Browse Source

Merge pull request #460 from b1ackmai1er/master

Master
pull/470/head
Wayne Warthen 1 year ago
committed by GitHub
parent
commit
e3192bfbe6
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      Source/HBIOS/cfg_MASTER.asm
  2. 6
      Source/HBIOS/fv.asm
  3. 8
      Source/HBIOS/hbios.asm
  4. 8
      Source/HBIOS/hbios.inc
  5. 120
      Source/HBIOS/kbd.asm
  6. 2
      Source/HBIOS/mky.asm
  7. 2
      Source/HBIOS/pio_ps.asm
  8. 246
      Source/HBIOS/ps2iface.inc
  9. 2
      Source/HBIOS/s100mon.z80
  10. 1
      Source/HBIOS/std.asm
  11. 4
      Source/HBIOS/vrc.asm

1
Source/HBIOS/cfg_MASTER.asm

@ -64,6 +64,7 @@ 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!!!)

6
Source/HBIOS/fv.asm

@ -1,6 +1,6 @@
;====================================================================== ;======================================================================
; VIDEO DRIVER FOR FPGA VGA ; VIDEO DRIVER FOR FPGA VGA
; http://s100computers.com/My%20System%20Pages/FPGA%20Z80%20SBC/FPGA%20Z80%20SBC.htm
; http://s100computers.com/My%20System%20Pages/FPGA%20Z80%20SBC/FPGA%20Z80%20SBC.htm
; ;
; WRITTEN BY: WAYNE WARTHEN -- 9/2/2024 ; WRITTEN BY: WAYNE WARTHEN -- 9/2/2024
;====================================================================== ;======================================================================
@ -36,8 +36,8 @@ FV_CTL .EQU FV_BASE+2 ; VGA CONTROL PORT
; ;
FV_BUFCTL .EQU $08 FV_BUFCTL .EQU $08
; ;
FV_KBDDATA .EQU $03
FV_KBDST .EQU $02
FV_KBDDATA .EQU $03 ; KBD CTLR DATA PORT
FV_KBDST .EQU $02 ; KBD CTLR STATUS/CMD PORT
; ;
FV_ROWS .EQU 40 FV_ROWS .EQU 40
FV_COLS .EQU 80 FV_COLS .EQU 80

8
Source/HBIOS/hbios.asm

@ -467,7 +467,7 @@ CB_HEAPTOP .DW 0
CB_SWITCHES .DB 0 ; this byte is set during init CB_SWITCHES .DB 0 ; this byte is set during init
; ;
; Byte 0: (L) ; Byte 0: (L)
; Bit 7-0 DISK BOOT SLice Number to Boot -> default = 0
; Bit 7-0 DISK BOOT Slice Number to Boot -> default = 0
; Bit 7-0 ROM BOOT (alpha character) Application to boot -> default = "H" ; Bit 7-0 ROM BOOT (alpha character) Application to boot -> default = "H"
; Byte 1: (H) ; Byte 1: (H)
; Bit 7 - ROM/DISK - Rom or Disk Boot -> Default=ROM=1 (AUTO_CMD is Numeric/Alpha) ; Bit 7 - ROM/DISK - Rom or Disk Boot -> Default=ROM=1 (AUTO_CMD is Numeric/Alpha)
@ -1137,7 +1137,7 @@ HBX_INTSTK .EQU $
; --- -------------- -------------- -------------- -------------- -------------- ; --- -------------- -------------- -------------- -------------- --------------
; 0 CTC0A INT1 -+ -+ -+ HCCARCV -+ ; 0 CTC0A INT1 -+ -+ -+ HCCARCV -+
; 1 CTC0B INT2 | | | HCCASND | ; 1 CTC0B INT2 | | | HCCASND |
; 2 CTC0C TIM0 | | IM2 | IM2 NABUKB | IM2
; 2 CTC0C TIM0 | | IM2 PS2KBD | IM2 NABUKB | IM2
; 3 CTC0D TIM1 | | INT | INT VDP | INT ; 3 CTC0D TIM1 | | INT | INT VDP | INT
; 4 UART0 DMA0 | Z180 UART0 | VEC UART0 | VEC OPTCRD0 | VEC ; 4 UART0 DMA0 | Z180 UART0 | VEC UART0 | VEC OPTCRD0 | VEC
; 5 UART1 DMA1 | CPU UART1 | GEN UART1 | GEN OPTCRD1 | GEN ; 5 UART1 DMA1 | CPU UART1 | GEN UART1 | GEN OPTCRD1 | GEN
@ -2361,7 +2361,7 @@ HB_CPU1:
CALL SN76489_PREINIT CALL SN76489_PREINIT
#ENDIF #ENDIF
#IF (DSRTCENABLE) #IF (DSRTCENABLE)
; THE DSRTC NEEDS TO BE INITIALIZED IN ORDER TO PERFROM THE
; THE DSRTC NEEDS TO BE INITIALIZED IN ORDER TO PERFORM THE
; CPU SPEED DETECTION BELOW. ; CPU SPEED DETECTION BELOW.
CALL DSRTC_PREINIT CALL DSRTC_PREINIT
#ENDIF #ENDIF
@ -7595,7 +7595,7 @@ Z2DMAADR2:
#ENDIF #ENDIF
; ;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; ROUTINES FOR NON VOLITILE (NVRAM) SWITCHES
; ROUTINES FOR NON VOLATILE (NVRAM) SWITCHES
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; ;
; RESET CONTENTS OF NVRAM, STORING INTO ; RESET CONTENTS OF NVRAM, STORING INTO

