; ASCII KEYBOARD INPUT ROUTINE ; FOR GENS ASSEMBLER ; ; KEND EQU #0308 ; STORE KEYPRESS LASTK EQU 23560 ; KEY PRESSED KBDKEY EQU 253 ; ASCII KBD DATA KBDSHF EQU 249 ; ASCII KBD STATUS ; ; HOOK INTO GENS GETKEY ROUTINE ; REPLACE BIT 5,(IY+5) ; WITH NOP:CALL KEYGET ; ALL REGISTERS PRESERVED, SO ALL CAN BE USED ; ; HOOK IN WITH: ; LET off=start+40+PEEK(start+33)+256*PEEK(start+34) ; IF PEEKoff<>253 THEN LET off=off+18 ; POKE off+0,0:POKE off+1,205 ; POKE off+2,176:POKE off+3,91 ; ORG #5BB0 KEYGET BIT 5,(IY+1) ; IS ZX KBD KEY PRESSED RET NZ ; RETURN WITH NZ=KEY EI ; ENABLE INTS NOP ; TAKES EFFECT AFTER NEXT OP HALT ; SYNC WITH KEYBOARD IN A,(KBDKEY) ; READ KEYPRESS DI CP 255 ; NO KEY PRESSED? RET Z ; RETURN WITH Z=NO KEY CALL KEYCONV ; CHECK KEYPRESS JP KEND ; STORE KEYPRESS KEYCONV LD C,A ; C=KEYPRESS IN A,(KBDSHF) ; GET KBD STATUS LD B,A ; B=STATUS, B1=CTRL B0=SHIFT LD A,C ; A=C=KEYPRESS CP 127 JR NC,KEYPAD ; KEYPAD AND DELETE CP 32 RET NC ; NOT CONTROLS BIT 1,B ; IS CTRL PRESSED? JR NZ,KEYCTRL ; CTRL PRESSED LD HL,KEYTAB-8 LD B,0 ; BC=KEYPRESS ADD HL,BC ; INDEX INTO TABLE LD A,(HL) ; CONVERT SPECIAL KEY RET KEYTAB DEFB 12,09,6,9 ; BS,TAB,LF,RGT DEFB 07,13 ; HOME,RET KEYCTRL AND A ; IS IT CTRL-@? JR NZ,KEYGRAF ; SQUEEZE INTO TABLE LD A,127 ; CTRL-@ RETURNS (C) RET DEFB 0,08,00,0 ; XXX,LFT,XXX,XXX DEFB 8,10,11,7 ; CLR,DWN,UP,ESC KEYGRAF ADD A,143 ; CONVERT TO GRAPHICS CHAR RET KEYPAD JR Z,KEYDEL ; DELETE AND 143 ; CONVERT TO BLOCK CHAR BIT 0,C ; IS SHIFT PRESSED? RET Z ; NOT PRESSED, RETURN IT XOR 15 ; INVERT BLOCK CHARACTER RET KEYDEL LD A,12 ; DELETE RET ; 127 -> DELETE