Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Build Status

An NES emulator written in Go

Super Mario Bros.

Donkey Kong


Legend of Zelda


Super Mario Bros. 3

Mega Man 2


Mac OS X/Linux/Windows

  1. Install Azul3D by following the official installation instructions for your platform.

  2. go get -u


WebAssembly support requires Go 1.11 or higher.

  1. Download nintengo

    go get -d -u
  2. Build wasm/nintengo.wasm

    cd $GOPATH/src/
    GOOS=js GOARCH=wasm go build -o wasm/nintengo.wasm .
  3. Start web server running on port 8000

    cd $GOPATH/src/
    go run serve.go -http :8000
  4. Open http://localhost:8000 in your browser. Press the Choose File button and select a .nes file to run.


FILE can be a .nes file or a .nes file inside a .zip archive
  -audio-recorder="": recorder to use: none | wav
  -connect="": Connect to address as slave, <rom-file> will be ignored (e.g., 'localhost:8080')
  -cpu-decode=false: decode CPU instructions
  -cpu-profile="": write CPU profile to file
  -http="": HTTP service address (e.g., ':6060')
  -listen="": Listen at address as master (e.g., ':8080')
  -mem-profile="": write memory profile to file
  -recorder="": recorder to use: none | jpeg | gif
  -region="NTSC": system region to emulate: NTSC | PAL


z - A
x - B
Enter - Start
Right Shift - Select
Arrow keys - Up/Down/Left/Right

p - Pause/Unpause
n - Toggle stepping by cycle/scanline/frame with p
r - Reset
q - Quit

F1 - save state
F5 - load state

F8  - 200% FPS (2x fast forward)
F9  - 100% FPS
F10 - 75% FPS
F11 - 50% FPS
F12 - 25% FPS

` - toggle overscan
1 - 256x240 screen size
2 - 512x480 screen size
3 - 768x720 screen size
4 - 1024x960 screen size
5 - 2560x1440 screen size

9 - Show/hide background
0 - Show/hide sprites

keypad 0 - toggle mute all channels
keypad 1 - toggle mute pulse 1 channel
keypad 2 - toggle mute pulse 2 channel
keypad 3 - toggle mute triangle channel
keypad 4 - toggle mute noise channel
keypad 5 - toggle mute DMC channel

l - Save pattern tables to left/right.jpg

o - Toggle CPU decoding
i - Toggle PPU decoding

with -recorder=gif:
s - Start recording to frame.gif
d - Stop recording

with -recorder=jpeg:
s - Save screenshot to frame.jpg

with -audio-recorder=wav:
keypad - (minus) - Start audio recording to audio.wav
keypad + (plus) - Stop audio recording


Audio support is currently a work in progress. All audio channels are working in some capacity.

Battery backed saves is implemented and are saved to disk with a .sav file extension.

Save states are supported and are saved to disk with a .nst file extension.


Nintengo includes two-player netplay support using the -listen and -connect command-line arguments. To use, player one launches nintengo and tells it to listen for incoming connections using the -listen flag:

nintengo -listen=:8080 FILE

Player two then connects to player one using the -connect flag, providing the server's host/port:

nintengo -connect=

Note that player two does not need to provide a FILE argument.


  • NROM
  • MMC1
  • MMC3
  • MMC2


This project would not have been possible without the amazing treasure trove of information that is the NESdev Wiki and the fine folks at #nesdev on EFnet.

Being able to read the source code of other NES emulators was also extremely helpful. The following is a short list of the ones I consulted most often, although it is probably not the complete list: