Retro Boy is a simple Game Boy emulator written in Rust that can be played on the web. Try it here.
To compile the implementation to WebAssembly, you will first need to install wasm-pack with the command cargo install wasm-pack
if you haven't done so already. Then, run sh ./build-wasm.sh
to build the core project and generate the Javascript binding code in the web frontend directory.
The web frontend for this emulator is a React/TypeScript app designed with Material UI. It is located in the frontends/web folder. The UI provides the ability to load a ROM as well as play, pause, or reset the emulator. It also provides a fullscreen mode.
To run the web frontend:
- Compile the Rust code to WebAssembly and generate the Javascript binding code as described in the "How to Compile to WebAssembly" section.
- When the binding code is generated, it will be added to the frontends/web/src/core directory.
- Run
yarn install
in the frontends/web directory to install all dependencies. - Run
yarn start
in the same directory to run the application locally.
This emulator passes the following test suites from Blargg's test ROM collection:
- CPU instruction tests
- CPU instruction timing tests
- Memory timing tests
- Memory timing tests 2
- APU tests (DMG)
Additionally, this emulator passes all JSON CPU tests, and only some tests from the Mooneye test ROM collection.
This project holds a fairly extensive test suite, as the bulk of the logic was designed using a TDD approach. There are a lot of tests that exercise CPU opcodes, and basic tests that exercise the GPU. Run cargo test
to run the test suite.
This emulator is still a work in progress and not all features are supported.
Feature | Supported |
---|---|
CPU | ✅ |
Basic Graphics | ✅ |
Audio | ✅ |
Color Support | ✅ |
GameShark Support | ❌ |
Type | Supported |
---|---|
MBC1 | ✅ |
MBC2 | ❌ |
MBC3 | ✅ |
MBC5 | ❌ |
MBC6 | ❌ |
MBC7 | ❌ |
(For MBC3, no RTC support yet.)
I described some of the resources I used to build this emulator in a blog post.
For convenience, here is a list of the resources I used:
- Gameboy CPU Manual
- Pan Docs
- Blargg's Test ROM Collection
- Gameboy Doctor
- Imran Nazar's Gameboy Emulator Tutorial
The following games work pretty well with this emulator:
- Tic-Tac-Toe
- Tetris
- Kirby's Dream Land
- Pac-Man
- Super Mario Land
Pokemon Red works for the most part but has a couple minor glitches (from what I've seen so far). Pokemon Silver works from what I can tell, however the clock does not work properly due to there being no RTC support.