Category : Batch File Utilities - mostly for DOS
Archive   : ABFS.ZIP
Filename : ASK.ASM

 
Output of file : ASK.ASM contained in archive : ABFS.ZIP
PAGE 55,132
TITLE ASK - ASKS FOR A YES OR NO REPLY, DEFAULT IS YES
;
; COPYRIGHT (C) 1985,1986 - M-SQUARED SYSTEMS, INC.
;
;
; NOTE: ALSO ALLOWS ENTRY OF 0-9 AS A REPLY FOR MENU CHOICE USES, WHEN
; FIRST CHARACTER OF PROMPT TEXT IS A SEMICOLON ";"
;
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:CODE,ES:CODE

PUBLIC ASK
PUBLIC DO_PROMPT,DEFAULT_PROMPT,NON_NUMERIC,REP_TYPE,DO_INPUT
PUBLIC CHECK_REPLY,RETEST,NUM_ONLY,REPROMPT,DOIT_AGAIN,REPRO
PUBLIC MSG0,MSG1,MSG2,MSG3,CRLF$,RET_YES,RET_NO

ORG 0100H ;USE .COM FORMAT

ASK PROC FAR
CALL DO_PROMPT ;OUTPUT THE PROMPT
CALL DO_INPUT ;GET & CHECK REPLY
CALL CHECK_REPLY ;VALIDATE REPLY & SET RC
MOV AH,4CH ;DOS RETURN WITH RETURN CODE
INT 21H
ASK ENDP

SUBTTL INTERNAL SUBROUTINES
PAGE

DO_PROMPT PROC NEAR
MOV DI,0080H ;POINT AT PSP COMMAND LINE
MOV DX,[DI] ;GET LENGTH BYTE
MOV DH,0
CMP DX,+01 ;NO PROMPT TEXT? (PIPE!)
JLE DEFAULT_PROMPT ;YUP, USE DEFAULT
CMP DX,+3CH ;MORE THAN 60 CHARS?
JZ DEFAULT_PROMPT ;YUP, USE DEFAULT
MOV AX,0 ;DEFAULT TO YES/NO REPROMPT
MOV CS:REP_TYPE,AX ;STORE IT AWAY
MOV AH,';' ;TEST FOR NUMERIC PROMPT
MOV BX,DI
INC BX
INC BX ;POINT AT BYTE 2
CMP AH,[BX] ;ASK ";" FOR NUMERIC
JNZ NON_NUMERIC
MOV AX,1
MOV CS:REP_TYPE,AX ;RESET PROMPT TYPE SWITCH TO
MOV BYTE PTR [BX],08H ;PUT BACKSPACE WHERE SEMI WAS!
DEC BX
DEC BX
MOV AX,2
CMP AL,[BX]
JZ DEFAULT_PROMPT
PAGE

NON_NUMERIC: ADD DX,080H ;POINT AT END OF PROMPT TEXT
MOV SI,DX ;PUT IT IN SI
MOV CH,' ' ;PROMPTS END IN ' ==> '
MOV DH,'='
MOV DL,'>'
MOV CL,'$'
INC SI ;ADD ONE
MOV [SI],CH ;APPEND THE BLANK
INC SI ;ADD ONE
MOV [SI],DH
INC SI ;ADD ONE
MOV [SI],DH
INC SI ;ADD ONE
MOV [SI],DL
INC SI ;ADD ONE
MOV [SI],CH ;APPEND THE BLANK
INC SI ;ADD ONE
MOV [SI],CL ;APPEND THE '$'
MOV DX,0082H ;SKIP LEADING BLANK
MOV SI,DX
LODSB ;GET FIRST CHARACTER AGAIN
CMP AL,08 ;BACKSPACE?
JNZ DOIT ;NOPE, NORMAL PROMPT
INC DX ;SKIP THE BACKSPACE!
DOIT: MOV AH,09 ;DOS DISPLAY CALL
INT 21H
RET ;AND RETURN

DEFAULT_PROMPT: MOV DX,OFFSET CS:MSG0 ;REPLY YES OR NO (Y/n)
XOR CX,CX
CMP CX,REP_TYPE
JZ DOIT
MOV DX,OFFSET CS:MSG1 ;REPLY 0-9 ONLY PLEASE
JMP SHORT DOIT
DO_PROMPT ENDP

PAGE

DO_INPUT PROC NEAR ;READ KEYBOARD WITH ECHO
MOV AH,01H
INT 21H
PUSH AX
MOV DX,OFFSET CS:CRLF$ ;SUPPLY CR-LF AFTER ECHO!
MOV AH,09
INT 21H
POP AX
RET
DO_INPUT ENDP

PAGE

CHECK_REPLY PROC NEAR ;VALIDATE USER INPUT
RETEST: MOV CX,1
CMP CX,CS:REP_TYPE ;WANT NUMERIC REPLY?
JZ NUM_ONLY ;YUP - GO TO IT
CMP AL,'Y'
JZ RET_YES
CMP AL,'y'
JZ RET_YES
CMP AL,'N'
JZ RET_NO
CMP AL,'n'
JZ RET_NO
CMP AL,20H
JZ RET_YES
;
; A YES/NO PROMPT MAY ALSO BE ANSWERED WITH 0-9 SO FALL THROUGH
;
NUM_ONLY: CMP AL,0DH ;ALLOW ONLY 0-9 AND CR
JZ RET_YES
MOV CX,1
CMP CX,CS:REP_TYPE
JNZ REPRO
CMP AL,029H
JLE REPRO
CMP AL,040H
JAE REPRO
SUB AL,030H
RET
REPRO: CALL REPROMPT
CALL DO_INPUT
JMP SHORT RETEST
RET_YES: MOV AL,00
RET
RET_NO: MOV AL,01
RET
CHECK_REPLY ENDP

PAGE

REPROMPT PROC NEAR
MOV DX,OFFSET CS:MSG2 ;REPLY YES OR NO ONLY PLEASE!
MOV AX,0
CMP AX,REP_TYPE ;WANT A YES/NO ONLY?
JZ DOIT_AGAIN
MOV DX,OFFSET CS:MSG3 ;REPLY 0-9 ONLY PLEASE!
DOIT_AGAIN: MOV AH,09 ;DISPLAY REPROMPT TEXT
INT 21H
RET
REPROMPT ENDP

SUBTTL READ-ONLY DATA
PAGE

REP_TYPE DW 0
MSG0 DB 'Reply Yes or No. (Y/n) ==> $'
MSG1 DB 'Reply with a digit (0-9) ==> $'
MSG2 DB 'Reply (Y/n) only please. ==> $'
MSG3 DB 'Reply (0-9) only please. ==> $'
CRLF$ DB 0DH,0AH,'$'

CODE ENDS
END ASK


  3 Responses to “Category : Batch File Utilities - mostly for DOS
Archive   : ABFS.ZIP
Filename : ASK.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/