8
Source/HBIOS/hbios.inc

@ -121,7 +121,7 @@ BF_SYSGET_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR
BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT
BF_SYSGET_SNDFN .EQU $51 ; GET SND UNIT FN/DATA ADR BF_SYSGET_SNDFN .EQU $51 ; GET SND UNIT FN/DATA ADR
; ;
BF_SYSGET_SWITCH .EQU $C0 ; GET NON VOLITILE SWITCH VALUE
BF_SYSGET_SWITCH .EQU $C0 ; GET NON VOLATILE SWITCH VALUE
BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE
BF_SYSGET_SECS .EQU $D1 ; GET CURRENT SECONDS VALUE BF_SYSGET_SECS .EQU $D1 ; GET CURRENT SECONDS VALUE
BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION
@ -132,7 +132,7 @@ BF_SYSGET_CPUSPD .EQU $F3 ; GET CLOCK SPEED & WAIT STATES
BF_SYSGET_PANEL .EQU $F4 ; GET FRONT PANEL SWITCHES VAL BF_SYSGET_PANEL .EQU $F4 ; GET FRONT PANEL SWITCHES VAL
BF_SYSGET_APPBNKS .EQU $F5 ; GET APP BANK INFORMATION BF_SYSGET_APPBNKS .EQU $F5 ; GET APP BANK INFORMATION
; ;
BF_SYSSET_SWITCH .EQU $C0 ; SET NON VOLITILE SWITCH VALUE
BF_SYSSET_SWITCH .EQU $C0 ; SET NON VOLATILE SWITCH VALUE
BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE
BF_SYSSET_SECS .EQU $D1 ; SET SECONDS VALUE BF_SYSSET_SECS .EQU $D1 ; SET SECONDS VALUE
BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION
@ -339,7 +339,7 @@ SW_OPT .EQU %00000111 ; SLICE/ROM APP
; ;
; NVRAM SWITCHES ; NVRAM SWITCHES
; ;
; used for identifying Non Volitile Switches
; used for identifying Non Volatile Switches
NVSW_BOOTOPTS .EQU 1 ; Boot Options NVRAM Switch NVSW_BOOTOPTS .EQU 1 ; Boot Options NVRAM Switch
NVSW_AUTOBOOT .EQU 3 ; Auto Boot NVRAM Switch NVSW_AUTOBOOT .EQU 3 ; Auto Boot NVRAM Switch
; ;
@ -347,7 +347,7 @@ NVSW_AUTOBOOT .EQU 3 ; Auto Boot NVRAM Switch
; ;
; AUTO BOOT MASKS ; AUTO BOOT MASKS
ABOOT_AUTO .EQU %00100000 ; AUTO=1/MANUAL=0 BOOT ABOOT_AUTO .EQU %00100000 ; AUTO=1/MANUAL=0 BOOT
ABOOT_TIMEOUT .EQU %00001111 ; MENU TIMEOUT IN SECONDS, 0=IMMEDIAGE
ABOOT_TIMEOUT .EQU %00001111 ; MENU TIMEOUT IN SECONDS, 0=IMMEDIATE
; DEFAULT BOOT MASKS ; DEFAULT BOOT MASKS
BOPTS_ROM .EQU %10000000 ; ROM=1/DISK=0 FLAG BOPTS_ROM .EQU %10000000 ; ROM=1/DISK=0 FLAG
BOPTS_UNIT .EQU %01111111 ; DISK UNIT BOPTS_UNIT .EQU %01111111 ; DISK UNIT

