A Nintendo 64 emulator that runs inside Roblox. It interprets the original
ROM on an R4300 CPU emulator, rasterizes the N64 graphics pipeline in
software, and presents every frame through a Roblox EditableImage.
- R4300 interpreter that boots the Super Mario 64 (EU) ROM into gameplay
- Fast3D and Goddard microcode rasterizers with texture mapping and a depth buffer
- Software framebuffer at 320×240 with a 160×120 fast path, drawn through
EditableImage:WritePixelsBuffer() - Audio HLE synthesized through a 16-voice sine oscillator bank
- Keyboard and gamepad input mapped to the N64 controller
- Deterministic session trace recording and replay
- Structured runtime profiling records written to the Roblox Studio log
- Node.js 24
- rokit — pins Rojo 7.7.0
- Roblox Studio with the Rojo plugin
- A legally obtained Super Mario 64 (EU) ROM
npm ci
npm run embed:local-rom -- --rom /path/to/your/baserom.eu.z64
npm run build
rokit install
npm run build:place
npm run serveOpen build.rbxlx in Roblox Studio with the Rojo plugin connected, then
press play. The ROM must match SHA-1
4ac5721683d0e0b6bbb561b58a71740845dceea9. Embedding writes generated chunks
to local-rom/, which is gitignored — no copyrighted data lives in this
repository.
| N64 | Keyboard | Gamepad |
|---|---|---|
| Analog stick | Arrow keys / WASD | Left stick |
| A | Z | A |
| B | X | B |
| Z | C | L2 |
| Start | Enter | Start |
| L | Q | L1 |
| R | E | R1 |
| C buttons | I / J / K / L | Right stick |
The interpreter executes the ROM, display lists are rasterized in software
into a framebuffer, and the client uploads that framebuffer into an
EditableImage each frame. Guest audio commands are synthesized on a sine
oscillator bank, and a separate trace system records and replays
deterministic sessions. More detail:
- docs/static-recompiler.md — generating the static recompiler tables
- docs/runtime-profiling.md — performance telemetry and how to read it
Functional in Roblox Studio: the EU ROM boots to gameplay, renders through
EditableImage, accepts input, and produces audio. Ongoing work focuses on
performance and differential testing between the Roblox and native
renderers.
