ACIDCAT . FILE FORMAT REFERENCE

GBS Anatomy

Nintendo Game BoyGame Boy Sound System
rev 2026.09
magic GBS + version
endian little
container own
samples none; four channels of chip

A .gbs is a Game Boy's music, cut out of the game: the sound engine and its data, with a 112-byte header saying where to load it and which routine to call. It is the same idea as an NSF for the NES, and it is simpler, because the Game Boy has no expansion chips and nothing in the header is reserved for anything. A player loads the code, calls init with a song number, then calls play sixty times a second.

the header, 112 bytes

Sixteen bytes of numbers, then three 32-byte text slots. Every multi-byte value is little-endian, as the Game Boy's processor is. The code follows immediately and runs to the end of the file.

▸three addressesload . init . play

The code is placed at load. init is called once per song with the song number in register A. play is called on every tick, and is the routine that actually writes the sound registers.

$0400 - $7FFFthe cartridge ROM window once the boot ROM is paged out
the ruleall three must land inside it, and the spec says so in as many words

A file whose code runs past $7FFF is not wrong: a player maps the excess as switched banks, the way a cartridge does. One that loads at $0070 is unusual and real -- the code sits over the interrupt vectors -- and a reader names it rather than refusing it.

▸the timerTMA . TAC

Two bytes that say how often play is called. Both zero means every VBlank, 59.7 times a second, which is what nearly every game did. Non-zero values program the Game Boy's hardware timer instead, for engines that ran faster than the frame.

TMAthe timer's modulo, what it reloads to; the period is 256 − TMA ticks, so 0 is the slowest, not off
TACbit 2 enables the timer; bits 0-1 pick the divider: 1024, 16, 64, 256
rate4194304 / (divider × (256 − TMA)) Hz when enabled; VBlank when not
▸the text slots3 x 32 bytes

Title, author, copyright. Each slot is always 32 bytes; a NUL ends the text inside it without ending the field. A reader that scans for the NUL instead of stopping at the slot runs a full 32-byte title into the author, which is how the composer's name ends up appended to the game's.

Nothing declares the encoding. Nominally ASCII; a Japanese rip may carry Shift-JIS, and no byte says so.

▸what is not hereand why

No per-song titles, no lengths, no expansion-chip flags, no bankswitching table. An NSF header has all four. The Game Boy's sound is four channels on one chip with no variants, and banking needs no table: the code is loaded from the load address up to $7FFF, and whatever is left fills 16 KB ROM banks from bank 1, which the engine maps in at $4000-$7FFF by writing a bank number to $2000, the way an MBC1 cartridge does. A file larger than the address space is the normal shape of a whole game's music. The song count and the first song are the whole of the per-song information.

▸identificationGBS + 01

Three letters and a version byte. The letters alone open ordinary text; the version byte is checked with them, and every file ever made is version 1.

▸byte orderlittle-endian

The Game Boy's processor is an 8-bit Z80 relative and stores words low byte first. Every address in the header follows it.