120
Source/HBIOS/kbd.asm

@ -4,6 +4,13 @@
; ;
; ORIGINAL CODE BY DR JAMES MOXHAM ; ORIGINAL CODE BY DR JAMES MOXHAM
; ROMWBW ADAPTATION BY WAYNE WARTHEN ; ROMWBW ADAPTATION BY WAYNE WARTHEN
; INTERRUPT DRIVER ADDITION BY PHIL SUMMERS
;
;
; IN DEBUG MODE:
: >>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 READ FROM DATA PORT
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; ;
; TODO: ; TODO:
@ -42,7 +49,7 @@ KBD_NUMPAD .EQU 80H ; BIT 7, NUM PAD KEY (KEY PRESSED IS ON NUM PAD)
; ;
KBD_DEFRPT .EQU $40 ; DEFAULT REPEAT RATE (.5 SEC DELAY, 30CPS) KBD_DEFRPT .EQU $40 ; DEFAULT REPEAT RATE (.5 SEC DELAY, 30CPS)
KBD_DEFSTATE .EQU KBD_NUMLCK ; DEFAULT STATE (NUM LOCK ON) KBD_DEFSTATE .EQU KBD_NUMLCK ; DEFAULT STATE (NUM LOCK ON)
;
KBD_ACK .EQU $FA ; CMD ACKNOWLEDGE
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; DATA ; DATA
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
@ -59,14 +66,24 @@ KBD_IDLE .DB 0 ; IDLE COUNT
DEVECHO "KBD: ENABLED\n" DEVECHO "KBD: ENABLED\n"
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; HARDWARE LEVEL INTERFACE
;__________________________________________________________________________________________________
;
#INCLUDE "ps2iface.inc"
;__________________________________________________________________________________________________
; KEYBOARD INITIALIZATION ; KEYBOARD INITIALIZATION
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; ;
KBD_INIT: KBD_INIT:
CALL NEWLINE ; FORMATTING CALL NEWLINE ; FORMATTING
PRTS("KBD: IO=0x$")
LD A,(IY+KBD_DAT)
PRTS("KBD: IO=0x$") ; DISPLAY
LD A,(IY+KBD_DAT) ; PORT SETTING
CALL PRTHEXBYTE CALL PRTHEXBYTE
#IF ((INTMODE == 2) & INTPS2KBD)
PRTS(" INT #$") ; DISPLAY
LD A,INT_PS2KB ; INTERRUPT SETTING
CALL PRTDECB
#ENDIF
; ;
LD A,KBD_DEFRPT ; GET DEFAULT REPEAT RATE LD A,KBD_DEFRPT ; GET DEFAULT REPEAT RATE
LD (KBD_REPEAT),A ; SAVE IT LD (KBD_REPEAT),A ; SAVE IT
@ -77,16 +94,28 @@ 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)
HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE
#ENDIF
LD A,$AA ; CONTROLLER SELF TEST LD A,$AA ; CONTROLLER SELF TEST
CALL KBD_PUTCMD ; SEND IT CALL KBD_PUTCMD ; SEND IT
CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK)
CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK)
; ;
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)
HB_EI ; RESTORE INTERRUPTS
#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)
; CALL KBDQINIT ; INITIALIZE QUEUE
LD HL,KBD_INT ; INSTALL VECTOR
LD (IVT(INT_PS2KB)),HL ; IVT INDEX
HB_EI ; ENABLE INTERUPTS
#ENDIF
PRTS(" MODE=$") ; TAG PRTS(" MODE=$") ; TAG
LD A,(IY+KBD_MODE) ; GET MODE VALUE LD A,(IY+KBD_MODE) ; GET MODE VALUE
LD DE,KBD_STR_MODEPS2 LD DE,KBD_STR_MODEPS2
@ -101,8 +130,12 @@ KBD_INIT2:
; ;
LD A,$60 ; SET COMMAND REGISTER LD A,$60 ; SET COMMAND REGISTER
CALL KBD_PUTCMD ; SEND IT CALL KBD_PUTCMD ; SEND IT
; LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS
#IF ((INTMODE == 2) & INTPS2KBD)
LD A,$21 ; XLAT DISABLED, MOUSE DISABLED, WITH INTS
#ELSE
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS
#ENDIF
CALL KBD_PUTDATA ; SEND IT CALL KBD_PUTDATA ; SEND IT
CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED
@ -159,35 +192,6 @@ KBD_FLUSH:
RET RET
; ;
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
; HARDWARE INTERFACE
;__________________________________________________________________________________________________
;
;__________________________________________________________________________________________________
KBD_IST:
;
; KEYBOARD INPUT STATUS
; 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
;
;__________________________________________________________________________________________________
KBD_OST:
;
; KEYBOARD OUTPUT STATUS
; A=0, Z SET FOR NOT READY, OTHERWISE READY TO WRITE
;
LD C,(IY+KBD_ST) ; STATUS PORT
EZ80_IO
IN A,(C) ; GET STATUS
AND $02 ; ISOLATE OUTPUT EMPTY BIT
XOR $02 ; FLIP IT FOR APPROPRIATE RETURN VALUES
RET
;
;__________________________________________________________________________________________________
KBD_PUTCMD: KBD_PUTCMD:
; ;
; PUT A CMD BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT ; PUT A CMD BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT
@ -211,9 +215,7 @@ KBD_PUTCMD1:
CALL PC_GT CALL PC_GT
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
LD C,(IY+KBD_CMD) ; COMMAND PORT
EZ80_IO
OUT (C),A ; WRITE IT
CALL KBD_CMDOUT ; OUTPUT CMD TO PORT
KBD_PUTCMD2: KBD_PUTCMD2:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
@ -241,9 +243,7 @@ KBD_PUTDATA1:
CALL PC_GT CALL PC_GT
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
LD C,(IY+KBD_DAT) ; DATA PORT
EZ80_IO
OUT (C),A ; WRITE IT
CALL KBD_DTAOUT ; WRITE IT
KBD_PUTDATA2: KBD_PUTDATA2:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
@ -251,7 +251,9 @@ KBD_PUTDATA2:
;__________________________________________________________________________________________________ ;__________________________________________________________________________________________________
KBD_GETDATA: KBD_GETDATA:
; ;
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT
; GET A RAW 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.
; ;
LD B,KBD_WAITTO ; SETUP TO LOOP LD B,KBD_WAITTO ; SETUP TO LOOP
KBD_GETDATA0: KBD_GETDATA0:
@ -262,9 +264,33 @@ KBD_GETDATA0:
XOR A ; NO DATA, RETURN ZERO XOR A ; NO DATA, RETURN ZERO
RET RET
KBD_GETDATA1: KBD_GETDATA1:
LD C,(IY+KBD_DAT) ; DATA PORT
EZ80_IO
IN A,(C) ; GET THE DATA VALUE
CALL KBD_IN ; GET A KEY
#IF (KBDTRACE >= 2)
PUSH AF
CALL PC_SPACE
CALL PC_LT
CALL PRTHEXBYTE
POP AF
#ENDIF
OR A ; SET FLAGS
RET
;
;__________________________________________________________________________________________________
KBD_GETDATA_P:
;
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT.
; KBD_GETDATA_P ALWAYS READS A BYTE FROM THE KEYBOARD CONTROLLER PORT.
;
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
CALL DELAY ; WAIT A BIT
DJNZ KBD_GETDATA0_P ; LOOP UNTIL COUNTER EXHAUSTED
XOR A ; NO DATA, RETURN ZERO
RET
KBD_GETDATA1_P:
CALL KBD_IN_P ; GET A KEY
#IF (KBDTRACE >= 2) #IF (KBDTRACE >= 2)
PUSH AF PUSH AF
CALL PC_SPACE CALL PC_SPACE
@ -300,7 +326,7 @@ KBD_RESET0:
JR NZ,KBD_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP JR NZ,KBD_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP
DJNZ KBD_RESET0 ; LOOP TILL COUNTER EXHAUSTED DJNZ KBD_RESET0 ; LOOP TILL COUNTER EXHAUSTED
KBD_RESET1: KBD_RESET1:
LD A,B
; LD A,B
XOR A ; SIGNAL SUCCESS (RESPONSE IS IGNORED...) XOR A ; SIGNAL SUCCESS (RESPONSE IS IGNORED...)
RET ; DONE RET ; DONE
; ;
@ -312,7 +338,7 @@ KBD_SETLEDS:
LD A,$ED ; SET/RESET LED'S COMMAND LD A,$ED ; SET/RESET LED'S COMMAND
CALL KBD_PUTDATA ; SEND THE COMMAND CALL KBD_PUTDATA ; SEND THE COMMAND
CALL KBD_GETDATA ; READ THE RESPONSE CALL KBD_GETDATA ; READ THE RESPONSE
CP $FA ; MAKE SURE WE GET ACK
CP KBD_ACK ; MAKE SURE WE GET ACK
RET NZ ; ABORT IF NO ACK RET NZ ; ABORT IF NO ACK
LD A,(KBD_STATE) ; LOAD THE STATE BYTE LD A,(KBD_STATE) ; LOAD THE STATE BYTE
RRCA ; ROTATE TOGGLE KEY BITS AS NEEDED RRCA ; ROTATE TOGGLE KEY BITS AS NEEDED
@ -333,7 +359,7 @@ KBD_SETRPT:
LD A,$F3 ; COMMAND = SET TYPEMATIC RATE/DELAY LD A,$F3 ; COMMAND = SET TYPEMATIC RATE/DELAY
CALL KBD_PUTDATA ; SEND IT CALL KBD_PUTDATA ; SEND IT
CALL KBD_GETDATA ; GET THE ACK CALL KBD_GETDATA ; GET THE ACK
CP $FA ; MAKE SURE WE GET ACK
CP KBD_ACK ; MAKE SURE WE GET ACK
RET NZ ; ABORT IF NO ACK RET NZ ; ABORT IF NO ACK
LD A,(KBD_REPEAT) ; LOAD THE CURRENT RATE/DELAY BYTE LD A,(KBD_REPEAT) ; LOAD THE CURRENT RATE/DELAY BYTE
CALL KBD_PUTDATA ; SEND IT CALL KBD_PUTDATA ; SEND IT

