Releases: mstan/MegaManXSNESRecomp
v1.1.3 — Save migration runs before the launcher
Minor follow-up to v1.1.2: the legacy-save migration (saves/smw.srm → saves/save.srm) now runs before the launcher opens, so the launcher's SAVES panel shows your carried-forward save on the first launch after upgrading (previously it appeared from the second launch). Behavior is otherwise identical.
v1.1.2 — Generic save file + automatic migration
Save files are now stored at a game-agnostic saves/save.srm instead of the old saves/smw.srm (a leftover name from a shared template).
Your existing save is migrated forward automatically on first launch — nothing to do. Your old saves/smw.srm is left untouched as a backup.
(No gameplay changes; everything from v1.1.1 still applies.)
v1.1.1 — Launcher polish (save import, controller nav, skip-on-boot)
Shared-launcher improvements (matching the SMW launcher work).
- Import Save / Clear Save in the launcher (Import backs up to
.srm.bakfirst). - Controller navigation in the launcher: D-pad / left stick move focus, A activates, B = back, Start = PLAY.
- "Skip Launcher on Boot" toggle (confirm dialog). Run with
--launcheror setSkipLauncher = 0inconfig.inito bring it back. - Gamepad deadzone set in Configure Controllers now persists.
- Audio sample-rate cycle includes 32040 Hz.
- Selecting a ROM copies it into the game folder (
rom.cfg/saves/config.inico-locate). DisableFrameDelaycfg-only toggle (default off).
Download the windows zip, extract, run mmx.exe. ROM not included — provide your own dump.
v1.1.0 — Launcher
What's new
- New launcher menu — starting the game now opens a menu to pick your ROM and tune settings (display, controllers, audio) before you play.
- Controller picker cleanup — the per-player input source is now a proper dropdown that lists only what's actually available (None / Keyboard / your connected controller). No more phantom "Gamepad (not connected)" entries when nothing is plugged in.
- Smoother audio — frame pacing is always on now, which fixes sound stutter on high-refresh-rate monitors.
You supply your own legally-obtained Mega Man X (USA) ROM. Setup notes are in the README inside the zip.
Mega Man X — Linux (AppImage, initial/experimental)
Initial experimental Linux release — x86_64 AppImage.
Bring your own ROM. Place your legally-dumped Mega Man X (.sfc) ROM in the same folder as the AppImage; it's auto-detected at launch. No ROM is included.
Run it
chmod +x MegaManX-x86_64.AppImage
./MegaManX-x86_64.AppImage # add --appimage-extract-and-run if FUSE is unavailable
Steam Deck / controllers — the AppImage reads the controller natively. In Desktop mode, launch through Gaming Mode (or set a Gamepad controller layout) so face buttons aren't remapped to keyboard keys.
Production build — no debug server / tooling. Early, experimental Linux port; expect rough edges. Source: this repo.
v1.0.8 — sound-command delivery fix
Fixes a class of silently dropped sound commands. A clock-domain race in the framework meant a sound command written to the APU ports could be overwritten before the SPC700 engine ever polled it — the engine advances in audio-callback bursts, and writes landed at wall-clock time. On SMW this dropped up to half of all sound effects in alternating runs; Mega Man X pushes its commands through the same path. Port writes are now scheduled on the APU's own sample clock with hardware-faithful spacing. Hand-verified: no missed sounds.
This may also improve the residual SFX-onset timing reported in #4 — the new always-on port-traffic diagnostics that found this bug now ship in the runtime, so if you still hear anything off, an issue report can be pinned to exact per-command evidence.
Install
Download MegaManXSNESRecomp-windows-1.0.8.zip, extract, and run mmx.exe. On first launch it asks for your legally-dumped Mega Man X (USA) (Rev 1) ROM. See the bundled README.md for controls.
Known: a music change can fail to start while holding Turbo — catches up at the next track change (framework ISSUES.md).
macOS (Apple Silicon) build — MegaManXSNESRecomp-macos-arm64.zip
Native arm64 .app (SDL2 bundled, ad-hoc signed). ROM not included.
v1.0.7 — settings now reliably apply
Fixes how the game finds its settings file (#4 follow-up). Your settings now always come from one place: config.ini sitting next to mmx.exe.
What was wrong, briefly:
- The
mmx.inifile shipped in previous zips was never actually read — the game reads aconfig.iniit creates next to the exe. Editing the shipped file did nothing. - The game also used to search up to three folders above where it was launched from and silently use any
config.iniit found there, so the settings in effect could come from somewhere else entirely. - If you upgraded from v1.0.5 or earlier into the same folder, a leftover
config.inicould silently carry old audio settings that undid part of v1.0.6's audio fixes (the sound-rate correction in particular).
Now: the config is config.ini next to mmx.exe, no exceptions. The zip ships it, the game regenerates it if it's missing, and if an old mmx.ini is lying around the game tells you it isn't read. Save files, keybinds and the remembered ROM location also stay next to the exe now, wherever you launch from.
Upgrading? Extract this zip to a fresh folder. If you reuse your old folder, delete the old config.ini and mmx.ini first so the corrected defaults take effect.
Install
Download MegaManXSNESRecomp-windows-1.0.7.zip, extract, and run mmx.exe. On first launch it asks for your legally-dumped Mega Man X (USA) (Rev 1) ROM. See the bundled README.md for controls.
v1.0.6 — audio accuracy
Tentatively fixes the audio inaccuracies (#4) — music skipping or stuttering around stage loads and scene transitions, a constant slightly-flat pitch, and the occasional off-pitch note.
What changed, briefly:
- The emulated sound chip was being fed fictional time during load-heavy moments (graphics decompression), making it race ahead and drop chunks of live music at boundaries. It now paces itself from real audio progress, so nothing audible gets dropped anymore.
- Sound output now runs at the SNES's true rate of 32040 Hz (it was 32000), removing a small constant flat-pitch offset.
- Note key-on/key-off now follows the real hardware's latched timing; the old shortcut could occasionally start a note with a stale instrument sample, which came out as an off-pitch note.
Measured against a snes9x reference recording over a 5-minute run: zero dropped audio over audible music, and pitch matches within a fraction of a cent. Tentatively because real gameplay ears are the final judge — if something still sounds off, please add to #4.
Reported by @CowSoftware (#4), with reference footage that helped pin this down.
Install
Download MegaManXSNESRecomp-windows-1.0.6.zip, extract, and run mmx.exe. On first launch it asks for your legally-dumped Mega Man X (USA) (Rev 1) ROM. See the bundled README.md for controls.
v1.0.5 — fix Rangda Bangda blue eye
Fixes the Rangda Bangda (Sigma stage 2) boss. The blue eye homed toward X but overshot ~17× and flew off the map for ~30–60 s, stalling the fight (no follow-up eye/nose, X never threatened). It now flies a short hop and returns to its socket so the fight proceeds.
Root cause was a recompiler call-dispatch defect, not a boss-specific bug. The recompiled JSL $80CE9A (the distance routine that sets the eye's fly-timer) was emitted as a runtime M/X-variant switch that was missing the M0X1 case, with a default that silently no-op'd. At the eye launch the CPU flags are exactly m=0,x=1, so the call hit default and the distance routine never ran — the fly-timer was computed from the un-overwritten input (≈43 s of flight instead of ≈1 s). The framework now routes a reached-but-pruned (m,x) dispatch combo to the nearest surviving variant instead of skipping the call. General fix.
Reported by @TechnicallyComputers (#3). Full write-up in issue #3 and ISSUES.md.
Install
Download MegaManXSNESRecomp-windows-1.0.5.zip, extract, and run mmx.exe. On first launch it asks for your legally-dumped Mega Man X (USA) (Rev 1) ROM. See the bundled README.md for controls.
v1.0.4 — fix Spark Mandrill dash-jump turtle
v1.0.4 — fix Spark Mandrill dash-jump turtle
Fixes the Spark Mandrill turtle rendering invisible when approached via dash-jump (#2).
What was wrong. The turtle enemy — and its projectiles — rendered invisible (though still active: it fired and dealt damage) when approached with a dash-jump, while a normal walk-up showed it correctly. Recomp-only; the turtle is never invisible on real hardware.
Root cause — a cooperative-scheduler timing bug, not a DMA problem. The graphics decompressor (Task_B25B / B2EB, slot 6) calls a conditional vblank-yield at $00:8121 (BIT $0B9D ; BMI yield) every 32 decompressed units. The C-host scheduler (MmxSchedulerTick) held the NMI flag $0B9D = $FF for the entire frame and cleared it only at the end of the tick, so the decompressor saw the flag set on its first check and yielded after a single batch each frame — ~⅓ of hardware's streaming throughput. The turtle's VRAM slot ($7F:828d) was therefore allocated at cursor +37 frames vs +14 on hardware, losing the race against the fast dash's ~+30-frame object activation, so the tile base latched 0 and the sprite read unloaded VRAM.
(The VRAM-DMA path $00:82C8 was healthy all along — it drains its full queue every frame. The earlier "DMA drains 3× too slow" theory was wrong.)
Fix. Clear $0B9D at the start of the scheduler's task walk — modeling the original asm scheduler's $80C6 STZ $0B9D, which clears the flag early so the decompressor runs the bulk of each frame with it clear, at hardware pace. One-line runner change in mmx_rtl.c; no recompiled-code or bank changes. Verified against the always-on WRAM rings and a standalone snes9x hardware reference: decompression blocks now complete in the same frame, and the turtle renders correctly on dash-jump.
Download
MegaManXSNESRecomp-windows-1.0.4.zip — extract and run mmx.exe (supply your own legally-dumped Mega Man X (USA) (Rev 1) ROM). Controls and setup are in the bundled README.md.
Full changelog: v1.0.3...v1.0.4