Browse Source

Follow-up on KBD Interrupt Support

Related to PR #460
pull/470/head
Wayne Warthen 1 year ago
parent
commit
7606abb8f3
  1. 2
      Source/HBIOS/cfg_MASTER.asm
  2. 8
      Source/HBIOS/cvdu.asm
  3. 8
      Source/HBIOS/gdc.asm
  4. 28
      Source/HBIOS/hbios.asm
  5. 31
      Source/HBIOS/kbd.asm
  6. 35
      Source/HBIOS/ps2iface.inc
  7. 19
      Source/HBIOS/tms.asm
  8. 8
      Source/HBIOS/vga.asm
  9. 8
      Source/HBIOS/vrc.asm

2
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 CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW
CPUOSC .EQU 1000000 ; CPU OSC FREQ IN MHZ CPUOSC .EQU 1000000 ; CPU OSC FREQ IN MHZ
INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) 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) DEFSERCFG .EQU SER_9600_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM)
; ;
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) 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] PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE]
KBDKBLOUT .EQU KBD_US ; KBD 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] 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) DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTCMODE_[STD|MFPIC|K80W] DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTCMODE_[STD|MFPIC|K80W]

8
Source/HBIOS/cvdu.asm

@ -921,3 +921,11 @@ CVDU_IDAT:
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB CVDU_KBDST .DB CVDU_KBDST
.DB CVDU_KBDDATA .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

8
Source/HBIOS/gdc.asm

@ -350,3 +350,11 @@ GDC_IDAT:
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB GDC_KBDST .DB GDC_KBDST
.DB GDC_KBDDATA .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

28
Source/HBIOS/hbios.asm

@ -3030,6 +3030,23 @@ HB_SPDTST:
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; ENABLE INTERRUPTS ; 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 HB_EI ; INTERRUPTS SHOULD BE OK NOW
; ;
@ -7595,7 +7612,7 @@ Z2DMAADR2:
#ENDIF #ENDIF
; ;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; ROUTINES FOR NON VOLATILE (NVRAM) SWITCHES
; ROUTINES FOR NON VOLITILE (NVRAM) SWITCHES
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; ;
; RESET CONTENTS OF NVRAM, STORING INTO ; RESET CONTENTS OF NVRAM, STORING INTO
@ -9357,6 +9374,15 @@ SIZ_EZ80DRVS .EQU $ - ORG_EZ80DRVS
MEMECHO "RTCDEF=" MEMECHO "RTCDEF="
MEMECHO RTCDEF MEMECHO RTCDEF
MEMECHO "\n" MEMECHO "\n"
;;;;
;;;; PRE-INTERRUPT HOOKS
;;;;
;;;HB_PREINT_HOOKS:
;;;;
;;;#IF (KBDENABLE)
;;; CALL KBD_PREINT_HOOK
;;;#ENDIF
;;; RET
; ;
HB_DRIVERS_END .EQU $ HB_DRIVERS_END .EQU $
; ;

31
Source/HBIOS/kbd.asm

@ -8,7 +8,7 @@
; ;
; ;
; IN DEBUG MODE: ; 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 ; >nn SHOWS HEX VALUE nn BEING WRITTEN TO THE DATA PORT
; <nn SHOWS HEX VALUE READ FROM DATA PORT ; <nn SHOWS HEX VALUE READ FROM DATA PORT
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
@ -70,6 +70,25 @@ KBD_IDLE .DB 0 ; IDLE COUNT
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; ;
#INCLUDE "ps2iface.inc" #INCLUDE "ps2iface.inc"
;;;;
;;;; 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
;;; 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
;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; KEYBOARD INITIALIZATION ; KEYBOARD INITIALIZATION
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
@ -79,7 +98,7 @@ KBD_INIT:
PRTS("KBD: IO=0x$") ; DISPLAY PRTS("KBD: IO=0x$") ; DISPLAY
LD A,(IY+KBD_DAT) ; PORT SETTING LD A,(IY+KBD_DAT) ; PORT SETTING
CALL PRTHEXBYTE CALL PRTHEXBYTE
#IF ((INTMODE == 2) & INTPS2KBD)
#IF ((INTMODE == 2) & KBDINTS)
PRTS(" INT #$") ; DISPLAY PRTS(" INT #$") ; DISPLAY
LD A,INT_PS2KB ; INTERRUPT SETTING LD A,INT_PS2KB ; INTERRUPT SETTING
CALL PRTDECB CALL PRTDECB
@ -94,7 +113,7 @@ KBD_INIT:
CP KBDMODE_VRC ; VRC? CP KBDMODE_VRC ; VRC?
JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT
; ;
#IF ((INTMODE == 2) & INTPS2KBD)
#IF ((INTMODE == 2) & KBDINTS)
HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE
#ENDIF #ENDIF
LD A,$AA ; CONTROLLER SELF TEST LD A,$AA ; CONTROLLER SELF TEST
@ -103,14 +122,14 @@ KBD_INIT:
; ;
CP $55 ; IS IT THERE? CP $55 ; IS IT THERE?
JR Z,KBD_INIT1 ; IF SO, CONTINUE JR Z,KBD_INIT1 ; IF SO, CONTINUE
#IF ((INTMODE == 2) & INTPS2KBD)
#IF ((INTMODE == 2) & KBDINTS)
HB_EI ; RESTORE INTERRUPTS HB_EI ; RESTORE INTERRUPTS
#ENDIF #ENDIF
PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM
RET ; BAIL OUT RET ; BAIL OUT
; ;
KBD_INIT1: KBD_INIT1:
#IF ((INTMODE == 2) & INTPS2KBD)
#IF ((INTMODE == 2) & KBDINTS)
; CALL KBDQINIT ; INITIALIZE QUEUE ; CALL KBDQINIT ; INITIALIZE QUEUE
LD HL,KBD_INT ; INSTALL VECTOR LD HL,KBD_INT ; INSTALL VECTOR
LD (IVT(INT_PS2KB)),HL ; IVT INDEX LD (IVT(INT_PS2KB)),HL ; IVT INDEX
@ -131,7 +150,7 @@ KBD_INIT2:
LD A,$60 ; SET COMMAND REGISTER LD A,$60 ; SET COMMAND REGISTER
CALL KBD_PUTCMD ; SEND IT CALL KBD_PUTCMD ; SEND IT
#IF ((INTMODE == 2) & INTPS2KBD)
#IF ((INTMODE == 2) & KBDINTS)
LD A,$21 ; XLAT DISABLED, MOUSE DISABLED, WITH INTS LD A,$21 ; XLAT DISABLED, MOUSE DISABLED, WITH INTS
#ELSE #ELSE
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS

35
Source/HBIOS/ps2iface.inc

@ -8,34 +8,7 @@
; CURRENTLY CONFIGURED FOR INT #2 ON DUODYNE WITH I/O MULTI BOARD. ; 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 ; KEYBOARD QUEUE FOR INTERRUPTS
@ -113,7 +86,7 @@ KBDQFULL: ; RETURN Z IF QUEUE IS FULL
; KEYBOARD READ ; KEYBOARD READ
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; ;
#IF ((INTMODE == 2) & INTPS2KBD))
#IF ((INTMODE == 2) & KBDINTS))
; ;
; RETURN A BYTE TO FROM KEYBOARD QUEUE ; RETURN A BYTE TO FROM KEYBOARD QUEUE
; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE. ; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE.
@ -153,7 +126,7 @@ KBD_IN_P:
; KEYBOARD INPUT STATUS ; KEYBOARD INPUT STATUS
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; ;
#IF ((INTMODE == 2) & INTPS2KBD))
#IF ((INTMODE == 2) & KBDINTS))
KBD_IST: KBD_IST:
KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE
LD A,(KBDQPUTX) ; Z STATUS AND ZERO IF NONE LD A,(KBDQPUTX) ; Z STATUS AND ZERO IF NONE
@ -204,7 +177,7 @@ KBD_OST:
; DEBUG QUEUE ; DEBUG QUEUE
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; ;
#IF ((INTMODE == 2) & INTPS2KBD & 0)
#IF ((INTMODE == 2) & KBDINTS & 0)
KBDQDBG: KBDQDBG:
PUSH HL PUSH HL
PUSH DE PUSH DE

19
Source/HBIOS/tms.asm

@ -211,7 +211,7 @@ TMS_PREINIT:
RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT
LD (TMS_INITVDU_REG_1), A LD (TMS_INITVDU_REG_1), A
LD C, TMSCTRL1 LD C, TMSCTRL1
JP TMS_SET
JP TMS_SET_X ; SET REG W/O INT MGMT
; ;
TMS_INIT: TMS_INIT:
#IF (CPUFAM == CPU_Z180) #IF (CPUFAM == CPU_Z180)
@ -584,10 +584,18 @@ TMS_READ:
;---------------------------------------------------------------------- ;----------------------------------------------------------------------
; SET TMS9918 REGISTER VALUE ; SET TMS9918 REGISTER VALUE
; TMS_SET WRITES VALUE IN A TO VDU REGISTER SPECIFIED IN C ; 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: TMS_SET:
; NORMALLY, WE WRAP REG CHANGES WITH DI/EI TO AVOID CONFLICTS
HB_DI HB_DI
CALL TMS_SET_X
HB_EI
RET
;
TMS_SET_X:
; ENTRY POINT W/O INT MGMT NEEDED BY TMS_PREINIT
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A ; WRITE IT OUT (TMS_CMDREG),A ; WRITE IT
TMS_IODELAY TMS_IODELAY
@ -596,7 +604,6 @@ TMS_SET:
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A ; SELECT THE DESIRED REGISTER OUT (TMS_CMDREG),A ; SELECT THE DESIRED REGISTER
TMS_IODELAY TMS_IODELAY
HB_EI
RET RET
; ;
;---------------------------------------------------------------------- ;----------------------------------------------------------------------
@ -1182,6 +1189,14 @@ TMS_IDAT:
.DB TMS_DATREG .DB TMS_DATREG
.DB TMS_CMDREG .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 ; TMS DRIVER - TMS9918 REGISTER INITIALIZATION
;================================================================================================== ;==================================================================================================

8
Source/HBIOS/vga.asm

@ -1056,3 +1056,11 @@ VGA_IDAT:
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB VGA_KBDST .DB VGA_KBDST
.DB VGA_KBDDATA .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

8
Source/HBIOS/vrc.asm

@ -675,3 +675,11 @@ VRC_IDAT:
.DB KBDMODE_VRC ; VGARC KEYBOARD CONTROLLER .DB KBDMODE_VRC ; VGARC KEYBOARD CONTROLLER
.DB VRC_KBDST .DB VRC_KBDST
.DB VRC_KBDDATA .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

Loading…
Cancel
Save