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..8cc165fb 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 +; + 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 ; ;__________________________________________________________________________________________________ diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 13d746a2..4a57e00d 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -58,9 +58,17 @@ KBD_INT: ; CALL KBDQDBG ; 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 -; ;__________________________________________________________________________________________________ ; KEYBOARD READ ;__________________________________________________________________________________________________