Metroid
UntestedNES · 1986 · Action-Adventure · Decompilation
Explore Planet Zebes as Samus Aran, finding the upgrades that open the way deeper in.
Controls
| Arrow keys | move, aim up, morph ball |
| X | A (jump) |
| Z | B (fire) |
| Enter | Start |
| Shift | Select |
| Gamepad | standard mapping |
About this build
Metroid rebuilt from the nmikstas disassembly and run in the browser on a WebAssembly NES core. The eight PRG banks reassemble to the same 131,072 bytes as a Metroid (USA) cartridge, with zero differences; only the 16-byte file header differs, because the disassembly emits plain iNES and most dumps carry NES 2.0. The project ships code only. You supply your own cartridge dump, it is read into page memory, and the page's Content-Security-Policy names no remote origin, so the browser itself refuses to let it leave.
- Built from
- EmulatorJS 4.2.3 driving the libretro fceumm core in WebAssembly, running a reassembly of the 6502 disassembly that is byte-identical to the cartridge
- Type
- Decompilation
- Game files
- You supply your own Metroid (USA) dump. It is read in the browser and never uploaded. ROM body sha1 fdbfc7871962f72a1ef57e5a7e456164fb93430b, crc32 70080810, 131072 bytes; a plain iNES or a NES 2.0 header both work.
- Code licence
- EmulatorJS is GPL-3.0; the libretro fceumm and nestopia cores are GPL-2.0; the Ophis assembler is MIT. The disassembly states no licence.
- Assets
- No game data is distributed. Nintendo retains all rights in Metroid.
- Source
- nmikstas/metroid-disassembly ↗
What has been tested
Reassembles to a byte-identical 131072-byte ROM body (0 differences; 5 of 16 header bytes differ because the dump is NES 2.0). In the browser: boots, renders at 256x224, pumps frames at ~60 fps, and reaches real gameplay in Brinstar confirmed from Metroid's own variables (GameMode, MainRoutine, InArea, ObjectX) decoded out of the emulator's save state at addresses parsed from the disassembly's own symbol table. Movement proven by holding Right then restoring the same state and holding Left: +121 and -122 pixels over 90 frames, at a symmetric 1.35 px/frame. A save state survives navigating away and back. Zero off-site requests, asserted at the network layer. 33 of 33 automated checks pass, all with audio muted.
Last tested 2026-10-05 in Chrome 151 headless, Linux. Full playthrough: not verified. How games are tested.
Known limitations
- Not yet playable here: no hosted page has been published for this title.
- Tested only as far as real, verified movement in Brinstar. Nothing deeper in the game was played, nothing was fought, and no item was collected.
- The password system was never exercised: no password was generated or entered.
- Progress is proven to survive a page reload. Whether it survives closing the browser is untested — headless Chrome on the test machine discards browser storage between runs.
- Audio was muted in every test, so nothing is known about sound.
- The keyboard and gamepad mappings are untested: the automated tests drive the emulator's input API directly rather than pressing real keys.
- Touch controls on phones and tablets are untested.
- Tested only in headless Chrome 151 on Linux. No other browser, and no mobile device.
- The alternative nestopia core boots and renders correctly, but the gameplay verification only works on fceumm, so nestopia is smoke-tested only.
Saves
Metroid has no battery: the real cartridge continues from a password, not a save file. This build instead keeps an automatic save state in your browser, under this site, keyed to your ROM's own hash, and restores it when you return. It is a save state, not a save file. Clearing site data removes it, and the footer has a button to discard it.