DaynaPORT SCSI/Link (SL003) emulation rewritten against a disassembly of the Dayna SL003 v2.0 firmware and Apple's .ENET0 1.2.2f0 driver. ROM addresses are cited in the source. The protocol core has no I/O of its own and is covered by host-side unit tests plus a loopback test against the FreeMiNT driver's record parser.
Tested on an Atari Falcon (SCSILINK.XIF 0.90 below), a Macintosh LC475 and SE/30 (System 7.5.5, Open Transport), and a Macintosh Plus (System 7.0.1, MacTCP), in both directions.
Changes against the previous emulation:
- Polled READ(6): one record per command, correct live more-pending flag, offset/peek/resume per CDB[1..2] as in the ROM.
- Blind READ(6): record stream; the receive ring refills during a batch (radio runs from a background IRQ).
- Bounded blind batches, by explicit contract: INQUIRY byte 36 bit 0 declares the capability, and CDB[5] bit 0x20 on a blind READ makes the allocation length a hard upper bound for the whole batch, so fixed-length initiators (Atari SCSI_In) cannot be overrun. Without the bit every read behaves exactly as the ROM does; the real device has neither the capability bit nor the bound. Both dumped SL003 ROMs build byte 36 from the enabled and mode bits only, so real hardware never sets bit 0.
- READ STATS returns 22 bytes with a working read-and-clear missed counter. INQUIRY byte 36 carries the enabled/mode bits.
- ADD MULTICAST programs the radio filter; EtherTalk and mDNS reach the host.
- SET MAC returns CHECK CONDITION (INVALID FIELD IN CDB). The radio cannot change its receive address; previous firmware accepted the command and ignored it.
- INQUIRY reports revision 2.4f. Apple's .ENET0 driver masks interrupts around its SCSI polls when the reported minor revision is below 4; reporting 2.4f keeps interrupts on outside transfers. Note the byte loops inside blind transfers mask unconditionally on any revision, so tick-based rate displays on the Mac still read high; measure on the wire.
- bluescsi.ini: DaynaPortGapHeaderUs / DaynaPortGapRecordUs set the inter-record delays (default 75/300 us, required for SE/30 and Plus blind mode; Atari hosts can use 0). WiFiPowerSave, default 0.
Measured throughput in KB/s, plain TCP, at the default settings above (Atari with gaps 0/0). All numbers wire-measured on the server side; classic Mac self-reported rates read high because the driver's SCSI loops mask the tick interrupt, and were discarded.
| host | download | upload |
|---|---|---|
| Mac LC475 (System 7.5.5, Open Transport, VM off) | 236 | 170 |
| Mac SE/30 (System 7.5.5, Open Transport, VM off) | 126 | 126 |
| Mac Plus (System 7.0.1, MacTCP) | 56 | 62 |
| Atari Falcon (68030/50, SCSILINK.XIF 0.82) | 127 | 84 |
Variations:
- Virtual memory on switches the Mac driver to polled reads: download drops to 176 (LC475) / 83 (SE/30).
- Atari-only gap setting 0/0 on the LC475: download 282. Not usable when an SE/30 or Plus shares the device.
- Falcon upload reaches 97 with a 64 KB socket send buffer.
Files:
- BlueSCSI_Pico_2_DaynaPORT-release.uf2: normal build, Pico 2 W.
- BlueSCSI_Pico_2_DaynaPORT-DIAG.uf2: logs batch depth and radio send timing to log.txt. Slower. For debugging only.
- SCSILINK.XIF: FreeMiNT driver 0.90. Probes the capability bit at init: batched i/o against this firmware, polled single-packet i/o against a real SL003, a PiSCSI, or older BlueSCSI firmware. Safe on all of them; fast on this firmware. Verified on a Falcon against both classes.
- INET4-delack16.XDD / INET4-delack32.XDD: FreeMiNT inet4 with delayed ACK every 16/32 segments, built from the distro kernel source (bf3d31a). Recommended with this driver: ACK traffic costs SCSI transactions.
- slinkctl.ttp: statistics tool for the driver.
For Atari-only devices set DaynaPortGapHeaderUs=0 and DaynaPortGapRecordUs=0 in bluescsi.ini; remove both if a Macintosh uses the device.
Source: branch redesign/sl003-core (firmware); FreeMiNT fork at https://github.com/ingpaschke/freemint, branches daynaport-throughput and daynaport-delack (Atari binaries), release scsilink-v0.90.