Compare commits

...

18 Commits

Author SHA1 Message Date
Wayne Warthen
2788fa4fdf Bump Version Numbers 2024-12-07 16:16:26 -08:00
Wayne Warthen
1468cecfad Update M80 from v3.43 to v3.44
- This addresses the issue with M80 from Issue #462.
- All of the other binaries from the newer distribution of Microsoft Basic Compiler match the binaries already in the disk image.
2024-12-07 16:02:11 -08:00
Wayne Warthen
8f75441317 Add NVRAM Configure to Main RomLdr Help
See Issue #451
2024-12-07 15:44:36 -08:00
Wayne Warthen
007e8a372a Final Tweaks to KBD Interrupt Support
Related to PR #460
2024-12-07 15:12:19 -08:00
Wayne Warthen
7606abb8f3 Follow-up on KBD Interrupt Support
Related to PR #460
2024-12-07 13:48:43 -08:00
Wayne Warthen
e3192bfbe6 Merge pull request #460 from b1ackmai1er/master
Master
2024-12-07 13:06:34 -08:00
b1ackmai1er
9d7adbec63 Spelling 2024-12-07 19:22:06 +08:00
b1ackmai1er
2d1811dcb4 Typos 2024-12-07 19:11:48 +08:00
b1ackmai1er
cfa86a9f2a Spurious interrupt fix. 2024-12-07 11:28:24 +08:00
b1ackmai1er
7a663e2a3c Use IY to retrieve status and data port values from idat tables. 2024-12-06 22:32:24 +08:00
b1ackmai1er
1a73a9614b Initialize interrupt vector after kbd controller detected 2024-12-06 19:31:52 +08:00
b1ackmai1er
660bb20bba Merge pull request #68 from wwarthen/master
Resync
2024-12-06 19:07:17 +08:00
Wayne Warthen
f03dcf7193 Clean Up NVRAM Switch Terminology
- Essentially, switch from the term "default boot" to the term "boot options".

See Issue #451
2024-12-05 19:01:03 -08:00
b1ackmai1er
64dbf4ff35 EZZ80_IO fixes 2024-12-06 05:39:57 +08:00
b1ackmai1er
ce98947d07 Cleanup 2024-12-05 20:50:17 +08:00
b1ackmai1er
5d92341189 PS2 Interrupt driven keyboard for Duo
For keyboard interface on I/O Multi board. Default is disabled. Requires interrupt #2 jumper set on I/O Multiboard, which is pin 11-12 in P5. Has limitations around port settings. Do not have a video card on my Duo so have been forcing a video driver to load and testing with PIP CON:=UR2: . Let me know what you think.
2024-12-05 20:41:03 +08:00
b1ackmai1er
2a501566d7 Merge branch 'wwarthen:master' into master 2024-12-04 17:55:34 +08:00
b1ackmai1er
736e4e276c Merge pull request #67 from wwarthen/master
Resync
2024-12-03 20:44:05 +08:00
30 changed files with 543 additions and 171 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3,7 +3,7 @@
**RomWBW ReadMe** \
Version 3.5 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
01 Dec 2024
05 Dec 2024
# Overview

View File

@@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
01 Dec 2024
05 Dec 2024

View File

