From 242dc594714665389aca50cd2a5b3c975d22466e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 14 May 2021 17:53:34 -0700 Subject: [PATCH] FDC hardware auto-detection - FD driver will now detect presence of FDC hardware and install if found in all standard configurations - Does *not* detect type of FDC which must still be set in config - Added default FD driver MODE to all configs - Thanks to Alan Cox for the technique! --- Binary/RomList.txt | 39 ++++++++++----- Doc/ChangeLog.txt | 1 + Source/HBIOS/Config/DYNO_std.asm | 2 +- Source/HBIOS/Config/EZZ80_std.asm | 3 ++ Source/HBIOS/Config/MK4_std.asm | 2 +- Source/HBIOS/Config/RCZ180_ext.asm | 2 +- Source/HBIOS/Config/RCZ180_nat.asm | 2 +- Source/HBIOS/Config/RCZ280_ext.asm | 3 ++ Source/HBIOS/Config/RCZ280_nat.asm | 3 ++ Source/HBIOS/Config/RCZ80_std.asm | 2 +- Source/HBIOS/Config/RCZ80_zrc.asm | 2 +- Source/HBIOS/Config/SBC_std.asm | 2 +- Source/HBIOS/Config/SCZ180_126.asm | 2 +- Source/HBIOS/Config/SCZ180_130.asm | 2 +- Source/HBIOS/Config/SCZ180_131.asm | 2 +- Source/HBIOS/Config/SCZ180_140.asm | 2 +- Source/HBIOS/fd.asm | 69 ++++++++++++++++++++++++++- Source/Images/d_bp/u0/UNZIPZ4.COM | Bin 0 -> 8704 bytes Source/Images/d_cpm22/u0/UNZIPZ4.COM | Bin 0 -> 8704 bytes Source/Images/d_zsdos/u0/UNZIPZ4.COM | Bin 0 -> 8704 bytes Source/ver.inc | 2 +- Source/ver.lib | 2 +- 22 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 Source/Images/d_bp/u0/UNZIPZ4.COM create mode 100644 Source/Images/d_cpm22/u0/UNZIPZ4.COM create mode 100644 Source/Images/d_zsdos/u0/UNZIPZ4.COM diff --git a/Binary/RomList.txt b/Binary/RomList.txt index fe87f73a..49173a01 100644 --- a/Binary/RomList.txt +++ b/Binary/RomList.txt @@ -83,6 +83,8 @@ SBC (SBC_std.rom): - Includes support for CVDU and VGA3 boards. If detected at startup, support for video and keyboard is installed including VT-100/ANSI terminal emulation. + - Auto detects DiskIO v3 floppy disk controller and installs + support for two attached 3.5" floppy disks if found - Auto-detects PropIO or PropIO V2 and installs associated video, keyboard and SD Card support if present. - If PropIO, PropIO V2, CVDU, or VGA hardware is detected, @@ -102,8 +104,10 @@ SBC (SBC_simh.rom): ZETA (ZETA_std.rom): - CPU speed is detected at startup - Console on onboard UART serial port at 38400 baud - - Includes support for on-board floppy disk controller and - two attached floppy disks. + - Auto-detects FDC and installs 3.5" disk support + if found + - Auto detects on-board floppy disk controller and installs + support for one attached 3.5" floppy disk if found - Auto-detects ParPortProp and includes support for it if it is attached. - If ParPortProp is installed, initial console output is @@ -114,8 +118,8 @@ ZETA (ZETA_std.rom): ZETA2 (ZETA2_std.rom): - CPU speed is detected at startup - Console on onboard UART serial port at 38400 baud - - Includes support for on-board floppy disk controller and - two attached floppy disks. + - Auto detects on-board floppy disk controller and installs + support for one attached 3.5" floppy disk if found - Auto-detects ParPortProp and includes support for it if it is attached. - Uses CTC to generate periodic timer interrupts. @@ -127,8 +131,8 @@ ZETA2 (ZETA2_std.rom): N8 (N8_std.rom): - CPU speed is detected at startup - Console on Z180 onboard primary ASCI serial port at 38400 baud - - Includes support for on-board floppy disk controller and - two attached floppy disks. + - Auto detects onboard floppy disk controller and installs + support for two attached 3.5" floppy disks if found - Includes support for on-board TMS9918 video and keyboard including VT-100/ANSI terminal emulation. - Includes support for on-board SD Card as hard disk and @@ -139,6 +143,8 @@ MK4 (MK4_std.rom): - Console on Z180 onboard primary ASCI serial port at 38400 baud - Includes support for on-board IDE port (CF Card via adapter). - Includes support for on-board SD Card port. + - Auto detects Dual IDE floppy disk controller and installs + support for two attached 3.5" floppy disks if found - Auto-detects PropIO or PropIO V2 and installs associated video, keyboard and SD Card support if present. - Includes support for CVDU and VGA3 boards. If detected at @@ -156,8 +162,9 @@ RCZ80 (RCZ80_std.rom): - Auto support for RC2014 Compact Flash Module - Auto support for RC2014 PPIDE Module - Support for Scott Baker SIO board may be enabled in config - - Support for Scott Baker floppy controllers (SMC & WDC) may - be enabled in config + - Auto detects WDC floppy disk controller and installs + support for two attached 3.5" floppy disks if found + - Support for SMC floppy controller may be enabled in config - Support for J.B. Lang TMS9918 video card may be enabled in config - Support for PropIO V2 may be enabled in config (PRPENABLE). If enabled, will auto-detect and install associated @@ -174,8 +181,9 @@ RCZ180 (RCZ180_nat.rom & RCZ180_ext.rom): - Auto support for RC2014 Compact Flash Module - Auto support for RC2014 PPIDE Module - Support for alternative serial modules may be enabled in config - - Support for Scott Baker floppy controllers (SMC & WDC) may - be enabled in config + - Auto detects WDC floppy disk controller and installs + support for two attached 3.5" floppy disks if found + - Support for SMC floppy controller may be enabled in config - Support for J.B. Lang TMS9918 video card may be enabled in config - You must pick the variant (_ext or _nat) depending on which memory module you are using: @@ -203,8 +211,9 @@ RCZ280 (RCZ280_ext.rom, RCZ280_nat.rom, RCZ280_nat_zz.rom): - Auto support for RC2014 Compact Flash Module - Auto support for RC2014 PPIDE Module - Support for Scott Baker SIO board may be enabled in config - - Support for Scott Baker floppy controllers (SMC & WDC) may - be enabled in config + - Auto detects WDC floppy disk controller and installs + support for two attached 3.5" floppy disks if found + - Support for SMC floppy controllers may be enabled in config - Support for J.B. Lang TMS9918 video card may be enabled in config - You must pick the variant (_ext, _nat, or _nat_zz) depending on which platform or memory module you are using: @@ -235,6 +244,9 @@ EZZ80 (EZZ80_std.rom): - Includes support for on-board SIO - Auto support for RC2014 Compact Flash Module - Auto support for RC2014 PPIDE Module + - Auto detects WDC floppy disk controller and installs + support for two attached 3.5" floppy disks if found + - Support for SMC floppy controllers may be enabled in config - Support for PropIO V2 may be enabled in config (PRPENABLE). If enabled, will auto-detect and install associated video, keyboard and SD Card support if present. @@ -243,5 +255,6 @@ DYNO (DYNO_std.rom): - Assumes CPU oscillator of 18.432 MHz - Console on Z180 onboard serial ports at 38400 baud - Includes support for BQ4842 RTC + - Auto detects Dyno floppy disk controller and installs + support for two attached 3.5" floppy disks if found - Includes support for onboard PPIDE - - Support for Dyno floppy controllers may be enabled in config diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index a2f6dab2..0ed87fd8 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -29,6 +29,7 @@ Version 3.1.1 - D?M: SD driver fixes for MT011 - J?C: Added FIND application from Jay Cotton - PMS: Preliminary support for I2C-based DS1307 clock +- WBW: FD driver auto hardware detect (thanks Alan Cox) Version 3.1 ----------- diff --git a/Source/HBIOS/Config/DYNO_std.asm b/Source/HBIOS/Config/DYNO_std.asm index cc31253a..2a3f825d 100644 --- a/Source/HBIOS/Config/DYNO_std.asm +++ b/Source/HBIOS/Config/DYNO_std.asm @@ -36,6 +36,6 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ;ASCI0CFG .SET SER_115200_8N1 ; ASCI 0: SERIAL LINE CONFIG ;ASCI1CFG .SET SER_115200_8N1 ; ASCI 1: SERIAL LINE CONFIG ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/EZZ80_std.asm b/Source/HBIOS/Config/EZZ80_std.asm index 02796033..b144bed2 100644 --- a/Source/HBIOS/Config/EZZ80_std.asm +++ b/Source/HBIOS/Config/EZZ80_std.asm @@ -30,6 +30,9 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; CPUOSC .SET 10000000 ; CPU OSC FREQ IN MHZ ; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index 027dcf36..43ac3748 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -36,7 +36,7 @@ VDUENABLE .SET FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .SET TRUE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index c401e771..cf4af5c2 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -43,7 +43,7 @@ SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index 061e6117..d900f25b 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -43,7 +43,7 @@ SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/RCZ280_ext.asm b/Source/HBIOS/Config/RCZ280_ext.asm index 1a82285b..9eefcaaa 100644 --- a/Source/HBIOS/Config/RCZ280_ext.asm +++ b/Source/HBIOS/Config/RCZ280_ext.asm @@ -42,6 +42,9 @@ UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ280_nat.asm b/Source/HBIOS/Config/RCZ280_nat.asm index 9cf5d474..8fe12ab4 100644 --- a/Source/HBIOS/Config/RCZ280_nat.asm +++ b/Source/HBIOS/Config/RCZ280_nat.asm @@ -44,6 +44,9 @@ UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index dbe7d3ac..c0380d6b 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -37,7 +37,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/RCZ80_zrc.asm b/Source/HBIOS/Config/RCZ80_zrc.asm index 3b4c70f8..90b27aa2 100644 --- a/Source/HBIOS/Config/RCZ80_zrc.asm +++ b/Source/HBIOS/Config/RCZ80_zrc.asm @@ -39,7 +39,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index b68e80c1..6189daea 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -32,7 +32,7 @@ VDUENABLE .SET FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .SET TRUE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_126.asm b/Source/HBIOS/Config/SCZ180_126.asm index 04a7859a..5d49834f 100644 --- a/Source/HBIOS/Config/SCZ180_126.asm +++ b/Source/HBIOS/Config/SCZ180_126.asm @@ -45,7 +45,7 @@ SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_130.asm b/Source/HBIOS/Config/SCZ180_130.asm index 0793f77f..ec324c62 100644 --- a/Source/HBIOS/Config/SCZ180_130.asm +++ b/Source/HBIOS/Config/SCZ180_130.asm @@ -52,7 +52,7 @@ SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) ; -FDENABLE .SET FALSE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDENABLE .SET TRUE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_131.asm b/Source/HBIOS/Config/SCZ180_131.asm index 5c400347..77aa8baa 100644 --- a/Source/HBIOS/Config/SCZ180_131.asm +++ b/Source/HBIOS/Config/SCZ180_131.asm @@ -50,7 +50,7 @@ ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] ; IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_140.asm b/Source/HBIOS/Config/SCZ180_140.asm index 2bd0b7c1..27e38cf7 100644 --- a/Source/HBIOS/Config/SCZ180_140.asm +++ b/Source/HBIOS/Config/SCZ180_140.asm @@ -46,7 +46,7 @@ ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) ; SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 7bf477ba..45ed35a9 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -648,9 +648,58 @@ FD_GEOM: ; FD_INIT: CALL NEWLINE ; FORMATTING - PRTS("FD: IO=0x$") + PRTS("FD: MODE=$") +; +#IF (FDMODE == FDMODE_DIO) + PRTS("DIO$") +#ENDIF +; +#IF (FDMODE == FDMODE_ZETA) + PRTS("ZETA$") +#ENDIF +; +#IF (FDMODE == FDMODE_DIO3) + PRTS("DIO3$") +#ENDIF +; +#IF (FDMODE == FDMODE_ZETA2) + PRTS("ZETA2$") +#ENDIF +; +#IF (FDMODE == FDMODE_DIDE) + PRTS("DIDE$") +#ENDIF +; +#IF (FDMODE == FDMODE_N8) + PRTS("N8$") +#ENDIF +; +#IF (FDMODE == FDMODE_RCSMC) + PRTS("RCSMC$") +#ENDIF +; +#IF (FDMODE == FDMODE_RCWDC) + PRTS("RCWDC$") +#ENDIF +; +#IF (FDMODE == FDMODE_DYNO) + PRTS("DYNO$") +#ENDIF +; +#IF (FDMODE == FDMODE_EPFDC) + PRTS("EPFDC$") +#ENDIF +; + PRTS(" IO=0x$") LD A,FDC_MSR CALL PRTHEXBYTE + CALL FD_DETECT ; CHECK FOR FDC + JR Z,FD_INIT00 ; CONTINUE IF FOUND + PRTS(" NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT + OR $FF ; SIGNAL FAILURE + RET ; BAIL OUT +; +FD_INIT00: PRTS(" UNITS=$") LD A, FD_DEVCNT + '0' CALL COUT @@ -688,6 +737,24 @@ FD_INIT0: ; RET ; +; HARDWARE PRESENCE DETECTION +; +; CURRENTLY JUST DETERMINES IF FDC EXISTS AT PRE-DEFINED ADDRESS, +; DOES NOT ATTEMPT TO DETERMINE THE ACTUAL VARIANT. +; +FD_DETECT: + IN A,(FDC_MSR) ; READ MSR + CP $80 + JR Z,FD_DETECT1 ; $80 IS OK + CP $D0 + JR Z,FD_DETECT1 ; $D0 IS OK + RET ; NOPE, ABORT WITH ZF=NZ +; +FD_DETECT1: + IN A,(FDC_MSR) ; READ MSR AGAIN + CP $80 + RET ; $80 OK, ELSE NOT PRESENT +; ; UNIT INITIALIZATION ; FD_INITUNIT: diff --git a/Source/Images/d_bp/u0/UNZIPZ4.COM b/Source/Images/d_bp/u0/UNZIPZ4.COM new file mode 100644 index 0000000000000000000000000000000000000000..6b701a70d4984925decfb78c2e64ff7b298e460e GIT binary patch literal 8704 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 Z$}dJ+?w^XzUL{#~U7PUlxcxuE{uh`B