retro-platform-jam 5 is about to start and I think I will give GameBoyAdvanced a try. Not sure I will finish something due to the RoomGame and the NetworkGame need some love. But I could use it to write a new renderer for RoomGame. Ok, enough blabla. Here how to setup a minimal vs-code,mGBA,debuggable,devkitpro obviously on linux.

Install devkit-pro on ubuntu/debian-based:

   chmod +x ./install-devkitpro-pacman
   sudo ./install-devkitpro-pacman
   sudo dkp-pacman -S gba-dev 

This will install everything you need. In order for all the environment-variables to be set,logout and relogin.

Create a folder somewhere. And start vscode in it:

mkdir TestGBA
cd TestGBA
code .

Create a file: Makefile (following files are basically copied from here)

# Makefile for first.gba


# --- Project details -------------------------------------------------

PROJ    := first

OBJS    := $(PROJ).o

# --- Build defines ---------------------------------------------------

PREFIX  := arm-none-eabi-
CC      := $(PREFIX)gcc
LD      := $(PREFIX)gcc
OBJCOPY := $(PREFIX)objcopy

ARCH    := -mthumb-interwork -mthumb
SPECS   := -specs=gba.specs

#CFLAGS  := $(ARCH) -O2 -Wall -fno-strict-aliasing
CFLAGS  := $(ARCH) -g -Wall -fno-strict-aliasing

.PHONY : build clean

# --- Build -----------------------------------------------------------
# Build process starts here!
build: $(TARGET).gba

# Strip and fix header (step 3,4)
$(TARGET).gba : $(TARGET).elf
	$(OBJCOPY) -v -O binary $< $@
	-@gbafix $@

# Link (step 2)
$(TARGET).elf : $(OBJS)
	$(LD) $^ $(LDFLAGS) -o $@

# Compile (step 1)
$(OBJS) : %.o : %.c
	$(CC) -c $< $(CFLAGS) -o $@

# --- emu ----
emu: build
	mgba-qt $(TARGET).gba

debug-emu: build
	mgba-qt -g $(TARGET).elf
# --- Clean -----------------------------------------------------------

clean : 
	@rm -fv *.gba
	@rm -fv *.elf
	@rm -fv *.o


Create a file first.c:

// First demo. You are not expected to understand it 
// (don't spend too much time trying and read on).
// But if you do understand (as a newbie): wow!

int main()
    *(unsigned int*)0x04000000 = 0x0403;

    ((unsigned short*)0x06000000)[120+80*240] = 0x001F;
    ((unsigned short*)0x06000000)[136+80*240] = 0x03E0;
    ((unsigned short*)0x06000000)[120+96*240] = 0x7C00;
    int result = 0;


    return 0;

Thx to J Vijn (see link)

Create Folder .vscode if not already there. And two files: launch.json and tasks.json(disclaimer: I'm always a bit lost when it comes to launch.json and tasks.json. you'll see what I mean):


    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit:
    "version": "0.2.0",
    "configurations": [
            "name": "Debug",
            "type": "gdb",
            "request": "attach",
            "gdbpath": "/opt/devkitpro/devkitARM/bin/arm-none-eabi-gdb",
            "executable": "./first.elf",
            "target": ":2345",
            "cwd": "${workspaceRoot}",
            "remote": true,
            "valuesFormatting": "parseText"


    // See
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
            "label": "Make",
            "type": "shell",
            "command": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            "label": "Make run",
            "type": "shell",
            "command": "make emu",
            "group": {
                "kind": "build",
                "isDefault": true
            "label": "Make debug",
            "type": "shell",
            "command": "make debug-emu",
            "group": {
                "kind": "build",
                "isDefault": true
            "label": "Make Clean",
            "type": "shell",
            "command": "make clean"

Download mGBA (worked for me with 0.9.3):

tar xvf mGBA...tar.gz
cd mGBA...
sudo dpkg -i libmgba.dep
sudo dpkg -i mgba-qt....dep

With mgba installed you now can run your game with

make emu

Or activate gdb to debug:

make debug-emu

You can also trigger both commands by using ctrl+shift+p => Run Tasks: Run tasks => Make Run or Make Debug

This will halt the emulator until you connect vscode to gdb.

  • go to first.c and add a breakpoint
  • go to vscode's Debug-view, select 'Debug' and hit the green arrow:

The debugger should stop at the breakpoint.

That setup might work better. E.g. the emulator could start automagically by the right vscode-(pre)command. But I just couldn't get it to run. That was the only way and it's good enough for me.

Here you can find my start template:

GitHub - dertom95/gba-template: minimal gba-dev template
minimal gba-dev template. Contribute to dertom95/gba-template development by creating an account on GitHub.

Further read: