; ASCII KEYBOARD INPUT ROUTINE ; ; 7 SEPTEMBER 1985 ; ; VER=1 ; ; EQUs REPDEL EQU 23561 REPPER EQU 23562 ; ; ADD TO END OF ZX BASIC NON-KEYWORD ENTRY ROUTINE ORG #F1CA CALL #10A8 ; GET INPUT FROM ZX KEYBOARD RET C ; KEY PRESSED, EXIT WITH CS HALT ; SYNC WITH ASCII KBD IN A,(253) ; READ KEYPRESS CP 255 ; NO KEY PRESSED? JR NZ,KEY_1 ; KEYPRESS NOT 255 LD (LAST_K),A ; SET NO KEY PRESSED RET ; RETURN EQ+NC=NO KEY KEY_1 LD C,A ; C=KEYPRESS IN A,(249) ; GET KBD STATUS LD B,A ; B=STATUS, B1=CTRL B0=SHIFT LD HL,COUNTER LD A,(LAST_K) ; GET CURRENT KEYPRESS CP C ; IS IT THE SAME JR Z,KEY_2 ; JUMP TO DEAL WITH REPEATS LD A,(REPDEL) LD (HL),A ; INIT REPEAT DELAY JR KEY_33 ; PROCESS NEW KEYPRESS KEY_2 DEC (HL) ; DEC REPEAT DELAY JR Z,KEY_3 ; REACHED ZERO, PROCESS KEYPRESS CP A ; EQ+NC = NO KEY PRESSED RET ; EXIT KEY_3 LD A,(REPPER) LD (HL),A ; INIT REPEAT KEY_33 LD A,C LD (LAST_K),A ; SET CURRENT KEYPRESS CP 127 JR C,KEY_4 ; <127, CHECK CONTROLS JR NZ,KEY_PAD ; >127, CHECK KEYPAD LD A,12 ; =127, CONVERT TO DELETE KEY_END AND A ; NE+CC SCF ; CS=KEY PRESSED RET ; EXIT WITH NE+CS KEY_4 CP 32 JR NC,KEY_END ; NOT CONTROL, RETURN KEYPRESS BIT 1,B ; IS CONTROL KEY PRESSED? JR Z,KEY_7 ; NO, JUMP WITH SPECIAL KEYS AND A ; IS IT CTRL-@? JR NZ,KEY_5 LD A,127 ; CTRL-@ RETURNS (C) JR KEY_END KEY_5 CP 27 ; CHECK FOR CTRL-LETTER JR NC,KEY_6 ; NOT CTRL-LETTER ADD A,143 ; CONVERT TO GRAPHICS CHARS JR KEY_END KEY_6 CP 28 ; CONVERT [ \ ] ^ _ ADC A,171 ; TO <= <= >= <> LINE JR KEY_END KEY_7 LD HL,TABLE-8 ; POINT TO CONVERSION TABLE LD B,0 ; BC=KEYPRESS ADD HL,DE ; INDEX TO CONVERTED BYTE LD A,(HL) ; GET CONVERTED KEYPRESS JR KEY_END ; RETURN KEYPRESS TABLE DEFB 14,15,6,9 ; EXT GRF CAP -> DEFB 30,13 DEFB 0,0,0,0,0,0,0 DEFB 8,0,0,7,10,11 ; HOM RET <- * * EDT DWN UP DEFB 27 ; ESC KEY_PAD AND 143 ; CONVERT TO BLOCK CHARACTER BIT 0,B ; IS SHIFT PRESSED? JR Z,KEY_END ; NOT PRESSED, RETURN KEYPRESS XOR 15 ; INVERT BLOCK CHARACTER JR KEY_END COUNTER DEFB 5 ; LOCAL COUNTER LAST_K DEFB 255 ; LOCAL LASTK