diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 367a234d..267fbc19 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -64,7 +64,6 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 1000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -INTPS2KBD .EQU FALSE ; USE INTERRUPTS FOR PS2 KEYBOARD DEFSERCFG .EQU SER_9600_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) @@ -174,6 +173,7 @@ KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +KBDINTS .EQU FALSE ; ENABLE KBD (PS2) KEYBOARD INTERRUPTS ; DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTCMODE_[STD|MFPIC|K80W] diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 8fce3e31..d33e96e8 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -921,3 +921,11 @@ 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 6e0fc085..9be0bcd4 100644 --- a/Source/HBIOS/gdc.asm +++ b/Source/HBIOS/gdc.asm @@ -350,3 +350,11 @@ 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 97135665..f94bfbc5 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3030,6 +3030,23 @@ HB_SPDTST: ;-------------------------------------------------------------------------------------------------- ; ENABLE INTERRUPTS ;-------------------------------------------------------------------------------------------------- +; + ;;;CALL HB_PREINT_HOOKS ; HACK TO ALLOW SOME DRIVERS TO DO PRE INTERRUPT STUFF +; +#IFDEF TESTING +; +INTTEST: + ; TEST TO SEE IF SOMEBODY ENABLED INTS EARLY! + LD A,I + JP PO,INTTEST_Z ; IF PO, INTS DISABLED AS EXPECTED + PRTX(STR_INTWARN) ; WARNING + JR INTTEST_Z ; CONTINUE +; +STR_INTWARN .TEXT "\r\n\r\nWARNING: INTERRUPTS ENABLED TOO EARLY!!!$" +; +INTTEST_Z: +; +#ENDIF ; HB_EI ; INTERRUPTS SHOULD BE OK NOW ; @@ -7595,7 +7612,7 @@ Z2DMAADR2: #ENDIF ; ;-------------------------------------------------------------------------------------------------- -; ROUTINES FOR NON VOLATILE (NVRAM) SWITCHES +; ROUTINES FOR NON VOLITILE (NVRAM) SWITCHES ;-------------------------------------------------------------------------------------------------- ; ; RESET CONTENTS OF NVRAM, STORING INTO @@ -9357,6 +9374,15 @@ 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 bbd7cfa8..3b963e87 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -8,7 +8,7 @@ ; ; ; IN DEBUG MODE: -: >>nn SHOWS HEX COMMAND nn BEING WRITTEN TO THE COMMAND PORT +; >>nn SHOWS HEX COMMAND nn BEING WRITTEN TO THE COMMAND PORT ; >nn SHOWS HEX VALUE nn BEING WRITTEN TO THE DATA PORT ; = 2) PUSH AF CALL PC_SPACE @@ -275,36 +289,52 @@ KBD_GETDATA1: OR A ; SET FLAGS RET ; -;__________________________________________________________________________________________________ -KBD_GETDATA_P: +KBD_GETDATA_Q: ; -; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. -; KBD_GETDATA_P ALWAYS READS A BYTE FROM THE KEYBOARD CONTROLLER PORT. +; GET A QUEUED DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. +; KBD_GETDATA_Q ALWAYS READS A BYTE FROM THE KEYBOARD INTERRUPT QUEUE. +; +#IF ((INTMODE == 2) & KBDINTS)) ; LD B,KBD_WAITTO ; SETUP TO LOOP -KBD_GETDATA0_P: - CALL KBD_IST_P ; GET INPUT REGISTER STATUS - JR NZ,KBD_GETDATA1_P ; BYTE PENDING, GO GET IT +KBD_GETDATA0_Q: + CALL KBD_IST_Q ; GET INPUT REGISTER STATUS + JR NZ,KBD_GETDATA1_Q ; BYTE PENDING, GO GET IT CALL DELAY ; WAIT A BIT - DJNZ KBD_GETDATA0_P ; LOOP UNTIL COUNTER EXHAUSTED + DJNZ KBD_GETDATA0_Q ; LOOP UNTIL COUNTER EXHAUSTED XOR A ; NO DATA, RETURN ZERO RET -KBD_GETDATA1_P: - CALL KBD_IN_P ; GET A KEY -#IF (KBDTRACE >= 2) +KBD_GETDATA1_Q: + CALL KBD_IN_Q ; GET A KEY + #IF (KBDTRACE >= 2) PUSH AF CALL PC_SPACE CALL PC_LT CALL PRTHEXBYTE POP AF -#ENDIF + #ENDIF OR A ; SET FLAGS RET ; +#ENDIF +; +; GET A DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT. +; DEPENDING ON ASSEMBLY CONFIGURATION KBD_GETDATA READS A BYTE FROM +; EITHER THE INTERRUPT QUEUE OR FROM THE KEYBOARD CONTROLLER PORT. +; +#IF ((INTMODE == 2) & KBDINTS)) +KBD_GETDATA .EQU KBD_GETDATA_Q +KBD_GETDATA1 .EQU KBD_GETDATA1_Q +#ELSE +KBD_GETDATA .EQU KBD_GETDATA_P +KBD_GETDATA1 .EQU KBD_GETDATA1_P +#ENDIF +; ;__________________________________________________________________________________________________ KBD_GETDATAX: ; -; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT +; GET A DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NO TIMEOUT +; IF NOTHING AVAILABLE, RETURN 0. ; CALL KBD_IST ; GET INPUT REGISTER STATUS RET Z ; NOTHING THERE, DONE diff --git a/Source/HBIOS/ps2iface.inc b/Source/HBIOS/ps2iface.inc index ffab23de..8ca320c4 100644 --- a/Source/HBIOS/ps2iface.inc +++ b/Source/HBIOS/ps2iface.inc @@ -8,34 +8,7 @@ ; CURRENTLY CONFIGURED FOR INT #2 ON DUODYNE WITH I/O MULTI BOARD. ;__________________________________________________________________________________________________ ; -#IF ((INTMODE == 2) & INTPS2KBD)) -; -; SETUP POINTER TO KEYBOARD PORT -; -#IF (TMSENABLE) -KBDIDAT .EQU TMS_IDAT ; KBD INSTANCE DATA TABLE -#ELSE - -#IF (GDCENABLE) -KBDIDAT .EQU GDC_IDAT ; KBD INSTANCE DATA TABLE -#ELSE - -#IF (CVDUENABLE) -KBDIDAT .EQU CVDU_IDAT ; KBD INSTANCE DATA TABLE -#ELSE - -#IF (VRCENABLE) -KBDIDAT .EQU VRC_IDAT ; KBD INSTANCE DATA TABLE -#ELSE - -#IF (VGAENABLE) -KBDIDAT .EQU VGA_IDAT ; KBD INSTANCE DATA TABLE -#ENDIF - -#ENDIF -#ENDIF -#ENDIF -#ENDIF +#IF ((INTMODE == 2) & KBDINTS)) ; ;__________________________________________________________________________________________________ ; KEYBOARD QUEUE FOR INTERRUPTS @@ -109,16 +82,24 @@ KBDQFULL: ; RETURN Z IF QUEUE IS FULL SUB KBDQSIZ RET #ENDIF +; ;__________________________________________________________________________________________________ ; KEYBOARD READ ;__________________________________________________________________________________________________ ; -#IF ((INTMODE == 2) & INTPS2KBD)) +; READ DIRECT FROM PORT ; -; RETURN A BYTE TO FROM KEYBOARD QUEUE -; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE. +KBD_IN_P: + LD C,(IY+KBD_DAT) ; DATA PORT + EZ80_IO + IN A,(C) ; GET THE DATA VALUE + RET ; -KBD_IN: +; READ FROM INTERRUPT QUEUE +; +#IF ((INTMODE == 2) & KBDINTS)) +; +KBD_IN_Q: KBDQPOP: CALL KBDQLEN RET Z ; EXIT IF THE QUEUE IS EMPTY @@ -137,38 +118,50 @@ KBDQPOP: ; RET ; -#ELSE +#ENDIF ; -; RETURN A BYTE FROM THE KEYBOARD PORT +; RETURN A BYTE TO FROM KEYBOARD QUEUE +; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE. ; -KBD_IN: +#IF ((INTMODE == 2) & KBDINTS)) +KBD_IN .EQU KBD_IN_Q +#ELSE +KBD_IN .EQU KBD_IN_P #ENDIF -KBD_IN_P: - LD C,(IY+KBD_DAT) ; DATA PORT - EZ80_IO - IN A,(C) ; GET THE DATA VALUE - RET ; ;__________________________________________________________________________________________________ ; KEYBOARD INPUT STATUS ;__________________________________________________________________________________________________ ; -#IF ((INTMODE == 2) & INTPS2KBD)) -KBD_IST: +; DIRECT PORT STATUS READ +; +KBD_IST_P: + LD C,(IY+KBD_ST) ; STATUS PORT + EZ80_IO + IN A,(C) ; GET STATUS + AND $01 ; ISOLATE INPUT PENDING BIT + RET +; +; STATUS FROM INTERRUPT QUEUE +; +#IF ((INTMODE == 2) & KBDINTS)) +; +KBD_IST_Q: KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE LD A,(KBDQPUTX) ; Z STATUS AND ZERO IF NONE LD HL,KBDQGETX SUB (HL) RET +; +#ENDIF +; +; RETURN INDICATION OF KEYBOARD DATA READY +; +#IF ((INTMODE == 2) & KBDINTS)) +KBD_IST .EQU KBD_IST_Q #ELSE -KBD_IST: +KBD_IST .EQU KBD_IST_P #ENDIF -KBD_IST_P: ; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING - LD C,(IY+KBD_ST) ; STATUS PORT - EZ80_IO - IN A,(C) ; GET STATUS - AND $01 ; ISOLATE INPUT PENDING BIT - RET ; ;__________________________________________________________________________________________________ ; OUTPUT TO KEYBOARD COMMAND PORT @@ -204,7 +197,7 @@ KBD_OST: ; DEBUG QUEUE ;__________________________________________________________________________________________________ ; -#IF ((INTMODE == 2) & INTPS2KBD & 0) +#IF ((INTMODE == 2) & KBDINTS & 0) KBDQDBG: PUSH HL PUSH DE diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 3da3ea5b..0df121d1 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -2495,6 +2495,7 @@ str_help .db "\r\n" .db "\r\n D - Device Inventory" .db "\r\n R - Reboot System" #if (BIOS == BIOS_WBW) + .db "\r\n W - RomWBW Configure" .db "\r\n I [] - Set Console Interface/Baud code" .db "\r\n V [] - View/Set HBIOS Diagnostic Verbosity" #endif diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index e8f57b37..07e08ad9 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -211,7 +211,7 @@ TMS_PREINIT: RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT LD (TMS_INITVDU_REG_1), A LD C, TMSCTRL1 - JP TMS_SET + JP TMS_SET_X ; SET REG W/O INT MGMT ; TMS_INIT: #IF (CPUFAM == CPU_Z180) @@ -584,10 +584,18 @@ TMS_READ: ;---------------------------------------------------------------------- ; SET TMS9918 REGISTER VALUE ; TMS_SET WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C +; TMS_SET_X IS A VARIANT THAT DOES NOT DO INT MGMT (TMS_PREINIT) ;---------------------------------------------------------------------- ; TMS_SET: + ; NORMALLY, WE WRAP REG CHANGES WITH DI/EI TO AVOID CONFLICTS HB_DI + CALL TMS_SET_X + HB_EI + RET +; +TMS_SET_X: + ; ENTRY POINT W/O INT MGMT NEEDED BY TMS_PREINIT EZ80_IO OUT (TMS_CMDREG),A ; WRITE IT TMS_IODELAY @@ -596,7 +604,6 @@ TMS_SET: EZ80_IO OUT (TMS_CMDREG),A ; SELECT THE DESIRED REGISTER TMS_IODELAY - HB_EI RET ; ;---------------------------------------------------------------------- @@ -1182,6 +1189,14 @@ 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 1b5e023b..c977415a 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -1056,3 +1056,11 @@ 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 98b12a59..e0986f7a 100644 --- a/Source/HBIOS/vrc.asm +++ b/Source/HBIOS/vrc.asm @@ -675,3 +675,11 @@ 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 diff --git a/Source/Images/d_bascomp/u0/M80.COM b/Source/Images/d_bascomp/u0/M80.COM index 9df2cc12..d5460657 100644 Binary files a/Source/Images/d_bascomp/u0/M80.COM and b/Source/Images/d_bascomp/u0/M80.COM differ diff --git a/Source/ver.inc b/Source/ver.inc index 0ec376c5..d7c982bf 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.98" +#DEFINE BIOSVER "3.5.0-dev.99" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 8fa7f74b..fa768e8b 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.98" + db "3.5.0-dev.99" endm