| Crates.io | yane |
| lib.rs | yane |
| version | 1.1.11 |
| created_at | 2025-03-03 00:59:56.860186+00 |
| updated_at | 2025-06-15 23:06:29.740312+00 |
| description | An N.E.S. emulator and emulation library. |
| homepage | |
| repository | https://github.com/josefwaller/yane |
| max_upload_size | |
| id | 1575018 |
| size | 4,404,676 |
Nintendo Entertainment System emulator and emulation library.
Can be used as either a standalone CLI emulator or as a ready-out-of-the-box rust crate for emulating an N.E.S.
WINDOWS USERS: Make sure the appropriate SDL2.dll is in your $PATH.
See the official releases.
cargo> cargo install yane
...
> yane [COMMAND] [OPTIONS]
...
Make sure your cargo install directory (default ~/.cargo/bin) is in your $PATH.
WINDOWS USERS: Add the appropriate SDL2.lib and SDL2.dll to the root of the crate (i.e. /yane/).
See the official releases.
> git clone https://github.com/josefwaller/yane.git
...
> cd yane
> cargo build -r
...
> ./target/release/yane [COMMAND] [ARGS]
Once installed, run yane ines path/to/my/rom.nes.
Yane uses a simple command line interface, use yane -h and yane [COMMAND] -h to see the available options.
> yane -h
An N.E.S. emulator.
Usage: yane [COMMAND]
Commands:
setup Initialize the configuration files at $HOME/.yane/
ines Load and run an iNES (.nes) file
savestate Load and run a savestate (.yane.bin) file.
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
> yane ines -h
Usage: yane ines [OPTIONS] <NES_FILE>
Arguments:
<NES_FILE> The iNes file to run
Options:
-s, --savedata-file <SAVEDATA_FILE> The savedata file (.SRM). Only used if the NES game supports battery backed static ram. Will default to using the NES file name and location
--config-file <FILE> The configuration file for the emulator's settings [default: ~/.yane/settings.yaml]
-d, --debug Start in debug mode
-p, --paused Start paused, after advancing one frame in order to render one frame
-m, --muted Start the emulator muted
--keymap-file <FILE> The .YAML file defining the key mappings for the NES [default: ~/.yane/key_map.yaml]
--tail Tail the logs in terminal as well as the logging file
--log-dir <DIRECTORY> Directory to save logs to [default: ~/.yane/logs]
-h, --help Print help
> yane setup
Successfully created configuration files
> yane ines path/to/my/rom.nes --muted --debug --keymap-file=my/custom/keymap.yaml
See KeyMap for the default key bindings.
Running yane setup will create a bunch of configuration files at $HOME/.yane.
These can then be edited to change the keymappings, settings, logging directory, etc.
Yane will check for these files before running every time and fall back on the defaults if they don't exist,
so you can run the emulator without running yane setup if you want.
All of Yane's functionality is available as a standalone, pure rust crate.
use yane::core::{Nes, Settings, Cartridge, Controller};
// Create a new N.E.S. console with an empty cartridge inserted
// You could use Cartridge::from_bytes(include_bytes!("path/to/my/game.nes", None)) to load from an iNes file instead.
let mut nes = Nes::new();
// Use the default settings for the emulator
let settings = Settings::default();
// Advance the N.E.S. by 1 frame (i.e. until the VBlank interval)
nes.advance_frame(&settings);
// Advance the N.E.S. by one single instruction
nes.advance_instruction(&settings);
// Press the A button on player 1's controller
nes.set_controller_state(0, Controller {
a: true,
..Controller::default()
});
// Reset the N.E.S.
nes.reset();
See the documentation on the library portion or the examples for more.
Yane includes two feature flags
sdl, which is enabled by default, includes the SDL interface that comes with Yane (i.e. everything in yane::app).
If you want to use yane as a pure rust library, you can omit this flag.wasm-bindgen makes Controller exportable to javascript via wasm_bindgen so that it can be passed between javascript and wasm easily.
See the wasm-bindgen docs.All test roms are from the nes-test-rom repository,
without which this project would probably not be possible.
Some examples use models or NES games not made by me, there are credits.txt files where appropriate.