Releases: ingpaschke/BlueSCSI-v2
Release list
DaynaPORT SL003 emulation rewrite
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.
DaynaPort throughput improvements (Pico 2 W)
DaynaPort WiFi throughput improvements for the BlueSCSI v2 Pico 2 W (RP2350) target, with a
matching FreeMiNT driver for Atari. One firmware works on both Atari (FreeMiNT) and classic
Mac (System 7 with the Dayna 7.5.3 drivers).
Firmware changes (tag v2026.07.24-daynaport)
- READ(6) returns multiple [len, flags, payload, crc] records per command, matching the
DaynaPort SCSI/Link protocol. It batches up to 16 records in blind mode and 4 in polled
mode (about 6 KB, the real device's packet-memory size), sets the per-record "more pending"
flag from ring occupancy, and paces the records to match the Mac driver's timing. - A READ(6) batch that stops on a size or packet cap now emits a zero-length terminator record,
so the host stops at the end of the transferred data instead of parsing stale buffer bytes. - The inbound packet ring no longer reads as empty when full.
- The inbound ring is 48 slots on the Pico 2 W target (was 20).
- platform_millis() is derived from the 64-bit microsecond counter, fixing a timeout misfire at
the 71.6 minute wrap. - The read-ahead prefetch cache is invalidated when the image behind a target changes.
Atari side (FreeMiNT)
SCSILINK.XIF adds multi-packet WRITE(6) transmit batching and matching multi-record receive
batching. Source: atari-daynaport-driver.patch (GPL). Branch:
https://github.com/ingpaschke/freemint/tree/daynaport-throughput
Measured throughput
- Atari Falcon (68030, FreeMiNT): about 90 KB/s receive, 85 KB/s transmit (was 11 / 0.5).
- Mac SE/30 (System 7.5, Dayna 7.5.3): over 100 KB/s, including with virtual memory on and
writing to the same BlueSCSI.
Install
Firmware: copy the .uf2 to the RP2350 in BOOTSEL mode.
Atari: copy SCSILINK.XIF into the MiNT system directory (for FreeMiNT OS Distro 26.2 that is
C:\MINT\1-19-CUR).
Optional configuration
WiFiPowerSave in the [SCSI] section of bluescsi.ini controls the radio power-save mode. The
default (0) keeps power save off for low latency (for example ping and incoming connections).
Set it to 1 for lower power draw at the cost of higher latency on unsolicited inbound traffic.
DaynaPORT ROM-verified READ/WRITE + fixes (2026.07.25)
DaynaPORT throughput + fixes for the BlueSCSI Pico 2 W (RP2350) target.
This build replaces the READ(6)/WRITE(6) handling with semantics derived from
disassembling Dayna's own SCSI/Link SL003 device firmware (Z180 ROMs v1.3b2
and v2.0), and folds in the timing, prefetch, and Wi-Fi power-save work.
What changed since v2026.07.24-daynaport
- READ(6) rewritten from the device ROM. Polled mode (CDB[5] bit 6 clear)
is now strictly one record per read with a truthful "more pending" flag, as
the real device does; blind mode batches up to 16 records with a zero-length
terminator on a capped batch. Fixes a polled-mode flag bug that forced hosts
into slow timer-polling. - WRITE(6) selector corrected to CDB[5] bit 7 (was CDB[5] == 0), matching
the device, and rejects a nonzero CDB[1..2]. - Inbound ring overflow-reads-as-empty fix; ring enlarged to 48 slots on the
RP2350. platform_millis()derived from the 64-bit counter (no 71.6-minute wrap).- Read-ahead prefetch cache invalidated on image (re)open.
- WiFiPowerSave ini option (default off) for low latency.
Measured (RX)
- Mac SE/30 (System 7.5, DaynaPORT 7.5.3): 90 KB/s VM on (polled) / 100 KB/s
VM off (blind) - Atari Falcon (FreeMiNT): 100 KB/s
- Mac Plus (System 7.0.1, MacTCP): functional
Install
Flash BlueSCSI_Pico_2_DaynaPORT-v2026.07.25.uf2 via BOOTSEL, or copy the
.bin onto the SD card root for the on-device bootloader.
Pico 2 W (RP2350) / Pico_2_DaynaPORT target only. Network READ/WRITE changes
are also open as PR BlueSCSI#399 against upstream.
Atari (FreeMiNT) driver
SCSILINK-v2026.07.25.XIF: the paired FreeMiNT SCSILINK network driver
(batched multi-packet TX + poll fixes). Copy to the FreeMiNT XIF directory as
SCSILINK.XIF. Uses blind mode (CDB[5] 0xC0).