A simple NES emulator.
- Cycle accurate, passes many timing tests (see below)
- Supports quite a few mappers
- 0, 1, 2, 3, 4, 5, 7, 9, 10, 11, 19, 21, 23, 24, 25, 26, 28, 30, 34, 66, 69, 71, 78, 85, 87, 206
- Has built-in cart database
- Supports additional audio channels for mapper 19, 24, 26
- Save/load battery backup
- Save/load emulator state to file
- Pause and step one frame
- Rewind and seek to specific cycle
- Convenient Python test harness using hashes to validate
Use a recursive clone, to include the submodules:
$ git clone --recursive https://github.com/binji/binjnes
If you've already cloned without initializing submodules, you can run this:
$ git submodule update --init
If you run make
, it will run CMake for you and put the output in the bin/
directory.
$ make
$ bin/binjnes foo.nes
You can also just use cmake directly:
$ mkdir build
$ cd build
$ cmake ..
$ make
You can build binjnes as a WebAssembly module. You'll need an incoming build of emscripten. See https://github.com/kripken/emscripten/wiki/WebAssembly and http://kripken.github.io/emscripten-site/docs/building_from_source/index.html#installing-from-source.
Put a symlink to Emscripten in the emscripten
directory, then run make.
$ ln -s ${PATH_TO_EMSCRIPTEN} emscripten
$ make wasm
Or set Makefile variables via command line:
$ make wasm EMSCRIPTEN_CMAKE="/path/to/Emscripten.cmake"
If you change the build config (e.g. update the submodules), you may need to run CMake again.
The simplest way to do this is to remove the out/
directory.
$ rm -rf out/
$ make
$ bin/binjnes <filename>
Keys:
Action | Key |
---|---|
P0 DPAD-UP | ↑ |
P0 DPAD-DOWN | ↓ |
P0 DPAD-LEFT | ← |
P0 DPAD-RIGHT | → |
P0 B | Z |
P0 A | X |
P0 START | Enter |
P0 SELECT | Tab |
P1 DPAD-UP | Y |
P1 DPAD-DOWN | H |
P1 DPAD-LEFT | G |
P1 DPAD-RIGHT | J |
P1 B | K |
P1 A | L |
P1 START | O |
P1 SELECT | I |
Reset | Delete |
Save state | F6 |
Load state | F9 |
Rewind | Backspace |
Pause | Space |
Step one frame | N |
scripts/tester.py
will only run the tests that match a filter passed on the
command line. Some examples:
# Run all tests
$ scripts/tester.py
# Run all apu tests
$ scripts/tester.py apu