2
Source/HBIOS/mky.asm

@ -1035,7 +1035,7 @@ MKY_SCNKEY: .FILL MATRIX_ROW_COUNT, $FF
; SET TO ZERO AFTER A SCAN CODE CONVERSION ; SET TO ZERO AFTER A SCAN CODE CONVERSION
MKY_SCANNED: .DB 0 MKY_SCANNED: .DB 0
; ;
; F3F6: VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE
; F3F6: VDP-INTERRUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE
; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD ; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD
MKY_SCNCNT: .DB SCAN_INT_PERIOD MKY_SCNCNT: .DB SCAN_INT_PERIOD

2
Source/HBIOS/pio_ps.asm

@ -416,7 +416,7 @@ SETPIO2:
LD A,(IY+5) ; SET I/O DIRECTION LD A,(IY+5) ; SET I/O DIRECTION
OUT (C),A ; FOR MODE 3 OUT (C),A ; FOR MODE 3
SETPIO3:; INTERUPT HANDLING
SETPIO3:; INTERRUPT HANDLING
JP SETPIO4 JP SETPIO4

246
Source/HBIOS/ps2iface.inc

@ -0,0 +1,246 @@
;__________________________________________________________________________________________________
; HARDWARE INTERFACE FOR POLLED AND INTERRUPT DRIVEN PS2 KEYBOARD.
;
; IN POLLED MODE THE KEYBOARD DEVICE IS IDENTIFIED BY THE TABLE POINTED TO BY IY
; IN INTERRUPT MODE THE KEYBOARD DEVICE IS UNKNOWN SO PREDEFINED PORT VALUES ARE USED.
;
; REQUIRES AN APPROPRIATE INTERRUPT JUMPER TO BE SET.
; 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
;
;__________________________________________________________________________________________________
; KEYBOARD QUEUE FOR INTERRUPTS
;__________________________________________________________________________________________________
;
;
KBDQSIZ .EQU 16 ; MUST BE POWER OF TWO, <=128
KBDQGETX .DB 0 ; QUEUE INDEX
KBDQPUTX .DB 0 ; QUEUE INDEX
.DB $55 ; GUARD BYTE FOR DEBUGGING
KBDQ .FILL KBDQSIZ,0 ; CIRCULAR KEYBOARD BUFFER
.DB $AA ; GUARD BYTE FOR DEBUGGING
;__________________________________________________________________________________________________
; RESET THE QUEUE TO EMPTY
;__________________________________________________________________________________________________
;
;KBDQINIT:
; XOR A
; LD (KBDQGETX),A
; LD (KBDQPUTX),A
; RET
;
;__________________________________________________________________________________________________
; KEYBOARD INTERRUPT VECTOR
;__________________________________________________________________________________________________
;
KBD_INT:
; CALL KBDQDBG
LD IY,KBDIDAT
LD C,(IY+KBD_ST) ; READ CONTROLLER STATUS
EZ80_IO
IN A,(C)
AND 1
RET Z
LD C,(IY+KBD_DAT) ; GET THE RESPONSE
EZ80_IO
IN A,(C)
; CALL KBDQPUSH ; SAVE KEYBOARD SCAN CODE
; RET
;
;__________________________________________________________________________________________________
; ADD A BYTE TO THE KEYBOARD QUEUE
;__________________________________________________________________________________________________
;
KBDQPUSH: ; ADD A SCAN CODE TO THE QUEUE
PUSH AF
CALL KBDQFULL
JR Z,KBDQISF ; EXIT IF THE QUEUE IS FULL
;
LD HL,KBDQPUTX
LD A,(HL) ; CREATE QUEUE INDEX
AND KBDQSIZ-1
INC (HL) ; UPDATE INDEX
;
LD HL,KBDQ ; INDEX INTO THE QUEUE
LD B,0
LD C,A
ADD HL,BC
POP AF
LD (HL),A ; SAVE THE CHARACTER IN THE QUEUE
; CALL KBDQDBG
;
RET
;
KBDQISF:POP AF
RET
KBDQFULL: ; RETURN Z IF QUEUE IS FULL
CALL KBDQLEN ; RETURN NZ IF STILL SPACE IN QUEUE
SUB KBDQSIZ
RET
#ENDIF
;__________________________________________________________________________________________________
; KEYBOARD READ
;__________________________________________________________________________________________________
;
#IF ((INTMODE == 2) & INTPS2KBD))
;
; RETURN A BYTE TO FROM KEYBOARD QUEUE
; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE.
;
KBD_IN:
KBDQPOP:
CALL KBDQLEN
RET Z ; EXIT IF THE QUEUE IS EMPTY
;
LD HL,KBDQGETX
LD A,(HL) ; CREATE QUEUE INDEX
AND KBDQSIZ-1
INC (HL) ; UPDATE INDEX
;
LD HL,KBDQ ; INDEX INTO THE QUEUE
LD B,0
LD C,A
ADD HL,BC
LD A,(HL) ; GET THE CHARACTER FROM THE QUEUE
; LD (HL),B ; DEBUG - CLEAN QUEUE
;
RET
;
#ELSE
;
; RETURN A BYTE FROM THE KEYBOARD PORT
;
KBD_IN:
#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:
KBDQLEN: ; EXIT WITH NUMBER OF CHARACTERS IN QUEUE
LD A,(KBDQPUTX) ; Z STATUS AND ZERO IF NONE
LD HL,KBDQGETX
SUB (HL)
RET
#ELSE
KBD_IST:
#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
;__________________________________________________________________________________________________
;
KBD_CMDOUT:
LD C,(IY+KBD_CMD) ; COMMAND PORT
EZ80_IO
OUT (C),A
RET
;__________________________________________________________________________________________________
; OUTPUT TO KEYBOARD COMMAND DATA
;__________________________________________________________________________________________________
;
KBD_DTAOUT:
LD C,(IY+KBD_DAT) ; DATA PORT
EZ80_IO
OUT (C),A
RET
;__________________________________________________________________________________________________
; KEYBOARD OUTPUT STATUS - A=0, Z SET FOR NOT READY, OTHERWISE READY TO WRITE
;__________________________________________________________________________________________________
;
KBD_OST:
LD C,(IY+KBD_ST) ; STATUS PORT
EZ80_IO
IN A,(C) ; GET STATUS
AND $02 ; ISOLATE OUTPUT EMPTY BIT
XOR $02 ; FLIP IT FOR APPROPRIATE RETURN VALUES
RET
;
;__________________________________________________________________________________________________
; DEBUG QUEUE
;__________________________________________________________________________________________________
;
#IF ((INTMODE == 2) & INTPS2KBD & 0)
KBDQDBG:
PUSH HL
PUSH DE
PUSH BC
PUSH AF
CALL NEWLINE ; PRINT QUEUE CONTENTS WITH PRE AND POST GUARD BYTES
LD B,KBDQSIZ+2
LD HL,KBDQ-1
KBDQPRT:
LD A,(HL)
CALL PRTHEXBYTE
INC HL
DJNZ KBDQPRT
LD A,' ' ; PRINT QUEUE INDEX
CALL COUT
LD A,(KBDQGETX)
AND KBDQSIZ-1
CALL PRTHEXBYTE
LD A,' ' ; PRINT QUEUE INDEX
CALL COUT
LD A,(KBDQPUTX)
AND KBDQSIZ-1
CALL PRTHEXBYTE
LD A,' ' ; PRINT # SCAN CODES IN QUEUE
CALL COUT
CALL KBDQLEN
CALL PRTHEXBYTE
CALL NEWLINE
POP AF
POP BC
POP DE
POP HL
RET
#ENDIF

