FM Towns cross-game recovery coverage

Session 2026-08-11 comprehensive tally of Firestaff’s byte-verified FM Towns real-data recovery across DM1, CSB, and DM2.

Latest verification (2026-08-11): the complete checkout builds successfully; the authentic CSB FM Towns handoff suite passes 6/6 executed tests (one explicitly skipped switch-only gate), and the authentic DM2 FM Towns M12, title, and NEW GAME/gameplay suite passes 3/3. These are opt-in tests and read the user-owned archives in place.

The CSB direct loose-tree handoff now carries the selected language through M11: FIRESTAFF_CSB_FMTOWNS_GAME_LANGUAGE=en binds CDATA/CHTWE.EXP, while ja binds CJDATA/CHTWJ.EXP. A shared extraction can no longer silently boot the first directory found by the filesystem scan; each selected graphics and dungeon pair must match its authentic FM Towns hashes.

Packed-media runtime coverage is now closed for CSB as well as DM2. CSB can start M11 directly from the authentic ZIP: the original IMG member and the selected GRAPHICS.DAT, DUNGEON.DAT, CHTWE/CHTWJ.EXP, MINI.DAT, and TITLE.ANM members stay in bounded RAM. Firestaff creates no loose runtime tree and does not rewrite the source archive. The real-data gates csb_v1_fmtowns_archive_launch_real and csb_v1_fmtowns_packed_m11_real cover this path.

DM1 packed media is archive-owned: M11 reads its original CUE and BIN members in bounded memory for mixed-sector CDDA dispatch and creates no FMTOWNS.BIN runtime cache. CSB’s packed route follows the same no-extraction contract.

The CSB switch-only gate was also run directly against the materialized SWITCHTW.EXP on 2026-08-10: 18/18 assertions passed. The skip above is only the default CTest invocation without the optional switch-path environment variable; it does not indicate a parser failure.

Discs used

Game Disc archive Track 01 sha256 (via header strip)
DM1 Dungeon Master (Japan) (En,Ja) (Rev 1).7z c888470d.. (EDM.EXP)
CSB Dungeon-Master-Chaos-Strikes-Back-Expansion-Set-1_FM-Towns_JA-EN.zip 08cceb0c.. (CDATA/GRAPHICS.DAT)
DM2 Dungeon-Master-II-Skullkeep_FM-Towns_JA.zip 634e7004.. (DATA/GRAPHICS.DAT)

Full per-file hashes in docs/fmtowns/all_games_real_data_hashes.json.

Cross-game byte-identical payloads

Data structures that appear byte-identical across two or three games at per-game virtual addresses:

Payload Size DM1 vaddr CSB vaddr DM2 vaddr Games
Menu font raster 768 (via asset 557) 0x50f1a in GRAPHICS.DAT 0x2f5a3 in GRAPHICS.DAT 3
CHAR geometry (7 words) 14 0x26c8a 0x2c94c 0x1f6 3
ICON geometry (4 words) 8 0x26c68 0x2c938 0x1de 3
SPELL_COSTS 32 0x24388 0x29f64 0x3bb0 3
SPELL_MULT 8 0x243a0 0x29f7c 0x3bc8 3
Phar Lap fs: 4-slot bridge — ✓ ✓ ✓ 3
Direct I/O port 0x04E9 — ✓ ✓ ✓ 3
OICON descriptor 1344 0x224db 0x27f77 — 2 (DM1+CSB)
PLAYER_COLOR 8 0x291b8 0x2d164 — 2
ICON_PAL 6 0x28f44 0x2cd8a — 2
DYNA_BUTTONS pool ≥500 0x24194 0x29d50 — 2

Per-game unique payloads

Data specific to each game that other games do NOT share:

Shipping Firestaff modules

Every module below is source-locked with a real-data round-trip test:

Byte-verified constants + accessors

Cross-game aliases

Shared cross-game infrastructure

Documentation + evidence

Completeness

What is intentionally NOT shipped