diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 105a66ca..1487963f 100644 --- a/Doc/ChangeLog.txt +++ b/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 diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 853297d0..8f372f58 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 41b99682..1bc3d0ef 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index a964b958..e4ed09a8 100644 Binary files a/Doc/RomWBW Errata.pdf and b/Doc/RomWBW Errata.pdf differ diff --git a/Doc/RomWBW ROM Applications.pdf b/Doc/RomWBW ROM Applications.pdf index f329fe22..67200b16 100644 Binary files a/Doc/RomWBW ROM Applications.pdf and b/Doc/RomWBW ROM Applications.pdf differ diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index f57e6d84..56d47ed9 100644 Binary files a/Doc/RomWBW System Guide.pdf and b/Doc/RomWBW System Guide.pdf differ diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 316f4419..4ef095ec 100644 Binary files a/Doc/RomWBW User Guide.pdf and b/Doc/RomWBW User Guide.pdf differ diff --git a/ReadMe.md b/ReadMe.md index 47ed488f..78875f53 100644 --- a/ReadMe.md +++ b/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 diff --git a/ReadMe.txt b/ReadMe.txt index 0ecab61b..a896b641 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -07 Apr 2023 +14 Apr 2023 diff --git a/Source/Doc/Basic.h b/Source/Doc/Basic.h index f3b529b3..fae5949f 100644 --- a/Source/Doc/Basic.h +++ b/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$ diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index e89fada4..468cbf66 100644 --- a/Source/Doc/SystemGuide.md +++ b/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** | diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index af68ecfe..3afccd89 100644 --- a/Source/HBIOS/API.txt +++ b/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 diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index 3e321620..b888160c 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/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 diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index edb084e0..3cead301 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/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 diff --git a/Source/HBIOS/Config/RCZ280_ext.asm b/Source/HBIOS/Config/RCZ280_ext.asm index a7574e8b..e994df2e 100644 --- a/Source/HBIOS/Config/RCZ280_ext.asm +++ b/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) diff --git a/Source/HBIOS/Config/RCZ280_nat.asm b/Source/HBIOS/Config/RCZ280_nat.asm index 415b925d..a22f9793 100644 --- a/Source/HBIOS/Config/RCZ280_nat.asm +++ b/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) diff --git a/Source/HBIOS/Config/RCZ280_zz80mb.asm b/Source/HBIOS/Config/RCZ280_zz80mb.asm index 82129e2b..0cc3f3c8 100644 --- a/Source/HBIOS/Config/RCZ280_zz80mb.asm +++ b/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 diff --git a/Source/HBIOS/Config/RCZ280_zzrc.asm b/Source/HBIOS/Config/RCZ280_zzrc.asm index c173c1bb..492af9a3 100644 --- a/Source/HBIOS/Config/RCZ280_zzrc.asm +++ b/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!!!) diff --git a/Source/HBIOS/Config/RCZ80_easy.asm b/Source/HBIOS/Config/RCZ80_easy.asm index dd6f0312..b2361a17 100644 --- a/Source/HBIOS/Config/RCZ80_easy.asm +++ b/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 ; diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index ee7d74de..8194f00d 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/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 diff --git a/Source/HBIOS/Config/RCZ80_skz.asm b/Source/HBIOS/Config/RCZ80_skz.asm index d3380a37..e3fad45e 100644 --- a/Source/HBIOS/Config/RCZ80_skz.asm +++ b/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] diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 6707b13d..e0002a56 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/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) ; diff --git a/Source/HBIOS/Config/RCZ80_tiny.asm b/Source/HBIOS/Config/RCZ80_tiny.asm index d5da8791..81189cb1 100644 --- a/Source/HBIOS/Config/RCZ80_tiny.asm +++ b/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 diff --git a/Source/HBIOS/Config/RCZ80_zrc.asm b/Source/HBIOS/Config/RCZ80_zrc.asm index 55566dc9..00020ada 100644 --- a/Source/HBIOS/Config/RCZ80_zrc.asm +++ b/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] ; diff --git a/Source/HBIOS/Config/RCZ80_zrc_ram.asm b/Source/HBIOS/Config/RCZ80_zrc_ram.asm index 7ec945db..efbc7746 100644 --- a/Source/HBIOS/Config/RCZ80_zrc_ram.asm +++ b/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] diff --git a/Source/HBIOS/Config/SCZ180_sc126.asm b/Source/HBIOS/Config/SCZ180_sc126.asm index 2550da0d..5fa11435 100644 --- a/Source/HBIOS/Config/SCZ180_sc126.asm +++ b/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 ; diff --git a/Source/HBIOS/Config/SCZ180_sc140.asm b/Source/HBIOS/Config/SCZ180_sc140.asm index 14dedad5..ad3d953e 100644 --- a/Source/HBIOS/Config/SCZ180_sc140.asm +++ b/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 diff --git a/Source/HBIOS/Config/SCZ180_sc503.asm b/Source/HBIOS/Config/SCZ180_sc503.asm index ac0070b5..29e741e2 100644 --- a/Source/HBIOS/Config/SCZ180_sc503.asm +++ b/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 diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 2d118f7b..a00e2e56 100644 --- a/Source/HBIOS/asci.asm +++ b/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)) ; diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 66bbf61c..011ccee1 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/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 diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index c14de563..1ccf685c 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/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 diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index e8b42400..5b5c6875 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/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 diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 2a3f618a..babaf468 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/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 diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 3d98e44d..b9890a87 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/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 diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index df1f9839..a0fa0b59 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/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 diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 87691c91..8d8a0a92 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/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 diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 9bb247e1..e04982b6 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/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 diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 7df16a4b..529274a3 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/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 diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 1a5eedbe..2bd8a81d 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/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 diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 70220ddc..e99e0b7b 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/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 diff --git a/Source/HBIOS/cfg_una.asm b/Source/HBIOS/cfg_una.asm index 0041d1c8..926e7917 100644 --- a/Source/HBIOS/cfg_una.asm +++ b/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 diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 33d614bc..b2b69b81 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/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 diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index e3d18470..23c0cadf 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/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 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 536eda5f..f8cdf4f4 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 1b858342..35d83ff4 100644 --- a/Source/HBIOS/hbios.inc +++ b/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 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 22e80695..ffcb676c 100644 --- a/Source/HBIOS/romldr.asm +++ b/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 diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 4342d9f2..ef707680 100644 --- a/Source/HBIOS/sio.asm +++ b/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 diff --git a/Source/ver.inc b/Source/ver.inc index 590006df..136b86bb 100644 --- a/Source/ver.inc +++ b/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 diff --git a/Source/ver.lib b/Source/ver.lib index 4e4d6cf6..04db95f2 100644 --- a/Source/ver.lib +++ b/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