A NES Emulator written for fun and learning

View the Project on GitHub daniel5151/ANESE


Build Status Windows Build Status macOS/Linux

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

While accuracy and performance are long-term goals, ANESE’s primary focus is to get some of the more popular titles up and running. Most basic Mappers have been implemented, so many popular titles should be working! :smile:

ANESE is built with cross-platform in mind, and is regularly tested on all major platforms (macOS, Windows, and Linux). ANESE doesn’t use any vendor-specific language extensions, and is compiled with strict compiler flags. It is also linted (fairly) regularly.

Lastly, ANESE strives to keep a clean and interesting C++11 codebase, emphasizing readability, maintainability, and approachability. The code is well commented, providing sources and insights for much of the logic.


Official releases can be found on the Releases tab on GitHub.

Alternatively, for the most up-to-date version of ANESE, you can download nightly builds. These are compiled directly from the latest ANESE commit, so there may (will) be bugs.

Windows: You can download nightly versions of ANESE from AppVeyor’s build artifacts page.

macOS: Travis uploads nightly bundles to this GDrive folder.



While ANESE’s emulation core (src/nes) doesn’t have any major dependencies, there are a couple of libraries the UI uses. Most of these dependencies are bundled with ANESE (see: /thirdparty), although some do require additional installation:

Generating + Compiling

ANESE builds with CMake. Nothing too fancy here.

# in ANESE root
mkdir build
cd build
cmake ..
make install # on macOS: creates in ANESE/bin/

On Windows, building is very similar:

mkdir build
cd build
cmake ..
msbuild anese.sln /p:Configuration=Release

If you’re interested in looking under the hood of the PPU, you can pass the -DDEBUG_PPU flag to cmake and have ANESE display PPU debug windows.


Running ANESE with no arguments throws you into a directory-browser, from which you can navigate to your ROM and launch it.

Alternatively, ANESE can run from the shell using anese [rom.nes] syntax. Certain features are only accessible from the command-line at the moment (e.g: movie recording / playback, PPU timing hacks). For a full list of switches, run anese -h

Windows Users: make sure the executable can find SDL2.dll! Download the runtime DLLs from the SDL website, and plop them in the same directory as anese.exe


There aren’t too many mappers implemented at the moment, but the ones that are cover a sizable chunk of the popular NES library.

# Name Some Games
000 NROM Super Mario Bros. 1, Donkey Kong, Duck Hunt
001 MMC1 Legend of Zelda, Dr. Mario, Metroid
002 UxROM Megaman, Contra, Castlevania
003 CNROM Arkanoid, Cybernoid, Solomon’s Key
004 MMC3 Super Mario Bros 2 & 3, Kirby’s Adventure
007 AxROM Marble Madness, Battletoads
009 MMC2 Punch Out!!

If a game you love doesn’t work in ANESE, feel free to implement it’s mapper and open a PR for it :D


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 of emulator actions:

Action Key Controller
Pause / Open Menu Esc Left Thumbstick Button
Reset Ctrl - R  
Power Cycle Ctrl - P  
Toggle CPU logging Ctrl - C  
Speed +25% Ctrl - =  
Speed -25% Ctrl - -  
Fast-Forward Space Right Thumbstick Button
Make Save-State Ctrl - (1-4)  
Load Save-State Ctrl - Shift - (1-4)  

(there are 4 save-state slots)



These are features that will add major value to ANESE:

Here’s a couple that have been crossed off already:

And here are some ongoing low-priority goals:


Key Milestones

Secondary Milestones

Tertiary Milestones (Fun Features!)

Accuracy & Compatibility