v0.1.0 — First release: static SNES recompiler building 3 commercial games
snesrecomp is a static recompiler for SNES (Super Famicom) games. It translates 65816 machine code into native C ahead-of-time, so a recompiled game runs as an ordinary native binary instead of under interpretation.
This is the first tagged release. It marks the first commit (00425c6) at which all three companion game repos regenerate cleanly, build, link, and have been verified playing correctly off a single shared snesrecomp main.
Games building against this release
snesrecomp is the shared, game-agnostic framework; each game lives in its own repo that junctions this checkout and supplies the game-specific runtime, .cfg, and build glue. All three pin this commit (00425c6):
| Game | Publisher / Year | Repo | Game release | Playability |
|---|---|---|---|---|
| Super Mario World | Nintendo, 1990 | mstan/SuperMarioWorldRecomp | v0.7.0 | Believed playable end-to-end; hand-verified through Worlds 1–3 (Yoshi's Island, Donut Plains incl. Iggy, into Vanilla Dome) |
| The Legend of Zelda: A Link to the Past | Nintendo, 1991 | mstan/ZeldaAlttPSNESRecomp | v0.2.0 | Playable through the early dungeon (boot → attract → file select → overworld → Module 07 dungeon with sword combat) |
| Mega Man X | Capcom, 1993 | mstan/MegaManXSNESRecomp | v1.0.5 | Believed playable end-to-end; intro stage + Maverick stages and their bosses |
Capabilities
- 65816 static recompilation — decode ROM bytes → reconstruct control flow → emit native C (
recompiler/). - C runtime (
runner/) the generated code links against: CPU state, LoROM/HiROM memory mapping (incl. bank-mirror + battery-SRAM routing), audio (DSP ring-buffer output), and a debug server. Embeds a snes9x-derived oracle for differential testing. - Framework bug classes now handled permanently: per-variant exit-(M, X) inference with order-independent fixpoint; dispatch-terminator JSL recognition; PHP/PLP-bracketed M/X tracking; wrapper-bypass autorouter; tail-call autorouter; abs-indirect dispatch emit; reference-taint prune convergence; MMX cooperative-scheduler HLE.
- Always-on ring-buffer observability + a runtime tripwire suite (M/X claim verifier, async m/x-flag-write detector, …) catalogued in
docs/TRIPWIRES.md. - Differential fuzzer (
fuzz/) diffing synthetic 65816 snippets recomp-vs-snes9x.
The intent is for snesrecomp to be game-agnostic — adding a new game should cost mostly per-game .cfg work, not framework patching.
This commit (00425c6)
Reference-taint prune convergence fix (alias-section attribution in _scan_variant_refs) — resets the scanner's current-variant on the un-suffixed void <name>(CpuState*) entry-point aliases emit_bank appends per bank. This removes the SMW/ALttP regen non-convergence treadmill and is what brings all three games to a clean, converging regen on one shared main. Companion: codegen emits one-line dispatch case/default, and v2_regen gains a fixed 1.5 h wall-clock cap, non-convergence backstops, and a rolling prune-snapshot window.
Status
Alpha. APIs change without warning; there is no public API or user-facing docs yet. No license is declared — the snes9x core under runner/snes9x-core/ retains its upstream libretro/snes9x license.