Browse Source

Add 5380 SCSI Support

Thanks and credit to Jay Cotton for providing the SCSI transport code upon which this driver is based.
pull/639/head v3.6.0-dev.44
Wayne Warthen 2 months ago
parent
commit
d05c1af35c
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. BIN
      Doc/RomWBW Applications.pdf
  2. BIN
      Doc/RomWBW Disk Catalog.pdf
  3. BIN
      Doc/RomWBW Hardware.pdf
  4. BIN
      Doc/RomWBW Introduction.pdf
  5. BIN
      Doc/RomWBW System Guide.pdf
  6. BIN
      Doc/RomWBW User Guide.pdf
  7. 5
      ReadMe.md
  8. 5
      ReadMe.txt
  9. 12
      Source/Apps/assign/assign.asm
  10. 5
      Source/CBIOS/cbios.asm
  11. 1
      Source/Doc/Hardware.md
  12. 3
      Source/Doc/Introduction.md
  13. 1
      Source/Doc/SystemGuide.md
  14. 2
      Source/HBIOS/Config/SZ180_std.asm
  15. 2
      Source/HBIOS/Config/SZ80_std.asm
  16. 2
      Source/HBIOS/Config/SZ80_t35.asm
  17. 2
      Source/HBIOS/cfg_DUO.asm
  18. 2
      Source/HBIOS/cfg_DYNO.asm
  19. 2
      Source/HBIOS/cfg_EPITX.asm
  20. 2
      Source/HBIOS/cfg_EZZ80.asm
  21. 2
      Source/HBIOS/cfg_GMZ180.asm
  22. 2
      Source/HBIOS/cfg_HEATH.asm
  23. 7
      Source/HBIOS/cfg_MASTER.asm
  24. 2
      Source/HBIOS/cfg_MBC.asm
  25. 2
      Source/HBIOS/cfg_MK4.asm
  26. 2
      Source/HBIOS/cfg_MON.asm
  27. 2
      Source/HBIOS/cfg_MSX.asm
  28. 2
      Source/HBIOS/cfg_N8.asm
  29. 2
      Source/HBIOS/cfg_N8PC.asm
  30. 2
      Source/HBIOS/cfg_NABU.asm
  31. 2
      Source/HBIOS/cfg_RCEZ80.asm
  32. 2
      Source/HBIOS/cfg_RCZ180.asm
  33. 2
      Source/HBIOS/cfg_RCZ280.asm
  34. 2
      Source/HBIOS/cfg_RCZ80.asm
  35. 2
      Source/HBIOS/cfg_RPH.asm
  36. 2
      Source/HBIOS/cfg_SBC.asm
  37. 2
      Source/HBIOS/cfg_SCZ180.asm
  38. 7
      Source/HBIOS/cfg_SZ180.asm
  39. 7
      Source/HBIOS/cfg_SZ80.asm
  40. 2
      Source/HBIOS/cfg_Z80RETRO.asm
  41. 2
      Source/HBIOS/cfg_ZETA.asm
  42. 2
      Source/HBIOS/cfg_ZETA2.asm
  43. 12
      Source/HBIOS/hbios.asm
  44. 1
      Source/HBIOS/hbios.inc
  45. 4
      Source/HBIOS/invntdev.asm
  46. 808
      Source/HBIOS/scsi.asm
  47. 2
      Source/ver.inc
  48. 2
      Source/ver.lib

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Hardware.pdf

Binary file not shown.

BIN
Doc/RomWBW Introduction.pdf

Binary file not shown.

BIN
Doc/RomWBW System Guide.pdf

Binary file not shown.

BIN
Doc/RomWBW User Guide.pdf

Binary file not shown.

5
ReadMe.md

@ -7,7 +7,7 @@
**RomWBW Introduction** \
Version 3.6 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
09 Dec 2025
10 Dec 2025
# Overview
@ -363,6 +363,9 @@ let me know if I missed you!
- Henk Berends added support for the MSX platform.
- Jay Cotton provided the SCSI transport code upon which the SCSI driver
is based.
## Related Projects
Outside of the hardware platforms adapted to RomWBW, there are a variety

5
ReadMe.txt

@ -1,6 +1,6 @@
RomWBW Introduction
Wayne Warthen (wwarthen@gmail.com)
09 Dec 2025
10 Dec 2025
@ -370,6 +370,9 @@ let me know if I missed you!
- Henk Berends added support for the MSX platform.
- Jay Cotton provided the SCSI transport code upon which the SCSI driver
is based.
Related Projects

12
Source/Apps/assign/assign.asm

@ -40,6 +40,7 @@
; overflow when the drives are finally added
; 2025-07-19 [D?N] Support for native USB drivers
; 2025-08-09 [WBW] Support for ESPSD driver
; 2025-11-10 [WBW] Support for SCSI driver
;_______________________________________________________________________________
;
; ToDo:
@ -2430,7 +2431,7 @@ devtbl: ; device table
.dw dev04, dev05, dev06, dev07
.dw dev08, dev09, dev10, dev11
.dw dev12, dev13, dev14, dev15
.dw dev16, dev17
.dw dev16, dev17, dev18
;
devunk .db "?",0
dev00 .db "MD",0
@ -2450,9 +2451,10 @@ dev13 .db "CHUSB",0
dev14 .db "CHSD",0
dev15 .db "USB",0
dev16 .db "ESPSD",0
dev17 .equ devunk
dev17 .db "SCSI",0
dev18 .equ devunk
;
devcnt .equ 18 ; 18 device types defined
devcnt .equ 19 ; 19 device types defined
;
udevram .db "RAM",0
udevrom .db "ROM",0
@ -2470,10 +2472,10 @@ stack .equ $ ; stack top
; Messages
;
indent .db " ",0
msgban1 .db "ASSIGN v2.2 for RomWBW CP/M ",0
msgban1 .db "ASSIGN v2.3 for RomWBW CP/M ",0
msg22 .db "2.2",0
msg3 .db "3",0
msbban2 .db ", 9-Aug-2025",0
msbban2 .db ",10-Dec-2025",0
msghb .db " (HBIOS Mode)",0
msgub .db " (UBIOS Mode)",0
msgban3 .db "Copyright 2025, Wayne Warthen, GNU GPL v3",0

