From f9ed5651e6ba2fdc64d3525d298e3d16115da333 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 8 Dec 2024 13:37:09 -0800 Subject: [PATCH] KBD Interrupt Processing Cleanup - I finally realized there was a much simpler way to setup the instance data pointer (IY) for the interrupt handler. This implements the change and reduces the complexity of the code. - Related to PR #460 --- Doc/RomWBW Applications.pdf | Bin 366706 -> 366706 bytes Doc/RomWBW Disk Catalog.pdf | Bin 217482 -> 217482 bytes Doc/RomWBW Errata.pdf | Bin 28494 -> 28494 bytes Doc/RomWBW System Guide.pdf | Bin 613362 -> 613362 bytes Doc/RomWBW User Guide.pdf | Bin 852087 -> 852087 bytes Source/Doc/UserGuide.md | 2 +- Source/HBIOS/cvdu.asm | 8 -------- Source/HBIOS/gdc.asm | 8 -------- Source/HBIOS/hbios.asm | 11 ----------- Source/HBIOS/kbd.asm | 33 +++++++++++++++++++++++++++++---- Source/HBIOS/ps2iface.inc | 2 +- Source/HBIOS/tms.asm | 8 -------- Source/HBIOS/vga.asm | 8 -------- Source/HBIOS/vrc.asm | 8 -------- 14 files changed, 31 insertions(+), 57 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 87f219a0393d8a1a36d94d3b33c0de788e1b125d..6b792df23d5873e1d70dfb45da38261e7b09fd28 100644 GIT binary patch delta 139 zcmeygLG058v4$4L7N!>F7M3lntbwe?#wJE4)42j!^a}06MB8UjP6A delta 139 zcmeygLG058v4$4L7N!>F7M3lntbweCCPpR()42j!Poy?34U0qFF-7K9=oh%I;&FvIy%n2%qRj{+;DlSPZDyb++P2(~)u`o3=;!;(0 I^>^a}09-^P*8l(j diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 0896624b25d7b502562cd332c36d3a0bd265430b..bcb35b0b81eb7a22e6c4971d511009fe08d4f553 100644 GIT binary patch delta 111 zcmeBL%-gk?x1oixg=q`3q6(|Av5B$ibTt)bIS6yRrwa1}9cN2ZM+;|jGeaW_a|<(| g3L^t!3nxbl6LSMg6GvAQH#-FzLQ1CR1TxD302Is`mjD0& delta 111 zcmeBL%-gk?x1oixg=q`3q6({_iIJ(nbTt)bIS6yRrwa1}9cLF4Gb2Y6Q&Te&Hy2YE hV{9Izon1{$Oq}c#YzQftY?v<#0LT3rg#Z8m diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index b5e4abedd9fd6197fb8937fd9ae40edb30dab21c..458369892ae2de2cbd5bbc3794f3a74e33b3f4b4 100644 GIT binary patch delta 146 zcmeygUG>v;)rJF7M2#)7Pc1lEgY5aS&fZN42`DOz2}gFFt;y!&+#EU(aG7+ z(bd4k!o=0k&BD#n#nQyY%-qt<(8So$z}dvn$WFnAu##8>J3Fr8lEk8tilWpsE>jCr Ob7K=ORaIAiH!c7M)F~JM delta 146 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 Bic0_h delta 2934 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 [] - Set Console Interface/Baud code + I [] - Set Console Interface/Baud Rate V [] - View/Set HBIOS Diagnostic Verbosity [.] - Boot Disk Unit/Slice ``` diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index d33e96e8..8fce3e31 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -921,11 +921,3 @@ CVDU_IDAT: .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB CVDU_KBDST .DB CVDU_KBDDATA -; -; IF WE ARE USING PS2 INTERRUPTS, WE NEED TO PASS THE INSTANCE -; DATA POINTER TO PS2IFACE.INC VIA KBDIDAT FOR USE BY THE INTERRUPT -; HANDLER IN PS2IFACE.INC. -; -#IF (KBDINTS) -KBDIDAT .EQU CVDU_IDAT -#ENDIF diff --git a/Source/HBIOS/gdc.asm b/Source/HBIOS/gdc.asm index 9be0bcd4..6e0fc085 100644 --- a/Source/HBIOS/gdc.asm +++ b/Source/HBIOS/gdc.asm @@ -350,11 +350,3 @@ GDC_IDAT: .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB GDC_KBDST .DB GDC_KBDDATA -; -; IF WE ARE USING PS2 INTERRUPTS, WE NEED TO PASS THE INSTANCE -; DATA POINTER TO PS2IFACE.INC VIA KBDIDAT FOR USE BY THE INTERRUPT -; HANDLER IN PS2IFACE.INC. -; -#IF (KBDINTS) -KBDIDAT .EQU GDC_IDAT -#ENDIF diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index f94bfbc5..53333209 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3030,8 +3030,6 @@ HB_SPDTST: ;-------------------------------------------------------------------------------------------------- ; ENABLE INTERRUPTS ;-------------------------------------------------------------------------------------------------- -; - ;;;CALL HB_PREINT_HOOKS ; HACK TO ALLOW SOME DRIVERS TO DO PRE INTERRUPT STUFF ; #IFDEF TESTING ; @@ -9374,15 +9372,6 @@ SIZ_EZ80DRVS .EQU $ - ORG_EZ80DRVS MEMECHO "RTCDEF=" MEMECHO RTCDEF MEMECHO "\n" -;;;; -;;;; PRE-INTERRUPT HOOKS -;;;; -;;;HB_PREINT_HOOKS: -;;;; -;;;#IF (KBDENABLE) -;;; CALL KBD_PREINT_HOOK -;;;#ENDIF -;;; RET ; HB_DRIVERS_END .EQU $ ; diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 3b963e87..3d1e9f44 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -6,6 +6,16 @@ ; ROMWBW ADAPTATION BY WAYNE WARTHEN ; INTERRUPT DRIVER ADDITION BY PHIL SUMMERS ; +; THIS DRIVER IS INVOKED BY VIDEO DRIVERS AS NEEDED. WHEN INVOKED, +; THE VIDEO DRIVER IS RESPONSIBLE FOR SETTING IY TO THE INSTANCE +; DATA FOR IT'S INSTANCE OF THE KBD DRIVER. THIS ALLOWS THIS CODE +; TO BE REUSED BY MULTIPLE VIDEO DRIVERS USING MULTIPLE PS/2 KBD +; INTERFACES IN A SINGLE SYSTEM. +; +; WARNING: WHEN INTERRUPTS ARE ENABLED FOR THIS DRIVER (KBDINTS), IT IS +; *NOT* POSSIBLE TO HAVE MULTIPLE VIDEO DRIVERS USING THIS KBD DRIVER +; ACTIVELY IN A SYSTEM. THE USE OF INTERRUPTS IMPLIES ONLY ONE PS/2 +; KBD INTERFACE CAN BE USED CONCURRENTLY. ; ; IN DEBUG MODE: ; >>nn SHOWS HEX COMMAND nn BEING WRITTEN TO THE COMMAND PORT @@ -70,12 +80,22 @@ KBD_IDLE .DB 0 ; IDLE COUNT ;__________________________________________________________________________________________________ ; #INCLUDE "ps2iface.inc" +; +;__________________________________________________________________________________________________ +; KEYBOARD PRE-INITIALIZATION +;__________________________________________________________________________________________________ +; +; 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 +; +; AT STARTUP. NOT USING IT FOR NOW BECAUSE IT IS NOT A PROBLEM IF +; YOU DON'T USE THE KEYBOARD DURING BOOT. +; +;;;KBD_PREINT: ;;;; -;;;; 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 @@ -87,7 +107,7 @@ KBD_IDLE .DB 0 ; IDLE COUNT ;;; CALL KBD_IN_P ;;; DJNZ KBD_PREINT_HOOK1 ;;;#ENDIF - RET +;;; RET ; ;__________________________________________________________________________________________________ ; KEYBOARD INITIALIZATION @@ -127,6 +147,7 @@ KBD_INIT: KBD_INIT1: #IF ((INTMODE == 2) & KBDINTS) ; CALL KBDQINIT ; INITIALIZE QUEUE + LD (KBD_IDAT),IY ; SAVE IY FOR INT HANDLER LD HL,KBD_INT ; INSTALL VECTOR LD (IVT(INT_PS2KB)),HL ; IVT INDEX #ENDIF @@ -770,6 +791,10 @@ KBD_STR_MODEPS2 .TEXT "PS2$" KBD_STR_MODEVRC .TEXT "VRC$" KBD_STR_MODEUNK .TEXT "???$" ; +#IF ((INTMODE == 2) & KBDINTS) +KBD_IDAT .DW 0 ; ADR OF INSTANCE DATA FOR INTS +#ENDIF +; ; ; #IF (KBDKBLOUT == KBD_US) diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index 8ca320c4..ad99eb9b 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -38,7 +38,7 @@ KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER ; KBD_INT: ; CALL KBDQDBG - LD IY,KBDIDAT + LD IY,(KBD_IDAT) ; POINT TO INSTANCE DATA LD C,(IY+KBD_ST) ; READ CONTROLLER STATUS EZ80_IO IN A,(C) diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 07e08ad9..4439a90a 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -1189,14 +1189,6 @@ TMS_IDAT: .DB TMS_DATREG .DB TMS_CMDREG ; -; IF WE ARE USING PS2 INTERRUPTS, WE NEED TO PASS THE INSTANCE -; DATA POINTER TO PS2IFACE.INC VIA KBDIDAT FOR USE BY THE INTERRUPT -; HANDLER IN PS2IFACE.INC. -; -#IF ((TMSKBD == TMSKBD_KBD) & KBDINTS) -KBDIDAT .EQU TMS_IDAT -#ENDIF -; ;================================================================================================== ; TMS DRIVER - TMS9918 REGISTER INITIALIZATION ;================================================================================================== diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index c977415a..1b5e023b 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -1056,11 +1056,3 @@ VGA_IDAT: .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB VGA_KBDST .DB VGA_KBDDATA -; -; IF WE ARE USING PS2 INTERRUPTS, WE NEED TO PASS THE INSTANCE -; DATA POINTER TO PS2IFACE.INC VIA KBDIDAT FOR USE BY THE INTERRUPT -; HANDLER IN PS2IFACE.INC. -; -#IF (KBDINTS) -KBDIDAT .EQU VGA_IDAT -#ENDIF diff --git a/Source/HBIOS/vrc.asm b/Source/HBIOS/vrc.asm index e0986f7a..98b12a59 100644 --- a/Source/HBIOS/vrc.asm +++ b/Source/HBIOS/vrc.asm @@ -675,11 +675,3 @@ VRC_IDAT: .DB KBDMODE_VRC ; VGARC KEYBOARD CONTROLLER .DB VRC_KBDST .DB VRC_KBDDATA -; -; IF WE ARE USING PS2 INTERRUPTS, WE NEED TO PASS THE INSTANCE -; DATA POINTER TO PS2IFACE.INC VIA KBDIDAT FOR USE BY THE INTERRUPT -; HANDLER IN PS2IFACE.INC. -; -#IF (KBDINTS) -KBDIDAT .EQU VRC_IDAT -#ENDIF