adamsoutar/gbrs

A Rust GameBoy emulator!

TetrisZelda: Link's Awakening

gbrs

TetrisZelda: Link's Awakening
Super Mario LandSuper Mario Land 2
Galaga & GalaxianMortal Kombat
Pac-ManAlleyway
Space InvadersRoad Rash
Donkey KongFrogger
dmg-acid2

Support

gbrs supports:

  • Mid-frame scanline effects (required for games like Road Rash)
  • The Window (a GPU feature required for Pac Man and Zelda)
  • Cycle-accurate CPU & counters
  • Save files & saved games (Zelda & Super Mario Land 2 use these)
  • The Window internal line counter (an unusual quirk required for perfect DMG-ACID2 rendering)
  • LCD Stat interrupt bug (a bug present on the real Gameboy hardware required for Road Rash)
  • Memory Board Controller 1 (MBCs are required for some more complex games)
  • Memory Board Controller 2
  • Sound!

& more!

Progress so far

I'm still working on gbrs (and having a tonne of fun doing it!).

The main thing(s) I'm working on:

  • Memory Board Controller 3 for Pokémon

Building from source

gbrs is not yet finished enough to distribute binaries, but if you want to try it out:

The repo contains ports for multiple graphics backends. SDL is the easiest to build.

SDL

The SDL port comes with everything you need to compile & run in one command. If you experience issues with screen tearing or cracking sound, check out the SFML port instead.

git clone https://github.com/adamsoutar/gbrs
cd gbrs/sdl-gui
cargo run --release ROM_PATH

(Replace ROM_PATH with the path to a .gb file)

SFML

You'll need SFML set up, which you can find instructions for here.

Afterwards, in a terminal, you can execute these commands, assuming you have a Rust toolchain installed.

git clone https://github.com/adamsoutar/gbrs
cd gbrs/sfml-gui
cargo run --release ROM_PATH

Ports to non-PC platforms

gbrs is written to be ported to other platforms. Its default GUIs for Windows, macOS and Linux are just modules that it doesn't have to use.

You can port gbrs-core to almost anything - especially since it supports running without the Rust StdLib.

All a port needs to do is:

use gbrs_core::cpu::Cpu;

let mut gameboy = Cpu::from_rom_bytes(
  include_bytes!("./tetris.gb").to_vec()
);

// Each frame:
gameboy.step_one_frame();
draw_screen(&gameboy.gpu.finished_frame);
// (where draw_screen is a platform-specific function left to the reader)

By Adam Soutar
Issues

Collection of the latest Issues

adamsoutar

adamsoutar

Comment Icon1

Little Sound DJ doesn't run because we don't support MBC5.

It doesn't seem to be a super popular MBC in terms of retail games, but it is required for Frogger 2 and Link's Awakening DX, among others.

Versions

Find the latest versions by id

v0.5 - Mar 16, 2022

This release fixes a long-running bug where corrupted scanlines would appear in double-height sprites. It fixes visual issues in Donkey Kong, among others.

It also implements support for Memory Board Controller 2, allowing us to run:

  • Kirby's Pinball Adventure
  • Ayakashi no Shiro
  • F-1 Race
  • Golf
  • Final Fantasy Legend
  • Top Ranking Tennis

v0.4 - Mar 13, 2022

This version does not implement any new Gameboy compatibility, however, it does make some important changes to the Rust codebase.

First of all, the GUI code for Windows/macOS/Linux (gbrs-sfml-gui) has been separated from Gameboy emulation code (gbrs-core) - splitting the project into two crates.

Second, gbrs-core has been updated to support compiling with #![no_std]. This allows us to port the core Gameboy emulation code to vastly more systems by running on bare metal. The main reason this change has been made is to support an upcoming project for porting gbrs to Playdate.

v0.3 - Jan 02, 2022

This version implements Gameboy Link Cable emulation, an LCD bug (a bug that exists in original hardware) and more accurate MBC1 chip RAM emulation.

It can now fully play:

  • Mortal Kombat
  • Alleyway
  • Road Rash
  • Galaxian
  • Space Invaders

on top of all games in the previous release

Note: gbrs is probably compatible with quite a few more games, these are just the ones I'm playing to test it :)

v0.2 - Dec 31, 2021

This version implements The window, Sprite z-fighting, MBC1 RAM, battery-backed save files, and more

This allows you to play:

  • Super Mario Land
  • Super Mario Land 2
  • The Legend of Zelda Link's Awakening
  • Donkey Kong
  • Pac-Man
  • Frogger

and can render the intros of:

  • Mortal Kombat
  • Dr Mario
  • Alleyway

Lots more than just Tetris now!

v0.1 - Jul 19, 2020

This is a tag to show a version of the emulator that runs. It should run Tetris just fine (without sound).

As I hack on the master branch, it's not guaranteed to remain stable, eg. I may make it panic on events like writing to the APU to track things down easier.

Information - Updated Aug 04, 2022

Stars: 31
Forks: 0
Issues: 1

Repositories & Extras

RGB (Rust Game Boy) is a simple emulator for the original game boy and the...

RGB (Rust Game Boy) is a simple emulator for the original game boy and the color game boy

RGB (Rust Game Boy) is a simple emulator for the original game boy and the...

A Gameboy emulator written in Rust

Can launch and play simple games

A Gameboy emulator written in Rust

An open source Gameboy emulator written in Rust that can use a command line interface...

An open source Gameboy emulator written in Rust that can use a command line interface as a screen and input device

An open source Gameboy emulator written in Rust that can use a command line interface...

Frosty is a GameBoy emulator written in rust

You can also hold TAB to enable turbo, which will disable the frame limiter

Frosty is a GameBoy emulator written in rust

Rust GameBoy Advanced Emulator

Building this project on linux requires cmake and gtk3

Rust GameBoy Advanced Emulator

Yet another GameBoy emulator in Rust

This is my attempt to write a GameBoy emulator in Rust, to add to the pile of existing ones

Yet another GameBoy emulator in Rust

Game Boy Emulator in Rust

To load a ROM in the emulator specify the path to the ROM file as an argument

Game Boy Emulator in Rust
Facebook Instagram Twitter GitHub Dribbble
Privacy