Browse Source

Merge pull request #467 from b1ackmai1er/master

PS2 keyboard spurious interrupts
pull/470/head
Wayne Warthen 1 year ago
committed by GitHub
parent
commit
66bc219b32
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 9
      Source/HBIOS/hbios.asm
  2. 92
      Source/HBIOS/kbd.asm
  3. 10
      Source/HBIOS/ps2iface.inc

9
Source/HBIOS/hbios.asm

@ -5316,6 +5316,11 @@ SYS_RESWARM:
; ;
SYS_RESCOLD: SYS_RESCOLD:
; ;
; TURN OFF SPURIOUS INTERRUPT SOURCES
;
#IF ((INTMODE == 2) & KBDINTS))
CALL KBD_DEINIT
#ENDIF
#IFDEF APPBOOT #IFDEF APPBOOT
JP HB_RESTART JP HB_RESTART
#ELSE #ELSE
@ -5406,8 +5411,8 @@ SYS_RESUSER2:
; GET THE CURRENT HBIOS VERSION ; GET THE CURRENT HBIOS VERSION
; ON INPUT, C=0 ; ON INPUT, C=0
; RETURNS VERSION IN DE AS BCD ; RETURNS VERSION IN DE AS BCD
; D: MAJOR VERION IN TOP 4 BITS, MINOR VERSION IN LOW 4 BITS
; E: UPDATE VERION IN TOP 4 BITS, PATCH VERSION IN LOW 4 BITS
; D: MAJOR VERSION IN TOP 4 BITS, MINOR VERSION IN LOW 4 BITS
; E: UPDATE VERSION IN TOP 4 BITS, PATCH VERSION IN LOW 4 BITS
; L: PLATFORM ID ; L: PLATFORM ID
; ;
SYS_VER: SYS_VER:

92
Source/HBIOS/kbd.asm

@ -1,6 +1,6 @@
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; ;
; 8242 BASED PS/2 KEYBOARD DRIVER FOR SBC
; 8242 BASED PS/2 KEYBOARD DRIVER
; ;
; ORIGINAL CODE BY DR JAMES MOXHAM ; ORIGINAL CODE BY DR JAMES MOXHAM
; ROMWBW ADAPTATION BY WAYNE WARTHEN ; 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_STATUS .DB 0 ; CURRENT STATUS BITS (SEE ABOVE)
KBD_REPEAT .DB 0 ; CURRENT REPEAT RATE KBD_REPEAT .DB 0 ; CURRENT REPEAT RATE
KBD_IDLE .DB 0 ; IDLE COUNT 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 ; KEYBOARD INITIALIZATION
@ -134,7 +118,7 @@ KBD_INIT:
JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT
; ;
HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE 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_PUTCMD ; SEND IT
CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK)
HB_EI ; RESTORE INTERRUPTS HB_EI ; RESTORE INTERRUPTS
@ -163,16 +147,15 @@ KBD_INIT1:
KBD_INIT2: KBD_INIT2:
CALL WRITESTR CALL WRITESTR
; ;
LD A,$60 ; SET COMMAND REGISTER
LD A,KBD_CON_WCR ; SET COMMAND REGISTER
CALL KBD_PUTCMD ; SEND IT CALL KBD_PUTCMD ; SEND IT
#IF ((INTMODE == 2) & KBDINTS) #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 #ELSE
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS
LD A,KBD_CON_IOF ; XLAT DISABLED, MOUSE DISABLED, INTS OFF
#ENDIF #ENDIF
CALL KBD_PUTDATA ; SEND IT CALL KBD_PUTDATA ; SEND IT
CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED
CALL KBD_RESET ; RESET THE KEYBOARD CALL KBD_RESET ; RESET THE KEYBOARD
@ -234,14 +217,8 @@ KBD_PUTCMD:
LD E,A ; SAVE INCOMING VALUE IN E LD E,A ; SAVE INCOMING VALUE IN E
LD A,(IY+KBD_MODE) ; GET MODE BYTE LD A,(IY+KBD_MODE) ; GET MODE BYTE
CP KBDMODE_VRC ; VGARC KEYBOARD? 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: KBD_PUTCMD1:
LD A,E ; RECOVER VALUE TO WRITE LD A,E ; RECOVER VALUE TO WRITE
#IF (KBDTRACE >= 2) #IF (KBDTRACE >= 2)
@ -250,10 +227,7 @@ KBD_PUTCMD1:
CALL PC_GT CALL PC_GT
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
CALL KBD_CMDOUT ; OUTPUT CMD TO PORT
KBD_PUTCMD2:
XOR A ; SIGNAL SUCCESS
RET
JP KBD_CMDOUT ; OUTPUT CMD TO PORT
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
KBD_PUTDATA: KBD_PUTDATA:
@ -263,14 +237,8 @@ KBD_PUTDATA:
LD E,A ; SAVE INCOMING VALUE IN E LD E,A ; SAVE INCOMING VALUE IN E
LD A,(IY+KBD_MODE) ; GET MODE BYTE LD A,(IY+KBD_MODE) ; GET MODE BYTE
CP KBDMODE_VRC ; VGARC KEYBOARD? 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: KBD_PUTDATA1:
LD A,E ; RECOVER VALUE TO WRITE LD A,E ; RECOVER VALUE TO WRITE
#IF (KBDTRACE >= 2) #IF (KBDTRACE >= 2)
@ -278,9 +246,19 @@ KBD_PUTDATA1:
CALL PC_GT CALL PC_GT
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #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 RET
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________

10
Source/HBIOS/ps2iface.inc

@ -58,9 +58,17 @@ KBD_INT:
; CALL KBDQDBG ; CALL KBDQDBG
; ;
RET RET
;__________________________________________________________________________________________________
; KEYBOARD DEINITIALIZATION
;__________________________________________________________________________________________________
; ;
KBD_DEINIT:
LD IY,(KBD_IDAT) ; SETUP PORT POINTER
LD A,KBD_CON_WCR ; LOAD WRITE COMMAND
CALL KBD_CMDOUT ; WRITE IT
LD A,KBD_CON_IOF ; LOAD DISABLE INTERRUPTS CFG
JP KBD_DTAOUT ; WRITE IT
#ENDIF #ENDIF
;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; KEYBOARD READ ; KEYBOARD READ
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________

Loading…
Cancel
Save