Intro
Last updated:
Who this is for
This is for developers that want to build an NES emulator. It assumes you're comfortable programming — it isn't the place to learn your first language, and the code is left to you.
Being new to emulation is fine, though; that's part of what the milestones below are for.
It is not an electrical-engineering text. Hardware details — latches, dummy reads, an address sitting on the bus for a cycle — are described only when an emulator has to reproduce them to accurately match the system's behaviour; if something has no observable consequence, it isn't here. So you don't need a hardware background to follow along.
Scope and status
- The main goal is accurate emulation — behaviour that matches the real hardware, not just "close enough to boot a game."
- Gentle learning curve. Complexity arrives gradually via milestones, but never at accuracy's expense. You get something on screen first; the harder cases — precise timing, dummy reads, the edge-case quirks — come once there's a working emulator to fit them into, rather than up front.
- I'm writing this to understand the rendering side myself, so for now it only
covers:
- NTSC. PAL has different clock dividers, a different frame shape, and some behavioural differences; I'll get to it once the NTSC side is solid. Until then, assume NTSC unless a page says otherwise.
- NROM. NROM (mapper 0) is the simplest cartridge type: the game's ROM is wired straight into memory, no extra hardware on the cartridge. It runs games like Donkey Kong and Super Mario Bros. Fancier cartridge types come later.
Work in progress, started June 2026. I'm writing these pages as I work through the system myself, so they land incomplete, get rewritten, and occasionally contradict each other for a while. Cross-check anything against NESdev before betting code on it.