Home

Awesome

Mizu

Build status codecov crate.io dependency status

Mizu is an accurate Gameboy emulator built in Rust.

Features

Controls

The SFML front-end provide these keyboard bindings:

Gameboy

KeyGameboy
JB
KA
USelect
IStart
WUp
SDown
ALeft
DRight

Extra

KeyFunction
EnterA+B+Select+Start*
+Increase 5 to FPS**
-Recude 5 from FPS**
POpen Printer
(NUM1~NUM0)Save state
Shift + (NUM1~NUM0)Load state
COutput All audio channels (default)
VOutput Pulse1 audio channel only
BOutput Pulse2 audio channel only
NOutput Wave audio channel only
MOutput Noise audio channel only

* I made this because in Zelda: Link's awakening you 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 60 FPS. If the user set FPS to 30 it will emulate in half the speed, this include audio, and CPU emulation.

Printer window keys

KeyFunction
CClear current image buffer
SSave image buffer to file

Printer

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:

The printer can be opened by pressing the P key.

The printer emulation allows to save the printed images into disk. The window will only show 160x144 pixels, but the image is scrollable.

Save states

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 2:

OffsetSizeField
0x004MAGIC: "MST\xee" (4D 53 54 EE)
0x048save state file version
0x0C32cartridge sha256 hash
0x2Cvariablezstd default level compressed saved state

There is no migrations between file versions (except from 1 to 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).

The hash is used to make sure that we are loading for the same game.

The zstd compression appeared in version 2, that is the reason we can load version s by loading with decompression. The compressed content, is the content we get by using the save_state library.

Building and Installation

For installing or building mizu we would use cargo.

Building

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

Installing

If you want to use the latest stable version from crates.io:

$ 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.

References

General Gameboy

CPU instructions

Debugging and testing