@@ -398,23 +398,23 @@ system configuration.
### Basic Operation
The application is an interactive application it does not have command line syntax.
The application is an interactive application; it does not have a command line syntax.
Instead commands are executed from within the application in a command line structure.
When you first start the (`SYSCONF`) utility it will display the current switches
followed by a command listing.
When you first run the (`SYSCONF`) utility the NVRAM will be uninitialised, and can
be initialised using the (R)eset command, which write default values to NVRAM.
be initialised using the (R)eset command, which writes default values to NVRAM.
Updates are done immediately to NVRAM as you enter them, i.e. there is no confirm
changes step. If you make an incorrect changes you simply need to enter a new
changes step. If you make any incorrect changes, you simply need to enter a new
command to set the Switch value correctly.
Once a change has been made it is available, however may not take effect until
Once a change has been made it is available, however it may not take effect until
the next system reboot. This is dependent on the Switch itself.
If no NVRAM is provided by your hardware then running this application will just
If no NVRAM is provided by your hardware, then running this application will just
report the missing hardware and exit immediately.
To exit from the application use the (Q)uit command.
@@ -445,7 +445,7 @@ character is used to delimit parameters in the command.
This switch will define if the system will perform auto boot at the RomWBW boot prompt.
Enabling this will not prevent a user from typing a boot command, so long as the timeout is not
exceeded. When configured this replaces the (`BOOT_DEFAULT`) variable
exceeded. When configured this replaces the (`AUTO_CMD`) variable
defined in build configuration.
Making changes to auto boot has no affect until the next reboot.
@@ -465,13 +465,13 @@ Making changes to auto boot has no affect until the next reboot.
| S AB E,10 | Enable Auto Boot with 10 second delay |
| S AB D | Disable Auto Boot |
#### Default Boot (DB)
#### Boot Options (BO)
This switch will define the default boot command to be executed when pressing enter
at the RomWBW boot prompt. When configured this replaces the (`BOOT_TIMEOUT`) variable
defined in build configuration.
This switch will define the boot command to be executed when auto boot is
enabled. When configured this replaces the (`AUTO_CMD`) variable
defined in the ROM build configuration.
Making changes to auto boot has no affect until the next reboot.
Making changes to boot options has no affect until the next reboot.
**Arguments**
@@ -487,8 +487,8 @@ Making changes to auto boot has no affect until the next reboot.
| Command | Description |
|-------------|----------------------------------------------------------|
| S DB D,2,14 | Set the default boot from Disk; Unit 2, Slice 14 |
| S DB R,M | Set the default boot to be the (M)onitor Rom Application |
| S BO D,2,14 | Set the default boot from Disk; Unit 2, Slice 14 |
| S BO R,M | Set the default boot to be the (M)onitor Rom Application |
## CP/M 2.2

View File

@@ -531,7 +531,7 @@ The following switch ID's are defined, and described in sections below.
| Switch Number | Name | Description |
|---------------|--------------|-----------------------------------------------|
| 0x00 | -reserved- | Reserved |
| 0x01 | Default Boot | Default boot, either a Rom App or Disk Boot |
| 0x01 | Boot Options | ROM or Disk Boot Settings |
| 0x02 | -n/a- | -n/a- high order byte of previous switch |
| 0x03 | Auto Boot | Automatically boot enabled without user input |
| 0x04 - 0xFE | -future- | Future general usage |
@@ -544,18 +544,19 @@ the bytes in NVRAM to check for authenticity before using the configuration.
|-------------|--------------|-----------------------------------|
| 0x00 | Header Byte | Header Signature Byte 'W' |
| 0x01 - 0x03 | Switch Data | Actual Switch Data |
| 0x04 | Parity Check | Parity byte to check authenticity |
| 0x04 | Parity Check | Checksum byte to check integrity |
The above data is copied into the HBIOS Configuration Block (HCB) at startup at
the location starting at CB_SWITCHES.
### Default Boot (NVSW_DEFBOOT)
### Boot Options (NVSW_BOOTOPTS)
16 bit Switch defining the default Rom application or Disk device to boot.
16 bit Switch defining the ROM application or Disk device to boot if
automatic booting is enabled.
| Bit 15 | Bits 14-8 | Bits 7-0 |
|-------------|-------------------|--------------------|
| 1 = Rom App | -undefined- | App to Boot (Char) |
| 1 = ROM App | -undefined- | App to Boot (Char) |
| 0 = Disk | Disk Unit (0-127) | Disk Slice (0-255) |
### Auto Boot (NVSW_AUTOBOOT)

View File

@@ -905,24 +905,24 @@ some limited configuration option options inside this NVRAM.
Several configuration options are currently supported, these are known as Switches
* Specify Automatic boot at startup, after an optional delay (AB)
* Define the Default Disk or ROM App to be booted at startup (DB)
* Define the Disk or ROM App to be booted at for automatic boot (BO)
RomWBW uses bytes located at the start of RTC NVRAM, and includes a Parity check of
the bytes in NVRAM to check for authenticity before using the configuration.
RomWBW uses bytes located at the start of RTC NVRAM, and includes a checksum of
the bytes in NVRAM to check for integrity before using the configuration.
Initially NVRAM has to be reset (with default values), before it can be used.
As well as setting defaults, it also writes the correct parity, and allows the
NVRAM to be accessed and to store RomWBW config.
As well as setting defaults, it also writes the correct checksum, and allows the
NVRAM to be accessed and to store the RomWBW config.
This is an explicit step that must be done, as any existing data stored is overitten.
If you are using NVRAM for other purposes then you can continue to do so
This is an explicit step that must be done, as any existing data stored is overwritten.
If you are using NVRAM for other purposes, then you can continue to do so
so long as you do NOT perform this Reset step.
NVRAM may also need to be reset in these circumstances
NVRAM may also need to be reset in these circumstances:
* When there has been a loss of power to the NVRAM.
* When upgrading to a new RomWBW version, or a RomWBW version that has new switches.
* If the NVRAM has been overitten by another application.
* If the NVRAM has been overwritten by another application.
If you want to continue to use NVRAM in your applications you may want to consider storing
your data above the RomWBW Switch data.

