Crab is a Game Boy Advance emulator written in Crystal. Currently, this project is still clearly a work-in-progress, although some games are currently playable. This would not be possible without [GBATEK](http://problemkaputt.de/gbatek.htm), [Tonc](https://www.coranac.com/tonc), [mGBA](https://mgba.io/), or the wonderful emudev community.

## Building [SDL2](https://www.libsdl.org/) is the only library you should need to install. It is available on every major package manager. Of course, the assumption is also that you have the [Crystal](https://crystal-lang.org/install/) compiler installed. After cloning the repository, all you'll need to do is run `shards build --release` to build the emulator in release mode. This will place the binary at `bin/crab`. ## Usage Running the emulator simply consists of `bin/crab /path/to/bios /path/to/rom`. At the moment, the BIOS _is_ a required argument, although I may ship with an open-source replacement BIOS at some point in the future. If you cannot dump the official BIOS from your own console, you can pick up [Normatt's replacement BIOS](https://github.com/Nebuleon/ReGBA/tree/master/bios) or the [one created by DenSinH and fleroviux](https://github.com/Cult-of-GBA/BIOS). Both of these BIOSes should be compatible in 99% of use-cases. ## Features and Remaining Work ### Features - Accurate sound emulation (both Direct Sound and PSGs) - GLSL shaders for color reproduction - PPU features - Modes 0-5 are mostly implemented - Affine backgrounds and sprites - Alpha blending - Windowing - CPU core - Passing [armwrestler](https://github.com/destoer/armwrestler-gba-fixed) - Passing [FuzzARM](https://github.com/DenSinH/FuzzARM) - Passing [gba-suite](https://github.com/jsmolka/gba-suite) - Storage - Flash and SRAM implemented (although Golden Sun refuses to save..) ### Remaining Work - Timers need improvement - PPU - Mosaic - Blending code needs cleanup - Storage - EEPROM - Fix Flash for Golden Sun - Game database to support odd cases like Classic NES - Timing - Cycle counting - DMA timing - Prefetch - Etc, etc, etc. ## Special Thanks A special thanks goes out to those in the emudev community who are always helpful, both with insightful feedback and targeted test ROMs. - https://github.com/ladystarbreeze - https://github.com/DenSinH - https://github.com/fleroviux - https://github.com/destoer ## Contributing 1. Fork it () 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 - [Matthew Berry](https://github.com/mattrberry) - creator and maintainer