The SCSI Driver is an important open software interface (API) for accessing peripheral devices, not just SCSI devices. SATA drives for optical media (e.g. DVDs and BDs) and USB mass storage devices also use the SCSI command set. For other hardware interfaces SCSI commands can be emulated, just as HDDRIVER does for IDE and SATA hard drives. SCSI Drivers can be used to send any SCSI command to almost any interface. Several SCSI drivers can coexist.
The source code for the software on this page is available on GitHub.
Internally HDDRIVER consists of two driver layers: The SCSI Driver and the actual hard disk driver, which accesses devices exclusively via SCSI Drivers. These drivers can be one of HDDRIVER's built-in SCSI Drivers (for ACSI/SCSI/IDE/ATAPI/SATA), a third-party SCSI Driver, e.g. for USB, or a combination. If a SCSI Driver for bus 0 (ACSI), 1 (SCSI) or 2 (IDE) already exists when starting HDDRIVER, HDDRIVER automatically uses the existing SCSI Driver instead of its own to access this bus, as required by the SCSI Driver specification.
A Milan with PCI SCSI card provides a good example: For SCSI devices HDDRIVER uses the Milan's PCI SCSI Driver, which is already available when booting. For IDE devices HDDRIVER uses its own SCSI Driver for Milan IDE. With MagiCMac, MagiCPC, Hatari and ARAnyM it is similar, provided that HDDRIVER is launched after the SCSI Driver for the respective platform/hardware.
HDDRIVER fully supports the current version 1.01 of the SCSI Driver interface. The documentation is available in ST GUIDE format and includes C and Modula-2 bindings as well as example code.
SCSI Driver documentation, bindings and example code
A small weakness of the SCSI Driver interface is the limitation to LUNs 0-7 (SCSI sub-units) per device, although SCSI (but not ACSI) allows 32 LUNs. Thanks to a backward compatible extension for the SCSI Driver interface, all 32 SCSI LUNs can be used with HDDRIVER's SCSI Driver. Devices with more than 8 LUNs are supported by SCSI2Pi, for example.
HDDRIVER is the only driver that supports the SCSI Driver target interface: A TT or Falcon are detected as SCSI devices by other computers (including non-Ataris) and can execute standardized or self-defined SCSI commands.

The screenshot shows the device check of a TT, with a Falcon on the same bus. The TT (SCSI ID 7) is running HDDRIVER 11.06, the Falcon (SCSI ID 6) is running HDDRIVER 11.05. Both computers "see" each other, and one can execute SCSI commands sent by the other.
Sample code in C for implementing custom SCSI commands is provided on GitHub. For the target interface to function correctly, any software that accesses SCSI peripherals must do so via the SCSI Driver interface.
In the HDDRUTIL settings you can configure whether HDDRIVER shall be installed with or without target interface support. Without target support HDDRIVER uses about 3 KiB less RAM.
Fully functional SCSI Drivers are available for the following hardware interfaces and emulators:
| Hardware/Emulator | Software Package | Author | Remark |
|---|---|---|---|
| Atari ACSI/SCSI/IDE | HDDRIVER CBHD/SCSIDRV.PRG |
Uwe Seimet Claus Brod, Steffen Engel |
Integrated in HDDRIVER |
| Atari ATAPI/SATA | HDDRIVER | Uwe Seimet | Integrated in HDDRIVER |
| Milan IDE/ATAPI/SATA | HDDRIVER | Uwe Seimet | Integrated in HDDRIVER |
| Milan SCSI | Milan PCI SCSI Driver | Michael Schwingen | Open Source |
| MagiCMac | MM_SCSI.PRG | Steffen Engel, Thomas Tempelmann | |
| MagiCPC | SCSIDRIV.DLL | Steffen Engel | |
| Hatari (Linux SCSI/IDE/ATAPI/SATA/USB) | NF_SCSI, see below | Uwe Seimet | Open Source |
| ARAnyM (Linux SCSI/IDE/ATAPI/SATA/USB) | NF_SCSI, see below | Uwe Seimet, Thorsten Otto | Open Source |
When implementing a new SCSI Driver, it is recommended to not only read the SCSI Driver specification but additionally the official SCSI standards and to make use of the test suite.. Information on the SCSI Driver interface is also provided in some of my papers for the German ST Computer magazine.
The following bus numbers are defined:
| Number | Bus | XHDI Major Device IDs | Remark |
|---|---|---|---|
| 0 | ACSI | 0-7 | According to SCSI Driver specification |
| 1 | SCSI | 8-15 | According to SCSI Driver specification, also for Milan SCSI (PCI)/MagiCMac/MagiCPC |
| 2 | IDE | 16-23 | According to SCSI Driver specification, also for ATAPI/SATA |
| 3 | SD | 24-31 | SD card slot (FireBee bus IDE2 and Vampire). The FireBee SCSI Driver unfortunately has known bugs. |
| 4 | USB | 32-39 | USB storage driver. It is important to use the latest version. Unfortunately also this version has known bugs (SCSI Driver, XHDI, media change). |
| 7 | Ramdisk | 56-63 | New generation ramdisk in a future HDDRIVER (in beta testing). |
| 8 | Floppy | 64-71 | See XHDI specification. There is no SCSI Driver yet. |
| 30 | Linux SG Driver, Bus A | 240-247 | SCSI Driver for Hatari and ARAnyM (/dev/sg0-/dev/sg7) |
| 31 | Linux SG Driver, Bus B | 248-255 | SCSI Driver for Hatari and ARAnyM (/dev/sg8-/dev/sg15) |
By convention, the unique base ID of each XHDI Major Device ID is derived from the bus number * 8, in order to avoid ID conflicts.
SCSI Driver NF_SCSI 1.22 (June 15, 2025)
With Linux, this SCSI Driver allows direct access to mass storage devices, e.g. with SCSI, IDE, SATA and USB devices. The webpage on emulators provides further information.
SCSI Driver Monitor 1.52 (October 23, 2025)
SCSI_MON logs SCSI Driver calls, which helps to analyze errors or when implementing a new SCSI Driver. SCSI_MON also helps in understanding the SCSI, SATA and USB software protocols for mass storage devices.