home *** CD-ROM | disk | FTP | other *** search
- title GETCH.ASM: A ROUTINE TO GRAB A CHARACTER INTO AN INTEGER.
- ;THIS ROUTINE IS USED INSTEAD OF THE QUICK BASIC INPUT$(1) OR INKEY$
- ;ROUTINES, BECAUSE BOTH OF THE OTHERS FAIL ON MACHINES LIKE THE TANDY
- ;1000 WHEN CERTAIN KEYS ARE PRESSED. (CTRL-9, FOR EXAMPLE).
- ;THIS ROUTINE IS PASSED A DUMMY INTEGER VARIABLE. THE ROUTINE WILL
- ;USE NORMAL DOS CALLS TO CHECK TO SEE IF A CHARACTER IS PRESENT. IT
- ;WILL WAIT FOREVER IF ONE IS NOT, SO NO LOOPING IS NEEDED. HOWEVER, IF
- ;ONE IS, THE ROUTINE WILL CHECK TO SEE IF IT IS A NORMAL CHARACTER OR
- ;A FUNCTION KEY. IF IT IS A NORMAL CHARACTER, THIS ROUTINE WILL RETURN
- ;THE VALUE OF THE CHARACTER IN THE INTEGER VARIABLE. IF IT IS A
- ;FUNCTION KEY, THE ROUTINE WILL RETURN AN INTEGER VALUE WITH THE HIGH
- ;BYTE SET TO FF HEX AND THE LOW BYTE SET TO THE VALUE OF THE FUNCTION
- ;KEY. WRITTEN BY BRUCE W. TONKIN ON 1-1-86 USING IBM'S MACRO-
- ;ASSEMBLER 1.0. COPYRIGHT 1986, BRUCE W. TONKIN.
- ;YOU MAY USE THIS ROUTINE WITH OR WITHOUT ATTRIBUTION.
- ;
- DATA SEGMENT WORD PUBLIC 'DATA'
- STORAGE DW 16
- DATA ENDS
- DGROUP GROUP DATA
- CODE SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:CODE, DS:DGROUP
- PUBLIC GETCH
- GETCH PROC FAR
- PUSH BP ;SAVE BASE POINTER
- MOV BP,SP ;SET UP TO ADDRESS OFF OF BP
- MOV BX,[BP]+6 ;GET THE ADDRESS OF THE INTEGER PARAMETER
- PUSH BX ;SAVE THAT ADDRESS FOR LATER USE.
- LOOP: MOV DL,0FFH ;DL=255, MEANS READ A CHARACTER
- MOV AH,07H ;DIRECT CONSOLE INPUT WITHOUT ECHO
- INT 021H ;PERFORM INTERRUPT
- MOV AH,0 ;CLEAR THE HIGH BYTE
- CMP AL,0 ;IS THIS A FUNCTION KEY?
- JNZ DONE ;NO. NORMAL CHARACTER. CLEAN UP AND FINISH.
- MOV DL,0FFH ;GO AGAIN TO GET FUNCTION KEY.
- MOV AH,07H ;THERE'LL BE A CHARACTER RIGHT THERE FOR US.
- INT 021H ;PERFORM INTERRUPT. IT'S GOING TO RETURN
- MOV AH,0FFH ;THE VALUE IN AL, SO WE'LL SET THE HIGH BYTE.
- DONE: POP BX ;RESTORE THE POINTER TO THE INTEGER PARAMETER
- MOV [BX],AX ;AND RETURN THE CHARACTER VALUE
- POP BP ;RESTORE BASE POINTER
- RET 2 ;RETURN AND REMOVE ONE PARAMETER FROM STACK
- GETCH ENDP
- CODE ENDS
- END