Game Boy Advance emulator in Rust with an experimental FireRed 3D desktop view and a 2D browser player.
See the codeA Game Boy Advance emulator written from scratch in Rust, with an alpha 3D mode that draws Pokémon FireRed as a tilted miniature built from the game's own map data.
.gba)No ROMs are included and none ever will be. Bring your own.

./gba path/to/firered.gba --3d

The game runs normally. --3d only changes how each frame is drawn: the renderer reads the map out of the game's memory while it runs and stands the buildings, trees and furniture up from that, using the original artwork. Nothing is modelled by hand, so it works on any save. Characters stay sprites. Battles and menus drop back to 2D.
This is an alpha. Pallet Town, Oak's lab, Viridian City and Route 1 have been checked. Everything past that has only been run through an automated audit, not played, so expect wrong shapes in later towns, caves and odd buildings. If a place renders wrong, open an issue with the town name and a screenshot.
The 3D renderer is desktop only. FireRed is the only game it understands. Details, tuning variables, the regression suite and the audit are in docs/3d-mode.md.

The 2D emulator underneath is the real thing, not a wrapper. The ARM7TDMI core, the PPU, DMA, timers, save hardware and audio were each built against the hardware documentation and test ROMs, with no emulation libraries and no ported reference code. No BIOS image is needed; the BIOS calls games actually make are implemented in Rust.
Accuracy. FireRed was run for 9,000 frames under a scripted input sequence and compared frame by frame against mGBA running the identical script. The output was pixel-for-pixel identical the whole way. The CPU core passes the jsmolka arm, thumb and memory suites in full. docs/differential-testing.md explains the harness and what it found.
What is in it
CpuSet, Div, Sqrt, LZ77, RLE, Huffman, ObjAffineSet, IntrWait with the real flag semantics, and the rest games actually callios/

Screenshots are framebuffer dumps from this emulator. Pokémon FireRed is © Game Freak and Nintendo, Kirby: Nightmare in Dream Land is © HAL Laboratory and Nintendo.
Download the archive for your platform from the releases page, unpack it, and run it with a ROM path:
./gba-macos-arm64 path/to/rom.gba # 2D
./gba-macos-arm64 path/to/firered.gba --3d
Or build it yourself with cargo build --release.
Battery saves are written to <rom>.gba.sav next to the ROM. Save states go to <rom>.gba.state.
| GBA | Keyboard |
|---|---|
| A / B | Z / X |
| Start / Select | Enter / Right Shift |
| D-pad | Arrow keys |
| L / R | Q / W |
| Save state / load state | F5 / F7 |
| Pause | P |
| Fast-forward (hold) | Tab |
| Quit | Esc |
Build commands, the source layout, headless runs, trace hooks and the release process are in docs/development.md.
MIT. See LICENSE.
Rust
74.4%
Swift
11.3%
Python
8.4%
JavaScript
2.6%
CSS
1.2%
C
1.1%
Game Boy Advance emulator in Rust with an experimental FireRed 3D desktop view and a 2D browser player.
See the codeA Game Boy Advance emulator written from scratch in Rust, with an alpha 3D mode that draws Pokémon FireRed as a tilted miniature built from the game's own map data.
.gba)No ROMs are included and none ever will be. Bring your own.

./gba path/to/firered.gba --3d

The game runs normally. --3d only changes how each frame is drawn: the renderer reads the map out of the game's memory while it runs and stands the buildings, trees and furniture up from that, using the original artwork. Nothing is modelled by hand, so it works on any save. Characters stay sprites. Battles and menus drop back to 2D.
This is an alpha. Pallet Town, Oak's lab, Viridian City and Route 1 have been checked. Everything past that has only been run through an automated audit, not played, so expect wrong shapes in later towns, caves and odd buildings. If a place renders wrong, open an issue with the town name and a screenshot.
The 3D renderer is desktop only. FireRed is the only game it understands. Details, tuning variables, the regression suite and the audit are in docs/3d-mode.md.

The 2D emulator underneath is the real thing, not a wrapper. The ARM7TDMI core, the PPU, DMA, timers, save hardware and audio were each built against the hardware documentation and test ROMs, with no emulation libraries and no ported reference code. No BIOS image is needed; the BIOS calls games actually make are implemented in Rust.
Accuracy. FireRed was run for 9,000 frames under a scripted input sequence and compared frame by frame against mGBA running the identical script. The output was pixel-for-pixel identical the whole way. The CPU core passes the jsmolka arm, thumb and memory suites in full. docs/differential-testing.md explains the harness and what it found.
What is in it
CpuSet, Div, Sqrt, LZ77, RLE, Huffman, ObjAffineSet, IntrWait with the real flag semantics, and the rest games actually callios/

Screenshots are framebuffer dumps from this emulator. Pokémon FireRed is © Game Freak and Nintendo, Kirby: Nightmare in Dream Land is © HAL Laboratory and Nintendo.
Download the archive for your platform from the releases page, unpack it, and run it with a ROM path:
./gba-macos-arm64 path/to/rom.gba # 2D
./gba-macos-arm64 path/to/firered.gba --3d
Or build it yourself with cargo build --release.
Battery saves are written to <rom>.gba.sav next to the ROM. Save states go to <rom>.gba.state.
| GBA | Keyboard |
|---|---|
| A / B | Z / X |
| Start / Select | Enter / Right Shift |
| D-pad | Arrow keys |
| L / R | Q / W |
| Save state / load state | F5 / F7 |
| Pause | P |
| Fast-forward (hold) | Tab |
| Quit | Esc |
Build commands, the source layout, headless runs, trace hooks and the release process are in docs/development.md.
MIT. See LICENSE.
Rust
74.4%
Swift
11.3%
Python
8.4%
JavaScript
2.6%
CSS
1.2%
C
1.1%