|
|
@ -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 |
|
|
|