.PREL .IDENT KB .INSERT BBEQU.ASM ; UART EQUATES UARTD=0E0H UARTS=0E1H ; KEYBOARD SCANNER KBSCAN:: CALL CHROME ; CHECK CHROMERICS JRNZ ..GOTK ; COMMENT OUT THIS NEXT INSTRUCTION TO ENABLE UART SCANNING ; RET ; ** DISABLE ICE UART FOR NOW ** IN UARTS ; CHECK STATUS ANI 2 ; IS A CHAR THERE? RZ IN UARTD ; GRAB A CHAR ..GOTK: ANI 7FH ; ZAP PARITY CPI 20H ; CONTROL CHARACTER? JRNC ..STUF ; JUMP IF NOT ; WE GOT A CONTROL CHARACTER - LOOKUP IN TRANSLATE TABLE MOV C,A MVI B,0 LXI H,CTRLTBL DAD B MOV A,M ANA A ; A HALT CHAR? JRNZ ..STUF ; JUMP IF NOT INR A ; SET THE HALT FLAG STA HLTFLG# RET ..STUF: MOV E,A ; SAVE CHAR LHLD KBBPC# ; GET BUFFER POINTERS MOV A,L ; A=PRODUCER CALL BUMPKB CMP H ; IS THE BUFFER FULL RZ ; IF SO - IGNORE THE CHAR STA KBPRO# ; ELSE UPDATE THE POINTER MVI H,0 ; AND STORE AT OLD PTR VAL LXI B,KEYBUF# DAD B MOV M,E RET ; SUBROUTINE TO INCREMENT POINTER TO KEYBOARD BUFFER BUMPKB:: INR A ; BUMP KEYBOARD PTR CPI KEYBSZ ; PAST LIMIT? RNZ ; NO SIR XRA A ; YES - RESET RET ; CHROMERICS KEYBOARD SCAN ROUTINE CHROME:: LXI B,0FE98H ; BC=MASK,PORT LXI D,0 ; DE=BIT,COL ..CHR: OUTP B ; OUTPUT MASK INP A ; GRAB SOME DATA CMA ; UPSIDE DOWN (OF COURSE) ANA A ; GET ANY? JRNZ ..KEYH ; YES SIR INR E ; NO - BUMP COL RLCR B ; SHIFT MASK JM ..CHR ; SCAN AWAY DCR A ; ZAP LAST KEY STA OLDKEY# XRA A ; ZERO FOR NOTHIN RET ..KEYH: RRC ; SCAN FOR BIT HIT JRC ..BITF INR D ; BUMP BIT CTR JMPR ..KEYH ; KEEP SCANIN ..BITF: MOV A,E ; A=COL RLC RLC RLC ; *8+ ADD D ; BIT # MOV E,A ; E=KEYCODE LXI H,OLDKEY# CMP M ; COMPARE TO LAST TIME THRU RZ ; KICKOUT IF SAME MOV M,A ; ELSE UPDATE MVI B,7FH ; READ CONTROL AND SHIFT OUTP B INP A CMA ; UPSIDE DOWN MOV B,A ; PUT IN B LXI H,NORTBL ; ASSUME NORMAL BIT 7,B ; SHIFT DOWN? JRZ ..NOSH LXI H,SHFTBL ; YEP - CHANGE MIND ..NOSH: MVI D,0 DAD D ; CHECK FOR CONTROL KEY MOV A,B ANI 28H MOV A,M ; CHAR TRANSLATED TO A JRZ ..GOTK ; JUMP IF NO CTRL CPI 40H ; SEE IF IN RANGE JRC ..GOTK ; FOR CONTROL KEY CPI 60H JRNC ..GOTK ANI 1FH ; YES SIR - ZAP BITS ..GOTK: MOV B,A ; SET NONZERO STATUS MVI A,1 ANA A MOV A,B RET ; NORMAL CHARACTER LOOKUP TABLE NORTBL: .BYTE '1','2','Q',1BH,'[','=','A','Z' .BYTE '4','3','E','W','C','S','D','X' .BYTE '6','5','T','R','B','F','G','V' .BYTE '8','7','U','Y',' ','H','J','N' .BYTE '0','9','O','I','M','K','L',',' .BYTE ')','(','+','P','.',';',5FH,'/' .BYTE 8,']',61H,5EH,66H,0DH,67H,60H ; SHIFTED CHARACTERS SHFTBL: .BYTE '!','"','Q',1BH,'{','=','A','Z' .BYTE '$','#','E','W','C','S','D','X' .BYTE '&','%','T','R','B','F','G','V' .BYTE '@',27H,'U','Y',' ','H','J','N' .BYTE 5EH,':','O','I','M','K','L','<' .BYTE 63H,62H,'-','P','>','*',5FH,'?' .BYTE 8,'}',61H,5EH,66H,0DH,67H,60H ; CONTROL CHARACTER TRANSLATE TABLE CTRLTBL: .BYTE 0 ; NULL .BYTE 76H ; A - RND .BYTE 71H ; B - BOX .BYTE 69H ; C - CLEAR .BYTE 78H ; D - DATA .BYTE 66H ; E - EDIT KEY .BYTE 72H ; F - FOR .BYTE 6FH ; G - GOSUB .BYTE RUBOUT ; H - RUBOUT .BYTE 73H ; I - INPUT .BYTE 67H ; j - go+10 .BYTE 6DH ; K - IF .BYTE 68H ; L - LIST .BYTE CR ; CARRIAGE RETURN .BYTE 6BH ; N - NEXT .BYTE 79H ; O - CIRCLE .BYTE 74H ; P - PRINT .BYTE 7DH ; Q - SNAP .BYTE 70H ; R - RETURN .BYTE 75H ; S - STEP .BYTE 77H ; T - TO .BYTE 7AH ; U - POINT .BYTE 7BH ; V - DEFAULT .BYTE 7CH ; W - SHOW .BYTE 6AH ; X - RUN .BYTE 7FH ; Y - SCROLL .BYTE 7EH ; Z - ZERO .BYTE 0 ; ESCAPE - HALT .BYTE 6CH ; BACKSLASH - LINE .BYTE 67H ; CLOSE SQUARE BKT - GO + 10 .BYTE 62H ; CARAT - MULTIPLY .BYTE 63H ; UNDERLINE - DIVIDE .END