;------------------------------------------------------------------
; Автор: А.В.Медведев.
; 220090, Республика Беларусь, Минск, ул.Широкая, 36, к.716а
; т. 64-51-52 (раб.)
;
; Простая утилита для командных файлов: выводит на экран вопрос
; и ждет ответа пользователя до тех пор, пока не будет нажата
; одна из перечисленных в командной строке клавиш. Анализируя код
; возврата, можно выполнять переход на нужную ветвь пакетного
; файла.
; 
; Формат вызова:
; ASK строка_запроса @клавиши_ответа
; Первой клавише в списке соответствует код возврата 1, второй - 2 и т.д.
; Регистр (верхний/нижний) для английских букв не имеет значения.
;
; Для получения выполнимого файла:
;	TASM ask
;	TLINK /x/t ask
;------------------------------------------------------------------

.MODEL  TINY
.CODE
LOCALS
ORG     100h

Start:
        mov     di,80h		; Смещение конца командной строки в PSP
	xor	cx,cx
        mov     cl,[di]		; длина "хвомта"
	jcxz	No_question	; 0 - команда введена без параметров
        mov     al,'@'
        mov     bx,cx
        cld
        inc     di
        repne scasb
        jne     No_question	; нет символа '@'
        mov     si,di           ; SI указывает на символ после '@'
        mov     al,13
        repne scasb
        jne     Ok
No_question:
	mov	ah,9
	mov	dx,offset Msg
	int	21h
	int	20h

Ok:     mov     cx,di           ;DI указывает на последнюю допустимую букву
        sub     cx,si           ;CX - количество допустимых букв ответа
        mov     bx,cx
        mov     di,si

@@1:    mov     al,[di]         ;преобразование клавиш в прописные
        call    Upcase
        stosb
        loop    @@1

        mov     byte ptr [si-1],'$'
        mov     ah,9            ;вывести строку запроса
	mov	dx,81h
	int	21h
@@2:
	xor	ax,ax
	int	16h
        call    Upcase
        mov     cx,bx
        mov     di,si
        repne scasb
        jne     @@2

        mov     ah,2            ;вывести символ
        mov     dl,al
        int     21h
        mov     dl,13
        int     21h
        mov     dl,10
        int     21h

        mov     al,bl           ;завершить программу с соответствующим кодом
        sub     al,cl
        mov     ah,4Ch
        int     21h

Upcase  PROC    NEAR
        cmp     al,'a'
        jb      @@2
        cmp     al,'z'
        ja      @@2
        sub     al,32
@@2:    ret
Upcase  ENDP

Msg     db 'Утилита ASK, вер. 2.0. Copyright (C) 1991 Андрей Вл. Медведев.',13,10
        db 'Формат вызова:',13,10
        db 'ASK строка_запроса @клавиши_ответа',13,10,10
        db 'Первой клавише в списке соответствует код возврата 1, второй - 2 и т.д.',13,10
        db 'Пример:',13,10,10
        db 'ASK Вы хотите загрузить Norton Commander ? (y/n)  @ny',13,10
        db 'if errorlevel 2 nc',13,10,'$'

END     Start
