Browse Source

Refactor ps2iface

pull/464/head
b1ackmai1er 1 year ago
parent
commit
c106b75261
  1. 91
      Source/HBIOS/ps2iface.inc
  2. 2
      Source/HBIOS/tms.asm

91
Source/HBIOS/ps2iface.inc

@ -1,8 +1,8 @@
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; HARDWARE INTERFACE FOR POLLED AND INTERRUPT DRIVEN PS2 KEYBOARD. ; 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. ; REQUIRES AN APPROPRIATE INTERRUPT JUMPER TO BE SET.
; CURRENTLY CONFIGURED FOR INT #2 ON DUODYNE WITH I/O MULTI BOARD. ; 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 KBDQGETX .DB 0 ; QUEUE INDEX
KBDQPUTX .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 ; RESET THE QUEUE TO EMPTY
@ -38,49 +38,32 @@ KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER
; ;
KBD_INT: KBD_INT:
; CALL KBDQDBG ; 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 LD (HL),A ; SAVE THE CHARACTER IN THE QUEUE
; CALL KBDQDBG ; CALL KBDQDBG
; ;
RET 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 #ENDIF
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
@ -104,25 +87,27 @@ KBDQPOP:
CALL KBDQLEN CALL KBDQLEN
RET Z ; EXIT IF THE QUEUE IS EMPTY 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 LD A,(HL) ; CREATE QUEUE INDEX
AND KBDQSIZ-1 AND KBDQSIZ-1
INC (HL) ; UPDATE INDEX INC (HL) ; UPDATE INDEX
;
LD HL,KBDQ ; INDEX INTO THE QUEUE LD HL,KBDQ ; INDEX INTO THE QUEUE
LD B,0
LD C,A 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 RET
; ;
#ENDIF #ENDIF
; ;
; RETURN A BYTE TO FROM KEYBOARD QUEUE
; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE.
;
#IF ((INTMODE == 2) & KBDINTS)) #IF ((INTMODE == 2) & KBDINTS))
KBD_IN .EQU KBD_IN_Q KBD_IN .EQU KBD_IN_Q
#ELSE #ELSE
@ -204,9 +189,9 @@ KBDQDBG:
PUSH BC PUSH BC
PUSH AF 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: KBDQPRT:
LD A,(HL) LD A,(HL)
CALL PRTHEXBYTE CALL PRTHEXBYTE

2
Source/HBIOS/tms.asm

@ -917,7 +917,7 @@ TMS_XY2IDX:
RET ; RETURN 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: TMS_PUTCHAR:

Loading…
Cancel
Save