A NES Emulator written for fun and learning

View the Project on GitHub daniel5151/ANESE


ANESE (Another NES Emulator) is a Nintendo Entertainment System Emulator being written for fun and learning.

Accuracy is a long-term goal, but the primary goal is simply getting ANESE to play some of the more popular titles :smile:

I’m aiming for clean and interesting C++11 code, with a emphasis on keeping the source readable and maintainable. Performance is important, but it’s not a primary focus.

NOTE: The APU is not my code. I wanted to get ANESE partially up and running before new-years 2018, so I’ve used Blargg’s venerable nes_snd_emu library to handle sound (for now). Once I polish up some of the other aspects of the emulator, I will revisit my own APU implementation (which is currently stubbed)

ANESE is built with cross-platform in mind, and builds are regularly tested on macOS, Linux (Ubuntu), and Windows regularly. The C++ doesn’t rely on vendor-specific extentions, and is compiled with strict compiler flags. The code is linted regularly.

Lastly, I am trying to avoid looking at the source codes of other NES emulators, since IMO, half the fun of writing a emulator is figuring things out yourself :D

(That said, big shout-out to LaiNES and fogleman/nes, two solid projects who’s code I referenced when implementing some particularly tricky parts of the PPU)


ANESE uses CMake, so make sure it is installed.

ANESE’s emualtion core doesn’t have any major dependencies (aside from clib), but there are a couple used for the UI. Most of these dependencies are bundled with ANESE (see: /thirdparty), although some require additional installation:

# in ANESE root
mkdir build
cd build
cmake ..

Building on Windows has been tested with VS 2017 using MSVC.

If you’re interested in looking under the hood of the PPU, you can pass the -DDEBUG_PPU flag to cmake and get an anese build with some neat debug info.


ANESE can run from the shell using anese [rom.nes] syntax.

If no ROM is provided, a simple dialog window pops-up prompting the user to select a valid NES rom.

For a full list of switches, run anese -h

Windows Users: make sure the executable can find SDL2.dll!


Currently hard-coded to the following:

Button Key Controller
Start Enter Start
Select Right Shift Select
Up Up arrow D-Pad
Down Down arrow D-Pad
Left Left arrow D-Pad
Right Right arrow D-Pad

Any xbox-compatible controller should work.

There are also a couple emulator actions:

Action Keys
Exit Esc
Reset Ctrl - R
Power Cycle Ctrl - P
Toggle CPU logging Ctrl - C
Speed++ Ctrl - =
Speed– Ctrl - -
Fast-Forward Space