A NES Emulator written for fun and learning

View the Project on GitHub


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

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

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

NOTE: The APU is not my code. I wanted to get ANESE up and running before new-years 2018, so i’ve decided to use 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 just a stub)

It is being built with cross-platform in mind, with builds being tested on MacOS, Linux (Ubuntu), and Windows regularly, with strict compiler flags, and regular cppcheck linting.

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 shoutout 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 core doesn’t have any hard dependencies, but there are a couple used by the UI. Most of these dependencies are either bundled with ANESE (see: /thirdparty), although some do require additional installation:

# in ANESE root
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release

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

NOTE: make sure to build ANESE in release configuration, since without the compiler optimizations, it’s bloody slow. This is because I wrote the code to be clean and neat, without worrying about performance.


Just open anese, and a file select dialog should prompt you for a rom file.

Alternatively, it can be called from the shell using standard anese [rom.nes] syntax.

For a full list of switches, run anese -h

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


Currently hardcoded 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