Browse Source

Front Panel Switch Support

pull/351/head v3.3.0-dev.0
Wayne Warthen 3 years ago
parent
commit
f346209c82
  1. 4
      Doc/ChangeLog.txt
  2. BIN
      Doc/RomWBW Applications.pdf
  3. BIN
      Doc/RomWBW Disk Catalog.pdf
  4. BIN
      Doc/RomWBW Errata.pdf
  5. BIN
      Doc/RomWBW ROM Applications.pdf
  6. BIN
      Doc/RomWBW System Guide.pdf
  7. BIN
      Doc/RomWBW User Guide.pdf
  8. 4
      ReadMe.md
  9. 2
      ReadMe.txt
  10. 2
      Source/Doc/Basic.h
  11. 23
      Source/Doc/SystemGuide.md
  12. 11
      Source/HBIOS/API.txt
  13. 2
      Source/HBIOS/Config/RCZ180_ext.asm
  14. 2
      Source/HBIOS/Config/RCZ180_nat.asm
  15. 2
      Source/HBIOS/Config/RCZ280_ext.asm
  16. 2
      Source/HBIOS/Config/RCZ280_nat.asm
  17. 2
      Source/HBIOS/Config/RCZ280_zz80mb.asm
  18. 2
      Source/HBIOS/Config/RCZ280_zzrc.asm
  19. 2
      Source/HBIOS/Config/RCZ80_easy.asm
  20. 2
      Source/HBIOS/Config/RCZ80_kio.asm
  21. 2
      Source/HBIOS/Config/RCZ80_skz.asm
  22. 2
      Source/HBIOS/Config/RCZ80_std.asm
  23. 2
      Source/HBIOS/Config/RCZ80_tiny.asm
  24. 2
      Source/HBIOS/Config/RCZ80_zrc.asm
  25. 2
      Source/HBIOS/Config/RCZ80_zrc_ram.asm
  26. 1
      Source/HBIOS/Config/SCZ180_sc126.asm
  27. 2
      Source/HBIOS/Config/SCZ180_sc140.asm
  28. 2
      Source/HBIOS/Config/SCZ180_sc503.asm
  29. 30
      Source/HBIOS/asci.asm
  30. 2
      Source/HBIOS/cfg_dyno.asm
  31. 2
      Source/HBIOS/cfg_master.asm
  32. 2
      Source/HBIOS/cfg_mbc.asm
  33. 2
      Source/HBIOS/cfg_mk4.asm
  34. 2
      Source/HBIOS/cfg_n8.asm
  35. 2
      Source/HBIOS/cfg_rcz180.asm
  36. 2
      Source/HBIOS/cfg_rcz280.asm
  37. 2
      Source/HBIOS/cfg_rcz80.asm
  38. 2
      Source/HBIOS/cfg_rph.asm
  39. 2
      Source/HBIOS/cfg_sbc.asm
  40. 2
      Source/HBIOS/cfg_scz180.asm
  41. 2
      Source/HBIOS/cfg_una.asm
  42. 2
      Source/HBIOS/cfg_zeta.asm
  43. 2
      Source/HBIOS/cfg_zeta2.asm
  44. 421
      Source/HBIOS/hbios.asm
  45. 11
      Source/HBIOS/hbios.inc
  46. 143
      Source/HBIOS/romldr.asm
  47. 8
      Source/HBIOS/sio.asm
  48. 6
      Source/ver.inc
  49. 6
      Source/ver.lib

4
Doc/ChangeLog.txt

@ -1,3 +1,7 @@
Version 3.3
-----------
- Support Front Panel switches
Version 3.2.1
-------------
- M?P: Fixed Zeta 2 FDD and CPUSPD config settings

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Errata.pdf

Binary file not shown.

BIN
Doc/RomWBW ROM Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW System Guide.pdf

Binary file not shown.

BIN
Doc/RomWBW User Guide.pdf

Binary file not shown.

4
ReadMe.md

@ -1,9 +1,9 @@
**RomWBW ReadMe** \
Version 3.2.1 \
Version 3.3 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
07 Apr 2023
14 Apr 2023
# Overview

2
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
07 Apr 2023
14 Apr 2023

2
Source/Doc/Basic.h

