SCSI DIOC / BDIO - RetroCore implementation handoff (2026-07-23)¶
State of the DOMINO SCSI DIOC emulation in RetroCore after this session. Read this first when resuming; it says what is built + verified, what is [OPEN] and why, and exactly how to close the tail on the live machine.
Companion docs (the byte-verified RE this rests on):
- tools/sintran-segment-carver/versions/L-VSX-500/re/domino-nucleus-io/BDIO-DOMINO-DRIVER-CARVE.md
- .../domino-nucleus-io/BDIO-ADDRESS-MODEL-FINDINGS-2026-07-23.md
- .../domino-nucleus-io/QUDF-ABPA2-PRODUCER-CARVE-2026-07-23.md
- .../domino-nucleus-io/NUCLEUS-PRIMITIVES-CARVE.md
- Plan: SINTRAN/ND5000/SCSI-DIOC-OCTOBUS-EMULATION-PLAN-2026-07-20.md
1. What the DIOC is (mental model)¶
To the ND-100 the DIOC is a BLACK BOX. SINTRAN never touches SCSI targets / LUNs / CDBs. What crosses the octobus is only: - a NUCLEUS message in shared MPM whose payload is a BDIO / ABSTrans record, and - octobus KICK 1 as the doorbell in each direction (S0 CONKI carve: NOT kick 5).
So the DIOC is a NUCLEUS message endpoint that moves 2KB pages between a disk image and the MPM window. The SCSI-bus chip emulation (Buses.SCSI, Mac/Sun) is NOT involved.
2. RetroCore components (all under Emulated.HW\ND\CPU\NDBUS\ unless noted)¶
| File | Role | Status |
|---|---|---|
MpmWindow.cs |
shared MPM view: bounds-guarded big-endian word/double access, byte-range DMA, TSET lock (X5SEM + NUCLEUS 070000B) | done; composed by BOTH the ND-5000 station and the DIOC |
OctobusMultibyteCollector.cs |
shared SOMB/EOMB reassembly | done; both stations use it |
OctobusScsiDiocStation.cs |
the DIOC octobus station (module 21B, station 13B): OMD-0 test protocol, kick-1 doorbell -> BDIO -> completion kick to station 1 | S1 + engine wiring done |
BdioRecord.cs |
byte-verified decode of the BDIO/ABSTrans record (DSCMD/DSTBL/DMYAD/DNRPG/DXPOO) | done |
BdioEngine.cs |
read/write page transfer disk<->MPM + DSSTS=(0,0) completion; reuses DeviceControllerBase.BlockRead/WriteDelegate | Read/Write done; Compare = [OPEN] |
BdioRecordScanner.cs |
S4-2 live-trace tool: finds a BDIO record in MPM by signature (DSOW1=1 + function + DMYAD bit31) | done |
NucleusStructures.cs |
byte-verified NUCLEUS offset table (master/descriptor/port/message/buffer/kick) | done (offsets [V]) |
NucleusClient.cs |
S2 scaffold: typed accessors over a descriptor's PHYSICAL address + TSET lock | scaffold; ID-resolution + provisioning = [OPEN] |
Emulated.Machines\ND\ND100\ND100Machine.ScsiDioc.cs |
AttachScsiDioc / MountScsiDiocImage machine wiring, disk via MachineStorageManager |
done |
Tests (Emulated.Tests.ND100\ControllerOctobus\ + Emulated.Tests\ND100):
BdioRecordTests, BdioEngineTests, BdioRecordScannerTests, NucleusClientTests,
OctobusScsiDiocS1Tests, OctobusScsiDiocBdioE2ETests, OctobusScsiDiocMachineTests.
135 octobus/BDIO/machine tests green; ND-5000 boot harness unaffected.
3. What is VERIFIED (no assumptions)¶
- BDIO record IS an ABSTrans message; fields map to ABFUN/MEMA1/ABP21/ABP31. [V]
- Memory address:
mpmByte = mpm.Start + (DMYAD & 0x7FFFFFFF)- DMYAD is window-relative once bit 31 is stripped, ADRZERO cancels. [V-derived] - Media address DSTBL = logical 2KB-page index (verbatim, no scaling; DOMINO path skips the SMD TOSECT). disk byte offset = DSTBL2048, length = DNRPG2048. [V]
- Completion contract DSSTS=(0,0)=OK. [V REBDIO]
- NUCLEUS structure offsets (NucleusStructures). [V]
- Doorbell = kick 1 both directions. [V S0 CONKI]
4. What is [OPEN] (blocked on the live machine, NOT guessable)¶
- NUCLEUS record-base discovery (S2). The DIOC learns WHERE in MPM the BDIO
record landed from the NUCLEUS message (port -> message -> buffer walk). The
MON-347 provisioning answers (create-port / open-port-by-name) and the
connect-answer fields (DIPOO / OPAIX / ARESZ) are not carved. Today the station
is told the record base via
SetPendingBdioRecord(test seam). - Live SINTRAN mount acceptance (S4). Needs a real DOMINO disk + SINTRAN reaching a BDIO transfer.
- Compare (213B) mismatch status + BDIO failure status codes. The DIOC's error DSSTS values are not carved; the engine returns result codes and does NOT fabricate a SINTRAN status word.
- Card routing to a DIOC station without an ND-5000 CPU attached - whether SINTRAN's octobus SENDS reach a DIOC station in the card's default mode is unconfirmed (part of the live path).
5. HOW TO CLOSE THE TAIL (the next live session)¶
The tool to close S2 + confirm the model in one live boot is already built:
- In a boot harness (model on
Nd100SintranNd5000OctobusBootHarnessTests), after building the machine callmachine.AttachScsiDioc(octobus)andmachine.MountScsiDiocImage(<domino disk>). - Subscribe
attachment.Station.FrameObserved+.KickReceivedto log what SINTRAN sends the DIOC. - On a kick-1 (or periodically), run
BdioRecordScanner.Scan(station.Mpm)and log the hits - each candidate prints its decoded fn/disk/mem/pages. - Correlate a hit's DSTBL against a KNOWN file's directory page to confirm the 2KB-page unit end to end, and note the record base + the NUCLEUS message that pointed at it -> that pins the S2 record-discovery path.
- Feed the discovered record base to
station.SetPendingBdioRecord(or wire the real discovery) and letBdioEngineservice it -> the mount acceptance gate.
6. Commit state (IMPORTANT)¶
- Committed earlier this session:
de2b95ab3(shared MpmWindow/collector + DIOC skeleton, by a concurrent agent) andb18b4efaf(BdioRecord/BdioEngine + MPM DMA + station wiring + first tests). - UNCOMMITTED at handoff time: the
/simplifycleanup (MpmWindow ReadDouble/WriteDouble/ReadWords, ND-double dedup, SendKick on the base, decimal NucleusStructures, nullable pending-record), plusBdioRecordScanner,NucleusStructures,NucleusClient,ND100Machine.ScsiDioc.cs, and their tests. RetroCore branch:ethernet-ii-controller-fixes(shared tree, other sessions committing autonomously - stage ONLY DIOC/BDIO files).
7. Architecture rules honored¶
No code duplication (shared helpers, not copies); no LINQ / no foreach; named delegates; reuse of the existing block-storage contract; every un-carved value is a result code / [OPEN] marker, never a fabricated byte.