2
Source/HBIOS/s100mon.z80

@ -550,7 +550,7 @@ TBL: DW FLUSH ;"@" SEND FF to LaserJet printer
BEGIN: DI ;No interrupts BEGIN: DI ;No interrupts
XOR A ;SET INTERUPT TO PAGE 0H
XOR A ;SET INTERRUPT TO PAGE 0H
LD I,A ;Z80 Interrupt page 0 LD I,A ;Z80 Interrupt page 0
SETUP_STACK: SETUP_STACK:

1
Source/HBIOS/std.asm

@ -971,6 +971,7 @@ INT_CTC0D .EQU 15 ; ZILOG CTC 0, CHANNEL D
; ;
; DUO Z80 IM2 INTERRUPTS ; DUO Z80 IM2 INTERRUPTS
; ;
INT_PS2KB .EQU 2 ; KEYBOARD RECEIVE
INT_UART0 .EQU 4 ; UART 0 INT_UART0 .EQU 4 ; UART 0
INT_UART1 .EQU 5 ; UART 1 INT_UART1 .EQU 5 ; UART 1
INT_SIO0 .EQU 8 ; ZILOG SIO 0, CHANNEL A & B INT_SIO0 .EQU 8 ; ZILOG SIO 0, CHANNEL A & B

4
Source/HBIOS/vrc.asm

@ -15,8 +15,8 @@ VRC_BASE .EQU $00 ; FIRST CHAR DATA PORT
VRC_FONTBASE .EQU VRC_BASE + $0C ; FIRST FONT PORT VRC_FONTBASE .EQU VRC_BASE + $0C ; FIRST FONT PORT
VRC_SCROLLIO .EQU $F5 ; SCROLL REG PORT VRC_SCROLLIO .EQU $F5 ; SCROLL REG PORT
; ;
VRC_KBDDATA .EQU $F4
VRC_KBDST .EQU $F5
VRC_KBDDATA .EQU $F4 ; KBD CTLR DATA PORT
VRC_KBDST .EQU $F5 ; KBD CTLR STATUS/CMD PORT
; ;
VRC_ROWS .EQU 48 VRC_ROWS .EQU 48
VRC_COLS .EQU 64 VRC_COLS .EQU 64

Loading…
Cancel
Save