@ -1,4 +1,4 @@
$define{doc_ver}{Version 3.2.1}$
$define{doc_ver}{Version 3.3}$
$define{doc_product}{RomWBW}$
$define{doc_root}{https://github.com/wwarthen/RomWBW/raw/dev/Doc}$
$ifndef{doc_title}$ $define{doc_title}{Document Title}$ $endif$

23
Source/Doc/SystemGuide.md

@ -2123,6 +2123,17 @@ Wait States (D) is the actual number of wait states, not the number
of wait states added. The returned Status (A) is a standard HBIOS
result code.
#### SYSGET Subfunction 0xF4 -- Get Front Panel Swithes (PANEL)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0xF8 | A: Status |
| C: 0xF4 | L: Switches |
This function will return the current value of the switches (L) from the
front panel of the system. If no front panel is available in the
system, the returned Status (A) will indicate a No Hardware error.
### Function 0xF9 -- System Set (SYSSET)
| **Entry Parameters** | **Returned Values** |
@ -2206,6 +2217,18 @@ limited set of divisors. If there is no satisfactory divisor to
retain the existing baud rate under the new CPU speed, then the baud
rate of the ASCI port(s) will be affected.
#### SYSSET Subfunction 0xF4 -- Set Front Panel LEDs (PANEL)
| **Entry Parameters** | **Returned Values** |
|----------------------------------------|----------------------------------------|
| B: 0xF8 | A: Status |
| C: 0xF4 | |
| L: LEDs | |
This function will set the front panel LEDs based on the bits in L. If
no front panel is available in the system, the returned Status (A) will
indicate a No Hardware error.
### Function 0xFA -- System Peek (SYSPEEK)
| **Entry Parameters** | **Returned Values** |

11
Source/HBIOS/API.txt

@ -117,7 +117,11 @@ GET ($F8):
L=Clock Mult (0:Half, 1:Full, 2: Double)
D=Memory Wait States
E=I/O Wait States
PANEL ($F4):
BC=Function/Subfunction A=Result
L=Switch Values
SET ($F9):
BC=Function/Subfunction A=Result
@ -142,6 +146,11 @@ SET ($F9):
E=I/O Wait States
PANEL ($F4):
BC=Function/Subfunction A=Result
L=LED Values
PEEK ($FA):
B=Function A=Result
D=Bank E=Byte Value

2
Source/HBIOS/Config/RCZ180_ext.asm

@ -29,6 +29,8 @@
CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
;
Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2

2
Source/HBIOS/Config/RCZ180_nat.asm

@ -29,6 +29,8 @@
CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
;
Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2

2
Source/HBIOS/Config/RCZ280_ext.asm

@ -30,6 +30,8 @@ CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
INTMODE .SET 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
;
Z280_MEMLOWAIT .SET 0 ; Z280: LOW 8MB MEMORY WAIT STATES (0-3)

2
Source/HBIOS/Config/RCZ280_nat.asm

@ -30,6 +30,8 @@ CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280]
;
Z280_MEMLOWAIT .SET 0 ; Z280: LOW 8MB MEMORY WAIT STATES (0-3)

2
Source/HBIOS/Config/RCZ280_zz80mb.asm

@ -32,6 +32,8 @@ CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ
INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280]
;
RAMLOC .SET 23 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE

2
Source/HBIOS/Config/RCZ280_zzrc.asm

@ -32,6 +32,8 @@ CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ
INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280]
;
RAMSIZE .SET 256 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)

2
Source/HBIOS/Config/RCZ80_easy.asm

@ -33,6 +33,8 @@ CPUOSC .SET 10000000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
WDOGMODE .SET WDOG_EZZ80 ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .SET $6F ; WATCHDOG REGISTER ADR
;

2
Source/HBIOS/Config/RCZ80_kio.asm

@ -30,6 +30,8 @@ CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM)
KIOENABLE .SET TRUE ; ENABLE ZILOG KIO SUPPORT

2
Source/HBIOS/Config/RCZ80_skz.asm

@ -29,6 +29,8 @@
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
SKZENABLE .SET TRUE ; ENABLE SERGEY'S Z80-512K FEATURES
SKZDIV .SET DIV_12 ; UART CLK (CLK2) DIVIDER FOR Z80-512K
WDOGMODE .SET WDOG_SKZ ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]

2
Source/HBIOS/Config/RCZ80_std.asm

@ -29,6 +29,8 @@
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM)
RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM)
;

2
Source/HBIOS/Config/RCZ80_tiny.asm

@ -33,6 +33,8 @@ CPUOSC .SET 16000000 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
EIPCENABLE .SET TRUE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION
WDOGMODE .SET WDOG_EZZ80 ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .SET $6F ; WATCHDOG REGISTER ADR

2
Source/HBIOS/Config/RCZ80_zrc.asm

@ -30,6 +30,8 @@
CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
RAMSIZE .SET 1536 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
;

2
Source/HBIOS/Config/RCZ80_zrc_ram.asm

@ -31,6 +31,8 @@
CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ
CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
;
RAMSIZE .SET 2048 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
ROMSIZE .SET 0 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]

1
Source/HBIOS/Config/SCZ180_sc126.asm

@ -35,6 +35,7 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .SET $0D ; DIAGNOSTIC PORT ADDRESS
;

2
Source/HBIOS/Config/SCZ180_sc140.asm

@ -34,6 +34,8 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPBASE .SET $A0 ; FRONT PANEL I/O PORT BASE ADDRESS
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .SET $A0 ; DIAGNOSTIC PORT ADDRESS

2
Source/HBIOS/Config/SCZ180_sc503.asm

@ -34,6 +34,8 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
;
FPENABLE .SET TRUE ; ENABLES FRONT PANEL SWITCHES
FPBASE .SET $A0 ; FRONT PANEL I/O PORT BASE ADDRESS
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .SET $A0 ; DIAGNOSTIC PORT ADDRESS

30
Source/HBIOS/asci.asm

