Binutils for Game Boy

January 3, 2026 ยท View on GitHub

Build binutils like this:

./configure --target=sm83-coff
--disable-gdb
--disable-readline
--disable-sim
--disable-nls
--enable-deterministic-archives make

as root:

make install

Example file:

; Handler for RST28 instruction (max. 8 bytes) .section .rst28 ret

; Handler for interrupt 4 (joypad) (max. 8 bytes) .section .irq4 reti

; Entry point (max. 4 bytes) .section .entry nop jp start

; GameBoy Header .section .hdrlogo .db 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D .db 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E, 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99 .db 0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E .section .hdrname .db "hram-rw" .section .hdrgc .db "TEST" .section .hdrcgb .db 0x00 .section .hdrmc .db "ZZ" .section .hdrsgb .db 0x00 .section .hdrtype .db 0x08 .section .hdrrom .db 0x00 .section .hdrram .db 0x02 .section .hdrdest .db 0x01 .section .hdrver .db 0x00

; Code for Bank 0 (starts at 0x150) .section .bank0 start: .global start di

call foo  ; call routine in bank 1

; Copy routine for initializing HRAM
ld c, _ehdata
ld hl, __load_stop_hdata - 1

loop: ld a, _hdata - 1 dec c cp c jp z, loop2 ; jumps to address 0xff80 ld a, (hld) ld (c), a jr loop

; Code loaded into HRAM (starts at 0xff80) .section .hdata loop2: jr loop2

; Code for Bank 1 (starts at 0x4000) .section bank1 foo: rst 0x28 ; call reset 0x28 handler ret

Build example with:

sm83-coff-as -o example.o example.s sm83-coff-ld -o example.gb example.o

Then use rgbfix from the Rednex Game Boy Development System (rgbds): rgbfix -fhg example.gb