Project index

Emulation / Debugging / C

01 / 06

Orbiter

An immersive NES emulator and debugger for live disassembly, hardware inspection, execution tracing, profiling, and deterministic rewind.

StatusPre-release
Period2026
Built withC / Win32 / D3D11
01 / In operation

Gameplay and the derived execution model move backward together through the same deterministic timeline.

02 / Intent

Most emulators make the machine disappear behind the game. Orbiter was built around the opposite idea: emulation is more interesting when the machine remains visible, inspectable, and reversible while it runs.

The result is a Windows application where playback and debugging occupy the same surface. A game can run beside its disassembly, processor state, profiler, character memory, and a control-flow model accumulated from actual execution.

03 / Architecture

Orbiter uses four explicit layers so that emulation, derived knowledge, presentation data, and interface code can evolve without collapsing into one system.

01

NES_Emulator

Owns authoritative machine state and advances the CPU, PPU, APU, buses, and mapper.

02

NES_Process

Orchestrates execution, records events, maintains the timeline, and derives durable analysis.

03

NES_Publication

Builds stable, display-ready CPU, PPU, video, palette, sprite, and character-map data.

04

Application views

Turn publications and analysis into interactive panels, GPU textures, graphs, and controls.

04 / Engineering decisions

01

Determinism becomes a user feature

Mutable emulator state lives in a flat NES_State value. Each timeline entry pairs that state with the execution-analysis cursor, so rewinding restores both the machine and the debugger knowledge associated with that moment. A fixed 1,024-entry ring keeps the operation bounded and predictable.

02

Record events; derive knowledge

The emulator records instruction and interrupt events into fixed-capacity buffers while it runs. NES_Process consumes that stream into a persistent model of executed instructions, basic blocks, subroutines, edges, and hit counts. The interface reads the model instead of inserting visualization concerns into the emulator.

03

Frame boundaries with audio-led buffering

The run API advances until the PPU emits a frame event. The application chooses how many whole frames to run from the amount of audio already queued, generates 48 kHz samples during those frames, and caps catch-up work to prevent an audio stall from turning into an unbounded visual jump.

04

Presentation is a boundary, not shared state

NES_Publication converts internal state into data the interface can safely consume: colorized video, character maps, palettes, sprites, and device registers. Views then upload images to D3D11 and arrange the debugger without becoming coupled to emulator internals.

05 / Current reality

Orbiter is an early Windows x64 prerelease, not a finished general-purpose NES emulator. It currently supports iNES mappers 0, 1, 2, and 9. CPU instructions still execute atomically before the PPU and APU are advanced by their reported cycle count, so the scheduler is deterministic but not yet cycle accurate. The application also runs emulation, debugging, audio production, and rendering on one thread.