EmuSen is a multi-system emulator written entirely from scratch in C# / .NET 10 — not a port or a fork of an existing emulator, but built directly against published hardware documentation. It's GPL-3.0, runs on Linux, Windows, and macOS, and it comes with something most emulators don't: a real Unix-like debugging shell built right into it.

Three cores, one shell. Hand it a ROM and it builds the right core automatically:

  • Venus (SNES) — the mature core. Full 65816 CPU (including decimal mode), SPC700 + S-DSP audio, all 7 PPU background modes, Mode 7, and real cartridge coprocessor support: SA-1, SuperFX/GSU, the NEC DSP family, and OBC1. Runs real commercial games — Kirby's Dream Land 3 and Kirby Super Star both play on the SA-1 path, and Yoshi's Island gets through its intro and into level 1-1 on the GSU path.
  • Moon (NES) — CPU validated against 2.56 million SingleStepTests cases (final state and per-cycle bus traces), a full PPU and APU, and ten mapper boards including MMC3. Younger than Venus and less play-tested, but no longer a skeleton.
  • Mercury (Game Boy / Game Boy Color) — built in four days and now feature-complete: SM83 CPU, a cycle-granular bus, full PPU and all four APU channels, CGB colour, five cartridge boards, and save states. One core covers both DMG and CGB.

Every other console EmuSen might eventually support is a reserved, empty folder — the architecture is built for more than three cores, and the project's own debug interface (IDebugTarget) proved that out: it had exactly one implementation for most of this project's life, and now has three, each costing less than the last to add.

Honest status, not marketing copy. The SNES core runs real games, several boot and play correctly, but very few have been verified end to end. The NES core runs and makes sound but has had far less play-testing. The Game Boy core is the best-instrumented of the three, but its timing claims are argued rather than proven until the actual hardware test corpus gets run against it — that's the single biggest item on the roadmap.

The part that makes this project unusual isn't the emulation, it's the tooling built around making it debuggable:

  • DianaOS — a genuine bash-alike shell embedded in the emulator itself, with pipes, variables, redirection, control flow, a coreutils subset (ls, grep, awk, sed, find, xxd...), and hardware inspection commands like mem, regs, watch, and disasm. Cartridge coprocessors get first-class treatment here too — their own register files, their own memory spaces, their own disassemblers.
  • Pharaoh — a headless, scriptable harness that runs the real core with no window and no human, so a bug can be reproduced deterministically and a fix proven byte-identical across the whole ROM library rather than eyeballed on one frame.

Architecture. Everything is layered bottom-to-top, each layer depending only on what's below it: a pure emulation core with no window and no frontend knowledge, the DianaOS debug layer sitting above it knowing nothing about the SNES specifically, and two Avalonia frontends — Mistress (the fuller GUI) and Hotaru (console-first, ROM on the command line) — sharing a presentation library and a UI toolkit above that. The boundary is enforced by an actual test, not just a comment: a dedicated assembly test asserts the shared libraries never reach back into the emulation core.

Why the names? EmuSen = Emulator Senshi, after Bishoujo Senshi Sailor Moon. Every core is named for a character, grouped by manufacturer — Nintendo gets the heroes (SNES = Venus, NES = Moon), everyone else gets a villain faction. Virtual Boy is Saturn, Guardian of Death and Destruction, which is a joke, not a coincidence.

Tested, seriously. 2,726 tests across 202 files, covering CPU/PPU hardware behaviour on all three cores, the coprocessors, audio sync, save-state round-tripping, and the DianaOS shell itself. Some tests are property-based — asserting laws rather than examples, like the rewind codec really being its own inverse. Beyond unit tests, output-identity digests (framesum/audiosum) prove a renderer or mixer change alters exactly the games it was meant to, across the whole local ROM library, and nothing else.

Requires the .NET 10 SDK to build — SDL3 ships with it. No ROMs are included or ever will be; supply your own legally-obtained dumps. Licensed GPL-3.0, written against the SNESdev wiki as the primary hardware reference.

EmuSen on GitHub