View File

@@ -173,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]

View File

@@ -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

View File

@@ -1,6 +1,6 @@
;======================================================================
; 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
;======================================================================
@@ -36,8 +36,8 @@ FV_CTL .EQU FV_BASE+2 ; VGA CONTROL PORT
;
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_COLS .EQU 80

View File

@@ -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

View File

@@ -462,28 +462,28 @@ CB_HEAPTOP .DW 0
;
.FILL (HCB + $30 - $),0
;
; First byte (header) of NVRAM = "W" if fully initialised, or a ststus byte
; First byte (header) of NVRAM = "W" if fully initialised, or a status byte
; = 0 if no NVRAM detected, or = 1 If NVR exists, but not configured
CB_SWITCHES .DB 0 ; this byte is set during init
;
; 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"
; Byte 1: (H)
; Bit 7 - ROM/DISK - Rom or Disk Boot -> Default=ROM=1 (BOOT_DEFAULT is Numeric/Alpha)
; Bit 7 - ROM/DISK - Rom or Disk Boot -> Default=ROM=1 (AUTO_CMD is Numeric/Alpha)
; Bit 6-0 - DISK BOOT Disk Unit to Boot (0-127) -> default = 0
CB_SWDEFBOOT .DB 'H' ; (WORD) DEFAULT BOOT NVR OPTIONS. USED By ROMLDR
.DB DBOOT_ROM ; Default Boot - ROM Application
CB_SW_AB_OPT .DB 'H' ; (WORD) AUTO BOOT NVR OPTIONS. USED By ROMLDR
.DB BOPTS_ROM ; Boot Opts - ROM Application
;
; Byte 0: (L)
; Bit 7-6 - Reserved
; Bit 5 - AUTO BOOT Auto boot, default=false (BOOT_TIMEOUT != -1)
; Bit 4 - Reserved
; Bit 3-0 - BOOT_TIMEOUT in seconds (0-15) 0=immediate -> default=3
CB_SWAUTOB .DB 0 ; AUTO BOOT NVR OPTIONS. USED By ROMLDR
CB_SW_AB_CFG .DB 0 ; AUTO BOOT NVR CONFIG. USED By ROMLDR
;
; CHECKSUM
CB_SWITCHCK .DB 0 ; CHECKSUM (XOR=0), INCLUDES HEADER and CB_VERSION
CB_SW_CKSUM .DB 0 ; CHECKSUM (XOR=0), INCLUDES HEADER and CB_VERSION
;
; STANDARD BANK ID'S START AT $D8. DEFAULT VALUES FOR 512KB SYSTEM WITH NO RESERVED BANKS
;
@@ -1137,7 +1137,7 @@ HBX_INTSTK .EQU $
; --- -------------- -------------- -------------- -------------- --------------
; 0 CTC0A INT1 -+ -+ -+ HCCARCV -+
; 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
; 4 UART0 DMA0 | Z180 UART0 | VEC UART0 | VEC OPTCRD0 | VEC
; 5 UART1 DMA1 | CPU UART1 | GEN UART1 | GEN OPTCRD1 | GEN
@@ -2361,7 +2361,7 @@ HB_CPU1:
CALL SN76489_PREINIT
#ENDIF
#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.
CALL DSRTC_PREINIT
#ENDIF
@@ -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
;
@@ -3407,7 +3424,7 @@ NVR_INIT:
JR NZ, NVR_INIT_DEF ; failed to correclty read data
;
CALL NVSW_CHECKSUM ; checksum calc into A
LD HL,CB_SWITCHCK ; address of HCB switch checksum value
LD HL,CB_SW_CKSUM ; address of HCB switch checksum value
CP (HL) ; compare Caculated Check, with hcb Check Value
JR Z,NVR_INIT_END ; The same so success
NVR_INIT_DEF:
@@ -7611,7 +7628,7 @@ NVSW_RESET:
;
NVSW_UPDATE:
CALL NVSW_CHECKSUM ; CALC checksum into A
LD (CB_SWITCHCK),A ; store checksum in hcb
LD (CB_SW_CKSUM),A ; store checksum in hcb
CALL NVSW_WRITE ; write the bytes to nvr
RET Z ; Successful write, return
; write failed for some reason ???
@@ -7695,8 +7712,8 @@ NVSW_WRITE2:
;
NVSW_DEFAULT:
.DB 'W' ; Signature Byte
.DB 'H' ; Default Boot - Rom Application [H]elp
.DB DBOOT_ROM ; Default Boot - ROM Application
.DB 'H' ; Auto Boot - Rom Application [H]elp
.DB BOPTS_ROM ; Auto Boot - ROM Application
.DB 0 ; Auto Boot - NO auto boot
; Configure above byte from (BOOT_TIMEOUT != -1)
; SIZE OF NVR BYTES
@@ -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 $
;

View File

@@ -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_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_SECS .EQU $D1 ; GET CURRENT SECONDS VALUE
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_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_SECS .EQU $D1 ; SET SECONDS VALUE
BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION
@@ -339,18 +339,18 @@ SW_OPT .EQU %00000111 ; SLICE/ROM APP
;
; NVRAM SWITCHES
;
; used for identifying Non Volitile Switches
NVSW_DEFBOOT .EQU 1 ; Default Boot NVRAM Switch
; used for identifying Non Volatile Switches
NVSW_BOOTOPTS .EQU 1 ; Boot Options NVRAM Switch
NVSW_AUTOBOOT .EQU 3 ; Auto Boot NVRAM Switch
;
; NVRAM SWITCH BIT MASKS
;
; AUTO BOOT MASKS
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
DBOOT_ROM .EQU %10000000 ; ROM=1/DISK=0 FLAG
DBOOT_UNIT .EQU %01111111 ; DISK UNIT
BOPTS_ROM .EQU %10000000 ; ROM=1/DISK=0 FLAG
BOPTS_UNIT .EQU %01111111 ; DISK UNIT
;
; MEDIA ID VALUES
;
@@ -510,8 +510,8 @@ HCB_BOOTMODE .EQU $14 ; HBIOS BOOTMODE (BYTE)
HCB_HEAP .EQU $20 ; DWORD ADDRESS OF START OF HEAP
HCB_HEAPTOP .EQU $22 ; DWORD ADDRESS OF TOP OF HEAP
;
HCB_SW_DBOOT .EQU $31 ; DEFAULT BOOT CONFIG (WORD)
HCB_SW_AUTOB .EQU $33 ; AUTO BOOT CONFIG (BYTE)
HCB_SW_BOPTS .EQU $31 ; BOOT OPTIONS (WORD)
HCB_SW_AUTOB .EQU $33 ; AUTO BOOT (BYTE)
;
; MEMORY BANK IDS (ONE BYTE EACH)
HCB_BIDCOM .EQU $D8 ; COMMON BANK (UPPER 32K)

View File

