diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 59762bc2..540fd2a2 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -7,6 +7,7 @@ Version 3.3 - WBW: Support per-drive floppy configuration - WBW: Support for Bill Shen's VGARC - WBW: Support for MG014 Parallel Port module + printer +- WBW: Support for Zip Drive on emm interface (much inspiration from Alan Cox) Version 3.2.1 ------------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 7d14511d..6287994b 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 8bced4cc..b282d0b9 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 3ffe81d0..e2f32db7 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 980dbfe8..f3c3ecdf 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 da571005..96cffc1d 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 f0a9c388..e3c525ec 100644 Binary files a/Doc/RomWBW User Guide.pdf and b/Doc/RomWBW User Guide.pdf differ diff --git a/Doc/Z180 ASCI Baud Rate Options.pdf b/Doc/Z180 ASCI Baud Rate Options.pdf index 9e48d821..2c8fe24b 100644 Binary files a/Doc/Z180 ASCI Baud Rate Options.pdf and b/Doc/Z180 ASCI Baud Rate Options.pdf differ diff --git a/ReadMe.md b/ReadMe.md index a5bcf40f..3ddc1dd5 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.3 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -03 May 2023 +23 May 2023 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index 8bb15525..a409cd8a 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -03 May 2023 +23 May 2023 diff --git a/Source/Apps/assign.asm b/Source/Apps/assign.asm index 757859f4..fcc677ea 100644 --- a/Source/Apps/assign.asm +++ b/Source/Apps/assign.asm @@ -1918,8 +1918,8 @@ dev06 .db "SD",0 dev07 .db "PRPSD",0 dev08 .db "PPPSD",0 dev09 .db "HDSK",0 -dev10 .equ devunk -dev11 .equ devunk +dev10 .db "PPA",0 +dev11 .db "IMM",0 dev12 .equ devunk dev13 .equ devunk dev14 .equ devunk diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 8eef64f2..97771883 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -3392,8 +3392,8 @@ DEV06 .DB "SD$" DEV07 .DB "PRPSD$" DEV08 .DB "PPPSD$" DEV09 .DB "HDSK$" -DEV10 .EQU DEVUNK -DEV11 .EQU DEVUNK +DEV10 .DB "PPA$" +DEV11 .DB "IMM$" DEV12 .EQU DEVUNK DEV13 .EQU DEVUNK DEV14 .EQU DEVUNK diff --git a/Source/Doc/Applications.md b/Source/Doc/Applications.md index 8c86d052..49aab8ff 100644 --- a/Source/Doc/Applications.md +++ b/Source/Doc/Applications.md @@ -889,6 +889,28 @@ written in C and requires SDCC to compile. As such it is not part of the RomWBW build process. However, the full project and source code is found in the [FAT GitHub Repository](https://github.com/wwarthen/FAT). +## Known Issues + +CP/M (and workalike) OSes have significant restrictions on filename +characters. The FAT application will block any attempt to create a +file on the CP/M filesystem containing any of these prohibited +characters: + +| `< > . , ; : = ? * [ ] _ % | ( ) / \` + +The operation will be aborted with "`Error: Invalid Path Name`" if such +a filename character is encountered. + +Since MS-DOS does allow some of these characters, you can have +issues when copying files from MS-DOS to CP/M if the MS-DOS filenames +use these characters. Unfortunately, FAT is not yet smart enough to +substitute illegal characters with legal ones. So, you will need to +clean the filenames before trying to copy them to CP/M. + +The FAT application does try to detect the scenario where you are +copying a file to itself. However, this detection is not perfect and +can corrupt a file if it occurs. Be careful to avoid this. + `\clearpage`{=latex} # TUNE diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index 9424ed1f..d6acd606 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -3896,7 +3896,8 @@ may be discovered by RomWBW in your system. | DSKY | System | Keypad & Display | | DSRTC | RTC | Maxim DS1302 Real-Time Clock w/ NVRAM | | DUART | Char | SCC2681 or compatible Dual UART | -| FD | Disk | 8272 of compatible Floppy Disk Controller | +| EMM | Disk | Disk drive on Parallel Port emm interface (Zip Drive) | +| FD | Disk | 8272 or compatible Floppy Disk Controller | | GDC | Video | uPD7220 Video Display Controller | | HDSK | Disk | SIMH Simulator Hard Disk | | IDE | Disk | IDE/ATA Hard Disk Interface | diff --git a/Source/Doc/Z180 ASCI Baud Rate Options.xlsx b/Source/Doc/Z180 ASCI Baud Rate Options.xlsx index 9ee75209..c0f50b9a 100644 Binary files a/Source/Doc/Z180 ASCI Baud Rate Options.xlsx and b/Source/Doc/Z180 ASCI Baud Rate Options.xlsx differ diff --git a/Source/HBIOS/Config/RCZ80_easy.asm b/Source/HBIOS/Config/RCZ80_easy.asm index 1eb9e5ae..902e5604 100644 --- a/Source/HBIOS/Config/RCZ80_easy.asm +++ b/Source/HBIOS/Config/RCZ80_easy.asm @@ -75,5 +75,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index 0e32f628..dd4e5ed8 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/Source/HBIOS/Config/RCZ80_kio.asm @@ -72,5 +72,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_skz.asm b/Source/HBIOS/Config/RCZ80_skz.asm index 281389bc..65aea7b1 100644 --- a/Source/HBIOS/Config/RCZ80_skz.asm +++ b/Source/HBIOS/Config/RCZ80_skz.asm @@ -67,5 +67,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 0481f9ad..92bb25f2 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -61,5 +61,6 @@ PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|USR] SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_tiny.asm b/Source/HBIOS/Config/RCZ80_tiny.asm index e3dcae7a..ef78618f 100644 --- a/Source/HBIOS/Config/RCZ80_tiny.asm +++ b/Source/HBIOS/Config/RCZ80_tiny.asm @@ -82,5 +82,6 @@ IDE0BASE .SET $90 ; IDE 0: IO BASE ADDRESS PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_zrc.asm b/Source/HBIOS/Config/RCZ80_zrc.asm index 3a7a5924..3b634d37 100644 --- a/Source/HBIOS/Config/RCZ80_zrc.asm +++ b/Source/HBIOS/Config/RCZ80_zrc.asm @@ -59,5 +59,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_zrc_ram.asm b/Source/HBIOS/Config/RCZ80_zrc_ram.asm index 84988475..40dbdf0d 100644 --- a/Source/HBIOS/Config/RCZ80_zrc_ram.asm +++ b/Source/HBIOS/Config/RCZ80_zrc_ram.asm @@ -63,5 +63,6 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index b3b9ae3e..92a781e3 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -252,6 +252,10 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 84f1e087..6d7ab6c8 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -317,6 +317,22 @@ LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index a2497b34..78380b60 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -241,6 +241,22 @@ LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 2ef262bb..4388cf4b 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -254,6 +254,10 @@ LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index a01db448..8a441056 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -247,6 +247,10 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index ea0c59ec..971a0e1e 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -263,6 +263,22 @@ LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index eeea9d6e..dd96ed6f 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -267,6 +267,22 @@ LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 66ce2745..bd089eb6 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -258,9 +258,25 @@ LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014] LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 702235a8..f1d46a3f 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -236,6 +236,10 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 574a2427..5177e829 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -234,11 +234,10 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) -LPTMODE .EQU LPTMODE_NONE ; LPT: DRIVER MODE: LPTMODE_[NONE|IBM|MG014] -LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) -LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR -LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 01c74f5f..a8a68639 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -257,6 +257,22 @@ LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPA0MODE .EQU PPAMODE_MG014 ; PPA 0: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1MODE .EQU PPAMODE_MG014 ; PPA 1: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMM0MODE .EQU IMMMODE_MG014 ; IMM 0: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1MODE .EQU IMMMODE_MG014 ; IMM 1: DRIVER MODE: IMMMODE_[NONE|MG014] +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index d21fff6c..1a92ce7b 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -206,6 +206,10 @@ PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 1ea67b88..f2a2e508 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -177,6 +177,10 @@ PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 34c68d84..1d937a05 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -188,6 +188,10 @@ PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 8d8464ee..be5110c8 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1261,11 +1261,11 @@ Z280_INITZ: ; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2) ; - ; IT HAS BEEN REPORTED THAT CMR NEEDS TO BE SET PRIOR TO CCR - ; WHEN USING AN INPUT FREQUENCY THAT IS XTAL / 2. - ; I NEVER EXPERIENCED A PROBLEM RELATED TO ORDER, BUT JUST + ; BILL MCMULLEN REPORTED THAT CMR NEEDS TO BE SET PRIOR TO CCR + ; WHEN USING A CPU FREQUENCY (PHI) THAT IS XTAL * 2. + ; HERE WE ARE SETTING CPU FREQUENCY TO XTAL / 2, BUT JUST ; FOR GOOD MEASURE, CMR IS SET PRIOR TO CCR BELOW. - ; https://www.retrobrewcomputers.org/forum/index.php?t=msg&th=316&#msg_5045 + ; https://www.retrobrewcomputers.org/forum/index.php?t=msg&th=316&goto=5045&#msg_5045 XOR A OUT0 (Z180_CMR),A OUT0 (Z180_CCR),A @@ -3239,6 +3239,12 @@ HB_INITTBL: #IF (HDSKENABLE) .DW HDSK_INIT #ENDIF +#IF (PPAENABLE) + .DW PPA_INIT +#ENDIF +#IF (IMMENABLE) + .DW IMM_INIT +#ENDIF #IF (PRPENABLE) .DW PRP_INIT #ENDIF @@ -6348,6 +6354,24 @@ SIZ_HDSK .EQU $ - ORG_HDSK .ECHO " bytes.\n" #ENDIF ; +#IF (PPAENABLE) +ORG_PPA .EQU $ + #INCLUDE "ppa.asm" +SIZ_PPA .EQU $ - ORG_PPA + .ECHO "PPA occupies " + .ECHO SIZ_PPA + .ECHO " bytes.\n" +#ENDIF +; +#IF (IMMENABLE) +ORG_IMM .EQU $ + #INCLUDE "imm.asm" +SIZ_IMM .EQU $ - ORG_IMM + .ECHO "IMM occupies " + .ECHO SIZ_IMM + .ECHO " bytes.\n" +#ENDIF +; #IF (TERMENABLE) ORG_TERM .EQU $ #INCLUDE "term.asm" @@ -7134,6 +7158,8 @@ PS_DDSD .TEXT "SD$" PS_DDPRPSD .TEXT "PRPSD$" PS_DDPPPSD .TEXT "PPPSD$" PS_DDHDSK .TEXT "HDSK$" +PS_DDPPA .TEXT "PPA$" +PS_DDIMM .TEXT "IMM$" ; ; DISK TYPE STRINGS ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 5ba100d3..9d4c65d7 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -321,6 +321,8 @@ DIODEV_SD .EQU $60 DIODEV_PRPSD .EQU $70 DIODEV_PPPSD .EQU $80 DIODEV_HDSK .EQU $90 +DIODEV_PPA .EQU $A0 +DIODEV_IMM .EQU $B0 ; ; RTC DEVICE IDS ; diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm new file mode 100644 index 00000000..7c1b63ec --- /dev/null +++ b/Source/HBIOS/imm.asm @@ -0,0 +1,1469 @@ +; +;============================================================================= +; IMM DISK DRIVER +;============================================================================= +; +; PARALLEL PORT INTERFACE FOR SCSI DISK DEVICES USING A PARALLEL PORT +; ADAPTER. PRIMARILY TARGETS PARALLEL PORT IOMEGA ZIP DRIVES. +; +; CURRENTLY CODED SPECIFICALLY FOR RCBUS MG014 PARALLEL PORT HARDWARE. +; INTENDED TO CO-EXIST WITH LPT DRIVER. +; +; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. +; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX). +; +; 5/23/2023 WBW - INITIAL RELEASE +; +;============================================================================= +; +; MG014 STYLE INTERFACE (USED BY RCBUS MG014 MODULE): +; +; PORT 0 (INPUT/OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | | | | /ERR | SEL | POUT | BUSY | /ACK | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (INPUT/OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | LED | | | | /SEL | /RES | /LF | /STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; TODO: +; +; - TIMEOUT IS INFINITE!!! +; +; - ASSIGN DRIVE LETTERS EVEN WHEN NO MEDIA AT BOOT +; +; - OPTIMIZE READ/WRITE LOOPS +; +; - COMMENT MORE OF THE CODE +; +; - THERE ARE CURRENTLY NO BUFFER OVERRUN CHECKS. WE ASSUME SCSI +; DEVICES WILL SEND/REQUEST THE EXPECTED NUMBER OF BYTES. +; +; - MAKE THE MG014 STATUS LED DO SOMETHING USEFUL? +; +; NOTES: +; +; - THIS DRIVER IS FOR THE ZIP DRIVE EMM INTERFACE. IT WILL SIMPLY +; FAIL TO EVEN RECOGNIZE A ZIP DRIVE WITH THE OLDER PPA INTERFACE. +; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP +; DRIVE IS EMM OR PPA. SIGH. +; +; - THERE ARE SOME HARD CODED TIMEOUT LOOPS IN THE CODE. THEY ARE +; WORKING OK ON A 7 MHZ Z80. THEY ARE LIKELY TO NEED TWEAKING ON +; FASTER CPUS. +; +; - THIS DRIVER OPERATES PURELY IN NIBBLE MODE. I SUSPECT IT IS +; POSSIBLE TO USE FULL BYTE MODE (PS2 STYLE), BUT I HAVE NOT +; ATTEMPTED IT. +; +; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE +; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN +; THE STANDARD IBM PARALLEL PORT WHICH NECESSITATES A BUNCH OF EXTRA +; BIT FIDDLING ON EVERY READ. +; +; IMM PORT OFFSETS +; +IMM_IODATA .EQU 0 ; PORT A, DATA, OUT +IMM_IOSTAT .EQU 1 ; PORT B, STATUS, IN +IMM_IOCTRL .EQU 2 ; PORT C, CTRL, OUT +IMM_IOSETUP .EQU 3 ; PPI SETUP +; +; SCSI UNIT IDS +; +IMM_SELF .EQU 7 +IMM_TGT .EQU 6 +; +; SCSI COMMAND CODES +; +SCSI_CMD_READ .EQU $08 +SCSI_CMD_INQ .EQU $12 +SCSI_CMD_TEST .EQU $00 +SCSI_CMD_START .EQU $1B +SCSI_CMD_SENSE .EQU $03 +SCSI_CMD_WRITE .EQU $0A +SCSI_CMD_RDCAP .EQU $25 + +; +; IMM DEVICE STATUS +; +IMM_STOK .EQU 0 +IMM_STINVUNIT .EQU -1 +IMM_STNOMEDIA .EQU -2 +IMM_STCMDERR .EQU -3 +IMM_STIOERR .EQU -4 +IMM_STTO .EQU -5 +IMM_STNOTSUP .EQU -6 +; +; IMM DEVICE CONFIGURATION +; +IMM_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +; +; PER DEVICE DATA OFFSETS IN CONFIG TABLE ENTRIES +; +IMM_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +IMM_MODE .EQU 1 ; OPERATION MODE: IMM MODE (BYTE) +IMM_STAT .EQU 2 ; LAST STATUS (BYTE) +IMM_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE) +IMM_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +IMM_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +; +;============================================================================= +; INITIALIZATION ENTRY POINT +;============================================================================= +; +IMM_INIT: + LD IY,IMM_CFG ; POINT TO START OF CONFIG TABLE +; +IMM_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,IMM_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +IMM_INIT2: + CALL NEWLINE ; FORMATTING + PRTS("IMM:$") ; DRIVER LABEL +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+IMM_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + PRTS(" MODE=$") ; LABEL FOR MODE + LD A,(IY+IMM_MODE) ; GET MODE BITS + LD DE,IMM_STR_MODE_NONE ; MODE LABEL + CP IMMMODE_NONE ; TEST FOR MODE + JR Z,IMM_INIT3 ; IF SO, DISPLAY IT + LD DE,IMM_STR_MODE_MG014 ; MODE LABEL + CP IMMMODE_MG014 ; TEST FOR MODE + JR Z,IMM_INIT3 ; IF SO, DISPLAY IT + LD DE,IMM_STR_MODE_UNK ; MODE LABEL +IMM_INIT3: + CALL WRITESTR ; DISPLAY MODE +; + ; CHECK FOR HARDWARE PRESENCE + CALL IMM_DETECT ; PROBE FOR INTERFACE + JR Z,IMM_INIT4 ; IF FOUND, CONTINUE + CALL PC_SPACE ; FORMATTING + LD DE,IMM_STR_NOHW ; NO IMM MESSAGE + CALL WRITESTR ; DISPLAY IT + JR IMM_INIT6 ; SKIP CFG ENTRY +; +IMM_INIT4: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(IMM_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+IMM_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (IMM_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,IMM_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL IMM_RESET ; RESET/INIT THE INTERFACE +; + ; START PRINTING DEVICE INFO + CALL IMM_PRTPREFIX ; PRINT DEVICE PREFIX +; + ; CHECK FOR BAD STATUS + LD A,(IY+IMM_STAT) ; GET STATUS + OR A ; SET FLAGS + JP Z,IMM_INIT5 ; CONTINUE + CALL PC_SPACE ; FORMATTING + CALL IMM_PRTSTATSTR ; PRINT STATUS STRING + JR IMM_INIT6 ; LOOP TILL DONE +; +IMM_INIT5: + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,IMM_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; +IMM_INIT6: + LD DE,IMM_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP IMM_INIT1 ; AND LOOP +; +;---------------------------------------------------------------------- +; PROBE FOR IMM HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +IMM_DETECT: + ; INITIALIZE 8255 + LD A,(IY+IMM_IOBASE) ; BASE PORT + ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY +; + CALL IMM_DISCONNECT + CALL IMM_CONNECT + CALL IMM_DISCONNECT +; + ; EXPECTING S1=$B8, S2=$18, S3=$38 + LD A,(IMM_S1) + CP $B8 + RET NZ + LD A,(IMM_S2) + CP $18 + RET NZ + LD A,(IMM_S3) + CP $38 + RET NZ +; + XOR A + RET +; +;============================================================================= +; DRIVER FUNCTION TABLE +;============================================================================= +; +IMM_FNTBL: + .DW IMM_STATUS + .DW IMM_RESET + .DW IMM_SEEK + .DW IMM_READ + .DW IMM_WRITE + .DW IMM_VERIFY + .DW IMM_FORMAT + .DW IMM_DEVICE + .DW IMM_MEDIA + .DW IMM_DEFMED + .DW IMM_CAP + .DW IMM_GEOM +#IF (($ - IMM_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID IMM FUNCTION TABLE ***\n" +#ENDIF +; +IMM_VERIFY: +IMM_FORMAT: +IMM_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +IMM_READ: + CALL HB_DSKREAD + LD A,SCSI_CMD_READ + LD (IMM_CMD_RW),A + JP IMM_IO +; +; +; +IMM_WRITE: + CALL HB_DSKREAD + LD A,SCSI_CMD_WRITE + LD (IMM_CMD_RW),A + JP IMM_IO +; +; +; +IMM_IO: + LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + CALL IMM_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO + JR NZ,IMM_IO3 ; BAIL OUT ON ERROR +; + ; SETUP LBA + ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN + LD HL,IMM_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB) + LD A,(IY+IMM_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB) + LD (HL),A + INC HL + LD A,(IY+IMM_LBA+1) + LD (HL),A + INC HL + LD A,(IY+IMM_LBA+0) + LD (HL),A + INC HL +; + ; DO SCSI IO + LD DE,(IMM_DSKBUF) + LD BC,512 + LD HL,IMM_CMD_RW + CALL IMM_RUNCMD + CALL Z,IMM_CHKCMD + JR NZ,IMM_IO2 ; IF ERROR, SKIP INCREMENT + ; INCREMENT LBA + LD A,IMM_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + ; INCREMENT DMA + LD HL,IDE_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +; +IMM_IO2: +IMM_IO3: + LD HL,(IMM_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET Z ; RETURN IF SUCCESS + LD A,ERR_IO ; SIGNAL IO ERROR + OR A ; SET FLAGS + RET ; AND DONE +; +; +; +IMM_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+IMM_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +IMM_RESET: + JP IMM_INITDEV +; +; +; +IMM_DEVICE: + LD D,DIODEV_IMM ; D := DEVICE TYPE + LD E,(IY+IMM_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01000000 ; C := REMOVABLE HARD DISK + LD H,(IY+IMM_MODE) ; H := MODE + LD L,(IY+IMM_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; IMM_GETMED +; +IMM_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,IMM_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA +; + CALL IMM_RESET ; RESET IMM INTERFACE +; +IMM_MEDIA1: + LD A,(IY+IMM_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +IMM_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+IMM_LBA+0),L ; SAVE NEW LBA + LD (IY+IMM_LBA+1),H ; ... + LD (IY+IMM_LBA+2),E ; ... + LD (IY+IMM_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +IMM_CAP: + LD A,(IY+IMM_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,IMM_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +IMM_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL IMM_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS IMM_CAP STATUS +; +;============================================================================= +; FUNCTION SUPPORT ROUTINES +;============================================================================= +; +IMM_WRITEDATA: + LD C,(IY+IMM_IOBASE) + OUT (C),A + CALL DELAY + RET +; +; +; +IMM_WRITECTRL: + XOR $0B + LD C,(IY+IMM_IOBASE) + INC C + INC C + OUT (C),A + CALL DELAY + RET +; +; +; +IMM_READSTATUS: + LD C,(IY+IMM_IOBASE) + INC C + IN A,(C) + LD C,0 ; INIT RESULT +; + BIT 0,A ; ACK = $01 + JR Z,IMM_READSTATUS1 + SET 6,C ; $40 +; +IMM_READSTATUS1: +; + BIT 1,A ; BUSY = $02 + JR NZ,IMM_READSTATUS2 + SET 7,C ; $80 +; +IMM_READSTATUS2: +; + BIT 2,A ; PAPER = $04 + JR Z,IMM_READSTATUS3 + SET 5,C ; $20 +; +IMM_READSTATUS3: +; + BIT 3,A ; SELECT = $08 + JR Z,IMM_READSTATUS4 + SET 4,C ; $10 +; +IMM_READSTATUS4: +; + BIT 4,A ; FAULT = $10 + JR Z,IMM_READSTATUS5 + SET 3,C ; $08 +; +IMM_READSTATUS5: + LD A,C + RET +; +; +; +IMM_CPP: + PUSH AF + LD A,$0C + CALL IMM_WRITECTRL + LD A,$AA + CALL IMM_WRITEDATA + LD A,$55 + CALL IMM_WRITEDATA + LD A,$00 + CALL IMM_WRITEDATA + LD A,$FF + CALL IMM_WRITEDATA + CALL IMM_READSTATUS + AND $B8 + LD (IMM_S1),A + LD A,$87 + CALL IMM_WRITEDATA + CALL IMM_READSTATUS + AND $B8 + LD (IMM_S2),A + LD A,$78 + CALL IMM_WRITEDATA + CALL IMM_READSTATUS + AND $38 + LD (IMM_S3),A + POP AF + CALL IMM_WRITEDATA + LD A,$0C + CALL IMM_WRITECTRL + LD A,$0D + CALL IMM_WRITECTRL + LD A,$0C + CALL IMM_WRITECTRL + LD A,$FF + CALL IMM_WRITEDATA +; + ; CONNECT: S1=$B8 S2=$18 S3=$30 + ; DISCONNECT: S1=$B8 S2=$18 S3=$38 +; +#IF (IMMTRACE >= 2) + PRTS("\r\nCPP: S1=$") + LD A,(IMM_S1) + CALL PRTHEXBYTE + PRTS(" S2=$") + LD A,(IMM_S2) + CALL PRTHEXBYTE + PRTS(" S3=$") + LD A,(IMM_S3) + CALL PRTHEXBYTE +#ENDIF +; + XOR A ; ASSUME SUCCESS FOR NOW + RET +; +IMM_S1 .DB 0 +IMM_S2 .DB 0 +IMM_S3 .DB 0 +; +; +; +IMM_CONNECT: + LD A,$E0 + CALL IMM_CPP + LD A,$30 + CALL IMM_CPP + LD A,$E0 + CALL IMM_CPP + RET +; +; +; +IMM_DISCONNECT: + LD A,$30 + CALL IMM_CPP + RET +; +; +; +IMM_RESETPULSE: + LD A,$04 + CALL IMM_WRITECTRL + LD A,$40 + CALL IMM_WRITEDATA + CALL DELAY ; 16 US, IDEALLY, 1 US + LD A,$0C + CALL IMM_WRITECTRL + LD A,$0D + CALL IMM_WRITECTRL + CALL DELAY ; 48 US, IDEALLY, 50 US + CALL DELAY + CALL DELAY + LD A,$0C + CALL IMM_WRITECTRL + LD A,$04 + CALL IMM_WRITECTRL + RET +; +; +; +IMM_SELECT: +#IF IMMTRACE >= 2) + PRTS("\r\nSELECT: $") +#ENDIF + LD A,$0C + CALL IMM_WRITECTRL +; + LD HL,500 ; TIMEOUT COUNTER +; +IMM_SELECT1: + CALL IMM_READSTATUS + AND $08 + JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON + DEC HL + LD A,H + OR L + JP Z,IMM_CMD_TIMEOUT ; TIMEOUT + JR IMM_SELECT1 +; +IMM_SELECT2: + LD A,$04 + CALL IMM_WRITECTRL + LD A,$80 | (1 << IMM_TGT) + CALL IMM_WRITEDATA + CALL DELAY + LD A,$0C + CALL IMM_WRITECTRL +; +#IF IMMTRACE >= 2) + CALL IMM_READSTATUS + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + LD A,$0D + CALL IMM_WRITECTRL +; +#IF IMMTRACE >= 2) + CALL IMM_READSTATUS + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + LD HL,500 ; TIMEOUT COUNTER +; +IMM_SELECT3: + CALL IMM_READSTATUS +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + AND $08 + JR NZ,IMM_SELECT4 ; IF CLEAR, MOVE ON + DEC HL + LD A,H + OR L + JP Z,IMM_CMD_TIMEOUT ; TIMEOUT + JR IMM_SELECT3 +; +IMM_SELECT4: + LD A,$0C + CALL IMM_WRITECTRL +; + XOR A + RET +; +; +; +IMM_SENDCMD: +; +#IF IMMTRACE >= 2) + PRTS("\r\nSENDCMD:$") +#ENDIF +; + LD HL,0 +IMM_SENDCMD1: + PUSH HL + CALL IMM_WAITDONE + POP HL + CP $A8 + JR NZ,IMM_SENDCMD2 + LD A,$04 + CALL IMM_WRITECTRL + LD A,(DE) +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL IMM_WRITEDATA + INC DE + INC HL + LD A,$05 + CALL IMM_WRITECTRL + LD A,(DE) +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL IMM_WRITEDATA + INC DE + INC HL + LD A,$00 + CALL IMM_WRITECTRL + JR IMM_SENDCMD1 +; +IMM_SENDCMD2: + LD A,$04 + CALL IMM_WRITECTRL +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + RET +; +; +; +IMM_WAITBUSY: + LD HL,500 ; NORMAL TIMEOUT COUNTER +; +IMM_WAITBUSY_HL: ; VARIABLE TIMEOUT ENTRY + LD A,$0C + CALL IMM_WRITECTRL +; +IMM_WAITBUSY2: + CALL IMM_READSTATUS + BIT 7,A + RET NZ ; IF SET, MOVE ON + DEC HL + LD A,H + OR L + ; TODO: IMPLEMENT TIMEOUT!!! + ;JP Z,IMM_CMD_TIMEOUT ; TIMEOUT + JR IMM_WAITBUSY2 +; +; +; +IMM_WAITDONE: + LD HL,500 ; NORMAL TIMEOUT COUNTER +; +IMM_WAITDONE_HL: ; VARIABLE TIMEOUT ENTRY + CALL IMM_WAITBUSY_HL + AND $B8 + PUSH AF + LD A,$04 + CALL IMM_WRITECTRL + POP AF + RET +; +; +; +IMM_NEGOTIATE: +#IF IMMTRACE >= 2) + PRTS("\r\nNEGO: $") +#ENDIF + LD A,$04 + CALL IMM_WRITECTRL + CALL DELAY ; 16 US, IDEALLY 5 US + LD A,$00 + CALL IMM_WRITEDATA + LD DE,7 ; 112 US, IDEALLY 100 US + CALL VDELAY + LD A,$06 + CALL IMM_WRITECTRL + CALL DELAY ; 16 US, IDEALLY 5 US + CALL IMM_READSTATUS + PUSH AF ; SAVE RESULT + CALL DELAY ; 16 US, IDEALLY 5 US + LD A,$07 + CALL IMM_WRITECTRL + CALL DELAY ; 16 US, IDEALLY 5 US + LD A,$06 + CALL IMM_WRITECTRL +; + POP AF +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + AND $20 +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PC_GT + CALL PRTHEXBYTE +#ENDIF +; + CP $20 + JP NZ,IMM_CMD_IOERR + RET +; +; +; +IMM_GETBYTE: + CALL IMM_WAITBUSY + LD A,$04 + CALL IMM_WRITECTRL + LD A,$06 + CALL IMM_WRITECTRL + CALL IMM_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + PUSH AF + LD A,$05 + CALL IMM_WRITECTRL + CALL IMM_READSTATUS + AND $F0 + POP HL + OR H + PUSH AF + LD A,$04 + CALL IMM_WRITECTRL + POP AF + RET +; +; DE=BUFFER +; HL=LENGTH (0 FOR VARIABLE) +; +IMM_GETDATA: + LD A,H + OR L + JR NZ,IMM_GETDATALEN +; +#IF IMMTRACE >= 2) + PRTS("\r\nGETDATA:$") +#ENDIF +; +IMM_GETDATA1: + PUSH HL + CALL IMM_WAITDONE + POP HL + CP $98 + JR NZ,IMM_GETDATA2 + LD A,$04 + CALL IMM_WRITECTRL + LD A,$06 + CALL IMM_WRITECTRL + CALL IMM_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + PUSH AF + LD A,$05 + CALL IMM_WRITECTRL + CALL IMM_READSTATUS + AND $F0 + POP BC + OR B + LD (DE),A + INC DE + INC HL + LD A,$04 + CALL IMM_WRITECTRL + LD A,$0C + CALL IMM_WRITECTRL + JR IMM_GETDATA1 +; +IMM_GETDATA2: +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + RET +; +IMM_GETDATALEN: +; +#IF IMMTRACE >= 2) + PRTS("\r\nGETDLEN:$") + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + LD A,$04 + CALL IMM_WRITECTRL +IMM_GETDATALEN1: + LD A,$06 + CALL IMM_WRITECTRL + CALL IMM_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + PUSH AF + LD A,$05 + CALL IMM_WRITECTRL + CALL IMM_READSTATUS + AND $F0 + POP BC + OR B + LD (DE),A + INC DE + DEC HL + LD A,$04 + CALL IMM_WRITECTRL + LD A,H + OR L + JR NZ,IMM_GETDATALEN1 + LD A,$0C + CALL IMM_WRITECTRL + RET +; +; DE=BUFFER +; HL=LENGTH (0 FOR VARIABLE) +; +IMM_PUTDATA: + LD A,H + OR L + JR NZ,IMM_PUTDATALEN +; +#IF IMMTRACE >= 2) + PRTS("\r\nPUTDATA:$") +#ENDIF +; +IMM_PUTDATA1: + PUSH HL + CALL IMM_WAITDONE + POP HL + CP $88 + JR NZ,IMM_PUTDATA2 + LD A,$04 + CALL IMM_WRITECTRL + LD A,(DE) + CALL IMM_WRITEDATA + INC DE + INC HL + LD A,$05 + CALL IMM_WRITECTRL + LD A,(DE) + CALL IMM_WRITEDATA + INC DE + INC HL + LD A,$00 + CALL IMM_WRITECTRL + JR IMM_PUTDATA1 +; +IMM_PUTDATA2: + LD A,$04 + CALL IMM_WRITECTRL +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + RET +; +IMM_PUTDATALEN: +; +#IF IMMTRACE >= 2) + PRTS("\r\nPUTDLEN:$") + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + LD A,$04 + CALL IMM_WRITECTRL +IMM_PUTDATALEN1: + LD A,(DE) + CALL IMM_WRITEDATA + INC DE + DEC HL + LD A,$05 + CALL IMM_WRITECTRL + LD A,(DE) + CALL IMM_WRITEDATA + INC DE + DEC HL + LD A,$00 + CALL IMM_WRITECTRL + LD A,H + OR L + JR NZ,IMM_PUTDATALEN1 + LD A,$04 + CALL IMM_WRITECTRL + RET +; +; +; +IMM_GETSTATUS: +; +#IF IMMTRACE >= 2) + PRTS("\r\nSTATUS:$") +#ENDIF +; + CALL IMM_GETBYTE + LD (IMM_CMDSTAT),A +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL IMM_WAITDONE + CP $B8 + RET NZ + CALL IMM_GETBYTE + LD (IMM_CMDSTAT+1),A +; +#IF IMMTRACE >= 2) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + RET +; +; +; +IMM_ENDREAD: + LD A,$04 + CALL IMM_WRITECTRL + LD A,$0C + CALL IMM_WRITECTRL + LD A,$0E + CALL IMM_WRITECTRL + LD A,$04 + CALL IMM_WRITECTRL + RET +; +; HL: COMMAND BUFFER +; DE: TRANSFER BUFFER +; BC: TRANSFER LENGTH (0=VARIABLE) +; +IMM_RUNCMD: + LD (IMM_CMDSTK),SP ; FOR ERROR ABORTS + LD (IMM_DSKBUF),DE ; SAVE BUF PTR + LD (IMM_XFRLEN),BC ; SAVE XFER LEN + PUSH HL + CALL IMM_CONNECT + CALL IMM_SELECT + CALL IMM_WAITBUSY + POP DE + CALL IMM_SENDCMD +; +IMM_RUNCMD_PHASE: + LD HL,50000 ; LONG TIMEOUT HERE + CALL IMM_WAITDONE_HL +; +#IF IMMTRACE >= 2) + PRTS("\r\nPHASE: $") + CALL PRTHEXBYTE +#ENDIF +; + CP $88 ; DEVICE WANTS TO RCV DATA + JR Z,IMM_RUNCMD_WRITE + CP $98 ; DEVICE WANTS TO SEND DATA + JR Z,IMM_RUNCMD_READ + CP $B8 ; DEVICE WANTS TO BE DONE + JR Z,IMM_RUNCMD_END + JR IMM_CMD_IOERR +; +IMM_RUNCMD_WRITE: + LD DE,(IMM_DSKBUF) + LD HL,(IMM_XFRLEN) ; XFER LENGTH + CALL IMM_PUTDATA ; SEND DATA NOW + JR IMM_RUNCMD_PHASE +; +IMM_RUNCMD_READ: + CALL IMM_NEGOTIATE + CALL IMM_WAITDONE + ; CHECK FOR STATUS $98??? + LD DE,(IMM_DSKBUF) + LD HL,(IMM_XFRLEN) ; XFER LENGTH + CALL IMM_GETDATA ; GET THE DATA NOW + CALL IMM_ENDREAD + JR IMM_RUNCMD_PHASE +; +IMM_RUNCMD_END: + CALL IMM_NEGOTIATE + CALL IMM_WAITDONE + ; CHECK FOR STATUS $B8??? + CALL IMM_GETSTATUS + CALL IMM_ENDREAD + CALL IMM_DISCONNECT + XOR A ; SIGNAL SUCCESS + RET +; +IMM_CMD_IOERR: + LD A,IMM_STIOERR + JR IMM_CMD_ERR +; +IMM_CMD_TIMEOUT: + LD A,IMM_STTO + JR IMM_CMD_ERR +; +IMM_CMD_ERR: + LD SP,(IMM_CMDSTK) ; UNWIND STACK + PUSH AF ; SAVE STATUS + ;CALL IMM_RESETPULSE ; CLEAN UP THE MESS??? + LD DE,62 + CALL VDELAY + CALL IMM_DISCONNECT + LD DE,62 + CALL VDELAY + POP AF ; RECOVER STATUS + JP IMM_ERR ; ERROR EXIT +; +; +; +IMM_CHKCMD: + ; SCSI COMMAND COMPLETED, CHECK SCSI CMD STATUS + LD A,(IMM_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + RET Z ; IF ZERO, ALL GOOD, DONE +; + ; DO WE HAVE A CHECK CONDITION? + CP 2 ; CHECK CONDITION RESULT? + JR Z,IMM_CHKCMD1 ; IF SO, REQUEST SENSE + JP IMM_IOERR ; ELSE, GENERAL I/O ERROR +; +IMM_CHKCMD1: + ; USE REQUEST SENSE CMD TO GET ERROR DETAILS + LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF + LD BC,0 ; VARIABLE LENGTH REQUEST + LD HL,IMM_CMD_SENSE ; REQUEST SENSE CMD + CALL IMM_RUNCMD ; DO IT + JP NZ,IMM_IOERR ; BAIL IF ERROR IN CMD +; + ; REQ SENSE CMD COMPLETED +#IF IMMTRACE >= 2) + LD A,16 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +#ENDIF +; + ; CHECK SCSI CMD STATUS + LD A,(IMM_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + JP NZ,IMM_IOERR ; IF FAILED, GENERAL I/O ERROR +; + ; RETURN RESULT BASED ON REQ SENSE DATA + LD A,(HB_WRKBUF+12) ; GET ADDITIONAL SENSE CODE + CP $3A ; NO MEDIA? + JP Z,IMM_NOMEDIA ; IF SO, RETURN NO MEDIA ERR + JP IMM_IOERR ; ELSE GENERAL I/O ERR +; +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. +; +IMM_CHKERR: + LD A,(IY+IMM_STAT) ; GET STATUS + OR A ; SET FLAGS + CALL NZ,IMM_RESET ; IF ERROR STATUS, RESET BUS + RET +; +; (RE)INITIALIZE DEVICE +; +IMM_INITDEV: + ; INITIALIZE 8255 + LD A,(IY+IMM_IOBASE) ; BASE PORT + ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY +; + CALL IMM_DISCONNECT + CALL IMM_CONNECT + CALL IMM_RESETPULSE + LD DE,62 + CALL VDELAY + CALL IMM_DISCONNECT + LD DE,62 + CALL VDELAY +; + LD B,4 +IMM_INITDEV1: + PUSH BC +; + ; REQUEST SENSE COMMAND + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMD + JR NZ,IMM_INITDEV2 ; CMD PROC ERROR +; + ; CHECK CMD STATUS + LD A,(IMM_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + JR NZ,IMM_INITDEV2 ; BAD CMD STATUS +; +#IF IMMTRACE >= 2) + LD A,16 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; CHECK SENSE KEY + LD A,(HB_WRKBUF + 2) + OR A +; +IMM_INITDEV2: + POP BC + JR Z,IMM_INITDEV3 ; IF NO ERROR, MOVE ON + DJNZ IMM_INITDEV1 ; TRY UNTIL COUNTER EXHAUSTED + JP IMM_IOERR ; HANDLE ERROR +; +IMM_INITDEV3: + ; READ & RECORD DEVICE CAPACITY + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_RDCAP + CALL IMM_RUNCMD + CALL Z,IMM_CHKCMD + RET NZ ; MEDIA PROBLEM +; +#IF IMMTRACE >= 2) + LD A,8 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; INCREMENT, BIG->LITTLE ENDIAN, SAVE + LD A,IMM_MEDCAP ; OFFSET IN CFG FOR CAPACITY + CALL LDHLIYA ; POINTER TO HL + PUSH HL ; SAVE IT + LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT + CALL LD32 ; LOAD IT TO DE:HL + LD A,L ; FLIP BYTES + LD L,D ; ... BIG ENDIAN + LD D,A ; ... TO LITTLE ENDIAN + LD A,H + LD H,E + LD E,A + CALL INC32 ; INCREMENT TO FINAL VALUE + POP BC ; RECOVER SAVE LOCATION + CALL ST32 ; STORE VALUE +; + XOR A ; SIGNAL SUCCESS + LD (IY+IMM_STAT),A ; RECORD IT + RET +;;;; +;;;; *** DEBUG *** +;;;; +;;; LD DE,HB_WRKBUF +;;; LD BC,512 +;;; LD HL,IMM_CMD_READ +;;; CALL IMM_RUNCMD +;;; CALL Z,IMM_CHKCMD +;;; LD DE,HB_WRKBUF +;;; CALL Z,DUMP_BUFFER +;;;; +;;; LD DE,HB_WRKBUF +;;; LD BC,512 +;;; LD HL,IMM_CMD_READ +;;; CALL IMM_RUNCMD +;;; CALL Z,IMM_CHKCMD +;;; LD DE,HB_WRKBUF +;;; CALL Z,DUMP_BUFFER +;;;; +;;; LD DE,HB_WRKBUF +;;; LD BC,0 +;;; LD HL,IMM_CMD_INQ +;;; CALL IMM_RUNCMD +;;; CALL Z,IMM_CHKCMD +;;; LD DE,HB_WRKBUF +;;; CALL Z,DUMP_BUFFER +;;;; +;;; LD DE,HB_WRKBUF +;;; LD BC,512 +;;; LD HL,IMM_CMD_WRITE +;;; CALL IMM_RUNCMD +;;; CALL Z,IMM_CHKCMD +;;;; +;;; LD DE,HB_WRKBUF +;;; LD BC,512 +;;; LD HL,IMM_CMD_READ2 +;;; CALL IMM_RUNCMD +;;; CALL Z,IMM_CHKCMD +;;; LD DE,HB_WRKBUF +;;; CALL Z,DUMP_BUFFER +;;;; +;;; RET +;;;; +;;;IMM_CMD .DB $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; TEMPLATE +;;;IMM_CMD_READ .DB $08, $00, $00, $00, $01, $00 ; READ SECTOR $0000 +;;;IMM_CMD_INQ .DB $12, $00, $00, $00, $FF, $00 ; INQUIRY +;;;IMM_CMD_TEST .DB $00, $00, $00, $00, $00, $00 ; TEST UNIT READY +;;;IMM_CMD_START .DB $1B, $00, $00, $00, $01, $00 ; START UNIT +;;;IMM_CMD_WRITE .DB $0A, $00, $F0, $00, $01, $00 ; READ SECTOR $F000 +;;;IMM_CMD_READ2 .DB $08, $00, $F0, $00, $01, $00 ; READ SECTOR $F000 +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +IMM_INVUNIT: + LD A,IMM_STINVUNIT + JR IMM_ERR2 ; SPECIAL CASE FOR INVALID UNIT +; +IMM_NOMEDIA: + LD A,IMM_STNOMEDIA + JR IMM_ERR +; +IMM_CMDERR: + LD A,IMM_STCMDERR + JR IMM_ERR +; +IMM_IOERR: + LD A,IMM_STIOERR + JR IMM_ERR +; +IMM_TO: + LD A,IMM_STTO + JR IMM_ERR +; +IMM_NOTSUP: + LD A,IMM_STNOTSUP + JR IMM_ERR +; +IMM_ERR: + LD (IY+IMM_STAT),A ; SAVE NEW STATUS +; +IMM_ERR2: +#IF (IMMTRACE >= 2) + CALL IMM_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +IMM_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO IMM_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +IMM_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+IMM_STAT) + CP IMM_STINVUNIT + JR Z,IMM_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + CALL IMM_PRTPREFIX ; PRINT UNIT PREFIX + JR IMM_PRTSTAT3 +IMM_PRTSTAT2: + CALL NEWLINE + PRTS("IMM:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT +IMM_PRTSTAT3: + CALL PC_SPACE ; FORMATTING + CALL IMM_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +IMM_PRTSTATSTR: + PUSH AF + PUSH DE + LD A,(IY+IMM_STAT) + OR A + LD DE,IMM_STR_STOK + JR Z,IMM_PRTSTATSTR1 + INC A + LD DE,IMM_STR_STINVUNIT + JR Z,IMM_PRTSTATSTR1 + INC A + LD DE,IMM_STR_STNOMEDIA + JR Z,IMM_PRTSTATSTR1 + INC A + LD DE,IMM_STR_STCMDERR + JR Z,IMM_PRTSTATSTR1 + INC A + LD DE,IMM_STR_STIOERR + JR Z,IMM_PRTSTATSTR1 + INC A + LD DE,IMM_STR_STTO + JR Z,IMM_PRTSTATSTR1 + INC A + LD DE,IMM_STR_STNOTSUP + JR Z,IMM_PRTSTATSTR1 + LD DE,IMM_STR_STUNK +IMM_PRTSTATSTR1: + CALL WRITESTR + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +IMM_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("IMM$") + LD A,(IY+IMM_DEV) ; GET CURRENT DEVICE NUM + CP $FE ; NOT YET ASSIGNED? + JR Z,IMM_PRTPREFIX1 ; SKIP DEV NUM IF SO + CALL PRTDECB +IMM_PRTPREFIX1: + CALL PC_COLON + POP AF + RET +; +;============================================================================= +; STRING DATA +;============================================================================= +; +IMM_STR_STOK .TEXT "OK$" +IMM_STR_STINVUNIT .TEXT "INVALID UNIT$" +IMM_STR_STNOMEDIA .TEXT "NO MEDIA$" +IMM_STR_STCMDERR .TEXT "COMMAND ERROR$" +IMM_STR_STIOERR .TEXT "IO ERROR$" +IMM_STR_STTO .TEXT "TIMEOUT$" +IMM_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +IMM_STR_STUNK .TEXT "UNKNOWN ERROR$" +; +IMM_STR_NOHW .TEXT "NOT PRESENT$" +; +IMM_STR_MODE_NONE .TEXT "NONE$" +IMM_STR_MODE_MG014 .TEXT "MG014$" +IMM_STR_MODE_UNK .TEXT "???$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +IMM_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +IMM_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING +IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER +IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH +IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS +; +IMM_TYPE_MAP: + .DW IMM_STR_NONE + .DW IMM_STR_MG014 +; +IMM_STR_NONE .DB "$" +IMM_STR_MG014 .DB "MG014$" +; +; SCSI COMMAND TEMPLATES +; +IMM_CMD_RW .DB $00, $00, $00, $00, $01, $00 ; READ/WRITE SECTOR +IMM_CMD_SENSE .DB $03, $00, $00, $00, $FF, $00 ; REQUEST SENSE DATA +IMM_CMD_RDCAP .DB $25, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; READ CAPACITY +; +; IMM DEVICE CONFIGURATION TABLE +; +IMM_CFG: +; +#IF (IMMCNT >= 1) +; +IMM0_CFG: ; DEVICE 0 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB IMM0MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB IMM0BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF (IMMCNT >= 2) +; +IMM1_CFG: ; DEVICE 1 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB IMM1MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB IMM1BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF ($ - IMM_CFG) != (IMMCNT * IMM_CFGSIZ) + .ECHO "*** INVALID IMM CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END MARKER diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm new file mode 100644 index 00000000..529b81b3 --- /dev/null +++ b/Source/HBIOS/ppa.asm @@ -0,0 +1,1454 @@ +; +;============================================================================= +; PPA DISK DRIVER +;============================================================================= +; +; PARALLEL PORT INTERFACE FOR SCSI DISK DEVICES USING A PARALLEL PORT +; ADAPTER. PRIMARILY TARGETS PARALLEL PORT IOMEGA ZIP DRIVES. +; +; CURRENTLY CODED SPECIFICALLY FOR RCBUS MG014 PARALLEL PORT HARDWARE. +; INTENDED TO CO-EXIST WITH LPT DRIVER. +; +; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. +; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX). +; +; 5/19/2023 WBW - INITIAL RELEASE +; +;============================================================================= +; +; MG014 STYLE INTERFACE (USED BY RCBUS MG014 MODULE): +; +; PORT 0 (INPUT/OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | | | | /ERR | SEL | POUT | BUSY | /ACK | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (INPUT/OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | LED | | | | /SEL | /RES | /LF | /STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; TODO: +; +; NOTES: +; +;;;; +;;;; COMMAND BYTES +;;;; +;;;PPA_CPPA_NOP .EQU $00 +;;;PPA_CPPA_DEVRES .EQU $08 +;;;PPA_CPPA_RECAL .EQU $10 +;;;PPA_CPPA_READ .EQU $20 +;;;PPA_CPPA_WRITE .EQU $30 +;;;PPA_CPPA_DEVDIAG .EQU $90 +;;;PPA_CPPA_IDPKTDEV .EQU $A1 +;;;PPA_CPPA_IDDEV .EQU $EC +;;;PPA_CPPA_SETFEAT .EQU $EF +; +; PPA PORT OFFSETS +; +PPA_IODATA .EQU 0 ; PORT A, DATA, OUT +PPA_IOSTAT .EQU 1 ; PORT B, STATUS, IN +PPA_IOCTRL .EQU 2 ; PORT C, CTRL, OUT +PPA_IOSETUP .EQU 3 ; PPI SETUP +; +; PPA DEVICE STATUS +; +PPA_STOK .EQU 0 +PPA_STINVUNIT .EQU -1 +PPA_STNOMEDIA .EQU -2 +PPA_STCMDERR .EQU -3 +PPA_STIOERR .EQU -4 +PPA_STTO .EQU -5 +PPA_STNOTSUP .EQU -6 +; +; PPA DEVICE CONFIGURATION +; +PPA_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +; +; PER DEVICE DATA OFFSETS IN CONFIG TABLE ENTRIES +; +PPA_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +PPA_MODE .EQU 1 ; OPERATION MODE: PPA MODE (BYTE) +PPA_STAT .EQU 2 ; LAST STATUS (BYTE) +PPA_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE) +PPA_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +PPA_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +; +;============================================================================= +; INITIALIZATION ENTRY POINT +;============================================================================= +; +PPA_INIT: + LD IY,PPA_CFG ; POINT TO START OF CONFIG TABLE +; +PPA_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,PPA_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +PPA_INIT2: + ; CHECK FOR HARDWARE PRESENCE + CALL PPA_DETECT ; PROBE FOR INTERFACE + JP NZ,PPA_INIT6 ; SKIP CFG ENTRY +; + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(PPA_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+PPA_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (PPA_DEVNUM),A ; SAVE IT +; + CALL PPA_PRTPREFIX ; PRINT DEVICE PREFIX +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+PPA_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + PRTS(" MODE=$") ; LABEL FOR MODE + LD A,(IY+PPA_MODE) ; GET MODE BITS + LD DE,PPA_STR_MODE_NONE ; MODE LABEL + CP PPAMODE_NONE ; TEST FOR MODE + JR Z,PPA_INIT3 ; IF SO, DISPLAY IT + LD DE,PPA_STR_MODE_MG014 ; MODE LABEL + CP PPAMODE_MG014 ; TEST FOR MODE + JR Z,PPA_INIT3 ; IF SO, DISPLAY IT + LD DE,PPA_STR_MODE_UNK ; MODE LABEL +PPA_INIT3: + CALL WRITESTR ; DISPLAY MODE +; +PPA_INIT4: + CALL PPA_RESET ; RESET THE INTERFACE +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,PPA_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + ; CHECK FOR BAD STATUS + LD A,(IY+PPA_STAT) ; GET STATUS + OR A ; SET FLAGS + JP Z,PPA_INIT5 ; CONTINUE + CALL PC_SPACE ; FORMATTING + CALL PPA_PRTSTATSTR ; PRINT STATUS STRING + JR PPA_INIT6 ; LOOP TILL DONE +; +PPA_INIT5: + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,PPA_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; +PPA_INIT6: + LD DE,PPA_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP PPA_INIT1 ; AND LOOP +; +;---------------------------------------------------------------------- +; PROBE FOR PPA HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +PPA_DETECT: + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +;============================================================================= +; DRIVER FUNCTION TABLE +;============================================================================= +; +PPA_FNTBL: + .DW PPA_STATUS + .DW PPA_RESET + .DW PPA_SEEK + .DW PPA_READ + .DW PPA_WRITE + .DW PPA_VERIFY + .DW PPA_FORMAT + .DW PPA_DEVICE + .DW PPA_MEDIA + .DW PPA_DEFMED + .DW PPA_CAP + .DW PPA_GEOM +#IF (($ - PPA_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID PPA FUNCTION TABLE ***\n" +#ENDIF +; +PPA_VERIFY: +PPA_FORMAT: +PPA_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +PPA_READ: + JP PPA_STNOTSUP ; NOT SUPPORTED +; +; +; +PPA_WRITE: + JP PPA_STNOTSUP ; NOT SUPPORTED +; +; +; +PPA_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+PPA_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +PPA_DEVICE: + LD D,DIODEV_PPA ; D := DEVICE TYPE + LD E,(IY+PPA_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01000000 ; C := REMOVABLE HARD DISK + LD H,(IY+PPA_MODE) ; H := MODE + LD L,(IY+PPA_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; PPA_GETMED +; +PPA_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,PPA_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA +; + ;CALL PPA_RESET ; RESET PPA INTERFACE + CALL PPA_INITUNIT ; RE-INITIALIZE UNIT +; +PPA_MEDIA1: + LD A,(IY+PPA_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +PPA_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+PPA_LBA+0),L ; SAVE NEW LBA + LD (IY+PPA_LBA+1),H ; ... + LD (IY+PPA_LBA+2),E ; ... + LD (IY+PPA_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +PPA_CAP: + LD A,(IY+PPA_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,PPA_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +PPA_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL PPA_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS PPA_CAP STATUS +; +;============================================================================= +; FUNCTION SUPPORT ROUTINES +;============================================================================= +; +PPA_SELF .EQU 7 +PPA_TGT .EQU 6 +; +IMM_TGT .EQU 6 +; +; +; +PPA_DELAY: + PUSH AF + CALL DELAY + CALL DELAY + CALL DELAY + CALL DELAY + POP AF + RET +; +; +; +PPA_WRITEDATA: + ;PRTS(" D-$") + ;CALL PRTHEXBYTE + + LD C,(IY+PPA_IOBASE) + OUT (C),A + CALL PPA_DELAY + RET +; +; +; +PPA_WRITECTRL: + ;PRTS(" C-$") + ;CALL PRTHEXBYTE + + XOR $0B + + ;PRTS(">$") + ;CALL PRTHEXBYTE + + LD C,(IY+PPA_IOBASE) + INC C + INC C + OUT (C),A + CALL PPA_DELAY + RET +; +; +; +PPA_READSTATUS: + LD C,(IY+PPA_IOBASE) + INC C + IN A,(C) + + ;PRTS(" I-$") + ;CALL PRTHEXBYTE + + LD C,0 ; INIT RESULT +; + BIT 0,A ; ACK = $01 + JR Z,PPA_READSTATUS1 + SET 6,C ; $40 +; +PPA_READSTATUS1: +; + BIT 1,A ; BUSY = $02 + JR NZ,PPA_READSTATUS2 + SET 7,C ; $80 +; +PPA_READSTATUS2: +; + BIT 2,A ; PAPER = $04 + JR Z,PPA_READSTATUS3 + SET 5,C ; $20 +; +PPA_READSTATUS3: +; + BIT 3,A ; SELECT = $08 + JR Z,PPA_READSTATUS4 + SET 4,C ; $10 +; +PPA_READSTATUS4: +; + BIT 4,A ; FAULT = $10 + JR Z,PPA_READSTATUS5 + SET 3,C ; $08 +; +PPA_READSTATUS5: + LD A,C + + ;PRTS(">$") + ;CALL PRTHEXBYTE + + RET +; +; +; +PPA_DPULSE: + CALL PPA_WRITEDATA + LD A,$0C + CALL PPA_WRITECTRL + LD A,$0E + CALL PPA_WRITECTRL + LD A,$0C ;? + CALL PPA_WRITECTRL ;? + LD A,$04 + CALL PPA_WRITECTRL + LD A,$0C + CALL PPA_WRITECTRL + RET +; +; +; +PPA_CPULSE: + CALL PPA_WRITEDATA + LD A,$04 + CALL PPA_WRITECTRL + LD A,$06 + CALL PPA_WRITECTRL + LD A,$04 + CALL PPA_WRITECTRL + LD A,$0C + CALL PPA_WRITECTRL + RET +; +; +; +PPA_CONNECT: + CALL NEWLINE + LD A,$00 + CALL PPA_CPULSE + LD A,$3C + CALL PPA_CPULSE + LD A,$20 + CALL PPA_CPULSE + LD A,$8F + CALL PPA_CPULSE + RET +; +; +; +IMM_CPP: + ;CALL NEWLINE + PUSH AF + LD A,$0C + CALL PPA_WRITECTRL + LD A,$AA + CALL PPA_WRITEDATA + LD A,$55 + CALL PPA_WRITEDATA + LD A,$00 + CALL PPA_WRITEDATA + LD A,$FF + CALL PPA_WRITEDATA + CALL PPA_READSTATUS + AND $B8 + LD (IMM_S1),A + LD A,$87 + CALL PPA_WRITEDATA + CALL PPA_READSTATUS + AND $B8 + LD (IMM_S2),A + LD A,$78 + CALL PPA_WRITEDATA + CALL PPA_READSTATUS + AND $38 + LD (IMM_S3),A + POP AF + CALL PPA_WRITEDATA + LD A,$0C + CALL PPA_WRITECTRL + LD A,$0D + CALL PPA_WRITECTRL + LD A,$0C + CALL PPA_WRITECTRL + LD A,$FF + CALL PPA_WRITEDATA + + ; CONNECT: S1=$B8 S2=$18 S3=$30 + ; DISCONNECT: S1=$B8 S2=$18 S3=$38 + + PRTS("\r\nCPP: S1=$") + LD A,(IMM_S1) + CALL PRTHEXBYTE + PRTS(" S2=$") + LD A,(IMM_S2) + CALL PRTHEXBYTE + PRTS(" S3=$") + LD A,(IMM_S3) + CALL PRTHEXBYTE + + XOR A ; ASSUME SUCCESS FOR NOW + RET +; +IMM_S1 .DB 0 +IMM_S2 .DB 0 +IMM_S3 .DB 0 +; +; +; +IMM_CONNECT: + LD A,$E0 + CALL IMM_CPP + LD A,$30 + CALL IMM_CPP + LD A,$E0 + CALL IMM_CPP + RET +; +; +; +IMM_DISCONNECT: + LD A,$30 + CALL IMM_CPP + RET +; +; +; +IMM_RESETPULSE: + ;CALL NEWLINE + LD A,$04 + CALL PPA_WRITECTRL + LD A,$40 + CALL PPA_WRITEDATA + CALL DELAY + LD A,$0C + CALL PPA_WRITECTRL + LD A,$0D + CALL PPA_WRITECTRL + CALL DELAY + CALL DELAY + CALL DELAY + CALL DELAY + LD A,$0C + CALL PPA_WRITECTRL + LD A,$04 + CALL PPA_WRITECTRL + RET +; +; +; +PPA_DISCONNECT: + ;CALL NEWLINE + LD A,$00 + CALL PPA_DPULSE + LD A,$3C + CALL PPA_DPULSE + LD A,$20 + CALL PPA_DPULSE + LD A,$0F + CALL PPA_DPULSE + RET +; +; +; +PPA_SELECT: + LD A,1 << PPA_TGT + CALL PPA_WRITEDATA + LD A,$0E + CALL PPA_WRITECTRL + LD A,$0C + CALL PPA_WRITECTRL + LD A,1 << PPA_SELF + CALL PPA_WRITEDATA + LD A,$08 + CALL PPA_WRITECTRL +; + LD HL,0 ; TIMEOUT COUNTER +; +PPA_SELECT1: + CALL PPA_READSTATUS + OR $F0 + RET NZ + DEC HL + LD A,H + OR L + RET Z ; TIMEOUT + JR PPA_SELECT1 +; +; +; +IMM_SELECT: + PRTS("\r\nSELECT: $") + LD A,$0C + CALL PPA_WRITECTRL +; + LD HL,500 ; TIMEOUT COUNTER +; +IMM_SELECT1: + CALL PPA_READSTATUS + AND $08 + JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON + DEC HL + LD A,H + OR L + JP Z,IMM_CMD_TIMEOUT ; TIMEOUT + JR IMM_SELECT1 +; +IMM_SELECT2: + LD A,$04 + CALL PPA_WRITECTRL + LD A,$80 | (1 << IMM_TGT) + CALL PPA_WRITEDATA + CALL DELAY + LD A,$0C + CALL PPA_WRITECTRL + + CALL PPA_READSTATUS + CALL PC_SPACE + CALL PRTHEXBYTE + + LD A,$0D + CALL PPA_WRITECTRL + + CALL PPA_READSTATUS + CALL PC_SPACE + CALL PRTHEXBYTE +; + LD HL,500 ; TIMEOUT COUNTER +; +IMM_SELECT3: + CALL PPA_READSTATUS + CALL PC_SPACE + CALL PRTHEXBYTE + AND $08 + JR NZ,IMM_SELECT4 ; IF CLEAR, MOVE ON + DEC HL + LD A,H + OR L + JP Z,IMM_CMD_TIMEOUT ; TIMEOUT + JR IMM_SELECT3 +; +IMM_SELECT4: + LD A,$0C + CALL PPA_WRITECTRL +; + XOR A + RET +; +; +; +IMM_SENDCMD: + ; TODO: USE PUTDATA ROUTINE??? + ; TODO: CHECK BUSY??? + PRTS("\r\nSENDCMD:$") + LD A,$04 + CALL PPA_WRITECTRL +; + LD HL,IMM_CMD + LD B,6 +; +IMM_SENDCMD1: + LD A,(HL) + CALL PC_SPACE + CALL PRTHEXBYTE + CALL PPA_WRITEDATA + INC HL + DEC B + LD A,$05 + CALL PPA_WRITECTRL + LD A,(HL) + CALL PC_SPACE + CALL PRTHEXBYTE + CALL PPA_WRITEDATA + INC HL + LD A,$00 + CALL PPA_WRITECTRL + DJNZ IMM_SENDCMD1 + LD A,$04 + CALL PPA_WRITECTRL +; + CALL PPA_READSTATUS + CALL PC_SPACE + CALL PC_GT + CALL PRTHEXBYTE + RET +; +; +; +IMM_WAITBUSY: + LD HL,500 ; NORMAL TIMEOUT COUNTER +; +IMM_WAITBUSY_HL: ; VARIABLE TIMEOUT ENTRY + ;PRTS("\r\nWAITB: $") + LD A,$0C + CALL PPA_WRITECTRL +; +IMM_WAITBUSY2: + CALL PPA_READSTATUS + BIT 7,A + RET NZ ; IF SET, MOVE ON + DEC HL + LD A,H + OR L + JP Z,IMM_CMD_TIMEOUT ; TIMEOUT + JR IMM_WAITBUSY2 +; +; +; +IMM_WAITDONE: + LD HL,500 ; NORMAL TIMEOUT COUNTER +; +IMM_WAITDONE_HL: ; VARIABLE TIMEOUT ENTRY + CALL IMM_WAITBUSY_HL + AND $B8 + PUSH AF + LD A,$04 + CALL PPA_WRITECTRL + POP AF + RET +; +; +; +IMM_NEGOTIATE: + ; TODO: REVIEW TIMING DELAYS!!! + PRTS("\r\nNEGO: $") + LD A,$04 + CALL PPA_WRITECTRL + CALL DELAY + LD A,$00 + CALL PPA_WRITEDATA + CALL DELAY + CALL DELAY + CALL DELAY + CALL DELAY + LD A,$06 + CALL PPA_WRITECTRL + CALL DELAY + CALL PPA_READSTATUS + PUSH AF ; SAVE RESULT + CALL DELAY + LD A,$07 + CALL PPA_WRITECTRL + CALL DELAY + LD A,$06 + CALL PPA_WRITECTRL +; + POP AF + CALL PC_SPACE + CALL PRTHEXBYTE + AND $20 + CALL PC_SPACE + CALL PC_GT + CALL PRTHEXBYTE + CP $20 + JP NZ,IMM_CMD_IOERR + RET +; +; +; +PPA_WAITDONE: + LD HL,0 ; TIMEOUT COUNTER +PPA_WAITDONE1: + CALL PPA_READSTATUS + AND $F0 + BIT 7,A + RET NZ + DEC HL + LD A,H + OR L + JP Z,IMM_CMD_TIMEOUT ; TIMEOUT + JR PPA_WAITDONE1 +; +; +; +IMM_GETBYTE: + CALL IMM_WAITBUSY + LD A,$04 + CALL PPA_WRITECTRL + LD A,$06 + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + PUSH AF + LD A,$05 + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + POP HL + OR H + PUSH AF + LD A,$04 + CALL PPA_WRITECTRL + POP AF + RET +; +; DE=BUFFER +; HL=LENGTH (0 FOR VARIABLE) +; +IMM_GETDATA: + LD A,H + OR L + JR NZ,IMM_GETDATALEN + PRTS("\r\nGETDATA:$") +IMM_GETDATA1: + PUSH HL + CALL IMM_WAITDONE + POP HL + CP $98 + JR NZ,IMM_GETDATA2 + LD A,$04 + CALL PPA_WRITECTRL + LD A,$06 + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + PUSH AF + LD A,$05 + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + POP BC + OR B + LD (DE),A + INC DE + INC HL + LD A,$04 + CALL PPA_WRITECTRL + LD A,$0C + CALL PPA_WRITECTRL + JR IMM_GETDATA1 +; +IMM_GETDATA2: + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") + RET +; +IMM_GETDATALEN: + PRTS("\r\nGETDLEN:$") + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") + LD A,$04 + CALL PPA_WRITECTRL +IMM_GETDATALEN1: + LD A,$06 + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + PUSH AF + LD A,$05 + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + POP BC + OR B + LD (DE),A + INC DE + DEC HL + LD A,$04 + CALL PPA_WRITECTRL + LD A,H + OR L + JR NZ,IMM_GETDATALEN1 + LD A,$0C + CALL PPA_WRITECTRL + RET +; +; DE=BUFFER +; HL=LENGTH (0 FOR VARIABLE) +; +IMM_PUTDATA: + LD A,H + OR L + JR NZ,IMM_PUTDATALEN + PRTS("\r\nPUTDATA:$") +IMM_PUTDATA1: + PUSH HL + CALL IMM_WAITDONE + POP HL + CP $88 + JR NZ,IMM_PUTDATA2 + + LD A,$04 + CALL PPA_WRITECTRL + LD A,(DE) + CALL PPA_WRITEDATA + INC DE + INC HL + LD A,$05 + CALL PPA_WRITECTRL + LD A,(DE) + CALL PPA_WRITEDATA + INC DE + INC HL + LD A,$00 + CALL PPA_WRITECTRL + JR IMM_PUTDATA1 +; +IMM_PUTDATA2: + LD A,$04 + CALL PPA_WRITECTRL + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") + RET +; +IMM_PUTDATALEN: + PRTS("\r\nPUTDLEN:$") + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") + LD A,$04 + CALL PPA_WRITECTRL +IMM_PUTDATALEN1: + LD A,(DE) + CALL PPA_WRITEDATA + INC DE + DEC HL + LD A,$05 + CALL PPA_WRITECTRL + LD A,(DE) + CALL PPA_WRITEDATA + INC DE + DEC HL + LD A,$00 + CALL PPA_WRITECTRL + LD A,H + OR L + JR NZ,IMM_PUTDATALEN1 + LD A,$04 + CALL PPA_WRITECTRL + RET +; +; +; +IMM_GETSTATUS: + PRTS("\r\nSTATUS:$") + CALL IMM_GETBYTE + LD (IMM_STATUS),A + CALL PC_SPACE + CALL PRTHEXBYTE + CALL IMM_WAITDONE + CP $B8 + RET NZ + CALL IMM_GETBYTE + LD (IMM_STATUS+1),A + CALL PC_SPACE + CALL PRTHEXBYTE + RET +; +; +; +IMM_ENDREAD: + LD A,$04 + CALL PPA_WRITECTRL + LD A,$0C + CALL PPA_WRITECTRL + LD A,$0E + CALL PPA_WRITECTRL + LD A,$04 + CALL PPA_WRITECTRL + RET +; +; +; +IMM_RUNCMDX: + ; COPY CMD BYTES FROM (HL) + PUSH BC + PUSH DE + LD BC,6 + LD DE,IMM_CMD + LDIR + POP DE + POP BC +; +IMM_RUNCMD: + LD (IMM_CMDSTK),SP ; FOR ERROR ABORTS + LD (IMM_DSKBUF),DE ; SAVE BUF PTR + LD (IMM_XFRLEN),BC ; SAVE XFER LEN + CALL IMM_CONNECT + CALL IMM_SELECT + CALL IMM_WAITBUSY + CALL IMM_SENDCMD +; +IMM_RUNCMD_LOOP: + LD HL,50000 ; LONG TIMEOUT HERE + CALL IMM_WAITDONE_HL +; + PRTS("\r\nCMD$") + PRTS("LOOP: $") + CALL PRTHEXBYTE +; + CP $88 + JR Z,IMM_RUNCMD_WRITE + CP $98 + JR Z,IMM_RUNCMD_READ + CP $B8 + JR Z,IMM_RUNCMD_END + JR IMM_CMD_IOERR +; +IMM_RUNCMD_WRITE: + LD DE,(IMM_DSKBUF) + LD HL,(IMM_XFRLEN) ; XFER LENGTH + CALL IMM_PUTDATA ; SEND DATA NOW + JR IMM_RUNCMD_LOOP +; +IMM_RUNCMD_READ: + CALL IMM_NEGOTIATE + CALL IMM_WAITDONE + ; CHECK FOR STATUS $98??? + LD DE,(IMM_DSKBUF) + LD HL,(IMM_XFRLEN) ; XFER LENGTH + CALL IMM_GETDATA ; GET THE DATA NOW + CALL IMM_ENDREAD + JR IMM_RUNCMD_LOOP +; +IMM_RUNCMD_END: + CALL IMM_NEGOTIATE + CALL IMM_WAITDONE + ; CHECK FOR STATUS $B8??? + CALL IMM_GETSTATUS + CALL IMM_ENDREAD + CALL IMM_DISCONNECT + XOR A ; SIGNAL SUCCESS + RET +; +IMM_CMD_IOERR: + LD A,PPA_STIOERR + JR IMM_CMD_ERR +; +IMM_CMD_TIMEOUT: + LD A,PPA_STTO + JR IMM_CMD_ERR +; +IMM_CMD_ERR: + LD SP,(IMM_CMDSTK) ; UNWIND STACK + PUSH AF ; SAVE STATUS + CALL IMM_RESETPULSE ; CLEAN UP THE MESS + CALL IMM_DISCONNECT ; MAKE SURE WE ARE OFF THE BUS + POP AF ; RECOVER STATUS + JP PPA_ERR ; ERROR EXIT +; +;============================================================================= +; HARDWARE INTERFACE ROUTINES +;============================================================================= +; +; RESET ALL DEVICES ON BUS +; +PPA_RESET: + JP PPA_INITUNIT +; +; +; +PPA_INITUNIT: + ;JP PPA_INITDEV + JP IMM_INITDEV +; +; (RE)INITIALIZE DEVICE +; +PPA_INITDEV: + ; INITIALIZE 8255 + LD A,(IY+PPA_IOBASE) ; BASE PORT + ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY + + CALL NEWLINE + LD A,$0C + CALL PPA_WRITECTRL + CALL DELAY +; + ; INITIALIZE PPA INTERFACE + CALL PPA_READSTATUS + + CALL NEWLINE + LD A,$AA + CALL PPA_WRITEDATA + + CALL PPA_DISCONNECT + + CALL PPA_CONNECT + + CALL NEWLINE + ;LD A,$06 + LD A,$0E + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + ;... CHECK VALUE=$F0 + + CALL PC_SPACE + CALL PRTHEXBYTE + + CALL NEWLINE + ;LD A,$04 + LD A,$0C + CALL PPA_WRITECTRL + CALL PPA_READSTATUS + AND $F0 + ;... CHECK VALUE=$80 + + CALL PC_SPACE + CALL PRTHEXBYTE + + CALL PPA_DISCONNECT + + CALL NEWLINE + LD A,$AA + CALL PPA_WRITEDATA + LD A,$0C ; ??? + CALL NEWLINE + CALL PPA_WRITECTRL + + CALL PPA_CONNECT + + CALL NEWLINE + LD A,$40 + CALL PPA_WRITEDATA + LD A,$08 + CALL PPA_WRITECTRL + LD A,$0C + CALL PPA_WRITECTRL + + CALL PPA_DISCONNECT +; + JP PPA_NOMEDIA +; + ; RECORD STATUS OK + XOR A ; A := 0 (STATUS = OK) + LD (IY+PPA_STAT),A ; SAVE IT +; + RET ; RETURN, A=0, Z SET +; +; +; +IMM_INITDEV: + ; INITIALIZE 8255 + LD A,(IY+PPA_IOBASE) ; BASE PORT + ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY +; + CALL IMM_CONNECT + CALL IMM_RESETPULSE + LD DE,62 + CALL VDELAY + CALL IMM_DISCONNECT + LD DE,62 + CALL VDELAY +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMDX + LD A,16 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMDX + LD A,16 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +; + LD DE,HB_WRKBUF + LD BC,512 + LD HL,IMM_CMD_READ + CALL IMM_RUNCMDX + LD DE,HB_WRKBUF + CALL Z,DUMP_BUFFER +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMDX + LD A,16 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +; + LD DE,HB_WRKBUF + LD BC,512 + LD HL,IMM_CMD_READ + CALL IMM_RUNCMDX + LD DE,HB_WRKBUF + CALL Z,DUMP_BUFFER +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMDX + LD A,16 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_INQ + CALL IMM_RUNCMDX + LD DE,HB_WRKBUF + CALL Z,DUMP_BUFFER +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMDX + LD A,16 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +; + LD DE,HB_WRKBUF + ;LD BC,512 + LD BC,0 + LD HL,IMM_CMD_WRITE + CALL IMM_RUNCMDX + LD DE,HB_WRKBUF +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMDX + LD A,16 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +; + LD DE,HB_WRKBUF + LD BC,512 + LD HL,IMM_CMD_READ2 + CALL IMM_RUNCMDX + LD DE,HB_WRKBUF + CALL DUMP_BUFFER +; + LD DE,HB_WRKBUF + LD BC,0 + LD HL,IMM_CMD_SENSE + CALL IMM_RUNCMDX + LD A,16 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +; + JP PPA_NOMEDIA +; +IMM_CMD .DB $00, $00, $00, $00, $00, $00 ; TEMPLATE +IMM_CMD_READ .DB $08, $00, $00, $00, $01, $00 ; READ SECTOR $0000 +IMM_CMD_INQ .DB $12, $00, $00, $00, $FF, $00 ; INQUIRY +IMM_CMD_TEST .DB $00, $00, $00, $00, $00, $00 ; TEST UNIT READY +IMM_CMD_START .DB $1B, $00, $00, $00, $01, $00 ; START UNIT +IMM_CMD_SENSE .DB $03, $00, $00, $00, $FF, $00 ; REQUEST SENSE DATA +IMM_CMD_WRITE .DB $0A, $00, $F0, $00, $01, $00 ; READ SECTOR $F000 +IMM_CMD_READ2 .DB $08, $00, $F0, $00, $01, $00 ; READ SECTOR $F000 + +; +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. +; +PPA_CHKERR: + LD A,(IY+PPA_STAT) ; GET STATUS + OR A ; SET FLAGS + CALL NZ,PPA_RESET ; IF ERROR STATUS, RESET BUS + RET +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +PPA_INVUNIT: + LD A,PPA_STINVUNIT + JR PPA_ERR2 ; SPECIAL CASE FOR INVALID UNIT +; +PPA_NOMEDIA: + LD A,PPA_STNOMEDIA + JR PPA_ERR +; +PPA_CMDERR: + LD A,PPA_STCMDERR + JR PPA_ERR +; +PPA_IOERR: + LD A,PPA_STIOERR + JR PPA_ERR +; +PPA_TO: + LD A,PPA_STTO + JR PPA_ERR +; +PPA_NOTSUP: + LD A,PPA_STNOTSUP + JR PPA_ERR +; +PPA_ERR: + LD (IY+PPA_STAT),A ; SAVE NEW STATUS +; +PPA_ERR2: +#IF (PPATRACE >= 2) + CALL PPA_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +PPA_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO PPA_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +PPA_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+PPA_STAT) + CP PPA_STINVUNIT + JR Z,PPA_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + CALL PPA_PRTPREFIX ; PRINT UNIT PREFIX + JR PPA_PRTSTAT3 +PPA_PRTSTAT2: + CALL NEWLINE + PRTS("PPA:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT +PPA_PRTSTAT3: + CALL PC_SPACE ; FORMATTING + CALL PPA_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +PPA_PRTSTATSTR: + PUSH AF + PUSH DE + LD A,(IY+PPA_STAT) + OR A + LD DE,PPA_STR_STOK + JR Z,PPA_PRTSTATSTR1 + INC A + LD DE,PPA_STR_STINVUNIT + JR Z,PPA_PRTSTATSTR1 + INC A + LD DE,PPA_STR_STNOMEDIA + JR Z,PPA_PRTSTATSTR1 + INC A + LD DE,PPA_STR_STCMDERR + JR Z,PPA_PRTSTATSTR1 + INC A + LD DE,PPA_STR_STIOERR + JR Z,PPA_PRTSTATSTR1 + INC A + LD DE,PPA_STR_STTO + JR Z,PPA_PRTSTATSTR1 + INC A + LD DE,PPA_STR_STNOTSUP + JR Z,PPA_PRTSTATSTR1 + LD DE,PPA_STR_STUNK +PPA_PRTSTATSTR1: + CALL WRITESTR + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +PPA_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("PPA$") + LD A,(IY+PPA_DEV) ; GET CURRENT DEVICE NUM + CP $FE ; NOT YET ASSIGNED? + JR Z,PPA_PRTPREFIX1 ; SKIP DEV NUM IF SO + CALL PRTDECB +PPA_PRTPREFIX1: + CALL PC_COLON + POP AF + RET +; +;============================================================================= +; STRING DATA +;============================================================================= +; +PPA_STR_STOK .TEXT "OK$" +PPA_STR_STINVUNIT .TEXT "INVALID UNIT$" +PPA_STR_STNOMEDIA .TEXT "NO MEDIA$" +PPA_STR_STCMDERR .TEXT "COMMAND ERROR$" +PPA_STR_STIOERR .TEXT "IO ERROR$" +PPA_STR_STTO .TEXT "TIMEOUT$" +PPA_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +PPA_STR_STUNK .TEXT "UNKNOWN ERROR$" +; +;;;PPA_STR_NO .TEXT "NO$" +PPA_STR_NOHW .TEXT "NOT PRESENT$" +; +PPA_STR_MODE_NONE .TEXT "NONE$" +PPA_STR_MODE_MG014 .TEXT "MG014$" +PPA_STR_MODE_UNK .TEXT "???$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +;;;PPA_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +; +PPA_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +IMM_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING +IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER +IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH +IMM_STATUS .DB 0, 0 ; CMD RESULT STATUS +; +PPA_TYPE_MAP: + .DW PPA_STR_NONE + .DW PPA_STR_MG014 +; +PPA_STR_NONE .DB "$" +PPA_STR_MG014 .DB "MG014$" +; +; PPA DEVICE CONFIGURATION TABLE +; +PPA_CFG: +; +#IF (PPACNT >= 1) +; +PPA0_CFG: ; DEVICE 0 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB PPA0MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB PPA0BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF (PPACNT >= 2) +; +PPA1_CFG: ; DEVICE 1 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB PPA1MODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB PPA1BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF ($ - PPA_CFG) != (PPACNT * PPA_CFGSIZ) + .ECHO "*** INVALID PPA CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END MARKER diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index fbbbe6ef..f057e926 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -248,6 +248,16 @@ LPTMODE_NONE .EQU 0 ; NONE LPTMODE_IBM .EQU 1 ; IBM STYLE INTERFACE LPTMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE ; +; PPA DRIVER MODE SELECTIONS +; +PPAMODE_NONE .EQU 0 ; NONE +PPAMODE_MG014 .EQU 1 ; RCBUS MG014 STYLE INTERFACE +; +; IMM DRIVER MODE SELECTIONS +; +IMMMODE_NONE .EQU 0 ; NONE +IMMMODE_MG014 .EQU 1 ; RCBUS MG014 STYLE INTERFACE +; ; GDC MONITOR SELECTIONS ; GDCMON_NONE .EQU 0 diff --git a/Source/ver.inc b/Source/ver.inc index 70ceab46..1a5a4399 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 3 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.3.0-dev.14" +#DEFINE BIOSVER "3.3.0-dev.15" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 41a88ab5..d9e32aa6 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 3 rup equ 0 rtp equ 0 biosver macro - db "3.3.0-dev.14" + db "3.3.0-dev.15" endm