GithubHelp home page GithubHelp logo

mattrberry / cryboy Goto Github PK

View Code? Open in Web Editor NEW
72.0 6.0 4.0 13.46 MB

A Game Boy (Color) emulator written in Crystal

License: MIT License

Crystal 100.00%
crystal gameboy emulator gameboy-emulator gameboy-color gameboy-color-emulator sdl2

cryboy's Introduction

Ported into my GBA emulator Crab to reduce common logic and bugs between the two

CryBoy is a Game Boy (Color) emulator written in Crystal. The goal of this project is to create an efficient Game Boy emulator with highly readable code.

This would not be possible without the Pan Docs, izik's opcode table, the gbz80 opcode reference, The Cycle-Accurate Game Boy Docs, or gekkio's Game Boy: Complete Technical Reference.

Installation

SDL2 is a requirement for this project. Install that in whichever way you see fit.

After cloning the repository, you can install the required shards with shards install. If you don't do this directly, they'll be installed when you build the project.

Usage

After installing the dependencies, the project can be built with shards build --release. At this point, the binary lives in bin/cryboy. The binary takes an optional CGB bios path and a rom path as its arguments: bin/cryboy /path/to/rom or bin/cryboy /path/to/bios /path/to/rom.

Note: The Game Boy Color bios initializes the color palettes in some old Game Boy games to give them an updated look. This is why Pokemon Blue (which was developed for the original Game Boy and only had 4 colors) has a handful more colors, including a blue primary color and a red color for the character sprites. If you choose to launch a game for the original Game Boy without the Game Boy Color bios, you'll only see the games in 4 colors as you would on an original Game Boy. Games with native support for the Game Boy Color, like Pokemon Crystal, should behave the same with or without the bios.

Compile-Time Flags

There are a couple of compile-time flags that you can take advantage of.

FIFO Rendering

To enable the experimental FIFO renderer (as opposed to the scanline renderer), you can build the project with the -Dfifo flag. The current FIFO implementation should work identically to the scanline renderer with the exception that it does not render sprites on column 0 of the LCD. However, it will play games like Prehistorik Man more accurately than the scanline renderer would since that game relies on a cycle-accurate PPU implementation.

Pink Color Scheme

If you want to switch things up from the default green color scheme, there's a pretty, pink color scheme hiding behind the -Dpink flag.

Keybindings

The current keybindings are tuned for my personal preferences. If the following layout diagram doesn't work for you, the "a" and "b" keys are also bound to their appropriate keys, as are the arrow keys.

Features and Remaining Work

CryBoy is still a work in progress. As of right now, all of the following features are supported

  • Passing all of blargg's CPU tests.
  • Passing all of blargg's instruction timing tests.
  • Passing all of blargg's memory timing tests.
  • Passing all of blargg's Game Boy Color sound tests
  • Passing all but one of the mooneye-gb timer tests.
  • PPU draws background, window, and sprites.
  • PPU offers both scanline and FIFO rendering modes (behind a compile-time flag).
  • Save files work as intended, and are compatible with other emulators like BGB.
  • MBC1 cartridges are supported (except for multicarts).
  • MBC2 cartridges are fully supported.
  • MBC3 cartridges are supported (except timers).
  • MBC5 cartridges are supported.
  • Controller support.
  • Game Boy Color support, including HDMA, double-speed mode, and palettes.

There is still a lot missing from CryBoy. Some of these missing pieces include

  • Picture processing
    • Pixel FIFO
      • I've made lots of progress into the FIFO renderer. There are still a couple of issues that I have yet to resolve, though. The main one that seems to be specific to the pixel FIFO renderer is that I don't render sprites on column 0 of the LCD, although I still do render the rest of the sprite in its correct position even if the sprite's x position is less than 8.
  • Misc
    • MBCs
      • MBC 5 rumble.
      • RTC
      • Fixing an issue when roms misreport their size.
    • Failing the mooneye-gb rapid_toggle timer test by 4 T-cycles. Needs to be debugged.

Contributing

  1. Fork it (https://github.com/mattrberry/CryBoy/fork)
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors

cryboy's People

Contributors

mattrberry avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.