5
Source/CBIOS/cbios.asm

@ -3408,7 +3408,7 @@ DEVTBL: ; DEVICE TABLE
.DW DEV04, DEV05, DEV06, DEV07
.DW DEV08, DEV09, DEV10, DEV11
.DW DEV12, DEV13, DEV14, DEV15
.DW DEV16, DEV17
.DW DEV16, DEV17, DEV18
;
DEVUNK .DB "???$"
DEV00 .DB "MD$"
@ -3428,7 +3428,8 @@ DEV13 .DB "CHUSB$"
DEV14 .DB "CHSD$"
DEV15 .DB "USB$"
DEV16 .DB "ESPSD$"
DEV17 .EQU DEVUNK
DEV17 .DB "SCSI$"
DEV18 .EQU DEVUNK
;
#ENDIF
;

1
Source/Doc/Hardware.md

@ -2478,6 +2478,7 @@ the active platform and configuration.
| SD | SD Card Interface |
| SYQ | Iomega SparQ Drive on PPI |
| ESPSD | S100 ESP32-based SD Card Interface |
| SCSI | 5380 SCSI Interface |
## Video

3
Source/Doc/Introduction.md

@ -347,6 +347,9 @@ please let me know if I missed you!
* Henk Berends added support for the MSX platform.
* Jay Cotton provided the SCSI transport code upon which the SCSI
driver is based.
`\clearpage`{=latex}
## Related Projects

1
Source/Doc/SystemGuide.md

@ -1101,6 +1101,7 @@ below enumerates their values.
| DIODEV_CHSD | 0x0E | CH375/376 SD Card | ch.asm |
| DIODEV_USB | 0x0F | CH376 Native USB Device | ch376.asm |
| DIODEV_ESPSD | 0x10 | S100 ESP32 SD Card | espsd.asm |
| DIODEV_SCSI | 0x11 | 5380 SCSI Interface | scsi.asm |
A fixed set of media types are defined. The currently defined media
types identifiers are listed below. Each driver will support one or

2
Source/HBIOS/Config/SZ180_std.asm

@ -82,3 +82,5 @@ SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY
ESPSDENABLE .SET TRUE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
ESPSDCNT .SET 1 ; ESPSD: NUMBER OF BOARDS TO DETECT (1-2), 1-2 DEVICES PER BOARD
ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)
;
SCSIENABLE .SET TRUE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)

2
Source/HBIOS/Config/SZ80_std.asm

@ -72,3 +72,5 @@ PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM)
ESPSDENABLE .SET TRUE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
ESPSDCNT .SET 1 ; ESPSD: NUMBER OF BOARDS TO DETECT (1-2), 1-2 DEVICES PER BOARD
ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)
;
SCSIENABLE .SET TRUE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)

2
Source/HBIOS/Config/SZ80_t35.asm

@ -83,3 +83,5 @@ SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM)
ESPSDENABLE .SET TRUE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
ESPSDCNT .SET 1 ; ESPSD: NUMBER OF BOARDS TO DETECT (1-2), 1-2 DEVICES PER BOARD
ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)
;
SCSIENABLE .SET TRUE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)

2
Source/HBIOS/cfg_DUO.asm

@ -375,6 +375,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .SET $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

2
Source/HBIOS/cfg_DYNO.asm

@ -359,6 +359,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_EPITX.asm

@ -385,6 +385,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_EZZ80.asm

@ -394,6 +394,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_GMZ180.asm

@ -384,6 +384,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_HEATH.asm

@ -384,6 +384,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

7
Source/HBIOS/cfg_MASTER.asm

@ -495,6 +495,13 @@ ESPSD0DUAL .EQU TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)
ESPSD1BASE .EQU $82 ; ESPSD 1: ESP32 INTERFACE IO BASE ADR
ESPSD1DUAL .EQU TRUE ; ESPSD 1: DUAL INTERFACE BOARD (DUAL SD)
;
SCSIENABLE .EQU FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
SCSITRACE .EQU 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
SCSICNT .EQU 2 ; SCSI: NUMBER OF TARGET DEVICES (1-2)
SCSI_TID .EQU 0 ; SCSI: TARGET DEVICE ID (0-6)
SCSI0_LUN .EQU 0 ; SCSI0: TARGET LUN
SCSI1_LUN .EQU 1 ; SCSI1: TARGET LUN
;
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)

2
Source/HBIOS/cfg_MBC.asm

@ -363,6 +363,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .SET $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

2
Source/HBIOS/cfg_MK4.asm

@ -356,6 +356,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .SET $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