@@ -4,6 +4,13 @@
;
; ORIGINAL CODE BY DR JAMES MOXHAM
; 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:
@@ -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_DEFSTATE .EQU KBD_NUMLCK ; DEFAULT STATE (NUM LOCK ON)
;
KBD_ACK .EQU $FA ; CMD ACKNOWLEDGE
;__________________________________________________________________________________________________
; DATA
;__________________________________________________________________________________________________
@@ -59,14 +66,43 @@ KBD_IDLE .DB 0 ; IDLE COUNT
DEVECHO "KBD: ENABLED\n"
;
;__________________________________________________________________________________________________
; HARDWARE LEVEL INTERFACE
;__________________________________________________________________________________________________
;
#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
;__________________________________________________________________________________________________
;
KBD_INIT:
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
#IF ((INTMODE == 2) & KBDINTS)
PRTS(" INT #$") ; DISPLAY
LD A,INT_PS2KB ; INTERRUPT SETTING
CALL PRTDECB
#ENDIF
;
LD A,KBD_DEFRPT ; GET DEFAULT REPEAT RATE
LD (KBD_REPEAT),A ; SAVE IT
@@ -77,9 +113,11 @@ KBD_INIT:
CP KBDMODE_VRC ; VRC?
JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT
;
HB_DI ; DISABLE INTERRUPTS WHILE WE PROBE
LD A,$AA ; CONTROLLER SELF TEST
CALL KBD_PUTCMD ; SEND IT
CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK)
CALL KBD_GETDATA_P ; CONTROLLER SHOULD RESPOND WITH $55 (ACK)
HB_EI ; RESTORE INTERRUPTS
;
CP $55 ; IS IT THERE?
JR Z,KBD_INIT1 ; IF SO, CONTINUE
@@ -87,6 +125,11 @@ KBD_INIT:
RET ; BAIL OUT
;
KBD_INIT1:
#IF ((INTMODE == 2) & KBDINTS)
; CALL KBDQINIT ; INITIALIZE QUEUE
LD HL,KBD_INT ; INSTALL VECTOR
LD (IVT(INT_PS2KB)),HL ; IVT INDEX
#ENDIF
PRTS(" MODE=$") ; TAG
LD A,(IY+KBD_MODE) ; GET MODE VALUE
LD DE,KBD_STR_MODEPS2
@@ -101,8 +144,12 @@ KBD_INIT2:
;
LD A,$60 ; SET COMMAND REGISTER
CALL KBD_PUTCMD ; SEND IT
; LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS
#IF ((INTMODE == 2) & KBDINTS)
LD A,$21 ; XLAT DISABLED, MOUSE DISABLED, WITH INTS
#ELSE
LD A,$20 ; XLAT DISABLED, MOUSE DISABLED, NO INTS
#ENDIF
CALL KBD_PUTDATA ; SEND IT
CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED
@@ -159,35 +206,6 @@ KBD_FLUSH:
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:
;
; PUT A CMD BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT
@@ -211,9 +229,7 @@ KBD_PUTCMD1:
CALL PC_GT
CALL PRTHEXBYTE
#ENDIF
LD C,(IY+KBD_CMD) ; COMMAND PORT
EZ80_IO
OUT (C),A ; WRITE IT
CALL KBD_CMDOUT ; OUTPUT CMD TO PORT
KBD_PUTCMD2:
XOR A ; SIGNAL SUCCESS
RET
@@ -241,30 +257,28 @@ KBD_PUTDATA1:
CALL PC_GT
CALL PRTHEXBYTE
#ENDIF
LD C,(IY+KBD_DAT) ; DATA PORT
EZ80_IO
OUT (C),A ; WRITE IT
CALL KBD_DTAOUT ; WRITE IT
KBD_PUTDATA2:
XOR A ; SIGNAL SUCCESS
RET
;
;__________________________________________________________________________________________________
KBD_GETDATA:
;
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT
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:
CALL KBD_IST ; GET INPUT REGISTER STATUS
JR NZ,KBD_GETDATA1 ; BYTE PENDING, GO GET IT
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 ; LOOP UNTIL COUNTER EXHAUSTED
DJNZ KBD_GETDATA0_P ; LOOP UNTIL COUNTER EXHAUSTED
XOR A ; NO DATA, RETURN ZERO
RET
KBD_GETDATA1:
LD C,(IY+KBD_DAT) ; DATA PORT
EZ80_IO
IN A,(C) ; GET THE DATA VALUE
KBD_GETDATA1_P:
CALL KBD_IN_P ; GET A KEY
#IF (KBDTRACE >= 2)
PUSH AF
CALL PC_SPACE
@@ -275,10 +289,52 @@ KBD_GETDATA1:
OR A ; SET FLAGS
RET
;
KBD_GETDATA_Q:
;
; 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_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_Q ; LOOP UNTIL COUNTER EXHAUSTED
XOR A ; NO DATA, RETURN ZERO
RET
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
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
@@ -300,7 +356,7 @@ KBD_RESET0:
JR NZ,KBD_RESET1 ; GOT A BYTE? IF SO, GET OUT OF LOOP
DJNZ KBD_RESET0 ; LOOP TILL COUNTER EXHAUSTED
KBD_RESET1:
LD A,B
; LD A,B
XOR A ; SIGNAL SUCCESS (RESPONSE IS IGNORED...)
RET ; DONE
;
@@ -312,7 +368,7 @@ KBD_SETLEDS:
LD A,$ED ; SET/RESET LED'S COMMAND
CALL KBD_PUTDATA ; SEND THE COMMAND
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
LD A,(KBD_STATE) ; LOAD THE STATE BYTE
RRCA ; ROTATE TOGGLE KEY BITS AS NEEDED
@@ -333,7 +389,7 @@ KBD_SETRPT:
LD A,$F3 ; COMMAND = SET TYPEMATIC RATE/DELAY
CALL KBD_PUTDATA ; SEND IT
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
LD A,(KBD_REPEAT) ; LOAD THE CURRENT RATE/DELAY BYTE
CALL KBD_PUTDATA ; SEND IT

View File

@@ -1035,7 +1035,7 @@ MKY_SCNKEY: .FILL MATRIX_ROW_COUNT, $FF
; SET TO ZERO AFTER A SCAN CODE CONVERSION
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
MKY_SCNCNT: .DB SCAN_INT_PERIOD

View File

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

239
Source/HBIOS/ps2iface.inc Normal file
View File

