From b5b9098429d26fe70671904b35d9c561644983d4 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Mon, 9 Dec 2024 21:18:03 +0800 Subject: [PATCH 1/2] PS2 keyboard spurious interrupts Resolved keyboard interrupt errors when a key is pressed during reboot. Turn off keyboard controller interrupt enable before cold boot process starts. I'm wondering if duodyne interrupt generator is immune to DI :)? --- Source/HBIOS/hbios.asm | 9 +++++-- Source/HBIOS/kbd.asm | 51 +++++++++++++-------------------------- Source/HBIOS/ps2iface.inc | 19 ++++++++++++++- 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 53333209..f8da23f2 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -5316,6 +5316,11 @@ SYS_RESWARM: ; SYS_RESCOLD: ; +; TURN OFF SPURIOUS INTERRUPT SOURCES +; +#IF ((INTMODE == 2) & KBDINTS)) + CALL KBD_DEINIT +#ENDIF #IFDEF APPBOOT JP HB_RESTART #ELSE @@ -5406,8 +5411,8 @@ SYS_RESUSER2: ; GET THE CURRENT HBIOS VERSION ; ON INPUT, C=0 ; 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 ; SYS_VER: diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 3d1e9f44..b47753d7 100644 --- a/Source/HBIOS/kbd.asm +++ b/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 ; 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 ; -; AT STARTUP. NOT USING IT FOR NOW BECAUSE IT IS NOT A PROBLEM IF -; YOU DON'T USE THE KEYBOARD DURING BOOT. + DEVECHO "KBD: ENABLED\n" ; -;;;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 +;__________________________________________________________________________________________________ +; HARDWARE LEVEL INTERFACE +;__________________________________________________________________________________________________ +; +#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, WITH INTS #ELSE - LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS + LD A,KBD_CON_IOF ; XLAT DISABLED, MOUSE DISABLED, NO INTS #ENDIF CALL KBD_PUTDATA ; SEND IT - CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED CALL KBD_RESET ; RESET THE KEYBOARD diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 13d746a2..7145d482 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -58,9 +58,26 @@ KBD_INT: ; CALL KBDQDBG ; RET +;__________________________________________________________________________________________________ +; KEYBOARD DEINITIALIZATION +;__________________________________________________________________________________________________ ; -#ENDIF +KBD_DEINIT: + LD IY,(KBD_IDAT) ; SETUP PORT POINTER +; + LD C,(IY+KBD_CMD) ; LOAD COMMAND PORT + LD A,KBD_CON_WCR ; LOAD WRITE COMMAND + EZ80_IO + OUT (C),A ; SEND COMMAND ; + LD C,(IY+KBD_DAT) ; LOAD DATA PORT + LD A,KBD_CON_IOF ; LOAD DISABLE INTERRUPTS CFG + EZ80_IO + OUT (C),A ; SEND DATA +; + XOR A ; SIGNAL SUCCESS + RET +#ENDIF ;__________________________________________________________________________________________________ ; KEYBOARD READ ;__________________________________________________________________________________________________ From e433eb4962713b46e5eca9d0ff7b86621967c8e7 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Wed, 11 Dec 2024 21:38:26 +0800 Subject: [PATCH 2/2] Refactor ps2 keyboard driver --- Source/HBIOS/kbd.asm | 45 +++++++++++++++++---------------------- Source/HBIOS/ps2iface.inc | 13 ++--------- 2 files changed, 22 insertions(+), 36 deletions(-) diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index b47753d7..8cc165fb 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -151,9 +151,9 @@ KBD_INIT2: CALL KBD_PUTCMD ; SEND IT #IF ((INTMODE == 2) & KBDINTS) - LD A,KBD_CON_ION ; XLAT DISABLED, MOUSE DISABLED, WITH INTS + LD A,KBD_CON_ION ; XLAT DISABLED, MOUSE DISABLED, INTS ON #ELSE - LD A,KBD_CON_IOF ; 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 @@ -217,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) @@ -233,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: @@ -246,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) @@ -261,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 ; ;__________________________________________________________________________________________________ diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 7145d482..4a57e00d 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -64,19 +64,10 @@ KBD_INT: ; KBD_DEINIT: LD IY,(KBD_IDAT) ; SETUP PORT POINTER -; - LD C,(IY+KBD_CMD) ; LOAD COMMAND PORT LD A,KBD_CON_WCR ; LOAD WRITE COMMAND - EZ80_IO - OUT (C),A ; SEND COMMAND -; - LD C,(IY+KBD_DAT) ; LOAD DATA PORT + CALL KBD_CMDOUT ; WRITE IT LD A,KBD_CON_IOF ; LOAD DISABLE INTERRUPTS CFG - EZ80_IO - OUT (C),A ; SEND DATA -; - XOR A ; SIGNAL SUCCESS - RET + JP KBD_DTAOUT ; WRITE IT #ENDIF ;__________________________________________________________________________________________________ ; KEYBOARD READ