[net.sources] short DOS batch utility

jay@umd5 (Jay Elvove) (09/19/86)

What follows is a short but useful DOS batch utility that compares a
single character typed at the keyboard with a list of expected characters
on the program command line.  The program comments should pretty much
speak for themselves.  An executable version of this program came with
the Microsoft CODEVIEW demonstration disk.  I simply disassembled it and
present interested parties with the source.  Since Microsoft has allowed
that all files on that disk are public domain, I think it unlikely that
they will object to my disseminating the program in source form (will you
Microsoft?).  If you have the CODEVIEW demo, check out its various batch 
files to see some ways the program can be used.

--------------------------------------------

TITLE   RESPOND.COM

; The command has the following format:
;
;       RESPOND <list>
;
; This program solicits a single keystroke and compares it against
; one or more expected characters.  It is primarily designed for use
; in DOS batch files. If a match occurs, the character typed is
; returned in the form of an exit code which can be confirmed via the
; BATCH command IF ERRORLEVEL <num>, where <num> is the numeric value
; of the ASCII character.  If an illegal character is typed, the
; program beeps once and waits for another character.  A typical
; example follows:
;
;       RESPOND YN
;
; The program treats upper and lower case as equivalent.  Don't forget
; that ERRORLEVEL responds with a TRUE condition if the exit value
; is equal to OR exceeds the value specified on its command line.
;
; The program also performs one of four other functions if <list> is
; specified as one of the following characters:
;
; char  value   function
; ----  -----   --------
;      (20)    return current video mode
;      (21)    return number of free memory segments
;      (22)    return current version of DOS
;       (<8)    set video mode to character specified
;               e.g., RESPOND    (sets screen to mode two)
;
; Each of the above MUST be entered as an ASCII character.
;
; NOTE: This program originates (in executable form only) from
;       Microsoft's CODEVIEW demonstration disk.  It was disassembled
;       and commented by me (Jay Elvove) on September 19, 1986.  My
;       only modification has been to remove four unnecessary NOPs.

CSEG    SEGMENT
        ASSUME DS:CSEG, SS:CSEG, CS:CSEG, ES:CSEG
        ORG     100H

RESPOND:
        MOV     AL,DS:82H       ; get first character
        CMP     AL,7            ; if greater than 7
        JG      GET_VIDEO_MODE  ; ... skip ahead

; set video mode: command line character is 0-7

        MOV     AH,0            ; else, perform BIOS set
        INT     10H             ; ... video mode function
        JMP     SHORT QUIT      ; ... and quit

GET_VIDEO_MODE:
        CMP     AL,20           ; 20 means get current video mode
        JNZ     COMPUTE_MEMORY  ; else, skip ahead

; get video mode: command line character is "" (ASCII value 20)

        MOV     AH,0FH          ; do BIOS get current video
        INT     10H             ; ... mode function
        JMP     SHORT QUIT

COMPUTE_MEMORY:
        CMP     AL,21           ; 21 means compute memory
        JNZ     GET_DOS_VERSION

; compute memory: command line character is "" (ASCII value 21)

        MOV     AX,DS:2         ; get top of memory
        MOV     BX,ES           ; get current segment address
        SUB     AX,BX           ; compute # of free segments
        MOV     AL,AH
        JMP     SHORT QUIT

GET_DOS_VERSION:
        CMP     AL,22           ; 22 means get DOS version
        JNZ     GET_KBD_INPUT

; get DOS version: command line character is "" (ASCII value 22)

        MOV     AH,30H          ; get DOS version
        INT     21H
        JMP     SHORT QUIT

; get a single keystroke: no special characters on command line

GET_KBD_INPUT:
        MOV     AH,8            ; DOS get single character from
        INT     21H             ; ... keyboard function (no echo)
        XCHG    AH,AL
        CALL    MAKE_UPPER      ; convert character to upper case
        XCHG    AH,AL
        MOV     SI,80H          ; point to cmd. line char count
        MOV     CX,DS:80H       ; put count in CX
        XOR     CH,CH           ; clear high byte
        JCXZ    NO_INPUT        ; no input, clear exit code & quit

        INC     CX

L014B:
        INC     SI              ; point to cmd line char
        DEC     CX              ; decrement char count
        MOV     AH,[SI]         ; put char in AH
        CMP     AH,' '          ; space or control char?
        JLE     L014B           ; yes, skip it and get next

        CALL    MAKE_UPPER      ; else, convert char to upper case
        CMP     AH,AL           ; same as we expect?
        JZ      QUIT            ; yes, quit

        CMP     CX,1            ; more chars on cmd line?
        JGE     L014B           ; yes, try them
                                ; user input didn't match
        MOV     DL,7            ; signal an error (bell)
        MOV     AH,2            ; DOS echo character function
        INT     21H
        JMP     RESPOND         ; ... and start over


NO_INPUT:
        XOR     AL,AL           ; clear exit code

QUIT:
        MOV     AH,4CH          ; DOS terminate function with exit
        INT     21H             ; ... code in AL

; --------------------
; program subroutines
; --------------------

MAKE_UPPER:
        CMP     AH,'a'
        JL      MAKE_UPPER_RET

        CMP     AH,'z'
        JG      MAKE_UPPER_RET

        SUB     AH,20H

MAKE_UPPER_RET:
        RET

CSEG    ENDS
END     RESPOND
-- 
---------------------------------
Jay Elvove       jay@umd5.umd.edu
c/o Systems, Computer Science Center, U. of MD.