Repository navigation
Releases: RetroPortingToolKit/snesrecomp
Release list
v0.4.2-alpha
Fix the Windows dependency walk used by source setup packaging: BcryptPrimitives.dll and ntdll.dll are Windows OS dependencies. The native analyzer now stages successfully without treating those system libraries as missing application DLLs. The staged-SDK regression invokes the real dependency walker.
This includes v0.4.1-alpha's native-analyzer staging and SDK smoke checks, and v0.4.0-alpha's generation recipes, computed-return fix, and bounded coverage tooling. Game setup packs generate with their bundled Python and C/C++ tools; Rust is required on the packaging host, rather than the player's machine.
Validation: two integration regressions, Windows extracted setup generation with Cargo excluded from PATH, a complete rebuild with the bundled Clang/Python toolchain, Linux/Windows/macOS CI, and the extracted self-contained Windows CLI smoke test. Four-platform game setup artifacts are checked separately before their releases.
v0.4.1-alpha
Fix source setup packs that failed Generate & Build without a Rust installation. The shared packager now builds and includes the host native analyzer, stages its runtime libraries, and runs a synthetic-ROM SDK smoke test from the staged source tree. It rejects a host/target platform mismatch and clears developer analyzer overrides during validation.
This follows v0.4.0-alpha's generation recipes, computed-return fix, and bounded coverage tooling. Game setup packs can now generate with their bundled Python and C/C++ tools; Rust is required on the packaging host, rather than the player's machine.
Validation: two integration regressions, Windows extracted setup generation with Cargo excluded from PATH, a complete rebuild with the bundled Clang/Python toolchain, Linux/Windows/macOS CI, and the extracted self-contained Windows CLI smoke test. Four-platform game setup artifacts are checked separately before their releases.
v0.4.0-alpha
Generation recipes preserve game-owned postprocessors and coverage inputs in both command-line regeneration and the Generate & Build flow. Staged generation keeps the previous published output when a hook fails. See Generation recipes.
Fix computed RTS/RTL calls that return to a continuation owned by the current interpreter bounce. This corrects a Yoshi's Island static-emission failure without promoting speculative coverage.
Add a journalled, bounded frame driver for cheat/teleport QA and strict paused-only SRAM edits. A step timeout is observed until the original request completes; mutations are never retried after an ambiguous reply.
Update recomp-net to its current main revision and repair the corresponding Linux runtime test linkage.
Validation: 104 Rust analyzer tests, 505 Python code-generation tests, recipe/route/coverage checks, SDK smoke tests, the Linux C runtime suite, and Linux/Windows/macOS CI. Windows real-ROM checks exercised SRAM write validation and the six-title consumer generation recipes. These results do not establish cross-build netplay compatibility.
The attached Windows CLI is self-contained. Game ROMs and generated game code are not included.
v0.3.0-alpha - updated self-contained Windows CLI
Updated self-contained Windows x64 ROM-to-source CLI, built from current main at d81c43e.
Download snesrecomp-cli-windows-x86_64.zip and extract the entire folder. Keep snesrecomp.exe beside its _internal directory. The CLI requires no installed Python or Rust.
.\snesrecomp.exe build --rom "C:\ROMs\game.sfc" --output "C:\Ports\game" --name "My Game"Changes since v0.2.0-alpha:
- Headless
generateandverify-romcommands with JSON progress for existing projects and launcher integration;resolve-romreads a scaffolded project's ROM selection, includingrom.cfg. - The Rust native analyzer is now the supported analysis backend, with improved dispatch-table bounds, exit-width contracts, inline argument handling, and explicit interpreter fallback boundaries.
- Identity-checked coverage feedback and disassembly-backed code discovery, plus safer generated output publication and reuse.
- Packaging fixes include the code-generation SDK modules and symbol synchronizer. Generated projects clearly identify the static library they build.
- Updated shared framework sources and license notices. SNESRecomp's original code now uses PolyForm Noncommercial 1.0.0; see the included
LICENSEandTHIRD_PARTY_ATTRIBUTION.md.
Validation: the official Windows CI build passes the headless SDK and packaged CLI smoke tests. Local packaged build and generate smoke tests also pass with PATH restricted to Windows system directories. A fresh Super Mario World project generates 339 AOT variants and 50 interpreter-only variants across eight banks, then compiles successfully with CMake, Ninja, and GCC 15.2.
Compiling a generated project requires CMake, Ninja, and a C compiler. The starter project builds a generated-code static library; producing a playable native port still requires game-specific configuration and host integration. No game ROMs are included.
v0.2.0-alpha - self-contained ROM-to-source CLI
Self-contained ROM-to-source developer CLI.
Download snesrecomp-cli-windows-x86_64.zip, extract it, and run snesrecomp.exe build with your .sfc or .smc ROM. The command writes automatically discovered C source, a starter bank configuration, CMake files, build scripts, and runner source.
The CLI itself requires no Python or Rust. Building the generated static library requires CMake, Ninja, and a C compiler. A playable native port still requires game-specific configuration and host integration.
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.