.PREL .IDENT EZKP .INSERT HVG.LIB .INSERT MACRO.LIB .INSERT MUSIC.LIB .INSERT BBEQU.ASM .RELOC ; KB - FUNCTION TO RETURN NEXT CHARACTER FROM KEYBOARD GETKB:: PUSH B PUSH D CALL CHKIO# POP D POP B MOV L,A MVI H,0 RET ; NEW KEYBOARD HANDLER ; WITH SHIFT KEY ROLLOVER CKIOLA:: LDA TAPEST# ; TAPE INPUT WANTED? DCR A JRNZ CHKIOQ ; NO - SKIP IT THEN ; YES - CHECK FOR ABORT KEYSTROKE CALL KEYSCN JNZ INIT0# LDA HLTFLG# ; NOW CHECK FOR HALT ANA A JNZ INIT0# ; GET CHARACTER FROM THE BUFFER LHLD CONPRO# MOV A,H CMP L ; ARE POINTERS EQUAL? JRZ CKIOLA ; YEP - LOOP WAITING LXI H,TAPBUF# MOV L,A ; MAKE OFFICIAL POINTER MOV C,M CALL BUMPTR# STA CONPTR# ; UPDATE MY POINTER MOV A,C ; PASS BACK THE CHARACTER RET CHKIOQ: CALL KEYSCN ; MAKE SURE PREVIOUS KEY RELEASED JRNZ CHKIOQ ; AWAIT DEBOUNCE TIMER COUNTDOWN CHKIO0: LXI H,KEYTMR# MVI M,6 ; SET IT LOOPER: MOV A,M ANA A JRNZ LOOPER ; SAVE BACKGROUND COLOR LDA DEVCL0# PUSH PSW ; ASSUME FIRST LEVEL KEYCODE LXI H,FIRSTL GETK1: PUSH H ; SAVE TABLE PTR LDA HLTFLG# ; CHECK FOR HALT ANA A JNZ INIT# ; SCAN ONLY FOR SHIFT KEYS LXI H,KTBL4 LXI D,-21 ; ** SIZE OF LOOKUP TABLE LXI B,0414H GETK2: INP A ; INPUT FROM PORT ANI 20H ; SHIFT KEY DOWN? JRNZ GETK3 ; JUMP IF YEP DAD D ; ELSE TO NEXT TABLE INR C ; AND PORT DJNZ GETK2 ; NO SHIFT KEY IS DOWN - USE WHATEVER WE HAD BEFORE POP H JMPR GETK5 ; A SHIFT KEY IS DOWN - SAME OLD STORY? GETK3: POP D ; DISCARD OLD BELIEFS LDA DEVCL0# ; IS CURRENT SCREEN COLOR CMP M ; THE SAME AS WHAT WE WOULD SET? JRZ GETK4 ; YEP - DON'T BOTHER WITH FEEDBACK MOV A,M ; ELSE SET NEW COLOR STA DEVCL0# CALL WCLICK ; AND GO CLICK GETK4: INX H ; SKIP COLOR BYTE ; NOW SCAN FOR ANY 'NORMAL' KEY DEPRESSION GETK5: PUSH H LHLD KBBPC# ; GET KEYBOARD BUFFER POINTERS MOV A,H CMP L ; ANYONE HOME? JRZ GETK6 MOV E,H ; YEP - POINT AT EM MVI D,0 LXI H,KEYBUF# DAD D MOV D,M ; GET AND SAVE CALL BUMPKB ; BUMP THE CONSUMER PTR STA KBCON# ; AND UPDATE POP PSW ; FORGET PUSHED HL POP PSW ; RESTORE COLOR STA DEVCL0# MOV A,D ; CHAR BACK TO AC JMPR KBRENT ; JOIN IN LATER GETK6: POP H CALL KEYSCN JRZ GETK1 ; JUMP IF NO KEY DOWN ; WE GOT ONE - CONVERT TO ASCII DCR A ; BY TABLE LOOKUP MOV C,A MVI B,0 DAD B POP PSW ; RESTORE COLOR STA DEVCL0# MOV A,M ; GET CODE ANA A ; A HLT PERCHANCE? JRZ INIJMP ; YEP - RESET CPI 1 ; AN ERROR? JZ CKIOLA ; YEP - GO DOIT AGAIN ; GOOD KEY... CHKIO2: PUSH PSW ; NEED WE GO 'CLICK'? CPI NLLN ; REJECT TOKENS JRNC NOCLK INDEXB 1 .WORD NOTES#-CR INR A JRNZ NOCLK CALL WCLICK NOCLK: POP PSW KBRENT: CPI NLLN RNZ LXI H,5 SHLD NLLNCT# ; SET FLAG AND ZERO SUPRESS MVI A,CR ; PASS BACK CR AS FIRST CHAR RET WCLICK: LDA NEWTMR# ANA A JRNZ WCLICK MVI A,G0 STA MUZTON# LDA DEVTEM# ; DON'T CLICK IF NT=0 ANA A RZ MVI A,1 STA NEWTMR# RET ; ; SUBROUTINE TO CHECK FOR HLT KEY WHILE PGM RUNNING WHATSU:: CALL HKHCHK# ; CALL HALT CHECK HOOK PUSH B PUSH D LDA HLTFLG# ; HALT FLAG SET? ANA A JNZ INIT# ; YEP - BLAST OFF CALL KEYSCN ; GET KEY CODE SUI 2 ; FREEZE? JRZ FRZKEY DCR A JRZ INIJMP CPI 1 ; RETURN Z STATUS FOR LIST KEY JMPR FRZGBK ; ELSE GO BACK TO CALLER FRZKEY: CALL KEYSCN ; SCAN FOR NONZERO KEY TO REL JRZ FRZKEY CPI 3 ; HLT NAILED? INIJMP: JZ INIT# FRZGBK: POP D POP B RET ; SUBROUTINE TO SCAN TINY BASIC KEYBOARD KEYSCN: LXI B,0414H ; B = CNT, C = PORT # LXI D,KEYTRK# ; DE = KEYBOARD MEMORY PUSH B PUSH D PUSH H CALL RND32# POP H POP D POP B KYSCN1: INP A ; LOOK AT COLUMN ANI 1FH ; ISOLATE THE RELEVANT JRNZ KYSCN2 ; JUMP IF BITS HIGH INR C ; BUMP PORT # DJNZ KYSCN1 XRA A ; SET ZERO STATUS STAX D ; NOTHIN - SAY ZIP RET ; DEPRESSION FOUND - JUMP UP AND DOWN KYSCN2: DCR B MVI C,0 ; COME UP WITH BIT # KYSCN4: RRC ; SHIFT BIT OVER JRC KYSCN3 ; JUMP IF THE ONE INR C ; ELSE COUNT UP JMPR KYSCN4 ; AND TRY AGAIN ; FOUND BIT - ASSEMBLE KEYCODE KYSCN3: MOV A,C ; BIT # TO A RLC ; * 4 RLC ORA B ; COMBINE WITH COL # INR A MOV B,A LDAX D XRA B MOV A,B RZ ; QUIT IF THE SAME STAX D ; ELSE UPDATE TRACKER RET ; BUMP KEYBOARD BUFFER POINTER BUMPKB:: INR A CPI KEYBSZ RNZ XRA A RET ; TABLE OF FIRST LEVEL KEYCODES FIRSTL: .BYTE CR .BYTE EDKEY .BYTE 0 .BYTE 63H .BYTE '7' .BYTE '8' .BYTE '9' .BYTE 62H .BYTE '4' .BYTE '5' .BYTE '6' .BYTE '-' .BYTE '1' .BYTE '2' .BYTE '3' .BYTE '+' .BYTE ' ' .BYTE '0' .BYTE RUBOUT .BYTE '=' ; FIRST SHIFT KEY KTBL1: .BYTE 0A7H ; FIRST SHIFT KEY COLOR .BYTE CR .BYTE 1 .BYTE 0 .BYTE 1 .BYTE 'A' .BYTE 'D' .BYTE 'G' .BYTE 'J' .BYTE 'M' .BYTE 'P' .BYTE 'S' .BYTE 'V' .BYTE 'Y' .BYTE 5FH .BYTE 5EH .BYTE '&' .BYTE '$' .BYTE '<' .BYTE '(' .BYTE '#' ; SECOND SHIFT KEY KTBL2: .BYTE 05FH ; SECOND SHIFT KEY COLOR .BYTE CR .BYTE 2FH .BYTE 0 .BYTE 5BH .BYTE 'B' .BYTE 'E' .BYTE 'H' .BYTE 'K' .BYTE 'N' .BYTE 'Q' .BYTE 'T' .BYTE 'W' .BYTE 'Z' .BYTE 27H .BYTE '.' .BYTE '@' .BYTE ',' .BYTE 22H .BYTE ';' .BYTE '%' ; TABLE THE THIRD KTBL3: .BYTE 0FH ; THIRD SHIFT KEY COLOR .BYTE CR .BYTE 5CH .BYTE 0 .BYTE 5DH .BYTE 'C' .BYTE 'F' .BYTE 'I' .BYTE 'L' .BYTE 'O' .BYTE 'R' .BYTE 'U' .BYTE 'X' .BYTE '!' .BYTE 61H .BYTE 60H .BYTE '*' .BYTE '?' .BYTE '>' .BYTE ')' .BYTE ':' ; TOKEN KEY KTBL4: .BYTE 77H ; WORDS KEY COLOR .BYTE NLLN .BYTE EDKEY .BYTE 6AH .BYTE 68H .BYTE 72H .BYTE 77H .BYTE 75H .BYTE 6BH .BYTE 6FH .BYTE 70H .BYTE 76H .BYTE 6DH .BYTE 69H .BYTE 6CH .BYTE 71H .BYTE 6EH .BYTE EDKEY .BYTE 73H .BYTE 1 .BYTE 74H .END