Tools and helpers for developing GBA programs using TinyGo.
Still highly experimental and subject to sudden changes.
You can run your TinyGo programs using the mGBA emulator:
You will probably need to create a symlink to whichever executable you choose to install. For example, if you install the Qt based emulator:
sudo ln -s /usr/bin/mgba-qt /usr/bin/mgba
package main import ( "machine" "image/color" "tinygo.org/x/tinygba" ) var ( // Colors black = color.RGBA{} white = color.RGBA{255, 255, 255, 255} green = color.RGBA{0, 255, 0, 255} red = color.RGBA{255, 0, 0, 255} // Google colors gBlue = color.RGBA{66, 163, 244, 255} gRed = color.RGBA{219, 68, 55, 255} gYellow = color.RGBA{244, 160, 0, 255} gGreen = color.RGBA{15, 157, 88, 255} ) func main() { machine.Display.Configure() tinygba.FillScreen(black) for { tinygba.WaitForVBlank() update() } } func update() { key := tinygba.ReadButtons() switch { case tinygba.ButtonStart.IsPushed(key): tinygba.FillScreen(black) case tinygba.ButtonSelect.IsPushed(key): tinygba.FillScreen(white) case tinygba.ButtonRight.IsPushed(key): tinygba.FillScreen(green) case tinygba.ButtonLeft.IsPushed(key): tinygba.FillScreen(red) case tinygba.ButtonDown.IsPushed(key): tinygba.FillScreen(gBlue) case tinygba.ButtonUp.IsPushed(key): tinygba.FillScreen(gRed) case tinygba.ButtonA.IsPushed(key): tinygba.FillScreen(gYellow) case tinygba.ButtonB.IsPushed(key): tinygba.FillScreen(gGreen) } }
Run the code:
tinygo run -target gameboy-advance ./examples/snake
-
Display Control (https://problemkaputt.de/gbatek.htm#lcdvramoverview)
- BG Mode 0
- BG Mode 1
- BG Mode 2
- BG Mode 3
- BG Mode 4
- BG Mode 5
-
Pallettes (https://problemkaputt.de/gbatek.htm#lcdcolorpalettes)
-
Sound (https://problemkaputt.de/gbatek.htm#gbasoundcontroller)
- Sound Channel 1
- Sound Channel 2
- Sound Channel 3
- Sound Channel 4
- Sound Channel DMA
-
Interrupts (https://problemkaputt.de/gbatek.htm#gbainterruptcontrol)