	page    65,132
;ASK, wie ASK aus den NORTON UTILITIES, nur krzer
;Matthaei, 16.6.90, 13.2.92
dbl     macro   text    ;;define a line
	db	text,cr
	endm

print_chr macro char	;;1 Zeichen zum
	mov	dl,char ;;Bildschirm
	mov	ah,2
	int	dos
	endm

jmps    macro   to      ;kurzer Sprung
	jmp     short to
	endm

cr	equ	0dh
lf	equ	0ah
esc	equ	1bh

dos	equ	21h
lparm	equ	0080h	;Parameterl„nge
fcb     equ     5ch     ;FCB aus Parameter
code	segment
	assume	cs:code, ds:code, es:code

	org     100h
start:  jmp     start1
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;Unterprogrammsammlung
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;PRINT MESSAGE FOLLOWING CALL PRMSG AND ENDING WITH 0
PRMSG:	mov	word ptr PRMSG2,di
	POP	di
	CALL	PSTR
	PUSH	di	;Returnadr.

	mov	di,0	;mod
PRMSG2	EQU	$-2
	RET

;PRINT MESSAGE ADRESSED BY di, ENDING WITH 0
;cr wird als cr lf ausgegeben
PSTR:	mov	dl,[di]
	INC	di
	cmp	dl,0
	jz	pstr99	     ;FALLS FERTIG
	cmp	dl,cr
	jnz	prstr2
	call	print_crlf
	jmp	short PSTR
prstr2:	mov	ah,02
	int	21h
	jmp	short PSTR

pstr99: ret

prstr	MACRO	TEXT	;;PRINT STRING
	CALL	PRMSG
	DB	TEXT,0
	ENDM

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
print_crlf:
	push	ax    ;Ausgabe cr lf
	print_chr cr
	print_chr lf
	pop	ax
	ret
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

;diverse Programmbeendigungen
ret0:	mov	al,0
	jmps    raus

ret1:	mov	al,1
	jmps    raus

ret3:	mov	al,3
	jmps    raus

;Programmende
raus:	call	print_crlf
	mov     ah,4ch
	int	dos

start1: mov     si,lparm        ;L„nge des Parameters
	xor     ch,ch
	mov     cl,[si]
	cmp     cx,0
	je      hilfe     ;Ausstieg, wenn keine Parameterangabe
start2: inc     si        ;berlesen fhrende Spaces
	cmp     byte ptr[si],' '
	jne     start3
	loop    start2


;Hilfstextanzeige wenn Aufruf ohne Parameter oder nur Spaces als Parameter
hilfe:  prstr   <'ASK prompt[,key-list]'>
        jmp     ret1

;Ausgabe des Prompts
;Die Ausgabe endet beim Komma im Parameter, es sei denn, das Komma steht
;nach einer ungeraden Anzahl G„nsefáchen
m_gsf   db      0

start3: mov     m_gsf,0         ;setzen Anzahl G„nsefáchen auf gerade
	dec     si

start5: inc     si
	mov     al,[si]

	cmp     al,'"'          ;umsetzen ?
	je      start9
	cmp     al,','
	jne     start10         ;Ausgabe
	cmp     m_gsf,0
	jne     start10         ;Ausgabe wegen Merker Schluá-Komma

	jmps    antw1

start9: xor     byte ptr m_gsf,1        ;Merker Schluá-Komma umsetzen
	jmps    start99

start10: print_chr al                   ;Zeichen ausgeben
	jmps    start99

start99: loop   start5
	jmp     ret0            ;Programmende, wenn hier abgearbeitet


antw1:  dec     cx
	jz      antw3           ;Programmende, wenn hier abgearbeitet
antw2:  inc     si              ;berlesen fhrende Spaces
	cmp     byte ptr[si],' '
	jne     antw4
	loop    antw2

antw3:  jmp     ret0            ;Programmende, wenn hier abgearbeitet

antw4:  push    si              ;fr Wiederholungen
	push    cx
	mov     bl,1
antw5:  print_chr '>'
	mov     ah,0    ;Zeicheneingabe
	int     16h     ;per Tastatur

antw6:  cmp     al,cr
	je      antw5   ;cr wird ignoriert
	mov     ah,al
	and     ah,5fh  ;ah enth. das Zeichen in Groáschrift
	cmp     byte ptr[si],al
	je      antw9
	cmp     byte ptr[si],ah
	je      antw9
	inc     si
	inc     bl
	loop    antw6

	pop     cx      ;war nicht dabei - neue Eingabe anfordern!
	pop     si
	jmps    antw4

 antw9: mov     al,bl   ;Errorlevel
	jmp     raus
code    ends
	end	start
