๐ฎ๐พ๐น๏ธ Gameboy Emulator Library written in Web Assembly using AssemblyScript, Debugger/Shell in Preact ๐ฎ๐พ๐น๏ธ
Project is still < 1.0.0. Most games are playable, but the emulator is still not very accurate. Expect bugs.
Debugger / Demo with support for mobile controls
- Features
- Usage
- Example Gifs & Screenshots
- Tests
- Contributing
- Notable Projects
- Special Thanks
- Random Tips for new Gameboy EmuDevs
- Resources
- Emulates the Gameboy / Gameboy Color ๐ฎ๐พ๐น๏ธ
- Outputs graphics to a scalable / responsive HTML5 canvas ๐ผ๏ธ, and audio through the Web Audio API ๐
- Support for In-game saves, and save states ๐พ
- Configurable options to increase performance for low(er) end devices ๐ฅ
- Importable into other projects as a dependency โป๏ธ
- Built with Web Assembly ๐ธ๏ธ
- Uses Web Workers for parallelized rendering ๐ ๏ธ
- Keyboard and gamepad input support using responsive gamepad โจ๏ธ ๐ฎ
- Debugger with a value table (I/O map), Tile Data visualizer, and Background Map with Scroll Indicators ๐
- Runs in both Browser and Node ๐
Project is still < 1.0.0. Most games are playable, but the emulator is still not very accurate. Expect bugs.
Simply install through npm:
npm install --save wasmboy
Documentation for the project can be found on the WasmBoy Wiki.
Try to test and aim for support on all major browsers (Chrome, Firefox, and Safari). Also, Node support works with the headless
option in the WasmBoy config, and using the Worker Threads --experimental-worker
flag.
Gameboy Support
Gameboy Color Support
Options & Save States
Debugger
These are all currently known passing tests (by me), there may be more test roms out there that pass. Some tests may not pass, and that can either be because of the component it is testing is actually incorrect, or another component that the test is testing is not yet implemented, or is incorrect (e.g a lot of mooneye tests rely on Serial Interrupts, which this emulator has yet to implement). Feel free to open an issue or PR to add any more passing tests to this list ๐ . The test names are listed from left to right, top to bottom.
Repo with all blargg's tests and source
cpu_instrs, instr_timing, mem_timing, mem_timing-2, halt_bug
div_write, rapid_toggle, tim00, tim00_div_trigger, tim01, tim01_div_trigger, tim10, tim10_div_trigger, tim11, tim11_div_trigger, tima_reload, tima_write_reloading, tma_write_reloading
halt_ime0_ei, halt_ime0_nointr_timing, halt_ime1_timing
Feel free to fork and submit PRs! Any help is much appreciated, and would be a ton of fun!
Just your standard node app. Install Node with nvm, git clone
the project, and npm install
, and you should be good to go!
The project contains three different elements.
- The
debugger
is the container for the wasmboy library, which is simply a preact application, generated with preact-cli. - The
core
orwasm
which is the web assembly module for wasmboy written in AssemblyScript. - The
lib
which is the importable library of wasmboy that can be used in other projects, that adds a top level API to thecore
.
Each of these uses a different build process. The debugger uses webpack, the wasm uses the AssemblyScript compiler CLI tool, and the lib uses Rollup.js.
Commands for each part of the project will be prepended with their element name and a colon, e.g debugger:[command here]
.
Commands not prepended with a colon are meant for easily building on all of the different parts as a whole.
# Command to serve the project, and watch the debugger, wasm, and lib for changes
# Uses concurrently: https://github.com/kimmobrunfeldt/concurrently
# Concurrently helps cleanup the output and organizes all three watchers/servers
npm start
# Same as npm start
npm run dev
# Same as npm start
npm run watch
# Build the wasm module and the lib to be ready to be pushed to npm or released
npm run build
# Run tests in `test/accuracy/test.js`
npm run test
# Run tests in `test/performance/test.js`
npm run test:performance
# Watch the debugger (preact) project for changes and livereload
npm run debugger:watch
# Build the debugger (preact) project and serve it
npm run debugger:serve
# Build the debugger (preact) project
npm run debugger:build
# Watch the wasm (AssemblyScript) *.ts files and build on changes
npm run core:watch
# Build the wasm (AssemblyScript) *.ts files, with the correct CLI flags
npm run core:build
# Watch the Wasmboy ES6 Module for changes, and build
npm run lib:watch
# Build the WasmBoy Es6 module
npm run lib:build
The debugger application/container for wasmboy utilizes the preact-cli. Additional workflow commands and tips can be found there.
Using the gh-pages for debugger/demo deployment onto gh-pages.
-
VaporBoy - PWA for playing ROMs with WasmBoy!
-
wasmboy-rs - Wasmboy Compiled to Rust, for native executables and additional cool features!
-
wasmboy.py - Wasmboy running in Python!
-
awesome gb-dev communitty, too many rad dudes to name!
-
dcodeIO for building and fixing bugs with AssemblyScript. And for being awesome!
-
r/emudev, especially to binjimint for helping me sooooo much!
-
mooneye GB Thank you Gekkio for all the contributions to the communitty, and all the awesome tests!
-
Blargg. Wherever you may be, thank you for all the awesome tests!
-
awesome gbdev for reference material, and getting help from the awesome discord community
-
node-gameboy, binjigb, gomeboycolor for comparison for when I'm REALLY stuck.