Metroid

Untested

NES · 1986 · Action-Adventure · Decompilation

Explore Planet Zebes as Samus Aran, finding the upgrades that open the way deeper in.

▶ Play with your filesYou 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.
Controls
Arrow keysmove, aim up, morph ball
XA (jump)
ZB (fire)
EnterStart
ShiftSelect
Gamepadstandard 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

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.

Play next