From 0ec1e0e15e57dee075c2d14fc812f3f95ebbd3ca Mon Sep 17 00:00:00 2001 From: Tom Morton Date: Mon, 26 Jun 2023 21:14:18 +0100 Subject: [PATCH] Implement INKEY with negative argument INKEY with a negative argument tests if the given fabgl virtual key (-arg) is currently held down. This is done with a keyboard state map maintained using an experimental mos_setkbvector OS call. (https://github.com/tomm/agon-mos/tree/mos_setkbvector) --- eval.asm | 19 +++++++++++++++++++ patch.asm | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/eval.asm b/eval.asm index d2c60e7..7a9dc93 100644 --- a/eval.asm +++ b/eval.asm @@ -85,6 +85,7 @@ XREF OSKEY XREF INKEY1 XREF GETPORT + XREF KBSTATE ; ; BINARY FLOATING POINT REPRESENTATION: ; 32 BIT SIGN-MAGNITUDE NORMALIZED MANTISSA @@ -1144,6 +1145,8 @@ GET1: SCF ; INKEYS: CALL ITEMI EXX + BIT 7,H + JR NZ, INKEY_NEG CALL OSKEY INKEY1: LD DE,ACCS LD (DE),A @@ -1151,6 +1154,22 @@ INKEY1: LD DE,ACCS RET NC INC E RET +; negative INKEY argument: See if that key is currently down +INKEY_NEG: + XOR A + LD H, A + SUB L ; +ve keycode in A + LD L, A + LD B, A + LD DE, KBSTATE + ADD HL, DE + LD A, (HL) ; non-zero if key is pressed + OR A + SCF + JR Z, INKEY1 + LD A, B + JP INKEY1 + ; ;MID$ - Return sub-string. ;Result is string. diff --git a/patch.asm b/patch.asm index 21825c9..96b3541 100644 --- a/patch.asm +++ b/patch.asm @@ -65,6 +65,7 @@ XDEF OSSAVE XDEF EXPR_W2 XDEF GETPORT + XDEF KBSTATE XREF ASC_TO_NUMBER XREF RAM_START @@ -302,7 +303,8 @@ LTRAP1: LD HL,FLAGS ; Escape is pressed at this point, so ; Z-flag reset indicates AUTO-RUN. ; Destroys: A,D,E,H,L,F ; -OSINIT: CALL VBLANK_INIT +OSINIT: CALL VBLANK_INIT + CALL KBVECTOR_INIT XOR A LD (FLAGS), A ; Clear flags and set F = Z LD HL, USER @@ -310,6 +312,56 @@ OSINIT: CALL VBLANK_INIT LD E, A ; Page boundary RET +KBVECTOR_STOP: + LD.L HL, 0 + LD C,0 ; do not extend HL with MB: we want it zeroed + LD A, 1Dh + RST.LIS 8 + RET + +KBVECTOR_INIT: + LD HL,KBVECTOR + LD C,1 ; extend HL to 24-bits using MB + LD A,1Dh + RST.LIS 8 + RET + + .ASSUME ADL = 1 +KBVECTOR: + PUSH IY + PUSH IX + PUSH DE + POP IX + + LD.SIS DE,0 + LD.SIS HL,KBSTATE + LD E, (IX+2) ; key code + + ; coerce upper case letters to lower case, otherwise there are issues with stuck keys when shift is used + LD A,E + SUB 48 + JR C, $F + CP 26 + JR NC, $F + LD A, E + SUB 26 + LD E, A + +$$: + ADD.S HL,DE + + LD A, (IX+3) ; key down + LD.SIS (HL),A + + POP IX + POP IY + RET + + .ASSUME ADL = 0 + +KBSTATE: + DS 256 + ; ;OSCLI - Process a MOS command ; @@ -404,6 +456,7 @@ COMDS: DB 'BY','E'+80h ; BYE ; *BYE ; STAR_BYE: CALL VBLANK_STOP ; Restore MOS interrupts + CALL KBVECTOR_STOP POP.LIL IX ; The return address to init LD HL, 0 ; The return code JP (IX)