

Welcome to the first ripsters' project. Our goal is to understand how GameBoy Advance works and to create a modern emulator written in Rust (if you want to collaborate but you can't code in Rust take a look here).
Everything is work in progress. We will update this document a lot of times in this stage.
We love collaborating with others, so feel free to interact with us however you want. First of all, we strongly suggest you to enter in our Discord channel where you can find all of us (here).
just and not make then if you want take the benefit of this install it cargo install justTip: Run
justto see all the available commands
# quick check all is working on you machine
just build
just test
# run a .gba file (debug build)
just run ~/Desktop/my_game.gba
Before running the emulator, you need:
gba_bios.bin (16KB) placed in the directory where you run the emulator. This is the GBA boot ROM and is required for the emulator to function.Note: The BIOS path is currently hardcoded to
gba_bios.binin the current working directory.
.gba ROM file you want to run.| Command | Description |
|---|---|
just run <rom> |
Run ROM in debug mode |
just run-release <rom> |
Run ROM in release mode (better performance) |
just run-log <rom> |
Run in debug mode with logging to file |
just run-release-log <rom> |
Run in release mode with logging to file |
Examples:
# Run a game in debug mode
just run ~/roms/pokemon_emerald.gba
# Run with better performance (recommended for playing)
just run-release ~/roms/pokemon_emerald.gba
# Run with logging enabled (logs saved to temp directory)
just run-log ~/roms/pokemon_emerald.gba
When --log-to-file is passed, logs are written to clementine.log in your system's temp directory. The path is printed at startup.
A built-in tool for Gen 3 Pokemon games (accessible from the sidebar). Supported games:
| Game | Region | ROM Code |
|---|---|---|
| Pokemon FireRed | US | BPRE |
| Pokemon LeafGreen | US | BPGE |
| Pokemon Emerald | US | BPEE |
| Pokemon Ruby | US | AXVE |
| Pokemon Sapphire | US | AXPE |
Party tab - View your party Pokemon (species, level, stats, moves, held items). The game version is auto-detected from the ROM header.
Wild tab - Force all wild grass encounters to a specific Pokemon species and level. Search/select any of the 386 Pokemon by name, set a level, and click "Patch All Encounters". This patches the ROM encounter tables in memory (not on disk), so it resets when the emulator restarts.
The emulator includes several debug tools accessible via the sidebar:
| Command | Description |
|---|---|
just build |
Build the entire project |
just test |
Run all tests across the workspace |
just lint |
Run clippy with strict configuration |
just fmt |
Format all code |
just check-fmt |
Check formatting without modifying |
just clean |
Clean build directory |
just doc |
Generate and open documentation |
The codebase is documented with Rust doc comments explaining how each component works. This is useful for understanding the GBA hardware and for contributors.
# Generate and open documentation in your browser
just doc
The emulator uses a multi-threaded architecture:
cpal callback pulls mixed samples the CPU thread producesCommunication between threads uses lock-free SPSC (single-producer, single-consumer) channels for commands (UI -> CPU), events (CPU -> UI) and audio samples (CPU -> audio device).
All tests + implementation are based on jsmolka/gba-tests.git + documentation in Wiki and online resources.
$ claude mcp add clementine \
-- python -m otcore.mcp_server <graph>