; ********** READ KEYBOARD ROUTINE ********** ; ; ENTRY: NO PARAMETERS. ; EXIT: (A) = KEY CONVERTED TO KBLUT VALUE OR 0 ; IF NO KEY HAS BEEN PRESSED. ; ************************************************** .ORG 0000h LD SP, 0080h ; ADDED FOR TESTING PURPOSES. CALL READKB ; ADDED FOR TESTING PURPOSES. HALT ; ADDED FOR TESTING PURPOSES. ; SCAN 7 ROWS. READKB: LD HL, 3801h ; ROW 0 ADDRESS. H=38 L=01. REA010: LD A, (HL) ; GET ROW VALUE. OR A ; TEST FOR ZERO. JP NZ, REA020 ; GO IF KEY THERE. SLA L ; SHIFT ROW ADDRESS. L=02 THEN 04 THEN 08, ETC. RET M ; GO IF LAST ROW & NO PRESS. M = S(IGN) FLAG IS SET. JP REA010 ; MORE ROWS TO GO. ;CONVERT ROW, COLUMN TO INDEX REA020: LD C, A ; ROW VALUE. XOR A ; ZERO A REGISTER. REA025: SRL L ; SHIFT ADDRESS. JP C, REA035 ; GO IF DONE. REA030: ADD A, 8 ; ROW * 8. JP REA025 ; CONTINUE. REA035: LD B, 0FFh ; COLUMN COUNT. REA040: INC B ; BUMP COUNT. SRL C ; SHIFT ROW VALUE. JP NC, REA040 ; CONTINUE UNTIL "1" OUT. ADD A, B ; NOW ROW * 8 + COLUMN IN A. LD C, A ; TRANSFER TO C. ; FIND TABLE ENTRY LD A, (3880h) ; SHIFT ROW ADDRESS. OR A ; TEST FOR SHIFT KEY. JP Z, REA045 ; GO IF NONE. LD A, 56 REA045: ADD A, C ; ADD HASH + SHIOFT * 56. LD C, A ; NOW ROW * 8 + COLUMN * SHIFT * 56. LD B, 0 ; NOW IN BC. LD HL, KBLUT ; ADDRESS OF KEYBOARD LOOK UP TABLE. ADD HL, BC ; POINT TO CODE. LD A, (HL) ; GET VALUE. ; DEBOUNCE DELAY LD HL, 8448 ; 100MS DELAY. LD BC, -1 ; DECREMENT. REA050: ADD HL, BC ; DECREMENT COUNT. JP C, REA050 ; GO IF NOT DONE. RET ; RETURN WITH CODE IN A REGISTER. ; KEYBOARD LOOK UP TABLE KBLUT: .DW 8 ; ROW 0 LC. .DW 8 ; ROW 1 LC. .DW 8 ; ROW 2 LC. .DW 8 ; ROW 3 LC. .DW 8 ; ROW 4 LC. .DW 8 ; ROW 5 LC. .DW 8 ; ROW 6 LC. .DW 8 ; ROW 0 LC. .DW 8 ; ROW 1 LC. .DW 8 ; ROW 2 LC. .DW 8 ; ROW 3 LC. .DW 8 ; ROW 4 LC. .DW 8 ; ROW 5 LC. .DW 8 ; ROW 6 LC. .END