2
Source/HBIOS/cfg_MON.asm

@ -391,6 +391,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_MSX.asm

@ -398,6 +398,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_N8.asm

@ -358,6 +358,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .SET $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

2
Source/HBIOS/cfg_N8PC.asm

@ -357,6 +357,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .SET $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

2
Source/HBIOS/cfg_NABU.asm

@ -394,6 +394,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_RCEZ80.asm

@ -395,6 +395,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_RCZ180.asm

@ -392,6 +392,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_RCZ280.asm

@ -402,6 +402,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_RCZ80.asm

@ -397,6 +397,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_RPH.asm

@ -339,6 +339,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .SET $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

2
Source/HBIOS/cfg_SBC.asm

@ -347,6 +347,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .SET $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

2
Source/HBIOS/cfg_SCZ180.asm

@ -389,6 +389,8 @@ SYQ1BASE .SET LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

7
Source/HBIOS/cfg_SZ180.asm

@ -381,6 +381,13 @@ ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)
ESPSD1BASE .SET $82 ; ESPSD 1: ESP32 INTERFACE IO BASE ADR
ESPSD1DUAL .SET TRUE ; ESPSD 1: DUAL INTERFACE BOARD (DUAL SD)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
SCSITRACE .SET 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
SCSICNT .SET 2 ; SCSI: NUMBER OF TARGET DEVICES (1-2)
SCSI_TID .SET 0 ; SCSI: TARGET DEVICE ID (0-6)
SCSI0_LUN .SET 0 ; SCSI0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI1: TARGET LUN
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

7
Source/HBIOS/cfg_SZ80.asm

@ -370,6 +370,13 @@ ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)
ESPSD1BASE .SET $82 ; ESPSD 1: ESP32 INTERFACE IO BASE ADR
ESPSD1DUAL .SET TRUE ; ESPSD 1: DUAL INTERFACE BOARD (DUAL SD)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
SCSITRACE .SET 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
SCSICNT .SET 2 ; SCSI: NUMBER OF TARGET DEVICES (1-2)
SCSI_TID .SET 0 ; SCSI: TARGET DEVICE ID (0-6)
SCSI0_LUN .SET 0 ; SCSI0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI1: TARGET LUN
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_Z80RETRO.asm

@ -314,6 +314,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_ZETA.asm

@ -284,6 +284,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

2
Source/HBIOS/cfg_ZETA2.asm

@ -295,6 +295,8 @@ SYQENABLE .SET FALSE ; SYQ: ENABLE SYQUEST SPARQ DISK DRIVER (SYQ.ASM)
;
ESPSDENABLE .SET FALSE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
PIO_SBC .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP

12
Source/HBIOS/hbios.asm

@ -4438,6 +4438,9 @@ HB_INITTBL:
#IF (ESPSDENABLE)
.DW ESPSD_INIT
#ENDIF
#IF (SCSIENABLE)
.DW SCSI_INIT
#ENDIF
#IF (PRPENABLE)
.DW PRP_INIT
#ENDIF
@ -9321,6 +9324,15 @@ SIZ_ESPSD .EQU $ - ORG_ESPSD
MEMECHO " bytes.\n"
#ENDIF
;
#IF (SCSIENABLE)
ORG_SCSI .EQU $
#INCLUDE "scsi.asm"
SIZ_SCSI .EQU $ - ORG_SCSI
MEMECHO "SCSI occupies "
MEMECHO SIZ_SCSI
MEMECHO " bytes.\n"
#ENDIF
;
#IF (ESPENABLE)
ORG_ESP .EQU $
#INCLUDE "esp.asm"

1
Source/HBIOS/hbios.inc

@ -427,6 +427,7 @@ DIODEV_CHUSB .EQU $0D
DIODEV_CHSD .EQU $0E
DIODEV_USB .EQU $0F
DIODEV_ESPSD .EQU $10
DIODEV_SCSI .EQU $11
;
; RTC DEVICE IDS
;

4
Source/HBIOS/invntdev.asm

@ -1,6 +1,6 @@
;==============================================================================
; DEVIVE INVENTORY - Inventory Device
; Version August-2025
; Version December-2025
;==============================================================================
;
; This was extracted from HBIOS and converted into a ROM Application
@ -11,6 +11,7 @@
; Change Log:
; 2025-06-30 [MAP] Initial Release copied from HBIOS.ASM
; 2025-08-09 [WBW] Add support for ESPSD driver
; 2025-12-10 [WBW] Add support for SCSI driver
;______________________________________________________________________________
;
; Include Files
@ -584,6 +585,7 @@ PS_DDCHUSB .TEXT "CHUSB$"
PS_DDCHSD .TEXT "CHSD$"
PS_DDCHNATUSB .TEXT "USB$"
PS_DDESPSD .TEXT "ESPSD$"
PS_DDSCSI .TEXT "SCSI$"
;
; DISK TYPE STRINGS
;

808
Source/HBIOS/scsi.asm

