; FKEY for TurboDOS ; By ESKAY 4/85 No Lefts Reversed ; LOC Data# ; LEADIN:: BYTE 0X01 ; LEAD-IN CHARACTER LASTC: BYTE 0 ; PREVIOUS CHAR INFK: BYTE 0 ; FF=IN SEQUENCE FKPTR: WORD 0 ; POINTS TO CURRENT FKEY FKEYS:: BYTE 0 RES 4095 ; LOC Code# ; FKEY:: MOV BX,&LEADIN CMP AL,[BX] JZ ISLI ; JUMP IF IT IS LEADIN INC BX MOV [BX],AL RET ; ; COME HERE IF WE JUST RECEIVED A LEADIN CHARACTER ; ISLI: CMP FKEYS,=0 JNZ DOFK ; FKEYS ARE ENABLED RET ; DOFK: INC BX MOV [BX],AL ; SET PREVIOUS CHAR PUSH DX MOV DL,=1 ; GET CHAR CALL SERIAL# ; ; THIS CHAR IS THE FKEY ; PUSH CX MOV BX,&FKEYS-1 ; HL POINTS TO FKEYS MOV CX,=4095 ; 4095 CHARS TO CHECK MOV AH,AL ; SAVE CHAR BEGOFK: INC BX CMP [BX],AH JZ FNDFK CMP BYTE [BX],=0XFF ;EOF? JZ PDEX INC BX DEC CX NXTFK: CMP BYTE [BX],=0 JZ BEGOFK CMP BYTE [BX],=0XFF JZ PDEX INC BX LOOP NXTFK PDEX: POP CX POP DX RET ; FKEY NOT IN TABLE ; FNDFK: INC BX MOV BYTE INFK,=0XFF MOV AL,[BX] INC BX MOV FKPTR,BX JMPS PDEX ; GETFK:: CMP BYTE INFK,=0 JNZ __X RET ; NO FKEY SEQUENCE ; __X: MOV BX,FKPTR MOV AL,[BX] INC FKPTR OR AL,AL JNZ RETFK MOV BYTE INFK,=0 ; RESET IN-FK FLAG RET ; RETURN (CONTINUE NORMALLY) ; RETFK: POP BX ; KILL RET ADDR RET ; RETURN TO PREVIOUS CALLER END