From c106b752614c77591fdfc84f8c8aec2117f43ec3 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 8 Dec 2024 21:12:47 +0800 Subject: [PATCH] Refactor ps2iface --- Source/HBIOS/ps2iface.inc | 91 ++++++++++++++++----------------------- Source/HBIOS/tms.asm | 2 +- 2 files changed, 39 insertions(+), 54 deletions(-) diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 8ca320c4..5e4e992f 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -1,8 +1,8 @@ ;__________________________________________________________________________________________________ ; HARDWARE INTERFACE FOR POLLED AND INTERRUPT DRIVEN PS2 KEYBOARD. ; -; IN POLLED MODE THE KEYBOARD DEVICE IS IDENTIFIED BY THE TABLE POINTED TO BY IY -; IN INTERRUPT MODE THE KEYBOARD DEVICE IS UNKNOWN SO PREDEFINED PORT VALUES ARE USED. +; IN POLLED MODE THE CONTROLLER PORT VALUES ARE KNOWN BY THE CALLING DRIVER. +; IN INTERRUPT MODE THE DEVICES PORTS ARE UNKNOWN SO PREDEFINED PORT VALUES ARE USED. ; ; REQUIRES AN APPROPRIATE INTERRUPT JUMPER TO BE SET. ; CURRENTLY CONFIGURED FOR INT #2 ON DUODYNE WITH I/O MULTI BOARD. @@ -15,12 +15,12 @@ ;__________________________________________________________________________________________________ ; ; -KBDQSIZ .EQU 16 ; MUST BE POWER OF TWO, <=128 +KBDQSIZ .EQU 32 ; MUST BE POWER OF TWO, <=128. KBDQGETX .DB 0 ; QUEUE INDEX KBDQPUTX .DB 0 ; QUEUE INDEX - .DB $55 ; GUARD BYTE FOR DEBUGGING -KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER - .DB $AA ; GUARD BYTE FOR DEBUGGING +; .DB $55 ; GUARD BYTE FOR DEBUGGING ; NOTE THAT SCAN CODES ARE BEING +KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER ; BUFFERED. ONE KEY PRESS CAN +; .DB $AA ; GUARD BYTE FOR DEBUGGING ; GENERATE SEVERAL SCAN CODES ;__________________________________________________________________________________________________ ; RESET THE QUEUE TO EMPTY @@ -38,49 +38,32 @@ KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER ; KBD_INT: ; CALL KBDQDBG - LD IY,KBDIDAT - LD C,(IY+KBD_ST) ; READ CONTROLLER STATUS - EZ80_IO - IN A,(C) - AND 1 - RET Z - LD C,(IY+KBD_DAT) ; GET THE RESPONSE - EZ80_IO - IN A,(C) -; CALL KBDQPUSH ; SAVE KEYBOARD SCAN CODE -; RET + LD IY,KBDIDAT ; POINT TO PORT TABLE ; -;__________________________________________________________________________________________________ -; ADD A BYTE TO THE KEYBOARD QUEUE -;__________________________________________________________________________________________________ +; LD C,(IY+KBD_ST) +; EZ80_IO +; IN A,(C) ; READ CONTROLLER STATUS +; AND 1 ; EXIT IF NOTHING + + CALL KBD_IST_P + RET Z ; TO READ + LD C,(IY+KBD_DAT) + EZ80_IO ; IF SOMETHING PENDING + IN A,(C) ; READ THE BYTE IN + LD B,A ; AND SAVE IT ; -KBDQPUSH: ; ADD A SCAN CODE TO THE QUEUE - PUSH AF - CALL KBDQFULL - JR Z,KBDQISF ; EXIT IF THE QUEUE IS FULL + CALL KBDQLEN ; CHECK IF + SUB KBDQSIZ ; QUEUE IS FULL + RET Z ; EXIT IF THE QUEUE IS FULL ; - LD HL,KBDQPUTX - LD A,(HL) ; CREATE QUEUE INDEX - AND KBDQSIZ-1 - INC (HL) ; UPDATE INDEX + LD HL,KBDQPUTX ; CREATE QUEUE INDEX + CALL KBD_Q_IDX ; POINTER IN HL ; - LD HL,KBDQ ; INDEX INTO THE QUEUE - LD B,0 - LD C,A - ADD HL,BC - POP AF LD (HL),A ; SAVE THE CHARACTER IN THE QUEUE ; CALL KBDQDBG ; RET ; -KBDQISF:POP AF - RET - -KBDQFULL: ; RETURN Z IF QUEUE IS FULL - CALL KBDQLEN ; RETURN NZ IF STILL SPACE IN QUEUE - SUB KBDQSIZ - RET #ENDIF ; ;__________________________________________________________________________________________________ @@ -104,25 +87,27 @@ KBDQPOP: CALL KBDQLEN RET Z ; EXIT IF THE QUEUE IS EMPTY ; - LD HL,KBDQGETX + LD HL,KBDQGETX ; CREATE QUEUE INDEX + CALL KBD_Q_IDX ; POINTER IN HL +; + LD A,(HL) ; GET THE CHARACTER FROM THE QUEUE +; LD (HL),B ; DEBUG - CLEAN QUEUE +; + RET + +KBD_Q_IDX: LD A,(HL) ; CREATE QUEUE INDEX AND KBDQSIZ-1 INC (HL) ; UPDATE INDEX -; LD HL,KBDQ ; INDEX INTO THE QUEUE - LD B,0 LD C,A - ADD HL,BC - LD A,(HL) ; GET THE CHARACTER FROM THE QUEUE -; LD (HL),B ; DEBUG - CLEAN QUEUE -; + LD A,B ; NOTE THE QUEUE GET + LD B,0 ; AND PUT INDEXES + ADD HL,BC ; NEVER DECREASE RET ; #ENDIF ; -; RETURN A BYTE TO FROM KEYBOARD QUEUE -; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE. -; #IF ((INTMODE == 2) & KBDINTS)) KBD_IN .EQU KBD_IN_Q #ELSE @@ -204,9 +189,9 @@ KBDQDBG: PUSH BC PUSH AF - CALL NEWLINE ; PRINT QUEUE CONTENTS WITH PRE AND POST GUARD BYTES - LD B,KBDQSIZ+2 - LD HL,KBDQ-1 + CALL NEWLINE ; PRINT QUEUE CONTENTS + LD B,KBDQSIZ ; +2 PRE AND POST GUARD BYTES + LD HL,KBDQ ; -1 PRE AND POST GUARD BYTES KBDQPRT: LD A,(HL) CALL PRTHEXBYTE diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 07e08ad9..577ad721 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -917,7 +917,7 @@ TMS_XY2IDX: RET ; RETURN ; ;---------------------------------------------------------------------- -; WRITE VALUE IN A TO CURRENT VDU BUFFER POSTION, ADVANCE CURSOR +; WRITE VALUE IN A TO CURRENT VDU BUFFER POSITION, ADVANCE CURSOR ;---------------------------------------------------------------------- ; TMS_PUTCHAR: