- Passing most hardware tests (see TESTING.md).
- Bettery save support.
- Control SRAM save file and ability to disable SRAM save.
- Accurate RTC emulation for MBC3 mapper.
- Accurate APU emulation with 48KHz audio.
- SFML gui front-end.
- Robust testing framework for continous testing.
- Easily change emulation speed.
- Functional mappers:
- Printer emulation
- Save states
The SFML front-end provide these keyboard bindings:
|+||Increase 5 to FPS**|
|-||Recude 5 from FPS**|
|Shift + (NUM1~NUM0)||Load state|
* I made this because in
Zelda: Link's awakeningyou need to press all of these buttons on the same frame to bring the save menu, which is annoying.
** FPS here is not the same with normal games FPS, where low FPS just makes the game laggy, here FPS control the emulation speed. Normally it will run on
60FPS. If the user set FPS to
30it will emulate in half the speed, this include audio, and CPU emulation.
Printer window keys
|C||Clear current image buffer|
|S||Save image buffer to file|
Gameboy Printer is a serial device that can be connected to the gameboy and used by some cartridges to print images. Popular cartidges that uses it are:
- Gameboy Camera.
- Zelda: Link's Awakening DX (to print images from the album).
- Pokemon (several versions) (to print pokemon info from the Pokedex).
The printer can be opened by pressing the
The printer emulation allows to save the printed images into disk. The window
will only show
160x144 pixels, but the image is scrollable.
Save state is a very useful features emulators should have, it allows
to save the state of the whole emulator at any point in time and be loaded
any time later.
mizu's save states files are saved in these folders:
Linux: /home/<user>/.local/share/mizu/saved_states Windows: C:\Users\<user>\AppData\Local\Amjad50\Mizu\data\saved_states macOS: /Users/<user>/Library/Application Support/Amjad50.Mizu/saved_states
The structure of the save file is at version
|0x04||8||save state file version|
There is no migrations between file versions (except from
2), that means
that a file saved from a past version of the emulator will not be able to be loaded
in a future version of the emulator.
(If any suggestions on how we can achieve this, you are welcome to open a PR).
hash is used to make sure that we are loading for the same game.
zstd compression appeared in version
2, that is the reason we can load version
by loading with decompression. The compressed content, is the content we get
by using the
Building and Installation
For installing or building
mizu we would use
If you want to use the development version of
mizu you can build the project
yourself. After downloading/cloning the repository, it can be build with:
$ cargo build
With release option:
$ cargo build --release
If you want to use the latest stable version from
$ cargo install mizu
Yet another gameboy emulator?
Why not?. it is fun and educational, but even though I'm planning to make it as accurate as I can. If you want to see cool emulators, check my previous work Plastic.
- Pandocs (of course)
- Gameboy manual
- GameBoy complete techincal reference
- The cycle accurate gameboy docs
- Mooneye accurate emulator, includes great tests
- Opcode table
- Simple opcodes explaination
Debugging and testing
- blargg gameboy tests
- BGB emulator
- GB test roms
- DMG ACID PPU test
- Mealybug PPU stress tear tests