No-std cross-platform Rust GameBoy emulator library. Rust GameboY (RGY, or Real GaY).
$ cargo run --example pc <a ROM file>
The example runs the GameBoy emulator in Mac/Linux/Windows.
On Ubuntu, you need to install these packages:
$ sudo apt install libasound2-dev libxcursor-dev libudev-dev
| Keyboard | Gamepad | GameBoy |
|---|---|---|
| Up / W | DPad Up | Up |
| Left / A | DPad Left | Left |
| Down / S | DPad Down | Down |
| Right / D | DPad Right | Right |
| K / X | South / East | A |
| J / Z | West / North | B |
| Space | Select | Select |
| Enter | Start | Start |
| Escape | - | Close |
The library itself is environment independent. It can be even ported onto bare-metal. Once you implement environment-specific part, i.e. Hardware trait, you will get a GameBoy emulator for your environment.
struct Hardware;
// 1. Implement `rgy::Hardware`.
impl rgy::Hardware for Hardware {
...
}
// 2. Call `rgy::run`.
fn main() {
let cfg = Config::new();
let rom = include_bytes!("path_to_rom_file.gb");
rgy::run(cfg, &rom, Hardware);
}- CPU
- Supports all the documented instructions.
- Emulates accurate read/write timing.
- Interrupts
- Supports all the interrupts.
- Emulates halt bug.
- Graphics
- The most features are functioning.
- OAM bug is not yet supported.
- Sound
- The most features are functioning.
- PCM registers are always emulated for sound tests.
- Joypad
- Timer
- Serial
- Cartridge (MBC 1,2,3,5, HuC 1)
- Gameboy Color feature is under development.
Test status of Blargg's Gameboy hardware test ROMs
-
cpu_instrs -
instr_timing -
mem_timing -
mem_timing-2 -
oam_bug -
interrupt_time -
dmg_sound-
01-registers -
02-len ctr -
03-trigger -
04-sweep -
05-sweep-details -
06-overflow on trigger -
07-len sweep period sync -
08-len ctr during power -
09-wave read while on -
10-wave trigger while on -
11-regs after power -
12-wave write while on
-
-
cgb_sound
Test status of Same Suite
- APU
-
apu/div_write_trigger.gb -
apu/div_write_trigger_10.gb -
apu/div_write_trigger_volume.gb -
apu/div_write_trigger_volume_10.gb -
apu/div_trigger_volume_10.gb - Channel 1
-
apu/channel_1/channel_1_delay.gb -
apu/channel_1/channel_1_duty_delay.gb -
apu/channel_1/channel_1_freq_change.gb -
apu/channel_1/channel_1_align.gb(CGB double speed) -
apu/channel_1/channel_1_align_cpu.gb(CGB double speed) -
apu/channel_1/channel_1_duty.gb(CGB double speed) -
apu/channel_1/channel_1_extra_length_clocking-cgb0B.gb(CGB double speed) -
apu/channel_1/channel_1_freq_change_timing-A.gb(CGB double speed) -
apu/channel_1/channel_1_freq_change_timing-cgb0BC.gb(CGB double speed) -
apu/channel_1/channel_1_freq_change_timing-cgbDE.gb(CGB double speed) -
apu/channel_1/channel_1_nrx2_glitch.gb -
apu/channel_1/channel_1_nrx2_speed_change.gb -
apu/channel_1/channel_1_restart.gb -
apu/channel_1/channel_1_restart_nrx2_glitch.gb -
apu/channel_1/channel_1_stop_div.gb -
apu/channel_1/channel_1_stop_restart.gb -
apu/channel_1/channel_1_sweep.gb -
apu/channel_1/channel_1_sweep_restart.gb -
apu/channel_1/channel_1_sweep_restart_2.gb -
apu/channel_1/channel_1_volume.gb -
apu/channel_1/channel_1_volume_div.gb
-
- Channel 4
-
apu/channel_4/channel_4_lfsr.gb -
apu/channel_4/channel_4_lfsr15.gb -
apu/channel_4/channel_4_lfsr_7_15.gb -
apu/channel_4/channel_4_lfsr_15_7.gb
-
-
The following projects use this library to run a GameBoy emulator.