Expand description
The S-DD1 board — Nintendo’s lossless decompression ASIC (Star Ocean, Street Fighter Alpha 2).
Clean-room port of ares’ SDD1 component (ISC, sfc/coprocessor/sdd1/): a Ricoh-style
Golomb-code + adaptive-binary-arithmetic entropy decoder that streams decompressed bytes
DURING a DMA transfer, not on a plain memory read. There is no chip-ROM dump — the algorithm
runs entirely against the cart’s own (compressed) ROM data — so the board is functional the
moment the cart loads (docs/adr/0003).
S-DD1 owns its ROM mapping directly (like Super FX / SA-1, not wrapped over a base board):
its bank-fold formula differs from plain LoROM/HiROM, and its DMA-decompression hook needs to
see the FULL $00-3F,$80-BF:$8000-FFFF + $C0-FF:$0000-FFFF read path uninterrupted.
Bus window (bank:addr):
| Region | Target |
|---|---|
$00-3F,$80-BF:$4800,$4801,$4804-$4807 | control registers ($4802,$4803 fall through to ROM) |
$00-3F,$80-BF:$8000-FFFF | banked ROM via the $4804-$4807 MMC registers (plain read, $20-3F/$A0-BF A21 fold when r4805/r4807 bit 7 set) |
$C0-FF:$0000-FFFF | banked ROM via MMC, OR a live decompression stream if a DMA channel matching this address is armed (Board::notify_dma_channel is the DMA-address/size snoop; rustysnes-core calls it on every $43n2-$43n6 write) |
S-DD1 always uses DMA fixed-address transfer mode, so the source address never advances —
every byte of a transfer reads the SAME address, which really means “keep streaming from
here”; Decompressor::init is called once per DMA (on the first matching read), then
Decompressor::read once per subsequent byte.
Structs§
- Sdd1
Board - A cartridge carrying an S-DD1 (owns its ROM mapping directly — see the module doc).