@ -53,7 +53,7 @@
; ASEXT:
; 7 6 5 4 3 2 1 0
; R D C X B F D S
; 0 1 1 0 0 1 1 0 DEFAULT VALUES
; 0 1 1 0 0 0 0 0 DEFAULT VALUES
; | | | | | | | |
; | | | | | | | +-- SEND BREAK
; | | | | | | +---- BREAK DETECT (RO)
@ -64,6 +64,10 @@
; | +-------------- DCD0 DISABLE
; +---------------- RDRF INT INHIBIT
;
ASCI_DEF_CNTLA .EQU $64
ASCI_DEF_CNTLB .EQU $20
ASCI_DEF_ASEXT .EQU $60
;
ASCI_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE
;
ASCI_NONE .EQU 0 ; NOT PRESENT
@ -513,17 +517,29 @@ ASCI_INITDEV3:
SET 4,C ; SET CNTLB BIT 4 FOR ODD PARITY
;
ASCI_INITDEV4:
; SETUP ASEXT
LD A,D ; CONFIG HIGH BYTE
AND %00100000 ; BIT 5 IS RTS
CPL ; INVERT FOR ASEXT
LD L,A ; MOVE TO L
LD A,ASCI_DEF_ASEXT ; GET ASEXT DEFAULT
AND L ; COMBINE
LD L,A ; AND LEAVE IN L
;
; SAVE CONFIG PERMANENTLY NOW
LD (IY+4),E ; SAVE LOW WORD
LD (IY+5),D ; SAVE HI WORD
JR ASCI_INITGO
;
ASCI_INITSAFE:
LD B,$64 ; CNTLA FAILSAFE VALUE
LD C,$20 ; CNTLB FAILSAFE VALUE
LD B,ASCI_DEF_CNTLA ; CNTLA FAILSAFE VALUE
LD C,ASCI_DEF_CNTLB ; CNTLB FAILSAFE VALUE
LD L,ASCI_DEF_ASEXT ; ASEXT FAILSAFE VALUE
;
ASCI_INITGO:
; IMPLEMENT CONFIGURATION
; B = CNTLA, C=CNTLB, L=ASEXT
PUSH HL ; SAVE ASEXT
LD H,B ; H := CNTLA VAL
LD L,C ; L := CNTLB VAL
LD B,0 ; MSB OF PORT MUST BE ZERO!
@ -532,6 +548,7 @@ ASCI_INITGO:
INC C ; BUMP TO
INC C ; ... CNTLB REG, B IS STILL 0
OUT (C),L ; WRITE CNTLB VALUE
POP HL ; RECOVER ASEXT
INC C ; BUMP TO
INC C ; ... STAT REG, B IS STILL 0
#IF ((ASCIINTS) & (INTMODE > 0))
@ -543,8 +560,11 @@ ASCI_INITGO:
LD A,$0E ; BUMP TO
ADD A,C ; ... ASEXT REG
LD C,A ; PUT IN C FOR I/O, B IS STILL 0
LD A,$66 ; STATIC VALUE FOR ASEXT
OUT (C),A ; WRITE ASEXT REG
BIT 0,C ; IS C ADDRESSING AN ODD NUMBERED PORT?
JR NZ,ASCI_INITGOZ ; IF SO, THIS IS SEC SERIAL, NO CTS!
OUT (C),L ; WRITE ASEXT REG
;
ASCI_INITGOZ:
;
#IF ((ASCIINTS) & (INTMODE > 0))
;

2
Source/HBIOS/cfg_dyno.asm

@ -66,6 +66,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_master.asm

@ -95,6 +95,8 @@ SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_mbc.asm

@ -60,6 +60,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_mk4.asm

@ -66,6 +66,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_n8.asm

@ -68,6 +68,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_rcz180.asm

@ -66,6 +66,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_rcz280.asm

@ -66,6 +66,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_rcz80.asm

@ -65,6 +65,8 @@ SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_rph.asm

@ -66,6 +66,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_sbc.asm

@ -60,6 +60,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_scz180.asm

@ -66,6 +66,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $0D ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $0D ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_una.asm

@ -19,6 +19,8 @@
CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280]
BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
;
BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE
;
CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO

2
Source/HBIOS/cfg_zeta.asm

@ -52,6 +52,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

2
Source/HBIOS/cfg_zeta2.asm

@ -63,6 +63,8 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
;
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
;
FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES
FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS

421
Source/HBIOS/hbios.asm

