home *** CD-ROM | disk | FTP | other *** search
- PAGE ,132 ;SET FOR WIDE LISTING
- ; REPLY.ASM
- ;--------------------------------------------------------------------
- CODE_SEG SEGMENT
- ASSUME CS:CODE_SEG,DS:CODE_SEG,SS:CODE_SEG,ES:CODE_SEG
- ; ORG 100H ;THIS COMMAND WAS NOT NEEDED
- ;====================================================================
- ; BEGINNING OF PROGRAM
- ;
- CALL INPUT ;GO TO INPUT CHECKING
- CMP AL,86H ;WAS THERE AN ERROR(86H)
- JZ EXIT ;IF YES, EXIT
- CALL WAIT ;GO TO WAITING ROUTINE
- EXIT: MOV AH,4CH ;
- INT 21H ;EXIT WITH CODE IN AL
- ;====================================================================
- ; DATA AREA ------ ESTABLISH TABLES AND SYMBOLS
- ;
- TABLE DB 31H DUP(0),'123456789',7H DUP(0),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- TABLE2 DB 6H DUP(0),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',85H DUP(0)
- DUPLIST DB 80H DUP(0)
- RESPONSES DB 24H DUP(0)
- NONE DB 'Missing Reply Parameter.',0DH,0AH,24H
- WRONG DB 'Invalid Reply Parameter.',0DH,0AH,24H
- DOUBLE DB 'Duplicate Reply Parameter.',0DH,0AH,24H
- ASKTHIS DB 'RESPONSE:$'
- TIMETICK DB ' .$'
- TIMEOUT DB ' DEFAULT',0DH,0AH,24H
- FEED DB 0DH,0AH,24H
- ;====================================================================
- ; CHARACTER INPUT AND CHECKING SUBROUTINE
- ;
- INPUT: CLD ;CLEAR DF
- XOR CX,CX ; " CX
- MOV DI,0080H ;SET DI TO INPUT STRING
- MOV CL,[DI] ;PUT COUNT INTO CX
- JCXZ MISSING ;IF CX=0 PRINT MISSING & END
- DEC CX ;SKIP LEADING SPACE
- MOV BP,CX ;PUT CX IN BP FOR LATER
- XOR AX,AX ;CLEAR AX
- MOV SI,0082H ;SI POINTS TO INPUT STRING
- LEA DI,RESPONSES+0100H ;DI " " RESPONSES
- LEA BX,TABLE+0100H ;BX " " TABLE
- TRANSLATE:
- LODSB ;PUT [SI] INTO AL, INC SI
- XLAT ;[BX+AL]=>AL
- CMP AL,00H ;CHECK IF VALID CHARACTER
- JZ INVALID ;PRINT INVALID AND END
- STOSB ;STORE AL=>[DI], INC DI
- LOOP TRANSLATE ;LOOP UNTIL CX=0
- MOV CX,BP ;PUT COUNT INTO CX
- XOR AX,AX ;CLEAR AX
- LEA SI,RESPONSES+0100H ;SI POINTS TO RESPONSES
- LEA BX,DUPLIST+0100H ;BX " " DUPLIST
- REDUNDANT:
- LODSB ;PUT [SI]=>AL, INC SI
- MOV DI,AX ;COPY CHARACTER INTO DI
- XLAT ;[BX+AL]=>AL
- CMP AL,20H ;DOES IT ALREADY EXIST
- JZ DUPLICATE ;YES, PRINT DUPLICATE & END
- MOV BYTE PTR[BX+DI],20H ;PUT 20H INTO DUPLIST
- LOOP REDUNDANT ;LOOP UNTIL DONE
- XOR AX,AX ;CLEAR AX
- JMP LEAVE ;GO TO LEAVE AND RETURN
- ;====================================================================
- ; ERROR MESSAGE OUTPUTS
- ;
- MISSING:
- MOV AH,09H ;
- LEA DX,[NONE+0100H] ;
- INT 21H ;PRINT "MISSING ..."
- MOV AL,86H ;SET AL TO ERROR(86H)
- JMP LEAVE ;RETURN
- ;
- INVALID:
- MOV AH,09H ;
- LEA DX,[WRONG+0100H]
- INT 21H ;PRINT "INVALID ..."
- MOV AL,86H ;SET AL TO ERROR(86H)
- JMP LEAVE ;RETURN
- ;
- DUPLICATE:
- MOV AH,09H ;
- LEA DX,[DOUBLE+0100H]
- INT 21H ;PRINT "DUPLICATE ..."
- MOV AL,86H ;SET AL TO ERROR(86H)
- ;
- LEAVE: RET ;RETURN
- ;====================================================================
- ; START OF TIMING, KEYBOARD RESPONSE, AND CHARACTER CHECKING ROUTINE
- ;
- WAIT: XOR AX,AX ;CLEAR AX
- MOV AH,09H ;
- LEA DX,ASKTHIS+0100H
- INT 21H ;PRINT "RESPONSE:"
- MOV CH,0AH ;SET TIMER TO 10+1
-
- SECONDS: MOV CL,02H ;SET TWIDDLE TO 2
- HALFSEC: MOV BX,65500 ;SET TWIDDLE COUNT
- TWIDDLE: DEC BX ;BX-1=>BX
- CMP BX,0000 ;IS BX ZERO
- JNZ TWIDDLE ;NO, CONTINUE TWIDDLE
- MOV AH,0BH ;
- INT 21H ;CHECK FOR INPUT READY
- CMP AL,-1 ;-1=READY, 00=NOT
- JZ PROCESS ;YES, PROCESS INPUT
- RETURN: DEC CL ;CL-1=>CL
- CMP CL,00 ;IS CL ZERO
- JNZ HALFSEC ;NO, CONTINUE TIMER
- MOV AH,09H ;
- LEA DX,TIMETICK+0100H
- INT 21H ;PRINT " ."
- DEC CH ;CH-1=>CH
- CMP CH,00 ;IS CH ZERO
- JZ DEFAULT ;YES, PROCESS DEFAULT
- JMP SECONDS ;CONTINUE TIMER LOOP
- ;====================================================================
- ; PROCESS KEYBOARD INPUT - CHECK IF VALID RESPONSE
- ;
- PROCESS:
- PUSH BX ;SAVE BX
- PUSH CX ; " CX
- PUSH DI ; " DI
- PUSH DX ; " DX
- XOR DX,DX ;CLEAR DX
- MOV AH,08H ;
- INT 21H ;GET CHARACTER IN AL
- LEA BX,TABLE+0100H ;POINT BX TO TABLE
- XLAT ;[BX+AL]=>AL
- CMP AL,00 ;IS CHARACTER VALID
- JZ GOBACK ;NO, GO BACK TO WAITING
- XOR CX,CX ;CLEAR CX
- LEA BX,RESPONSES+0100H ;POINT BX TO RESPONSES
- SEARCH: INC CL ;CL+1=>CL
- MOV DL,[BX] ;GET RESPONSES CHARACTER
- CMP DL,00 ;IS THERE NO CHOOSES
- JZ GOBACK ;NO, GO BACK TO WAITING
- CMP DL,AL ;DOES INPUT="RESPONSES"
- JZ FOUND ;YES, GO TO FOUND
- INC BX ;BX+1=>BX
- JMP SEARCH ;KEEP SEARCHING
- ;====================================================================
- ; GO BACK TO WAITING LOOP
- ;
- GOBACK: POP DX ;RESTORE DX
- POP DI ; " DI
- POP CX ; " CX
- POP BX ; " BX
- JMP RETURN ;RETURN TO WAITING
- ;====================================================================
- ; KEYBOARD INPUT CHARACTER IS A VALID PARAMETER - SET UP RETURN CODE
- ;
- FOUND: MOV AH,02H ;
- INT 21H ;ECHO CORRECT CHARACTER
- MOV AH,09H ;
- LEA DX,FEED+0100H ;
- INT 21H ;CLEAN UP LINE
- ADD CL,CH ;TOTAL THE COUNT
- MOV AL,CL ;PUT COUNT IN AL
- POP DX ;RESTORE DX
- POP DI ; " DI
- POP CX ; " CX
- POP BX ; " BX
- RET ;RETURN TO EXIT
- ;====================================================================
- ; PROCESS DEFAULT OPTION - RETURNS "00" IN AL REGISTER
- ;
- DEFAULT:MOV AH,09H ;
- LEA DX,TIMEOUT+0100H
- INT 21H ;PRINT " DEFAULT"
- MOV AX,0000 ;PUT 0000 IN AX
- RET ;RETURN
- ;====================================================================
- CODE_SEG ENDS
- END