@ -0,0 +1,808 @@
;
;=============================================================================
; SCSI DISK DRIVER FOR 5380
;=============================================================================
;
; DISK DEVICE DRIVER FOR THE 5380 SCSI CHIP.
; DERIVED FROM CODE PROVIDED BY JAY COTTON.
;
; TODO:
; - IMPLEMENT INQUIRY COMMAND AND DISPLAY DATA AT INIT
; - IMPLEMENT CAPACITY COMMAND
; - DO SOMETHING IN INITDEV TO CONFIRM LUN EXISTS
;
; NOTES:
; - CAPACITY IS CURRENTLY HARD-CODED TO 200000 BLOCKS (1GB OF DATA)
;
SCSIBASE .EQU $40
;
; SCSI DEVICE STATUS CODES
;
SCSI_STOK .EQU 0
SCSI_STNOMEDIA .EQU -1
SCSI_STIOERR .EQU -2
SCSI_STTO .EQU -3
SCSI_STNOTRDY .EQU -4
;
; NCR 5380 I/O REGISTERS
;
SCSI_SR_CSD .EQU SCSIBASE ; CURRENT SCSI DATA
SCSI_SR_ICR .EQU SCSIBASE + $01 ; INITIATOR COMMAND
SCSI_SR_MR .EQU SCSIBASE + $02 ; MODE
SCSI_SR_TCR .EQU SCSIBASE + $03 ; TARGET COMMAND
SCSI_SR_CSBS .EQU SCSIBASE + $04 ; CURRENT SCSI BUS STAT.
SCSI_SR_BSR .EQU SCSIBASE + $05 ; BUS STATUS
SCSI_SR_IDR .EQU SCSIBASE + $06 ; INITIATOR DMA RECV.
SCSI_SR_RPI .EQU SCSIBASE + $07 ; RESET PARITY/IRQ
;
; NCR 5380 OUTPUT ONLY REGISTERS
;
SCSI_SR_ODR .EQU SCSIBASE ; OUTPUT DATA
SCSI_SR_SER .EQU SCSIBASE + $04 ; SELECT ENABLE
SCSI_SR_SDS .EQU SCSIBASE + $05 ; START DMA SEND
SCSI_SR_SDTR .EQU SCSIBASE + $06 ; START TARGET DMA RECV.
SCSI_SR_SDIR .EQU SCSIBASE + $07 ; START INITIATOR DMA RECV.
;
; SCSI CURRENT BUS STATUS BIT MASKS
;
SCSI_SM_RST .EQU $80 ; RESET
SCSI_SM_BSY .EQU $40 ; BUSY
SCSI_SM_REQ .EQU $20 ; REQUEST
SCSI_SM_MSG .EQU $10 ; MESSAGE
SCSI_SM_CD .EQU $08 ; CMD/DATA
SCSI_SM_IO .EQU $04 ; IN/OUT
SCSI_SM_SEL .EQU $02 ; SELECT
SCSI_SM_DBP .EQU $01 ; PARITY BIT
;
SCSI_SM_PHM .EQU $08 ; PHASE MATCH BIT
;
; SDCI DEVICE CONFIGURATION
;
; PER DEVICE DATA OFFSETS IN CFG BLOCK
;
SCSI_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE)
SCSI_IOBASE .EQU 1 ; IO BASE ADDRESS (BYTE)
SCSI_LUN .EQU 2 ; TARGET LUN
SCSI_STAT .EQU 3 ; LAST STATUS (BYTE)
SCSI_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
SCSI_LBA .EQU 8 ; OFFSET OF LBA (DWORD)
;
SCSI_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES
;
SCSI_CFGTBL:
;
#IF (SCSICNT >= 1)
;
SCSI0_CFG:
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB SCSIBASE ; IO BASE ADDRESS
.DB SCSI0_LUN ; SCSI TARGET LUN
.DB SCSI_STNOTRDY ; DEVICE STATUS
.DW $0000,$0020 ; DEVICE CAPACITY (BLOCKS)
.DW 0,0 ; CURRENT LBA
;
DEVECHO "SCSI: IO="
DEVECHO SCSIBASE
DEVECHO ", LUN="
DEVECHO SCSI0_LUN
DEVECHO "\n"
#ENDIF
;
#IF (SCSICNT >= 2)
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
.DB SCSIBASE ; IO BASE ADDRESS
.DB SCSI1_LUN ; SCSI TARGET LUN
.DB SCSI_STNOTRDY ; DEVICE STATUS
.DW $0000,$0020 ; DEVICE CAPACITY (BLOCKS)
.DW 0,0 ; CURRENT LBA
;
DEVECHO "SCSI: IO="
DEVECHO SCSIBASE
DEVECHO ", LUN="
DEVECHO SCSI1_LUN
DEVECHO "\n"
#ENDIF
;
#IF ($ - SCSI_CFGTBL) != (SCSICNT * 2 * SCSI_CFGSIZ)
.ECHO "*** INVALID SCSI CONFIG TABLE ***\n"
#ENDIF
;
.DB $FF ; END OF TABLE MARKER
;
;=============================================================================
; INITIALIZATION ENTRY POINT
;=============================================================================
;
SCSI_INIT:
CALL NEWLINE ; FORMATTING
PRTS("SCSI:$") ; TAG
;
PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS
LD A,SCSIBASE ; GET IO BASE ADDRES
CALL PRTHEXBYTE ; DISPLAY IT
;
CALL SCSI_DETECT ; DETECT THE SCSI INTERFACE
JR Z,SCSI_INIT1 ; IF FOUND CONTINUE
PRTS(" NOT PRESENT$") ; SHOW NOT PRESENT
XOR A ; SUCCESS
RET ; AND BAIL OUT
;
SCSI_INIT1:
XOR A ; ZERO ACCUM
LD (SCSI_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT
LD IY,SCSI_CFGTBL ; POINT TO START OF CONFIG TABLE
;
SCSI_INIT2:
LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END
CP $FF ; CHECK FOR END OF TABLE VALUE
RET Z ; RETURN IF DONE
;
CALL SCSI_INIT3 ; REGISTER & INIT DEVICE
;
LD DE,SCSI_CFGSIZ ; SIZE OF CFG TABLE ENTRY
ADD IY,DE ; BUMP POINTER
JP SCSI_INIT2 ; AND LOOP
;
SCSI_INIT3:
; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE
LD A,(SCSI_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN
LD (IY+SCSI_DEV),A ; UPDATE IT
INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN
LD (SCSI_DEVNUM),A ; SAVE IT
;
; ADD UNIT TO GLOBAL DISK UNIT TABLE
LD BC,SCSI_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 SCSI_PRTPREFIX ; TAG FOR ACTIVE DEVICE
;
PRTS(" LUN=$") ; LUN LABEL
LD A,(IY+SCSI_LUN) ; LOAD LUN
CALL PRTDEC8 ; DISPLAY IT
;
CALL SCSI_INITDEV ; INITIALIZE DEVICE
#IF (SCSITRACE < 2)
JP NZ,SCSI_PRTSTAT
#ENDIF
RET NZ
;
; PRINT STORAGE CAPACITY (BLOCK COUNT)
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
LD A,SCSI_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
;
XOR A ; SUCCESS
RET
;
;=============================================================================
; DRIVER FUNCTION TABLE
;=============================================================================
;
SCSI_FNTBL:
.DW SCSI_STATUS
.DW SCSI_RESET
.DW SCSI_SEEK
.DW SCSI_READ
.DW SCSI_WRITE
.DW SCSI_VERIFY
.DW SCSI_FORMAT
.DW SCSI_DEVICE
.DW SCSI_MEDIA
.DW SCSI_DEFMED
.DW SCSI_CAP
.DW SCSI_GEOM
#IF (($ - SCSI_FNTBL) != (DIO_FNCNT * 2))
.ECHO "*** INVALID SCSI FUNCTION TABLE ***\n"
#ENDIF
;
SCSI_VERIFY:
SCSI_FORMAT:
SCSI_DEFMED:
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
RET
;
;
;
SCSI_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD A,$08 ; SETUP READ COMMAND
JR SCSI_IO ; DO THE IO
;
;
;
SCSI_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD A,$0A ; SETUP WRITE COMMAND
JR SCSI_IO ; DO THE IO
;
;
;
SCSI_IO:
LD (SCSI_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
; SETUP SCSI COMMAND
LD (SCSI_S_CDB),A ; SET SCSI COMMAND
; SETUP DISK BUFFER POINTERS
LD (SCSI_BUF_OUT),HL ; INPUT BUFFER
LD (SCSI_BUF_IN),HL ; OUTPUT BUFFER
; SETUP LUN/LBA
LD A,(IY+SCSI_LUN) ; PUT LUN IN ACCUM
RRCA ; MOVE TO TOP 3 BITS
RRCA ; ...
RRCA ; ...
OR (IY+SCSI_LBA+2) ; MERGE WITH TOP OF LBA
LD (SCSI_CUR_LUN),A ; PUT IN CDB
LD A,(IY+SCSI_LBA+1) ; LBA MID
LD (SCSI_CUR_LBN),A ; PUT IN CDB
LD A,(IY+SCSI_LBA+0) ; LBA MID
LD (SCSI_CUR_LBN+1),A ; PUT IN CDB
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
JR NZ,SCSI_IO1 ; IF ERROR, SKIP INCREMENT
; INCREMENT LBA
LD A,SCSI_LBA ; LBA OFFSET
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
CALL INC32HL ; INCREMENT THE VALUE
; INCREMENT DMA
LD HL,SCSI_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
SCSI_IO1:
LD HL,(SCSI_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS
RET Z ; DONE IF NO ERROR
LD A,ERR_IO ; SIGNAL IO ERROR
OR A ; SET FLAGS
RET ; AND DONE
;
;
;
SCSI_STATUS:
LD A,(IY+SCSI_STAT) ; GET STATUS OF SELECTED DEVICE
OR A ; SET FLAGS
RET ; AND RETURN
;
;
;
SCSI_RESET:
CALL SCSI_INITDEV ; REINITIALIZE UNIT
OR A ; SET RESULT FLAGS
RET
;
;
;
SCSI_DEVICE:
LD D,DIODEV_SCSI ; D := DEVICE TYPE
LD E,(IY+SCSI_DEV) ; E := PHYSICAL DEVICE NUMBER
LD C,%00110000 ; C := GENERIC HARD DISK ATTRIBUTES
LD H,0 ; H := MODE
LD L,(SCSI_IOBASE) ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
;
;
;
SCSI_MEDIA:
LD A,E ; GET FLAGS
OR A ; SET FLAGS
JR Z,SCSI_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
CALL SCSI_INITDEV ; REINITIALIZE DEVICE
;
SCSI_MEDIA1:
LD A,(IY+SCSI_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
;
;
;
SCSI_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+SCSI_LBA+0),L ; SAVE NEW LBA
LD (IY+SCSI_LBA+1),H ; ...
LD (IY+SCSI_LBA+2),E ; ...
LD (IY+SCSI_LBA+3),D ; ...
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
SCSI_CAP:
LD A,(IY+SCSI_STAT) ; GET STATUS
PUSH AF ; SAVE IT
LD A,SCSI_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
;
;
;
SCSI_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 SCSI_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 SCSI_CAP STATUS
;
;=============================================================================
; FUNCTION SUPPORT ROUTINES
;=============================================================================
;
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
;
SCSI_DETECT:
LD A,$05
OUT (SCSIBASE+3),A
IN A,(SCSIBASE+3)
CP $05
RET NZ
LD A,$0A
OUT (SCSIBASE+3),A
IN A,(SCSIBASE+3)
CP $0A
RET
;
; INITIALIZE DEVICE
;
SCSI_INITDEV:
XOR A
LD (IY+SCSI_STAT),A
RET
;
;=============================================================================
; COMMAND PROCESSING
;=============================================================================
;
;----------------------------------------------------------------
;WRITE LOGICAL BLOCK TO DISK
;CUR_TID,CUR_LUN,CUR_LBN ALREADY SET
;EXIT WITH ZERO STATUS IF OK
;----------------------------------------------------------------
;
WR_PHY:
LD A,0AH ;WRITE COMMAND
JR PHY_COM ;FINISH SAME AS READ
;----------------------------------------------------------------
;READ LOGICAL BLOCK FROM DISK
;CUR_TID,CUR_LUN,CUR_LBN ALREADY SET
;EXIT WITH ZERO STATUS IF OK
;----------------------------------------------------------------
;
RD_PHY:
LD A,8 ;READ COMMAND
PHY_COM:
LD (SCSI_S_CDB),A ;SET IN COMMAND BLOCK
LD IX,SCSI_S_IOT ;POINT TO IO TABLE
CALL SCSI_GO
AND 02H ;MASK TO ERROR BIT
RET
;-------------------------------------------------------------------------------
;DO SCSI TRANSACTION
; IX=SCSI IO BLOCK
;-------------------------------------------------------------------------------
SCSI_GO:
LD A,$FF ;PRESET ERROR STATUS
LD L,(IX+4) ;POINT TO STATUS ADDRESS
LD H,(IX+5) ;POINT TO STATUS ADDRESS
LD (HL),A ;SET ERROR
;
XOR A ;
OUT (SCSI_SR_MR),A ;RESET CONTROL REG
OUT (SCSI_SR_TCR),A ;CLEAR COMMAND REG.
OUT (SCSI_SR_ICR),A ;
LD A,(IX) ;GET TID
BIT 7,A ; TURN ON MY ID
OUT (SCSI_SR_ODR),A ;SET TARGET ID
LD A,$01 ;DRIVE BUS
OUT (SCSI_SR_ICR),A ;
LD A,$05 ;SET SEL AND DRIVE BUS
OUT (SCSI_SR_ICR),A ;
;
;WAIT FOR SCSI BUSY
LD BC,0 ;INIT TIMEOUT
S_SWT:
IN A,(SCSI_SR_CSBS) ;GET BUS STATUS
AND SCSI_SM_BSY ;MASK TO BUSY BIT
JR NZ,S_BSYA ;JMP IF BUSY ACTIVE
NOP ;KILL A LITTLE TIME
NOP
NOP
NOP
DEC BC ;DEC TIMEOUT
LD A,B ;TEST TIMEOUT=0
OR C
JR NZ,S_SWT ;JMP IF NO TIMEOUT
XOR A ;CLEAR A
OUT (SCSI_SR_ICR),A ;CLEAR SEL AND DATA
JR S_EXIT ;ERROR EXIT
;
;BUSY IS ACTIVE
S_BSYA:
XOR A ;CLEAR A
OUT (SCSI_SR_ICR),A ;CLEAR SEL AND DATA
;-------------------------------------------------------------------------------
;
;TARGET IS SELECTED SO TEST BSY AND REQ
;THEN DECODE REQUESTED PHASE
;
;-------------------------------------------------------------------------------
PHASE:
XOR A
OUT (SCSI_SR_ICR),A ;RESET INITIATOR
;
S_WTREQ:
IN A,(SCSI_SR_CSBS) ;GET BUS STATUS
LD B,A ;SAVE COPY
AND SCSI_SM_BSY ;MASK TO BUSY BIT
JR NZ,S_WTRQ1 ;STILL BUSY SO CONT.
;-------------------------------------------------------------------------------
;BUSY LOST SO EXIT
;-------------------------------------------------------------------------------
S_EXIT:
LD L,(IX+4) ;GET STATUS POINTER
LD H,(IX+5) ;GET STATUS POINTER
LD A,(HL)
RET ;BUSY LOST? WERE DONE
;
S_WTRQ1:
LD A,B ;RECOVER STATUS
AND SCSI_SM_REQ ;REQUEST ACTIVE?
JR Z,S_WTREQ ;LOOP TILL REQUEST
;-------------------------------------------------------------------------------
;REQUEST IS ACTIVE SO SET 5380 TO REQUESTED PHASE
;-------------------------------------------------------------------------------
LD A,B ;RECOVER BUS STATUS
RR A ;SHIFT STATUS TO PHASE BITS
RR A
AND $07 ;MASK TO PHASE BITS
OUT (SCSI_SR_TCR),A ;SET PHASE
;
;JUMP TO PHASE HANDLER
;
LD A,B ;RECOVER BUS STATUS
RR A
AND $0E ;MASK TO PHASE BITS
LD E,A ;
LD D,0
LD HL,PHTABL ;POINT TO TABLE
ADD HL,DE ;OFFSET INTO TABLE
LD E,(HL) ;GET EXECUTION ADDRESS
INC HL
LD D,(HL)
PUSH DE
RET ;EXECUTE PHASE
;-------------------------------------------------------------------------------
;PHASE TABLE
;-------------------------------------------------------------------------------
PHTABL:
.WORD PHASE0 ;DATA OUT
.WORD PHASE1 ;DATA IN
.WORD PHASE2 ;CMD OUT
.WORD PHASE3 ;STATUS IN
.WORD S_EXIT ;UNUSED
.WORD S_EXIT ;UNUSED
.WORD PHASE6 ;MESSAGE OUT
.WORD PHASE7 ;MESSAGE IN
;-------------------------------------------------------------------------------
;PHASE HANDLERS
;-------------------------------------------------------------------------------
;
;DATA OUT
PHASE0:
LD L,(IX+6) ;GET POINTER
LD H,(IX+7)
JP S_WRIT ;WRITE BYTES
;
;DATA IN
PHASE1:
LD L,(IX+8) ;GET POINTER
LD H,(IX+9)
JP S_READ ;READ BYTES
;
;CMD OUT
PHASE2:
LD L,(IX+2)
LD H,(IX+3)
JP S_WRIT
;
;STATUS IN
PHASE3:
LD L,(IX+4)
LD H,(IX+5)
JP S_READ
;
;MSG OUT
PHASE6:
LD L,(IX+10)
LD H,(IX+11)
JP S_WRIT
;
;MSG IN
PHASE7:
LD L,(IX+12)
LD H,(IX+13)
JP S_READ
;-------------------------------------------------------------------------------
;SCSI WRITE ROUTINE (SEND BYTES TO TARGET)
;BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH
;-------------------------------------------------------------------------------
S_WRIT:
LD A,1 ;DRIVE SCSI DATA BUS
OUT (SCSI_SR_ICR),A
;
;WAIT FOR REQ WHILE CHECKING BUSY
;
S_WWREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT
LD B,A ;SAVE IT
AND SCSI_SM_REQ ;REQUEST ACTIVE?
JR NZ,S_WNXT ;
;
LD A,B ;RECOVER CURRENT BUS STAT
AND SCSI_SM_BSY ;STILL BUSY?
JP NZ,S_WWREQ ;LOOP IF STILL BUSY
JP PHASE ;
;
;REQUEST ACTIVE SO CHECK PHASE
;
S_WNXT:
IN A,(SCSI_SR_BSR) ;GET STATUS
AND SCSI_SM_PHM ;MASK TO PHASE MATCH
JP Z,PHASE ;JMP IF PHASE MISMATCH
;
;REQUEST ACTIVE AND PHASE MATCH SO SEND DATA
;
LD A,(HL) ;GET BYTE
OUT (SCSI_SR_ODR),A ;SEND DATA
LD A,$11 ;ACK + DRIVE BUS
OUT (SCSI_SR_ICR),A ;SET ACK,DRIVE SCSI BUS
INC HL ;ADVANCE BUF POINTER
;
;WAIT FOR REQUEST TO DROP
;
S_WNREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS
AND SCSI_SM_REQ
JR NZ,S_WNREQ ;LOOP TILL REQ DROPS
;
LD A,$1 ;DROP ACK,ASSERT DATA
OUT (SCSI_SR_ICR),A ;DROP ACK
JP S_WWREQ ;LOOP FOR NEXT BYTE/PHASE
;-------------------------------------------------------------------------------
;SCSI READ ROUTINE (GET BYTES FROM TARGET)
;BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH
;-------------------------------------------------------------------------------
;
S_READ:
;
;WAIT FOR REQ WHILE CHECKING BUSY
;
S_RWREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT
LD B,A ;SAVE IT
AND SCSI_SM_REQ ;REQUEST ACTIVE?
JR NZ,S_RNXT ;
;
LD A,B ;RECOVER CURRENT BUS STAT
AND SCSI_SM_BSY ;STILL BUSY?
JP NZ,S_RWREQ ;LOOP IF STIL BUSY
JP PHASE ;
;
;REQUEST ACTIVE SO CHECK PHASE
S_RNXT:
IN A,(SCSI_SR_BSR) ;GET STATUS
AND SCSI_SM_PHM ;MASK TO PHASE MATCH
JP Z,PHASE ;JMP IF PHASE MISMATCH
;REQUEST ACTIVE AND PHASE MATCH SO GET DATA
;
IN A, (SCSI_SR_CSD) ;GET DATA
LD (HL),A ;SAVE DATA
LD A,$10
OUT (SCSI_SR_ICR),A ;SET ACK
INC HL ;ADVANCE BUF POINTER
;
;WAIT FOR REQUEST TO DROP
;
S_RNREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS
AND SCSI_SM_REQ
JR NZ,S_RNREQ ;LOOP TILL REQ DROPS
XOR A
OUT (SCSI_SR_ICR),A ;DROP ACK
JP S_READ ;LOOP FOR NEXT BYTE/PHASE
;
;=============================================================================
; HARDWARE INTERFACE ROUTINES
;=============================================================================
;
;=============================================================================
; ERROR HANDLING AND DIAGNOSTICS
;=============================================================================
;
; ERROR HANDLERS
;
SCSI_NOMEDIA:
LD A,SCSI_STNOMEDIA
JR SCSI_ERR
;
SCSI_IOERR:
LD A,SCSI_STIOERR
JR SCSI_ERR
;
SCSI_TO:
LD A,SCSI_STTO
JR SCSI_ERR
;
SCSI_NOTRDY:
LD A,SCSI_STNOTRDY
JR SCSI_ERR
;
SCSI_ERR:
LD (IY+SCSI_STAT),A ; SAVE NEW STATUS
;
#IF (SCSITRACE >= 2)
CALL SCSI_PRTSTAT
#ENDIF
OR A ; SET FLAGS
RET
;
;
;
SCSI_PRTERR:
RET Z ; DONE IF NO ERRORS
; FALL THRU TO SCSI_PRTSTAT
;
; PRINT FULL DEVICE STATUS LINE
;
SCSI_PRTSTAT:
PUSH AF
PUSH DE
PUSH HL
LD A,(IY+SCSI_STAT)
CALL SCSI_PRTPREFIX ; PRINT UNIT PREFIX
JR SCSI_PRTSTAT3
SCSI_PRTSTAT2:
CALL NEWLINE
PRTS("SCSI:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT
SCSI_PRTSTAT3:
CALL PC_SPACE ; FORMATTING
CALL SCSI_PRTSTATSTR
POP HL
POP DE
POP AF
RET
;
; PRINT STATUS STRING
;
SCSI_PRTSTATSTR:
PUSH AF
PUSH DE
LD A,(IY+SCSI_STAT)
OR A
LD DE,SCSI_STR_STOK
JR Z,SCSI_PRTSTATSTR1
INC A
LD DE,SCSI_STR_STNOMEDIA
JR Z,SCSI_PRTSTATSTR1
INC A
LD DE,SCSI_STR_STIOERR
JR Z,SCSI_PRTSTATSTR1
INC A
LD DE,SCSI_STR_STTO
JR Z,SCSI_PRTSTATSTR1
INC A
LD DE,SCSI_STR_STNOTRDY
JR Z,SCSI_PRTSTATSTR1
LD DE,SCSI_STR_STUNK
SCSI_PRTSTATSTR1:
CALL WRITESTR
POP DE
POP AF
RET
;
; PRINT DIAGNONSTIC PREFIX
;
SCSI_PRTPREFIX:
PUSH AF
CALL NEWLINE
PRTS("SCSI$")
LD A,(IY+SCSI_DEV) ; GET CURRENT DEVICE NUM
CP $FE ; NOT YET ASSIGNED?
JR Z,SCSI_PRTPREFIX1 ; SKIP DEV NUM IF SO
CALL PRTDECB
SCSI_PRTPREFIX1:
CALL PC_COLON
POP AF
RET
;
;=============================================================================
; STRING DATA
;=============================================================================
;
SCSI_STR_STOK .TEXT "OK$"
SCSI_STR_STNOMEDIA .TEXT "NO MEDIA$"
SCSI_STR_STIOERR .TEXT "IO ERROR$"
SCSI_STR_STTO .TEXT "TIMEOUT$"
SCSI_STR_STNOTRDY .TEXT "NOT READY$"
SCSI_STR_STUNK .TEXT "UNKNOWN ERROR$"
;
;=============================================================================
; DATA STORAGE
;=============================================================================
;
SCSI_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
SCSI_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
;
;----------------------------------------------------------------
;SCSI COMMAND DESCRIPTOR FOR READ/WRITE
;DO NOT USE THIS FOR DIRECT SCSI I/O
;YOU WILL MESS UP BLOCK/DEBLOCK
;
SCSI_S_CDB:
.DB 8 ; COMMAND
SCSI_CUR_LUN:
.DB 0 << 5 ; LUN/LBA HI
SCSI_CUR_LBN:
.DB 0 ; LBA MID
.DB 0 ; LBA LOW
.DB 1 ; COUNT
.DB 0 ; FLAGS
;
;----------------------------------------------------------------
;SCSI I/O ADDRESS TABLE FOR READ/WRITE
;DONT MESS WITH THIS EITHER
SCSI_S_IOT:
SCSI_CUR_TID .DB 1 << SCSI_TID ;TARGET
.DB 0 ;UNUSED
.DW SCSI_S_CDB ;CDB POINTER
.DW SCSI_S_STAT ;STATUS POINTER
SCSI_BUF_OUT .DW HB_WRKBUF ;DATA OUT POINTER
SCSI_BUF_IN .DW HB_WRKBUF ;DATA IN POINTER
.DW SCSI_S_MSG ;MSG OUT POINTER
.DW SCSI_S_MSG ;MSG IN POINTER
;
;----------------------------------------------------------------
;THIS IS THE END OF INITIALIZED DATA
;EVERYTHING FOLLOWING MUST HAVE MEMORY SPACE AVAILABLE
;BUT IS NOT PART OF THE BOOT IMAGE
;----------------------------------------------------------------
;
; UNINITIALIZED DATA AREA
;
SCSI_S_STAT .DW 0 ;SCSI ENDING STATUS
SCSI_S_MSG .DW 0 ;SCSI MESSAGE
;

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 6
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.6.0-dev.43"
#DEFINE BIOSVER "3.6.0-dev.44"
#define rmj RMJ
#define rmn RMN
#define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 6
rup equ 0
rtp equ 0
biosver macro
db "3.6.0-dev.43"
db "3.6.0-dev.44"
endm

Loading…
Cancel
Save