@@ -0,0 +1,239 @@
;__________________________________________________________________________________________________
; 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) & KBDINTS))
;
;__________________________________________________________________________________________________
; 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
;__________________________________________________________________________________________________
;
; READ DIRECT FROM PORT
;
KBD_IN_P:
LD C,(IY+KBD_DAT) ; DATA PORT
EZ80_IO
IN A,(C) ; GET THE DATA VALUE
RET
;
; READ FROM INTERRUPT QUEUE
;
#IF ((INTMODE == 2) & KBDINTS))
;
KBD_IN_Q:
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
;
#ENDIF
;
; RETURN A BYTE TO FROM KEYBOARD QUEUE
; NOTE THE QUEUE INDEX'S NEVER DECREASE IN SIZE.
;
#IF ((INTMODE == 2) & KBDINTS))
KBD_IN .EQU KBD_IN_Q
#ELSE
KBD_IN .EQU KBD_IN_P
#ENDIF
;
;__________________________________________________________________________________________________
; KEYBOARD INPUT STATUS
;__________________________________________________________________________________________________
;
; 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 .EQU KBD_IST_P
#ENDIF
;
;__________________________________________________________________________________________________
; 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) & KBDINTS & 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

View File

@@ -742,10 +742,10 @@ fp_flopboot2:
;
runnvr:
ld bc,BC_SYSGET_SWITCH ; HBIOS SysGet NVRAM Switches
ld d,NVSW_DEFBOOT ; Read Default Boot (disk/Rom) switch
ld d,NVSW_BOOTOPTS ; Read Boot options (disk/Rom) switch
rst 08
ld a,h
and DBOOT_ROM ; Get the Default Boot from ROM Flag
and BOPTS_ROM ; Get the Boot Opts ROM Flag
jr nz,nvrsw_rom ; IF Set as ROM App BOOT, otherwise Disk
;
nvrsw_disk:
@@ -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 <u> [<c>] - Set Console Interface/Baud code"
.db "\r\n V [<n>] - View/Set HBIOS Diagnostic Verbosity"
#endif

View File

@@ -550,7 +550,7 @@ TBL: DW FLUSH ;"@" SEND FF to LaserJet printer
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
SETUP_STACK:

View File

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

View File

