|
|
|
@ -8,7 +8,7 @@ |
|
|
|
; |
|
|
|
; |
|
|
|
; IN DEBUG MODE: |
|
|
|
: >>nn SHOWS HEX COMMAND nn BEING WRITTEN TO THE COMMAND PORT |
|
|
|
; >>nn SHOWS HEX COMMAND nn BEING WRITTEN TO THE COMMAND PORT |
|
|
|
; >nn SHOWS HEX VALUE nn BEING WRITTEN TO THE DATA PORT |
|
|
|
; <nn SHOWS HEX VALUE READ FROM DATA PORT |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
@ -70,6 +70,25 @@ KBD_IDLE .DB 0 ; IDLE COUNT |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
#INCLUDE "ps2iface.inc" |
|
|
|
;;;; |
|
|
|
;;;; HACK TO ENSURE PS/2 CONTROLLER INTERRUPTS ARE TURNED OFF!!! |
|
|
|
;;;; |
|
|
|
;;;KBD_PREINT_HOOK: |
|
|
|
;;;#IF (KBDINTS) |
|
|
|
;;; LD IY,KBDIDAT |
|
|
|
;;; LD A,$60 ; SET COMMAND REGISTER |
|
|
|
;;; CALL KBD_PUTCMD ; SEND IT |
|
|
|
;;; LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS |
|
|
|
;;; CALL KBD_PUTDATA ; SEND IT |
|
|
|
;;;; |
|
|
|
;;; ; FLUSH ANY PENDING OUTPUT |
|
|
|
;;; LD B,16 |
|
|
|
;;;KBD_PREINT_HOOK1: |
|
|
|
;;; CALL KBD_IN_P |
|
|
|
;;; DJNZ KBD_PREINT_HOOK1 |
|
|
|
;;;#ENDIF |
|
|
|
RET |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; KEYBOARD INITIALIZATION |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
@ -79,7 +98,7 @@ KBD_INIT: |
|
|
|
PRTS("KBD: IO=0x$") ; DISPLAY |
|
|
|
LD A,(IY+KBD_DAT) ; PORT SETTING |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#IF ((INTMODE == 2) & INTPS2KBD) |
|
|
|
#IF ((INTMODE == 2) & KBDINTS) |
|
|
|
PRTS(" INT #$") ; DISPLAY |
|
|
|
LD A,INT_PS2KB ; INTERRUPT SETTING |
|
|
|
CALL PRTDECB |
|
|
|
@ -94,27 +113,22 @@ KBD_INIT: |
|
|
|
CP KBDMODE_VRC ; VRC? |
|
|
|
JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT |
|
|
|
; |
|
|
|
#IF ((INTMODE == 2) & INTPS2KBD) |
|
|
|
HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE |
|
|
|
#ENDIF |
|
|
|
LD A,$AA ; CONTROLLER SELF TEST |
|
|
|
CALL KBD_PUTCMD ; SEND IT |
|
|
|
CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) |
|
|
|
HB_EI ; RESTORE INTERRUPTS |
|
|
|
; |
|
|
|
CP $55 ; IS IT THERE? |
|
|
|
JR Z,KBD_INIT1 ; IF SO, CONTINUE |
|
|
|
#IF ((INTMODE == 2) & INTPS2KBD) |
|
|
|
HB_EI ; RESTORE INTERRUPTS |
|
|
|
#ENDIF |
|
|
|
PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM |
|
|
|
RET ; BAIL OUT |
|
|
|
; |
|
|
|
KBD_INIT1: |
|
|
|
#IF ((INTMODE == 2) & INTPS2KBD) |
|
|
|
#IF ((INTMODE == 2) & KBDINTS) |
|
|
|
; CALL KBDQINIT ; INITIALIZE QUEUE |
|
|
|
LD HL,KBD_INT ; INSTALL VECTOR |
|
|
|
LD (IVT(INT_PS2KB)),HL ; IVT INDEX |
|
|
|
HB_EI ; ENABLE INTERUPTS |
|
|
|
#ENDIF |
|
|
|
PRTS(" MODE=$") ; TAG |
|
|
|
LD A,(IY+KBD_MODE) ; GET MODE VALUE |
|
|
|
@ -131,7 +145,7 @@ KBD_INIT2: |
|
|
|
LD A,$60 ; SET COMMAND REGISTER |
|
|
|
CALL KBD_PUTCMD ; SEND IT |
|
|
|
|
|
|
|
#IF ((INTMODE == 2) & INTPS2KBD) |
|
|
|
#IF ((INTMODE == 2) & KBDINTS) |
|
|
|
LD A,$21 ; XLAT DISABLED, MOUSE DISABLED, WITH INTS |
|
|
|
#ELSE |
|
|
|
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS |
|
|
|
@ -249,22 +263,22 @@ KBD_PUTDATA2: |
|
|
|
RET |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
KBD_GETDATA: |
|
|
|
; |
|
|
|
KBD_GETDATA_P: |
|
|
|
; |
|
|
|
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. |
|
|
|
; DEPENDING ON ASSEMBLY CONFIGURATION KBD_GETDATA READS A BYTE FROM |
|
|
|
; EITHER THE INTERRUPT QUEUE OR FROM THE KEYBOARD CONTROLLER PORT. |
|
|
|
; KBD_GETDATA_P ALWAYS READS A BYTE FROM THE KEYBOARD CONTROLLER PORT. |
|
|
|
; |
|
|
|
LD B,KBD_WAITTO ; SETUP TO LOOP |
|
|
|
KBD_GETDATA0: |
|
|
|
CALL KBD_IST ; GET INPUT REGISTER STATUS |
|
|
|
JR NZ,KBD_GETDATA1 ; BYTE PENDING, GO GET IT |
|
|
|
KBD_GETDATA0_P: |
|
|
|
CALL KBD_IST_P ; GET INPUT REGISTER STATUS |
|
|
|
JR NZ,KBD_GETDATA1_P ; BYTE PENDING, GO GET IT |
|
|
|
CALL DELAY ; WAIT A BIT |
|
|
|
DJNZ KBD_GETDATA0 ; LOOP UNTIL COUNTER EXHAUSTED |
|
|
|
DJNZ KBD_GETDATA0_P ; LOOP UNTIL COUNTER EXHAUSTED |
|
|
|
XOR A ; NO DATA, RETURN ZERO |
|
|
|
RET |
|
|
|
KBD_GETDATA1: |
|
|
|
CALL KBD_IN ; GET A KEY |
|
|
|
KBD_GETDATA1_P: |
|
|
|
CALL KBD_IN_P ; GET A KEY |
|
|
|
#IF (KBDTRACE >= 2) |
|
|
|
PUSH AF |
|
|
|
CALL PC_SPACE |
|
|
|
@ -275,36 +289,52 @@ KBD_GETDATA1: |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
KBD_GETDATA_P: |
|
|
|
KBD_GETDATA_Q: |
|
|
|
; |
|
|
|
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. |
|
|
|
; KBD_GETDATA_P ALWAYS READS A BYTE FROM THE KEYBOARD CONTROLLER PORT. |
|
|
|
; GET A QUEUED DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. |
|
|
|
; KBD_GETDATA_Q ALWAYS READS A BYTE FROM THE KEYBOARD INTERRUPT QUEUE. |
|
|
|
; |
|
|
|
#IF ((INTMODE == 2) & KBDINTS)) |
|
|
|
; |
|
|
|
LD B,KBD_WAITTO ; SETUP TO LOOP |
|
|
|
KBD_GETDATA0_P: |
|
|
|
CALL KBD_IST_P ; GET INPUT REGISTER STATUS |
|
|
|
JR NZ,KBD_GETDATA1_P ; BYTE PENDING, GO GET IT |
|
|
|
KBD_GETDATA0_Q: |
|
|
|
CALL KBD_IST_Q ; GET INPUT REGISTER STATUS |
|
|
|
JR NZ,KBD_GETDATA1_Q ; BYTE PENDING, GO GET IT |
|
|
|
CALL DELAY ; WAIT A BIT |
|
|
|
DJNZ KBD_GETDATA0_P ; LOOP UNTIL COUNTER EXHAUSTED |
|
|
|
DJNZ KBD_GETDATA0_Q ; LOOP UNTIL COUNTER EXHAUSTED |
|
|
|
XOR A ; NO DATA, RETURN ZERO |
|
|
|
RET |
|
|
|
KBD_GETDATA1_P: |
|
|
|
CALL KBD_IN_P ; GET A KEY |
|
|
|
#IF (KBDTRACE >= 2) |
|
|
|
KBD_GETDATA1_Q: |
|
|
|
CALL KBD_IN_Q ; GET A KEY |
|
|
|
#IF (KBDTRACE >= 2) |
|
|
|
PUSH AF |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PC_LT |
|
|
|
CALL PRTHEXBYTE |
|
|
|
POP AF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; GET A DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. |
|
|
|
; DEPENDING ON ASSEMBLY CONFIGURATION KBD_GETDATA READS A BYTE FROM |
|
|
|
; EITHER THE INTERRUPT QUEUE OR FROM THE KEYBOARD CONTROLLER PORT. |
|
|
|
; |
|
|
|
#IF ((INTMODE == 2) & KBDINTS)) |
|
|
|
KBD_GETDATA .EQU KBD_GETDATA_Q |
|
|
|
KBD_GETDATA1 .EQU KBD_GETDATA1_Q |
|
|
|
#ELSE |
|
|
|
KBD_GETDATA .EQU KBD_GETDATA_P |
|
|
|
KBD_GETDATA1 .EQU KBD_GETDATA1_P |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
KBD_GETDATAX: |
|
|
|
; |
|
|
|
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT |
|
|
|
; GET A DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NO TIMEOUT |
|
|
|
; IF NOTHING AVAILABLE, RETURN 0. |
|
|
|
; |
|
|
|
CALL KBD_IST ; GET INPUT REGISTER STATUS |
|
|
|
RET Z ; NOTHING THERE, DONE |
|
|
|
|