NES EMULATOR
jeg
JEG is a small, developer-focused NES emulator written in C (C99) with an emphasis on hardware abstraction, unit testability and portable backends (SDL prototype). It currently implements the 6502 CPU, basic PPU functionality, and iNES mapper 0 support; audio (APU) is not implemented yet.

WHY IT MATTERS
Why JEG exists
JEG targets developers and researchers who need a clean, testable NES core that can be ported to embedded or batch environments. The code emphasizes hardware abstraction layers and unit tests so emulator components can be replaced or exercised in isolation.
BEST FOR
Best use cases
– Research, testing and educational use (unit tests, test ROMs). – Embedding or porting to custom platforms because of its clean hardware abstraction. – Reference implementation for CPU and basic PPU behavior while development continues.
The people behind jeg
Status and development notes
The project is hosted on GitHub and is actively developed in the repository. The README and repository notes list these verified status points: CPU (6502) is completed, the PPU is nearly complete but failing the ppu_vbl_nmi timing test, the APU (audio) is missing, and cartridge abstraction is at a draft stage. Supported mappers are limited to iNES mapper 0. A prototype UI using SDL exists. The project includes unit tests and integrates several NES test ROMs for automated testing. A pre-release tagged V0.1.0 exists with a note that sound is not working and timing/FPS handling is immature. The repository is released under the MIT license.
What jeg supports
- Linux
- macOS
- Windows (via SDL)
- Embedded targets (source-level portability)
Download and availability
OFFICIAL DOWNLOADS
Get jeg
Official source and release assets are published in the project's GitHub repository releases. Pre-release tags and a V0.1.0 entry are present; assets and binaries (if any) are provided there.
Get jeg ↗DOCUMENTATION
Official documentation
Read the official configuration, compatibility, and troubleshooting material before changing advanced options.
Read official documentation ↗jeg setup guide
Setup note: This is a developer-oriented emulator: build from source, run test ROMs, and expect incomplete audio and limited mapper support. The guide below covers verified, practical steps to get the project compiling and running a ROM as shown in the repository documentation.
- Prerequisites: Install a C compiler (gcc/clang) and standard build tools (make). For the prototype UI you will need SDL development headers (SDL2). Ensure git is available to clone the repository.
- Get the source: Clone the official repository: git clone https://github.com/semiversus/jeg and change into the project directory.
- Build and run tests: Run make test to execute the project's unit tests and the included NES test ROMs. The README documents that running make test exercises CPU and PPU tests drawn from NESDev test suites and blargg tests (some tests are marked not yet working).
- Build the prototype binary: Use make (or the provided Makefile) to build the project. The repository targets a portable C99 build; the Makefile will expect a working C toolchain and SDL development libraries if you plan to use the SDL prototype UI.
- Start the emulator with a ROM: The repository README and release notes show the emulator can be started from the command line: jeg YOUR_ROM.nes. Note: the emulator supports iNES format ROMs and currently only the simplest cartridges (iNES mapper 0) are supported.
- What to expect (limitations): APU (audio) is not implemented — releases and README explicitly state sound is missing. PPU still fails at least one vblank/NMI timing test. Only iNES mapper 0 is supported; many commercial cartridges will not work. FPS/timing are noted as incomplete in early releases. Do not expect full compatibility with commercial games.
- Embedding or porting: JEG is designed with hardware abstraction in mind. To port it to an embedded platform: 1) implement the platform-specific HAL functions the project uses for graphics/audio/input; 2) replace/omit the SDL prototype backend; 3) build with a cross-compiler respecting the project's C99 code. Consult the repository source and platform/ folder for existing portability abstractions.
- Running test ROMs and contributing: The repo includes references to NES test ROMs (blargg and others) and documents how to run tests. Use make test to run them locally. If you contribute, follow the repository's issue and pull request workflow and run the existing tests locally before submitting changes.
Software reminder: JEG does not include commercial game ROMs, firmware, BIOS, or audio assets. Only use ROMs and test images you have the right to use; respect copyright and local law.
Sources and further reading
Detailed guides and tutorials
Explore step-by-step guides for jeg as they are published.
Retro Replay Retro Gaming History, Reviews & Emulation