@@ -208,8 +208,8 @@ helpandloop: ; HELP MENU
; the folloiwng is just testing a single charater
cp 'A' ; Auto Boot help menu
JP Z,HELP_AB
cp 'D' ; Default Boot help menu
JP Z,HELP_DB
cp 'B' ; Boot Options help menu
JP Z,HELP_BO
;
printmainhelp:
ld de,MSG_MENU ; nothing found Print the Main Menu
@@ -237,8 +237,8 @@ setvalueandloop:
; the folloiwng is just testing a single charater
cp 'A' ; Auto Boot help menu
JP Z,SET_AB
cp 'D' ; Default Boot help menu
JP Z,SET_DB
cp 'B' ; Boot Options help menu
JP Z,SET_BO
;
setvalueerror:
ld de,MSG_QUESTION ; nothing found Print the Main Menu
@@ -269,8 +269,8 @@ PRT_STATUS:
;
; print invdividual stats, on all per switch
;
CALL STAT_DEFBOOT
CALL STAT_AUTOB
CALL STAT_BO
CALL STAT_AB
;
; end individual stats
;
@@ -297,31 +297,31 @@ STAT_NOTFOUND1:
; Specific Switches Below
; ======================================================================
;
; DEFAULT BOOT
; BOOT OPTIONS
; Byte 1: (L)
; Bit 7-0 DISK BOOT SLice Number to Boot -> default = 0
; Bit 7-0 ROM BOOT (alpha character) Application to boot -> default = 0 translates to "H"
; Byte 2: (H)
; Bit 7 - DISK/ROM - Disk or Rom Boot -> Default=ROM (BOOT_DEFAULT is Numeric/Alpha)
; Bit 7 - DISK/ROM - Disk or Rom Boot -> Default=ROM (AUTO_CMD is Numeric/Alpha)
; Bit 6-0 - DISK BOOT Disk Unit to Boot (0-127) -> default = 0
;
; PRINT CURRENT SWITCH VALUE
;
STAT_DEFBOOT:
STAT_BO:
LD BC,BC_SYSGET_SWITCH
LD D,NVSW_DEFBOOT
LD D,NVSW_BOOTOPTS
RST 08 ; Should return auto Boot in HL
RET NZ ; return if error
LD de,MSG_DEFBOOT
LD de,MSG_BO
CALL prtstr
LD A,H ; Byte 2
AND DBOOT_ROM ; DISK/ROM
JR NZ,STAT_AUTOROM ; is it ROM
STAT_AUTODISK:
AND BOPTS_ROM ; DISK/ROM
JR NZ,STAT_BO_ROM ; is it ROM
STAT_BO_DISK:
LD de,MSG_DISK ; disk
CALL prtstr
LD A,H ; Byte 2
AND DBOOT_UNIT ; Unit
AND BOPTS_UNIT ; Unit
CALL prtdecb
LD de,MSG_DISK2 ; Slice
CALL prtstr
@@ -330,7 +330,7 @@ STAT_AUTODISK:
LD de,MSG_DISK3 ; close bracket
CALL prtstr
RET
STAT_AUTOROM:
STAT_BO_ROM:
LD de,MSG_ROM ; ROM
CALL prtstr
LD A,L ; ROM APP
@@ -341,67 +341,67 @@ STAT_AUTOROM:
;
; SET SWITCH VALUE
;
SET_DB:
SET_BO:
CALL findskipws ; skip over WS to first char
JR z,SET_DB_ERR ; if empty line, print main help
JR z,SET_BO_ERR ; if empty line, print main help
call upcase
cp 'R' ; ROM
JR Z,SET_DB_ROM
JR Z,SET_BO_ROM
cp 'D' ; DISK
JR Z,SET_DB_DISK
JR SET_DB_ERR
SET_DB_ROM:
JR Z,SET_BO_DISK
JR SET_BO_ERR
SET_BO_ROM:
CALL findskipcomma
CALL skipws
JR z,SET_DB_ERR ; if empty line, print main help
JR z,SET_BO_ERR ; if empty line, print main help
LD L,A ; LOW BYTE ; next CHAR is the ROM App Name
LD A,DBOOT_ROM
LD H,A ; HIGH BYTE, has constant. DBOOT_ROM = $80
JR SET_DB_SAVE ; SAVE
SET_DB_DISK:
LD A,BOPTS_ROM
LD H,A ; HIGH BYTE, has constant. ABOOT_ROM = $80
JR SET_BO_SAVE ; SAVE
SET_BO_DISK:
CALL findskipcomma
CALL skipws
JR z,SET_DB_ERR ; if empty line, print main help
JR z,SET_BO_ERR ; if empty line, print main help
CALL getnum ; next CHAR is the DISK UNIT
JR C,SET_DB_ERR ; overflow
JR C,SET_BO_ERR ; overflow
BIT 7,A ; is > 127
JR NZ, SET_DB_ERR
JR NZ, SET_BO_ERR
LD H,A ; HIGH BYTE, has disk unit < $80
CALL findskipcomma
CALL skipws
JR z,SET_DB_ERR ; if empty line, print main help
JR z,SET_BO_ERR ; if empty line, print main help
CALL getnum ; next CHAR is the SLICE
JR C,SET_DB_ERR ; overflow
JR C,SET_BO_ERR ; overflow
LD L,A ; LOW BYTE, has the slice number
;JR SET_DB_SAVE ; SAVE - Fall Through
SET_DB_SAVE:
LD D,NVSW_DEFBOOT ; DEFAULT BOOT
;JR SET_BO_SAVE ; SAVE - Fall Through
SET_BO_SAVE:
LD D,NVSW_BOOTOPTS ; BOOT OPTIONS
JP setvaluesave ; SAVE THE VALUE
SET_DB_ERR:
SET_BO_ERR:
JP setvalueerror ; ERROR. Added this so can use JR above
;
; PRINT HELP TEST FOR SWITCH
;
HELP_DB:
ld de,MSG_DEFB_H
HELP_BO:
ld de,MSG_BO_H
JP printhelp
;
MSG_DEFBOOT .DB CR,LF, " [DB] / Default Boot: ",0
MSG_BO .DB CR,LF, " [BO] / Boot Options: ",0
MSG_DISK .DB "Disk (Unit = ",0
MSG_DISK2 .DB ", Slice = ",0
MSG_DISK3 .DB ")",0
MSG_ROM .DB "ROM (App = \"",0
MSG_ROM2 .DB "\")",0
;
MSG_DEFB_H .DB "\r\nDefault Boot - Disk or Rom App (DB):\r\n"
.DB " DB [R|D],[{romapp}|{unit},{slice}]\r\n"
.DB " e.g. S DB D,2,14 ; Disk Boot, unit 2, slice 14\r\n"
.DB " S DB R,M ; Rom Application 'M'onitor\r\n"
MSG_BO_H .DB "\r\nBoot Options - Disk or Rom App (BO):\r\n"
.DB " BO [R|D],[{romapp}|{unit},{slice}]\r\n"
.DB " e.g. S BO D,2,14 ; Disk Boot, unit 2, slice 14\r\n"
.DB " S BO R,M ; Rom Application 'M'onitor\r\n"
.DB " Note: Disk: Unit (0-127); Slice (0-255)\r\n",0
;
;=======================================================================
;
; AUTO BOOT
; AUTO BOOT CONFIG
; Byte 0: (L)
; Bit 7-6 - Reserved
; Bit 5 - AUTO BOOT Auto boot, default=false (i.e. BOOT_TIMEOUT != -1)
@@ -410,7 +410,7 @@ MSG_DEFB_H .DB "\r\nDefault Boot - Disk or Rom App (DB):\r\n"
;
; PRINT CURRENT SWITCH VALUE
;
STAT_AUTOB:
STAT_AB:
LD BC,BC_SYSGET_SWITCH
LD D,NVSW_AUTOBOOT
RST 08 ; Should return auto Boot in HL
@@ -420,14 +420,14 @@ STAT_AUTOB:
LD A,L ; Byte 1
LD de,MSG_DISABLED
AND ABOOT_AUTO ; enabled
JR Z, STAT_AUTOB1 ; disabled
JR Z, STAT_AB1 ; disabled
LD de,MSG_ENABLED ; enabled
CALL prtstr
LD A,L ; Byte 1
AND ABOOT_TIMEOUT ; timeout
CALL prtdecb ; print timeout
LD de,MSG_ENABLED2 ; and closing bracket
STAT_AUTOB1:
STAT_AB1:
CALL prtstr
RET
;
@@ -458,7 +458,7 @@ SET_AB_DISAB:
LD L,0
;JR SET_AB_SAVE ; SAVE - Fall Through
SET_AB_SAVE:
LD D,NVSW_AUTOBOOT ; AUTO BOOT
LD D,NVSW_AUTOBOOT ; AUTO BOOT CONFIG
JP setvaluesave ; SAVE THE VALUE
SET_AB_ERR:
JP setvalueerror ; ERROR. Added this so can use JR above
@@ -466,7 +466,7 @@ SET_AB_ERR:
; PRINT HELP TEST FOR SWITCH
;
HELP_AB:
ld de,MSG_AUTOB_H
ld de,MSG_AB_H
JP printhelp
;
MSG_AUTOB: .DB CR,LF," [AB] / Auto Boot: ",0
@@ -474,7 +474,7 @@ MSG_ENABLED: .DB "Enabled (Timeout = ",0
MSG_ENABLED2: .DB ")",0
MSG_DISABLED: .DB "Disabled",0
;
MSG_AUTOB_H .DB "\r\nAutomatic Boot (AB):\r\n"
MSG_AB_H .DB "\r\nAutomatic Boot (AB):\r\n"
.DB " AB <D|E>[,{timeout}]\r\n"
.DB " e.g. S AB E,3 ; enabled (show menu) with 3 second timout before boot\r\n"
.DB " S AB E,0 ; enabled with immediate effect, bypass menu\r\n"
@@ -1031,12 +1031,12 @@ stack .equ $ ; stack top
SLACK .EQU (NVR_END - $)
;
#IF (SLACK < 0)
.ECHO "*** NVRCONFIG APP IS TOO BIG!!!\n"
.ECHO "*** SYSCONF APP IS TOO BIG!!!\n"
!!! ; FORCE AN ASSEMBLY ERROR
#endif
;
.FILL SLACK,$00
.ECHO "NVRCONFIG space remaining: "
.ECHO "SYSCONF space remaining: "
.ECHO SLACK
.ECHO " bytes.\n"
;

View File

@@ -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
;==================================================================================================

View File

@@ -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

View File

@@ -15,8 +15,8 @@ VRC_BASE .EQU $00 ; FIRST CHAR DATA PORT
VRC_FONTBASE .EQU VRC_BASE + $0C ; FIRST FONT 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_COLS .EQU 64
@@ -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

Binary file not shown.

View File

@@ -2,7 +2,7 @@
#DEFINE RMN 5
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.5.0-dev.97"
#DEFINE BIOSVER "3.5.0-dev.99"
#define rmj RMJ
#define rmn RMN
#define rup RUP

View File

@@ -3,5 +3,5 @@ rmn equ 5
rup equ 0
rtp equ 0
biosver macro
db "3.5.0-dev.97"
db "3.5.0-dev.99"
endm