@ -22,7 +22,7 @@
; SYSTEM INITIALIZATION, THE IMAGE OF THE RUNNING ROM BANK IS COPIED TO A RAM BANK
; CREATING A SHADOW COPY IN RAM. EXECUTION IS THAN TRANSFERRED TO THE RAM SHADOW COPY.
; THIS IS ESSENTIAL BECAUSE THE HBIOS CODE DOES NOT SUPPORT RUNNING IN READ ONLY MEMORY
; (EXCEPT FOR THE INITIAL LAUNCHING CODE). IN THIS MODE, THE HBIOS INITIALIZATION WILL
; (EXCEPT FOR THE INITIAL LAUNCHING CODE). IN THIS MODE, THE HBI OS INITIALIZATION WILL
; ALSO COPY THE OS IMAGES BANK IN ROM TO THE USER RAM BANK AND LAUNCH IT AFTER HBIOS
; IS INSTALLED.
;
@ -2232,6 +2232,29 @@ NOT_REC_M0:
CALL DSKY_SHOW
#ENDIF
;
#IF FPENABLE
;
; IF FRONT PANEL IS ENABLED IN CONFIG, WE NEED TO CHECK TO SEE IF THE
; HARDWARE REALLY EXISTS. THE ONLY WAY TO DO THAT IS TO SEE IF THE
; FRONT PANEL PORT SEEMS TO BE VALID (NOT FLOATING). HERE WE JUST
; DO THE CHECKING AND RECORD WHETHER THE FP SWITCHES ARE USEABLE.
;
; THE SWITCH HARDWARE MAY OR MAY NOT BE INSTALLED. SO, HERE WE
; ATTEMPT TO CONFIRM WE HAVE A VALID PORT. CREDIT TO STEPHEN
; COUSINS FOR THIS APPROACH.
LD C,FPBASE ; ADR OF SWITCH PORT
IN C,(C) ; READ IT USING IN (C)
IN A,(FPBASE) ; READ IT USING IN (PORT)
CP C ; PORT FLOATING ON MISMATCH
JR NZ,HB_SWZ ; ABORT IF FLOATING
CP $FF ; $FF ALSO MEANS PORT INACTIVE
JR Z,HB_SWZ ; ABORT IF SO
OR $FF ; SIGNAL FP EXISTS
LD (HB_HASFP),A ; AND SAVE IT
HB_SWZ:
;
#ENDIF
;
#IF FALSE
;
; TEST DEBUG ***************************************************************************************
@ -2248,7 +2271,6 @@ NOT_REC_M0:
;
;
;
;
#IF (BOOT_DELAY > 100)
.ECHO "*** ERROR: INVALID BOOT_DELAY (BOOT_DELAY > 100)!!!\n"
!!! ; FORCE AN ASSEMBLY ERROR
@ -2288,10 +2310,10 @@ HB_CONRDY:
; RETRIEVE THE CONFIG FROM THE CONSOLE PORT
LD B,BF_CIOQUERY ; HBIOS QUERY CIO CONFIG
LD A,(CB_CONDEV) ; GET CONSOLE DEVICE
LD (HB_BOOTCONSAV),A ; SAVE IT FOR LATER
LD (HB_BOOTCON),A ; SAVE IT FOR LATER
LD C,A ; BOOT CONSOLE TO C
CALL HB_DISPATCH ; INTERNAL HBIOS CALL
LD (HB_CONCFGSAV),DE ; SAVE CONFIG
LD (HB_BOOTCFG),DE ; SAVE CONFIG
RES 5,D ; CLEAR RTS BIT
LD B,BF_CIOINIT ; HBIOS CIO INIT
LD A,(CB_CONDEV) ; GET CONSOLE DEVICE
@ -2743,8 +2765,10 @@ HB_WDZ:
LD HL,(CB_HEAPTOP)
LD (HEAPCURB),HL
;
; NOW SWITCH TO CRT CONSOLE IF CONFIGURED
; NOW SWITCH CONSOLES IF CONFIGURED
;
LD A,(CB_CONDEV) ; GET CURRENT CONSOLE
LD (HB_NEWCON),A ; AND INIT NEW CONSOLE VAR
#IF CRTACT
;
; BIOS IS CONFIGURED TO AUTO ACTIVATE CRT DEVICE. FIRST,
@ -2763,39 +2787,107 @@ HB_WDZ:
JR Z,INITSYS3 ; Z=SHORTED, BYPASS CONSOLE SWITCH
#ENDIF
;
; NOTIFY USER OF CONSOLE SWITCH ON BOOT CONSOLE
CALL NEWLINE2
PRTX(STR_SWITCH)
CALL NEWLINE
LD A,(CB_CRTDEV) ; GET CRT DISPLAY DEVICE
LD (HB_NEWCON),A ; AND QUEUE TO SWITCH
;
; SWITCH TO CRT CONSOLE
#ENDIF
;
#IF FPENABLE
;
; IF WE HAVE FRONT PANEL SWITCHES, THIS IS THE RIGHT PLACE TO HANDLE
; ANY CONSOLE CHANGE REQUESTS. THE FRONT PANEL HAS TWO SWITCHES
; RELATED TO THIS: 1) CRT/SER, AND 2) SEC/PRI. IF CRT/SER IS SET,
; THEN WE SWITCH TO THE CRT DEVICE (IF THERE IS ONE). IF THE SEC/PRI
; SWITCH IS SET, THEN WE ATTEMPT TO USE THE SECOND SERIAL OR CRT
; DEVICE.
;
PRTS("\r\nFP: IO=0x$")
LD A,FPBASE
CALL PRTHEXBYTE
;
; THE EXISTENCE OF THE FP WAS TESTED EARLIER. IF IT DOESN'T
; EXIST, BAIL OUT.
LD A,(HB_HASFP) ; GET FP EXISTENCE FLAG
OR A ; SET FLAGS
JR NZ,HB_FP1 ; IF WE HAVE ONE, CONTINUE
;
; HANDLE NO FP
PRTS(" NOT PRESENT$")
JR HB_FPZ
;
HB_FP1:
; WE NOW BELIEVE WE HAVE A VALID SWITCH SETTINGS VALUE.
; CHECK FOR CRT SWITCH VALUE AND SWITCH TO CRT IF SET.
; NOTE THAT CB_CRTDEV WILL BE ZERO IF THERE IS NO CRT DEVICE
; IN THE SYSTEM, SO WE DON'T NEED TO CHECK FOR THE EXISTENCE
; OF A CRT DEVICE -- IT WILL JUST FAILBACK TO FIRST SERIAL
; PORT.
PRTS(" SWITCHES=0x$") ; TAG
IN A,(FPBASE) ; GET SWITCH SETTINGS
CALL PRTHEXBYTE ; DISPLAY VALUE
LD B,A ; SAVE IN REG B
AND SW_CRT ; TEST CRT BIT
JR Z,HB_FP2 ; SKIP AHEAD IF NOT SET
LD A,(CB_CRTDEV) ; GET CRT DISPLAY DEVICE
LD (CB_CONDEV),A ; SAVE IT AS ACTIVE CONSOLE DEVICE
CP $FF ; $FF MEANS NO CRT PRESENT
JR Z,HB_FP2 ; BYPASS IF SO
LD (HB_NEWCON),A ; QUEUE NEW CONSOLE UNIT
;
HB_FP2:
; IF SEC SWITCH IS SET, WE WANT TO BUMP TO SECONDARY
; CRT OR SERIAL DEVICE. FOR NOW, WE ARE GOING TO CHEAT AND
; JUST INCREMENT THE CONSOLE DEVICE UNIT. THIS SHOULD WORK
; ASSUMING NORMAL ORDERING OF THE CHARACTER DEVICE UNITS.
LD A,B ; RECOVER SWITCH SETTINGS
AND SW_SEC ; TEST SEC BIT
JR Z,HB_FPZ ; IF NOT SET, THEN ALL DONE
;
; INCREMENT CONSOLE UNIT, BUT MAKE SURE IT DOES NOT EXCEED
; THE HIGHEST CHAR UNIT IN SYSTEM.
LD A,(CIO_CNT) ; GET CHAR UNIT COUNT
LD B,A ; MOVE TO B
LD A,(HB_NEWCON) ; GET NEW CONSOLE UNIT
INC A ; BUMP TO SECONDARY
CP B ; A (UNIT) >= B (CNT)?
JR NC,HB_FPZ ; ABORT IF UNIT TOO HIGH
LD (HB_NEWCON),A ; UPDATE NEW CONSOLE UNIT
;
HB_FPZ:
;
#ENDIF
;
INITSYS3:
;
; IF WE ARE GOING TO SWITCH CONSOLES, IT IS IMPLEMENTED HERE. A
; MESSAGE IS PRINTED ON THE OLD CONSOLE INDICATING WHERE THE NEW
; CONSOLE IS AND THE NEW CONSOLE RECEIVES AN HBIOS BANNER.
;
LD A,(HB_BOOTCON) ; GET ORIGINAL BOOT CONSOLE DEV
LD C,A ; PUT IN C
LD A,(HB_NEWCON) ; GET NEW CONSOLE DEVICE
CP C ; COMPARE
JR Z,INITSYS3A ; NO CHANGE, BYPASS
;
LD DE,STR_CONSOLE ; CONSOLE CHANGE NOTIFY
CALL WRITESTR ; PRINT IT
LD A,(HB_NEWCON) ; GET NEW CONSOLE UNIT NUM
CALL PRTDECB ; PRINT UNIT NUM
LD (CB_CONDEV),A ; IMPLEMENT NEW CONSOLE!
CALL NEWLINE2 ; FORMATTING
LD DE,STR_BANNER ; POINT TO BANNER
CALL NZ,WRITESTR ; OUTPUT IF CONSOLE MOVED
;
INITSYS3A:
;
; RESTORE BOOT CONSOLE CONFIGURATION
;
CALL LDELAY ; ALLOW SERIAL PORT TO FLUSH
LD B,BF_CIOINIT ; HBIOS CIO INIT
LD A,(HB_BOOTCONSAV) ; ORIGINAL BOOT CONSOLE DEVICE
LD A,(HB_BOOTCON) ; ORIGINAL BOOT CONSOLE DEVICE
LD C,A ; BOOT CONSOLE TO C
LD DE,(HB_CONCFGSAV) ; SAVED ORIGINAL CONSOLE CFG
LD DE,(HB_BOOTCFG) ; SAVED ORIGINAL CONSOLE CFG
CALL HB_DISPATCH ; INTERNAL HBIOS CALL
;
LD A,(HB_BOOTCONSAV) ; GET ORIGINAL BOOT CONSOLE DEV
LD C,A ; PUT IN C
LD A,(CB_CONDEV) ; GET ACTIVE CONSOLE DEVICE
CP C ; COMPARE
JR Z,INITSYS3A ; SKIP AHEAD IF NO CHANGE
;
; DISPLAY HBIOS BANNER ON NEW CONSOLE IF WE SWITCHED TO NEW
; CONSOLE DEVICE
PRTX(STR_BANNER) ; DISPLAY HBIOS BANNER
;
INITSYS3A:
CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE
;
#IF 0
@ -4157,9 +4249,130 @@ SYS_GET:
JP Z,SYS_GETBNKINFO
CP BF_SYSGET_CPUSPD
JP Z,SYS_GETCPUSPD
CP BF_SYSGET_PANEL
JP Z,SYS_GETPANEL
SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR
RET
;
; GET SERIAL UNIT COUNT
;
SYS_GETCIOCNT:
LD A,(CIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET SERIAL UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETCIOFN:
BIT 7,E ; CHECK FOR SPECIAL UNIT CODE
CALL NZ,SYS_GETCIOFN1 ; IF SO, HANDLE IT
LD IY,CIO_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
;
SYS_GETCIOFN1:
LD A,(CB_CONDEV) ; UNIT $80 -> CONSOLE UNIT
LD E,A ; REPLACE UNIT VALUE IN C
RET ; AND BACK TO REGULAR FLOW
;
;
; GET DISK UNIT COUNT
;
SYS_GETDIOCNT:
LD A,(DIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET DISK UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETDIOFN:
LD IY,DIO_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
;
; GET RTC UNIT COUNT
;
SYS_GETRTCCNT:
LD E,0 ; ASSUME 0 RTC DEVICES
LD A,(RTC_DISPACT) ; IS RTC ACTIVE?
OR A ; SET FLAGS
JR Z,SYS_GETRTCCNT1 ; IF NONE, DONE
INC E ; SET ONE DEVICE
SYS_GETRTCCNT1:
XOR A ; SIGNALS SUCCESS
RET
;
; GET VIDEO UNIT COUNT
;
SYS_GETVDACNT:
LD A,(VDA_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET VIDEO UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETVDAFN:
LD IY,VDA_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
;
; GET SOUND UNIT COUNT
;
SYS_GETSNDCNT:
LD A,(SND_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET SOUND UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETSNDFN:
LD IY,SND_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
;
; SHARED CODE TO COMPLETE A FUNCTION LOOKUP
; ENTRY:
; IY: DISPATCH FUNCTION TABLE
; D: FUNCTION ID
; E: UNIT NUMBER
; EXIT:
; HL: DRIVER FUNCTION ADDRESS
; DE: DRIVER UNIT DATA ADDRESS
;
SYS_GETFN:
LD A,D ; GET FUNC NUM FROM D
LD B,A ; AND PUT IN B
LD A,E ; GET UNIT NUM FROM E
LD C,A ; AND PUT IN C
CALL HB_DISPCALC ; CALC FN ADR & BLOB ADR
PUSH IY ; MOVE DATA ADR
POP DE ; ... TO DE
RET ; AF STILL HAS RESULT OF CALC
;
; GET TIMER
; RETURNS:
; DE:HL: TIMER VALUE (32 BIT)
@ -4317,124 +4530,27 @@ SYS_GETCPUSPD1:
OR $FF
RET
;
; GET SERIAL UNIT COUNT
;
SYS_GETCIOCNT:
LD A,(CIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET SERIAL UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; GET FRONT PANEL SWITCH VALUES BYTE
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETCIOFN:
BIT 7,E ; CHECK FOR SPECIAL UNIT CODE
CALL NZ,SYS_GETCIOFN1 ; IF SO, HANDLE IT
LD IY,CIO_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
; L: SWITCH VALUES BYTE
;
SYS_GETCIOFN1:
LD A,(CB_CONDEV) ; UNIT $80 -> CONSOLE UNIT
LD E,A ; REPLACE UNIT VALUE IN C
RET ; AND BACK TO REGULAR FLOW
;
;
; GET DISK UNIT COUNT
SYS_GETPANEL:
;
SYS_GETDIOCNT:
LD A,(DIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET DISK UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETDIOFN:
LD IY,DIO_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
;
; GET RTC UNIT COUNT
;
SYS_GETRTCCNT:
LD E,0 ; ASSUME 0 RTC DEVICES
LD A,(RTC_DISPACT) ; IS RTC ACTIVE?
#IF FPENABLE
LD A,(HB_HASFP) ; GET FP EXISTS FLAG
OR A ; SET FLAGS
JR Z,SYS_GETRTCCNT1 ; IF NONE, DONE
INC E ; SET ONE DEVICE
SYS_GETRTCCNT1:
XOR A ; SIGNALS SUCCESS
RET
;
; GET VIDEO UNIT COUNT
;
SYS_GETVDACNT:
LD A,(VDA_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET VIDEO UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETVDAFN:
LD IY,VDA_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
;
; GET SOUND UNIT COUNT
;
SYS_GETSNDCNT:
LD A,(SND_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD E,A ; PUT IT IN E
XOR A ; SIGNALS SUCCESS
RET
;
; GET SOUND UNIT API FN ADR AND DATA ADR
; ENTRY:
; D: FUNCTION
; E: UNIT
; RETURNS:
; HL: FUNCTION ADDRESS
; DE: DATA BLOB ADDRESS
;
SYS_GETSNDFN:
LD IY,SND_TBL ; POINT TO UNIT TABLE
JP SYS_GETFN ; GO TO COMMON CODE
;
; SHARED CODE TO COMPLETE A FUNCTION LOOKUP
; ENTRY:
; IY: DISPATCH FUNCTION TABLE
; D: FUNCTION ID
; E: UNIT NUMBER
; EXIT:
; HL: DRIVER FUNCTION ADDRESS
; DE: DRIVER UNIT DATA ADDRESS
;
SYS_GETFN:
LD A,D ; GET FUNC NUM FROM D
LD B,A ; AND PUT IN B
LD A,E ; GET UNIT NUM FROM E
LD C,A ; AND PUT IN C
CALL HB_DISPCALC ; CALC FN ADR & BLOB ADR
PUSH IY ; MOVE DATA ADR
POP DE ; ... TO DE
RET ; AF STILL HAS RESULT OF CALC
JR Z,SYS_GETPANEL1 ; HANDLE NOT EXISTS
IN A,(FPBASE) ; READ SWITCHES
LD H,0 ; FOR FUTURE
LD L,A ; PUT SWITCHES VALUE IN L
XOR A ; SIGNAL SUCCESS
RET ; DONE
#ENDIF
SYS_GETPANEL1: ; HANDLE NON-EXISTENT FRONT PANEL
LD HL,0 ; ZERO RESULT VALUE
LD A,ERR_NOHW ; NO HARDWARE ERR
OR A ; SET FLAGS
RET ; DONE
;
; SET SYSTEM PARAMETERS
; PARAMETER(S) TO SET INDICATED IN C
@ -4449,6 +4565,8 @@ SYS_SET:
JR Z,SYS_SETBOOTINFO
CP BF_SYSSET_CPUSPD
JR Z,SYS_SETCPUSPD
CP BF_SYSSET_PANEL
JP Z,SYS_SETPANEL
SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR
RET
;
@ -4724,6 +4842,23 @@ SYS_SETCPUSPD_ERR:
OR $FF ; NOT SUPPORTED
RET
;
; SET FRONT PANEL LEDS
; ON ENTRY:
; L: LED VALUES BYTE
;
SYS_SETPANEL:
;
#IF DIAGENABLE
LD A,L
OUT (DIAGPORT),A
XOR A
RET
#ELSE
LD A,ERR_NOHW ; NO HARDWARE ERR
OR A ; SET FLAGS
RET
#ENDIF
;
; RETURN A BYTE OF MEMORY FROM SPECIFIED BANK
; ENTRY: D=BANK ID, HL=ADDRESS
; RETURN: E=BYTE VALUE
@ -7287,7 +7422,8 @@ HB_BOOT_REC .DB 0 ; BOOT MODE (0=NORMAL, 1=RECOVERY MODE)
;
STR_BANNER .DB "RomWBW HBIOS v", BIOSVER, ", ", TIMESTAMP, "$"
STR_PLATFORM .DB PLATFORM_NAME, "$"
STR_SWITCH .DB "*** Activating CRT Console ***$"
;STR_SWITCH .DB "*** Activating CRT Console ***$"
STR_CONSOLE .DB "\r\n\r\n Console on Unit #$"
STR_BADINT .DB "\r\n*** BAD INT ***\r\n$"
STR_LOWBAT .DB "\r\n\r\n+++ LOW BATTERY +++$"
;
@ -7311,8 +7447,11 @@ HB_CURSEC .DB 0 ; CURRENT SECOND (TEMP)
;
HB_BCDTMP .FILL 5,0 ; BCD NUMBER STORAGE (TEMP)
;
HB_BOOTCONSAV .DB 0 ; INITIAL BOOT CONSOLE SAVE AREA
HB_CONCFGSAV .DW 0 ; CONSOLE CONFIG SAVE AREA
HB_BOOTCON .DB 0 ; INITIAL BOOT CONSOLE SAVE AREA
HB_BOOTCFG .DW 0 ; CONSOLE CONFIG SAVE AREA
HB_NEWCON .DB 0 ; NEW CONSOLE TO SWITCH TO
;
HB_HASFP .DB 0 ; NON-ZERO MEANS FP EXISTS
;
HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER
;

11
Source/HBIOS/hbios.inc

@ -109,11 +109,13 @@ BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION
BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO
BF_SYSGET_BNKINFO .EQU $F2 ; GET BANK ASSIGNMENT INFO
BF_SYSGET_CPUSPD .EQU $F3 ; GET CLOCK SPEED & WAIT STATES
BF_SYSGET_PANEL .EQU $F4 ; GET FRONT PANEL SWITCHES VAL
;
BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE
BF_SYSSET_SECS .EQU $D1 ; SET SECONDS VALUE
BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION
BF_SYSSET_CPUSPD .EQU $F3 ; SET CLOCK SPEED & WAIT STATES
BF_SYSSET_PANEL .EQU $F4 ; SET FRONT PANEL LEDS
;
BF_SYSINT_INFO .EQU $00 ; GET INTERRUPT SYSTEM INFO
BF_SYSINT_GET .EQU $10 ; GET INT VECTOR ADDRESS
@ -261,6 +263,15 @@ DIAG_08 .EQU 11111111B ; ON
DIAG_09 .EQU 11111111B ; ON
#ENDIF
;
; FRONT PANEL SWITCHES
;
SW_AUTO .EQU %10000000 ; AUTO/MENU BOOT
SW_CRT .EQU %01000000 ; CRT/SER CONSOLE
SW_SEC .EQU %00100000 ; SEC/PRI CONSOLE
SW_DISK .EQU %00010000 ; DISK/ROM
SW_FLOP .EQU %00001000 ; FLOP/HD
SW_OPT .EQU %00000111 ; SLICE/ROM APP
;
; MEDIA ID VALUES
;
MID_NONE .EQU 0

143
Source/HBIOS/romldr.asm

@ -180,6 +180,30 @@ start1:
call pstr ; do it
call clrbuf ; zero fill the cmd buffer
;
#if (BIOS == BIOS_WBW)
;
ld b,BF_SYSGET ; HBIOS SysGet
ld c,BF_SYSGET_PANEL ; ... Panel swiches value
rst 08 ; do it
jr nz,nofp ; no switches, skip over
ld a,l ; put value in A
ld (switches),a ; save it
;
call nl ; formatting
ld hl,str_switches ; tag
call pstr ; display
ld a,(switches) ; get switches value
call prthexbyte ; display
;
ld a,(switches) ; get switches value
and SW_AUTO ; auto boot?
call nz,runfp ; process front panel
;
nofp:
; fall thru
;
#endif
;
#if (BOOT_TIMEOUT != -1)
; Initialize auto command timeout downcounter
or $FF ; auto cmd active value
@ -212,12 +236,12 @@ prompt:
ld hl,msg_sel ; boot select msg
call DSKY_SHOW ; show on DSKY
#IF (DSKYMODE == DSKYMODE_NG)
#if (DSKYMODE == DSKYMODE_NG)
call DSKY_PUTLED
.db $3f,$3f,$3f,$3f,$00,$00,$00,$00
call DSKY_BEEP
call DSKY_L2ON
#ENDIF
#endif
#endif
;
@ -366,6 +390,118 @@ runcmd2:
ld (bootslice),a ; save boot slice
jp diskboot ; boot the disk unit/slice
;
#if (BIOS == BIOS_WBW)
;
;=======================================================================
; Process Front Panel switches
;=======================================================================
;
runfp:
ld a,(switches) ; get switches value
and SW_DISK ; disk boot?
jr nz,fp_diskboot ; handle disk boot
;
fp_romboot:
; Handle FP ROM boot
ld a,(switches) ; get switches value
and SW_OPT ; isolate options bits
ld hl,fpapps ; rom apps cmd char list
call addhla ; point to the right one
ld a,(hl) ; get it
;
; Attempt ROM application launch
ld ix,(ra_tbl_loc) ; point to start of ROM app tbl
ld c,a ; save command in C
fp_romboot1:
ld a,(ix+ra_conkey) ; get match char
and ~$80 ; clear "hidden entry" bit
cp c ; compare
jp z,romload ; if match, load it
ld de,ra_entsiz ; table entry size
add ix,de ; bump IX to next entry
ld a,(ix) ; check for end
or (ix+1) ; ... of table
jr nz,fp_romboot1 ; loop till done
ret ; no match, return
;
fpapps .db "MBFPCZNU"
;
fp_diskboot:
; get count of disk units
ld b,BF_SYSGET ; HBIOS Get function
ld c,BF_SYSGET_DIOCNT ; HBIOS DIO Count sub fn
rst 08 ; call HBIOS
ld a,e ; count to A
ld (diskcnt),a ; save it
or a ; set flags
ret z ; bort if no disk units
ld a,(switches) ; get switches value
and SW_FLOP ; floppy switch bit
jr nz,fp_flopboot ; handle auto flop boot
; fall thru for auto hd boot
;
fp_hdboot:
; Find the first hd with media and boot to that unit using
; the slice specified by the FP switches.
ld a,(diskcnt) ; get disk count
ld b,a ; init loop counter
ld c,0 ; init disk index
fp_hdboot1:
push bc ; save loop control
ld b,BF_DIODEVICE ; HBIOS Disk Device func
rst 08 ; unit in C, do it
pop bc ; restore loop control
ld a,d ; device type to A
cp DIODEV_IDE ; type IDE or greater is HD
jr nc,fp_hdboot2 ; if hd, go boot it
inc c ; else next disk
djnz fp_hdboot1 ; loop thru all disks
ret ; nothing works, abort
;
fp_hdboot2:
ld a,c ; disk unit to A
ld (bootunit),a ; save it
ld a,(switches) ; get switches value
and SW_OPT ; isolate slice value
ld (bootslice),a ; save it
jp diskboot ; do it
;
fp_flopboot:
; Find the nth floppy drive and boot to that unit. The
; floppy number is based on the option switches.
ld a,(diskcnt) ; get disk count
ld b,a ; init loop counter
ld c,0 ; init disk index
ld a,(switches) ; get switches value
and SW_OPT ; isolate option bits
ld e,a ; floppy unit down counter
inc e ; pre-increment for ZF check
fp_flopboot1:
push bc ; save loop control
push de ; save floppy down ctr
ld b,BF_DIODEVICE ; HBIOS Disk Device func
rst 08 ; unit in C, do it
ld a,d ; device type to A
pop de ; restore loop control
pop bc ; restore floppy down ctr
cp DIODEV_FD ; type FD?
jr nz,fp_flopboot3 ; if not floppy, skip
dec e ; decrement down ctr
jr z,fp_flopboot2 ; if ctr expired, boot this unit
fp_flopboot3:
inc c ; else next disk
djnz fp_flopboot1 ; loop thru all disks
ret ; nothing works, abort
;
fp_flopboot2:
ld a,c ; disk unit to A
ld (bootunit),a ; save it
xor a ; ; zero accum
ld (bootslice),a ; floppy boot slice is always 0
jp diskboot ; do it
;
#endif
;
;=======================================================================
; Process a DSKY command from key in A
;=======================================================================
@ -2168,6 +2304,7 @@ str_upd .db "XModem Flash Updater",0
str_user .db "User App",0
str_egg .db "",0
str_net .db "Network Boot",0
str_switches .db "FP Switches = 0x",0
newcon .db 0
newspeed .db 0
;
@ -2194,6 +2331,8 @@ ra_tbl_loc .dw 0 ; points to active ra_tbl
bootunit .db 0 ; boot disk unit
bootslice .db 0 ; boot disk slice
loadcnt .db 0 ; num disk sectors to load
switches .db 0 ; front panel switches
diskcnt .db 0 ; disk unit count value
;
;=======================================================================
; Pad remainder of ROM Loader

8
Source/HBIOS/sio.asm

@ -785,10 +785,14 @@ SIO_INITBROK:
;
; SET RECEIVE DATA BITS WR3
;
LD A,D ; HI WORD OF CONFIG
AND %00100000 ; BIT 5 IS AUTO-CTS
LD H,A ; SAVE IN H
LD A,L ; DATA BITS
AND $C0 ; CLEAR OTHER BITS
OR $21 ; CTS/DCD AUTO, RX ENABLE
;
OR $01 ; RX ENABLE
OR H ; COMBINE WITH AUTO-CTS
;
LD (SIO_WR3),A
;
; SAVE CONFIG PERMANENTLY NOW

6
Source/ver.inc

@ -1,8 +1,8 @@
#DEFINE RMJ 3
#DEFINE RMN 2
#DEFINE RUP 1
#DEFINE RMN 3
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.2.1"
#DEFINE BIOSVER "3.3.0-dev.0"
#define rmj RMJ
#define rmn RMN
#define rup RUP

6
Source/ver.lib

@ -1,7 +1,7 @@
rmj equ 3
rmn equ 2
rup equ 1
rmn equ 3
rup equ 0
rtp equ 0
biosver macro
db "3.2.1"
db "3.3.0-dev.0"
endm

Loading…
Cancel
Save