gbaid 0.3.0-beta

A GameBoy Advance emulator in D

To use this package, run the following command in your project's root directory:

Manual usage
Put the following dependency into your project's dependences section:


GBAiD stands for <strong>G</strong>ame<strong>B</strong>oy <strong>A</strong>dvance <strong>i</strong>n <strong>D</strong>. I've started this project as an effort to learn the D programming language.

This emulator is written mostly in pure D, with some inline x86 (32 and 64 bit) assembly in the display emulation to help with performance.

Current state

Go dragons!

All of the GameBoy's built-in hardware has been implemented, except for the serial communication port.

I've tested 8 games so far:

  • Super Mario Advance
  • Mario kart
  • Pokemon Emerald (full play-through completed)
  • Pokemon Ruby/Sapphire
  • Pokemon Fire Red
  • Legend of Zelda: A Link To The Past
  • Legend of Zelda: Minish Cap
  • Doom
  • Classic NES Series: Super Mario Bros
  • Classic NES Series: Metroid
  • Street Fighter Alpha 3

The emulator uses under 40% CPU on an Intel Core i7-4980HQ (2.80GHz), for a single core.



GBAiD uses SDL2 for input, OpenGL graphics, sound (eventually) and controller support.

  • SDL 2.0.3 or greater is required
  • OpenGL 2.0 or greater is required


A D compiler and DUB should be installed. Compiling works with LDC and DMD, other compilers have not been tested.

Then use:

dub build --build release

It is necessary to build in release mode to have the performance required for the emulator to run at full speed.

LDC has better performance over DMD, use the --compiler ldc2 option to enable it.



dub run --build release -- (arguments)

Again, use --compiler ldc2 option to enable LDC.

Or get the binary from the bin folder after building and use:

./gbaid (arguments)


At minimum, you must specify the path to the bios and rom images with

-b (path to bios) (path to rom)

The following arguments are also recognized:

Long formShort formArgumentUsage
--bios-bPath to biosSpecify bios image
--save-sPath to saveSpecify path for loading and saving saves
--noload-nNoneDon't load the save
--nosave-NNoneDon't save the save, either on exit or quick save
--scale-rScaling factor (float)Draw the display at "factor" times the original resolution
--fullscreen-RNoneDisplay in full screen mode (--scale will be ignored)
--filtering-fLINEAR or NONEWhat technique to use to filter the output texture to be drawn to the screen
--upscaling-uEPX, XBR, BICUBIC or NONEWhat technique to use to increase the resolution of the drawn texture
--controller-cNoneEnable the controller as an input method
--raw-audioN/ANoneDon't filter the audio output of the emulator; will generally be noisier
--save-memoryN/ASee saves sectionWhat memory configuration to use for the main save
--eepromN/ASee saves sectionWhat memory configuration to use for the EEPROM
--rtcN/ASee saves sectionWhat memory configuration to use for the RTC

Note that these arguments are case sensitive and that bundling is only supported by the --noload and --nosave switches.


Saves use a custom format and .gsf extension that is not compatible with other emulators. If no save path is specified, the same path as the ROM is used, but with the .gsf extension instead of whatever the ROM image is using. If no save is found matching either the given or default path, then a new save is created using that path. Saves are overwritten on exit, unless the --nosave argument is used.

The emulator can almost always auto-detect the save type, but it's not guaranteed to always work. If it doesn't work, then you will need to use the following switches to configure the save memory manually.

The --save-memory switch is used to configure the main save memory. It takes any one of the following arguments (case senstive).

SRAM64KB of static RAM
FLASH_512K512Kb of Flash
FLASH_1M1Mb of Flash
NONENo main save memory
AUTODecide from the ROM

The --eeprom and --rtc switches are used to configure the optional EEPROM and RTC respectively. They take any one of the following arguments (case senstive).

AUTODecide from the ROM

These flags are only needed when creating a new save, after that the format is saved in the save file.

GBA controls

These will be re-mapable in a future version.

UpWD-pad or L-stick
DownSD-pad or L-stick
RightDD-pad or L-stick
LeftAD-pad or L-stick
RR-shiftRB or RT
LL-shiftLB or LT

Emulator controls

These will be re-mapable in a future version.

Quick saveQX

Quick saves are not save states, they just write the contents of the save memory to the save file immediately. Otherwise this is only done on exit. This is useful to ensure you do not loose game progress if the emulator crashes or fails to close normally. Note that quick saves are disabled when using the -N switch.


All upscaling is implemented as OpenGL shaders.

  • EPX is a simple but fast 2x upscaler.
  • XBR is a 5x implementation, it gives better results, but is slower.
  • BICUBIC is an interpolation method that offers better results than linear filtering at a greater cost. It upscales to whatever is defined by the --scale switch so it should always be used with this method.

When you use the --upscaling switch you should also use the --scale switch with the appropriate factor for the selected algorithm (unless you are using the full screen mode).


GBAiD is licensed under MIT


  • Implement SIO
  • Implement emulator networking for SIO
  • Emulator pause feature
  • Save states with quick saves
  • Replace getters and setters with @property
  • Replace most classes with structs

Useful information

This page for a whole lot of detailed information on the hardware.

This and this for a list of all instructions supported by the ARM7TDMI CPU.

  • Aleksi "DDoS" Sapon
derelict-gl3, derelict-sdl2
0.3.0-beta 2017-Jul-19
0.2.1-alpha 2017-Mar-16
0.2.0-alpha 2016-Dec-26
0.1.2-alpha 2015-Mar-25
0.1.1-alpha 2014-Dec-27
Show all 7 versions
Download Stats:
  • 0 downloads today

  • 0 downloads this week

  • 0 downloads this month

  • 366 downloads total

Short URL: