Skip to content
Screenshot published by the nescore project
Screenshot published in the nescore project's official README. Image source: nescore project on GitHub.

nescore

NES EMULATOR

nescore

NesCore — a JavaScript NES emulator implemented for educational purposes. Implements a 6502 CPU, PPU and APU behavior (not cycle-accurate), supports several common mappers (NROM, MMC1, UxROM, CNROM, MMC3), SRAM and save states, and exposes a web frontend and a programmatic API for embedding in JS projects.

NESPRIMARY SYSTEM
History documentedPROJECT BEGAN
Open sourcePROJECT MODEL

WHY IT MATTERS

Why this project exists

NesCore was created to demonstrate the inner workings of the Nintendo Entertainment System in clear, object-oriented JavaScript code for learning and experimentation rather than for maximum performance or cycle-accurate emulation.

BEST FOR

Best uses

Learning and research: reading and running a readable JS implementation to understand NES CPU/PPU/APU internals; embedding a simple NES engine in browser projects; experimenting with mapper and save-state behavior.

The Legend of Zelda gameplay on NES
Gameplay from The Legend of Zelda on NES.

The people behind nescore

History and verification

The project's source and documentation are available on GitHub and a demo/docs site. The repository description and README state the emulator was written for educational purposes, implements the official 6502 instructions (nestest passes), and supports a set of popular mappers plus SRAM and save states. The project is not cycle-accurate and emphasizes clarity over raw performance. I consulted the project's GitHub repository and its documentation/demo site for these details; exact project start year and latest commit timestamps were not determinable within this verification run, so the project_began field is recorded as 'History documented' rather than a date.

What nescore supports

  • Nintendo Entertainment System (NES)
  • Browser (web frontend)
  • Node/npm usage as a JavaScript library
  • Common NES mappers: NROM (0), MMC1 (1), UxROM (2), CNROM (3), MMC3 (4)

Download and availability

OFFICIAL DOWNLOADS

Get nescore

Official source and release artifacts (if any) are provided on the project's GitHub repository and its releases page. For embedding via npm, the README documents an npm package installation (see sources).

Get nescore ↗

DOCUMENTATION

Official documentation

Read the official configuration, compatibility, and troubleshooting material before changing advanced options.

Read official documentation ↗
Broken or missing download? Emulator projects move and official links sometimes change. Please contact Retro Replay so the source can be verified and updated.

nescore setup guide

Setup note: This setup guide covers running the repo's web demo and using the emulator as a JavaScript library (npm). It assumes familiarity with Node.js/npm and hosting static files for the browser demo. The project does not include any commercial ROMs, BIOS, or firmware — supply your own legally-obtained ROM files in .nes format.

  1. 1) Get the source or install via npm: Option A — GitHub: clone the repository from its GitHub page to inspect and run the demo locally. Option B — npm: the README references an npm package installation (npm install –save nes-emu) for embedding the emulator as a library. Use whichever you prefer; cloning gives you the demo app and source to read.
  2. 2) Running the web demo locally: If you cloned the repo, install dependencies with npm install (or the package manager specified in package.json). The project uses a web frontend (the repo includes public/ and index.html and a vite config). Run the development server as the repository's README or package scripts indicate (for example npm run dev or npm start if present). Open the served demo in a modern browser. The demo expects a .nes ROM to be provided to the page (the README/demo shows how to load ROMs).
  3. 3) Using NesCore as a JS library: Import the library per the README/examples. The documented API usage example shows creating an instance with: const nes = new NES(onFrame, onSample); where onFrame receives a Uint32Array framebuffer and onSample receives audio sample numbers. Load a ROM by passing a Uint8Array to nes.load(rom). Drive emulation by calling nes.frame() per video frame and manage input with nes.setButton(player, button, isPressed). Save states are available via nes.getSaveState() and nes.setSaveState(state).
  4. 4) ROMs, saves and mapper considerations: Provide your own NES ROM files in standard .nes format. The emulator supports mapper 0 (NROM), 1 (MMC1), 2 (UxROM), 3 (CNROM) and 4 (MMC3) according to the README; games requiring other mappers will not work. SRAM (battery-backed saves) support and ephemeral save states are implemented per the README, but exact compatibility will depend on the mapped behavior for a given ROM.
  5. 5) Debugging and development: The README indicates a global window.debug object is exposed in the demo for inspecting emulator state. Adding ?debug to the demo URL engages special debug controls. For integration debugging, use the provided API hooks (onFrame/onSample) and run nestest to validate CPU instruction correctness if you need to replicate their self-test environment.
  6. 6) Platform and hosting notes: The emulator runs in modern browsers (the demo is client-side JS) and can be embedded in Node-based projects as a library. No special BIOS or commercial firmware is required. Performance is not the primary goal — expect lower performance than native, cycle-accurate emulators, particularly for heavy ROMs or on low-end devices.

Software reminder: The project does not include commercial ROMs, BIOS, or proprietary firmware. Use only ROMs you legally own and follow local copyright law.

Sources and further reading

Detailed guides and tutorials

Explore step-by-step guides for nescore as they are published.