Skip to content

v0.1.0 — First release: static SNES recompiler building 3 commercial games

Choose a tag to compare

@mstan mstan released this 03 Jun 17:43
· 464 commits to main since this release

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.