|
|
|
@ -1,6 +1,6 @@ |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
; 8242 BASED PS/2 KEYBOARD DRIVER FOR SBC |
|
|
|
; 8242 BASED PS/2 KEYBOARD DRIVER |
|
|
|
; |
|
|
|
; ORIGINAL CODE BY DR JAMES MOXHAM |
|
|
|
; ROMWBW ADAPTATION BY WAYNE WARTHEN |
|
|
|
@ -72,42 +72,26 @@ KBD_RSTATE .DB 0 ; STATE BITS FOR "RIGHT" KEYS |
|
|
|
KBD_STATUS .DB 0 ; CURRENT STATUS BITS (SEE ABOVE) |
|
|
|
KBD_REPEAT .DB 0 ; CURRENT REPEAT RATE |
|
|
|
KBD_IDLE .DB 0 ; IDLE COUNT |
|
|
|
; |
|
|
|
DEVECHO "KBD: ENABLED\n" |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; HARDWARE LEVEL INTERFACE |
|
|
|
; 8242 CONTROLLER COMMANDS AND RESPONSES |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
#INCLUDE "ps2iface.inc" |
|
|
|
; |
|
|
|
KBD_CON_WCR .EQU $60 ; WRITE TO COMMAND REGISTER. VALUE TO FOLLOW. |
|
|
|
KBD_CON_CST .EQU $AA ; CONTROLLER SELF TEST. RETURN FF IF CONTROLLER OK |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; KEYBOARD PRE-INITIALIZATION |
|
|
|
; 8242 CONTROLLER COMMAND REGISTER VALUES |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
; TO BE CALLED PRIOR TO INITERRUPTS BEING ENABLED |
|
|
|
; MUST BE CALLED FROM VIDEO DRIVER PREINIT WITH IY SET |
|
|
|
; THIS PREVENTS INTRERRUPT ISSUES IF 8242 HAS INTERRUPTS ENABLED |
|
|
|
KBD_CON_ION .EQU $21 ; XLAT DISABLED, MOUSE DISABLED, WITH INTS |
|
|
|
KBD_CON_IOF .EQU $20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS |
|
|
|
; |
|
|
|
DEVECHO "KBD: ENABLED\n" |
|
|
|
; |
|
|
|
; AT STARTUP. NOT USING IT FOR NOW BECAUSE IT IS NOT A PROBLEM IF |
|
|
|
; YOU DON'T USE THE KEYBOARD DURING BOOT. |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; HARDWARE LEVEL INTERFACE |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
;;;KBD_PREINT: |
|
|
|
;;;; |
|
|
|
;;;; |
|
|
|
;;;#IF (KBDINTS) |
|
|
|
;;; 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 |
|
|
|
#INCLUDE "ps2iface.inc" |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; KEYBOARD INITIALIZATION |
|
|
|
@ -134,7 +118,7 @@ KBD_INIT: |
|
|
|
JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT |
|
|
|
; |
|
|
|
HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE |
|
|
|
LD A,$AA ; CONTROLLER SELF TEST |
|
|
|
LD A,KBD_CON_CST ; CONTROLLER SELF TEST |
|
|
|
CALL KBD_PUTCMD ; SEND IT |
|
|
|
CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) |
|
|
|
HB_EI ; RESTORE INTERRUPTS |
|
|
|
@ -163,16 +147,15 @@ KBD_INIT1: |
|
|
|
KBD_INIT2: |
|
|
|
CALL WRITESTR |
|
|
|
; |
|
|
|
LD A,$60 ; SET COMMAND REGISTER |
|
|
|
LD A,KBD_CON_WCR ; SET COMMAND REGISTER |
|
|
|
CALL KBD_PUTCMD ; SEND IT |
|
|
|
|
|
|
|
#IF ((INTMODE == 2) & KBDINTS) |
|
|
|
LD A,$21 ; XLAT DISABLED, MOUSE DISABLED, WITH INTS |
|
|
|
LD A,KBD_CON_ION ; XLAT DISABLED, MOUSE DISABLED, INTS ON |
|
|
|
#ELSE |
|
|
|
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS |
|
|
|
LD A,KBD_CON_IOF ; XLAT DISABLED, MOUSE DISABLED, INTS OFF |
|
|
|
#ENDIF |
|
|
|
CALL KBD_PUTDATA ; SEND IT |
|
|
|
|
|
|
|
CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED |
|
|
|
|
|
|
|
CALL KBD_RESET ; RESET THE KEYBOARD |
|
|
|
@ -234,14 +217,8 @@ KBD_PUTCMD: |
|
|
|
LD E,A ; SAVE INCOMING VALUE IN E |
|
|
|
LD A,(IY+KBD_MODE) ; GET MODE BYTE |
|
|
|
CP KBDMODE_VRC ; VGARC KEYBOARD? |
|
|
|
JR Z,KBD_PUTCMD2 ; BAIL OUT |
|
|
|
LD B,KBD_WAITTO ; SETUP TO LOOP |
|
|
|
KBD_PUTCMD0: |
|
|
|
CALL KBD_OST ; GET OUTPUT REGISTER STATUS |
|
|
|
JR NZ,KBD_PUTCMD1 ; EMPTY, GO TO WRITE |
|
|
|
CALL DELAY ; WAIT A BIT |
|
|
|
DJNZ KBD_PUTCMD0 ; LOOP UNTIL COUNTER EXHAUSTED |
|
|
|
RET |
|
|
|
RET Z ; BAIL OUT |
|
|
|
CALL KBD_CHK_OST |
|
|
|
KBD_PUTCMD1: |
|
|
|
LD A,E ; RECOVER VALUE TO WRITE |
|
|
|
#IF (KBDTRACE >= 2) |
|
|
|
@ -250,10 +227,7 @@ KBD_PUTCMD1: |
|
|
|
CALL PC_GT |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL KBD_CMDOUT ; OUTPUT CMD TO PORT |
|
|
|
KBD_PUTCMD2: |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
JP KBD_CMDOUT ; OUTPUT CMD TO PORT |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
KBD_PUTDATA: |
|
|
|
@ -263,14 +237,8 @@ KBD_PUTDATA: |
|
|
|
LD E,A ; SAVE INCOMING VALUE IN E |
|
|
|
LD A,(IY+KBD_MODE) ; GET MODE BYTE |
|
|
|
CP KBDMODE_VRC ; VGARC KEYBOARD? |
|
|
|
JR Z,KBD_PUTDATA2 ; BAIL OUT |
|
|
|
LD B,KBD_WAITTO ; SETUP TO LOOP |
|
|
|
KBD_PUTDATA0: |
|
|
|
CALL KBD_OST ; GET OUTPUT REGISTER STATUS |
|
|
|
JR NZ,KBD_PUTDATA1 ; EMPTY, GO TO WRITE |
|
|
|
CALL DELAY ; WAIT A BIT |
|
|
|
DJNZ KBD_PUTDATA0 ; LOOP UNTIL COUNTER EXHAUSTED |
|
|
|
RET |
|
|
|
RET Z ; BAIL OUT |
|
|
|
CALL KBD_CHK_OST |
|
|
|
KBD_PUTDATA1: |
|
|
|
LD A,E ; RECOVER VALUE TO WRITE |
|
|
|
#IF (KBDTRACE >= 2) |
|
|
|
@ -278,9 +246,19 @@ KBD_PUTDATA1: |
|
|
|
CALL PC_GT |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
CALL KBD_DTAOUT ; WRITE IT |
|
|
|
KBD_PUTDATA2: |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
JP KBD_DTAOUT ; WRITE IT |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
; |
|
|
|
; CHECK OUTPUT BUFFER IS READY TO ACCEPT. TIMEOUT IF BUFFER DOES NOT BECOME READY |
|
|
|
; |
|
|
|
KBD_CHK_OST: |
|
|
|
LD B,KBD_WAITTO ; SETUP TO LOOP |
|
|
|
KBD_OST_LP: |
|
|
|
CALL KBD_OST ; GET OUTPUT REGISTER STATUS |
|
|
|
RET NZ ; EMPTY, GO TO WRITE |
|
|
|
CALL DELAY ; WAIT A BIT |
|
|
|
DJNZ KBD_OST_LP ; LOOP UNTIL COUNTER EXHAUSTED |
|
|
|
RET |
|
|
|
; |
|
|
|
;__________________________________________________________________________________________________ |
|
|
|
|