ARM programming for Gameboy Advance

Following the Gameboy Color, the Gameboy Advance was the first hand-held console to bring Super-Nintendo Quality to handhelds...

Rather than using the Gameboy's GBZ80, or the Super Nintendo's 65816, the Gameboy Advance uses an ARM processor.

In fact, the GBA is pretty much the simplest system to develop ARM for!

There were multiple generations of the Gameboy Advance, but they were essentially functionally identical... the later NDS was also backwards compatible with the GBA

Tech Specs
Cpu 16.7 MHZ ARM7TDMI
Memory 384k
Resolution 240x160 - 256 or 32K colors
Sprites 128 @ 64x64
Sound 4 channel + 2xDMA
The 3 generations of the GBA

If you want to learn ARM get the Cheatsheet! it has all the ARM7 commands, it covers the commands, and options like Bitshifts and conditions as well as the bytecode structure of the commands!

Technical Resources
GBATEK - complete documentation on the GBA and NDS


Screen Display
In these tutorials we're going to use mode 4 - this effectively has 2 bitmap layers of 256 colors each, they are NOT PLANAR - they are linear bitmap format.
Note, it is not possible to write in bytes to the screen, We must write in WORDS... if we write a byte, both bytes of the word will be set the same - effectively halving the horizontal resolution

Memory Map
From To Purpose
00000000 00003FFF BIOS - System ROM (16 KBytes)
00004000 01FFFFFF Not used
02000000 0203FFFF WRAM - On-board Work RAM (256 KBytes) 2 Wait
02040000 02FFFFFF Not used
03000000 03007FFF WRAM - On-chip Work RAM (32 KBytes)
03008000 03FFFFFF Not used
04000000 040003FE I/O Registers
04000400 04FFFFFF Not used
05000000 050003FF BG/OBJ Palette RAM (1 Kbyte)
05000400 05FFFFFF Not used
06000000 06017FFF VRAM - Video RAM (96 KBytes)
06018000 06FFFFFF Not used
07000000 070003FF OAM - OBJ Attributes (1 Kbyte)
07000400 07FFFFFF Not used
08000000 09FFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 0
0A000000 0BFFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 1
0C000000 0DFFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 2
0E000000 0E00FFFF Game Pak SRAM (max 64 KBytes) - 8bit Bus width
0E010000 0FFFFFFF Not used
10000000 FFFFFFFF Not used (upper 4bits of address bus unused)

Ports
Port Name Description Bits Details
4000000h DISPCNT LCD Control
Owwddddd Bmhfcbbb
4000002h - Undocumented - Green Swap

4000004h DISPSTAT General LCD Status (STAT LYC)
4000006h VCOUNT Vertical Counter (LY)

4000008h BG0CNT BG0 Control

400000Ah BG1CNT BG1 Control

400000Ch BG2CNT BG2 Control

400000Eh BG3CNT BG3 Control

4000010h BG0HOFS BG0 X-Offset

4000012h BG0VOFS BG0 Y-Offset

4000014h BG1HOFS BG1 X-Offset

4000016h BG1VOFS BG1 Y-Offset

4000018h BG2HOFS BG2 X-Offset

400001Ah BG2VOFS BG2 Y-Offset

400001Ch BG3HOFS BG3 X-Offset

400001Eh BG3VOFS BG3 Y-Offset

4000020h BG2PA BG2 Rotation/Scaling Parameter A (dx)

4000022h BG2PB BG2 Rotation/Scaling Parameter B (dmx)

4000024h BG2PC BG2 Rotation/Scaling Parameter C (dy)

4000026h BG2PD BG2 Rotation/Scaling Parameter D (dmy)

4000028h BG2X BG2 Reference Point X-Coordinate

400002Ch BG2Y BG2 Reference Point Y-Coordinate

4000030h BG3PA BG3 Rotation/Scaling Parameter A (dx)

4000032h BG3PB BG3 Rotation/Scaling Parameter B (dmx)

4000034h BG3PC BG3 Rotation/Scaling Parameter C (dy)

4000036h BG3PD BG3 Rotation/Scaling Parameter D (dmy)

4000038h BG3X BG3 Reference Point X-Coordinate

400003Ch BG3Y BG3 Reference Point Y-Coordinate

4000040h WIN0H Window 0 Horizontal Dimensions

4000042h WIN1H Window 1 Horizontal Dimensions

4000044h WIN0V Window 0 Vertical Dimensions

4000046h WIN1V Window 1 Vertical Dimensions

4000048h WININ Inside of Window 0 and 1

400004Ah WINOUT Inside of OBJ Window & Outside of Windows

400004Ch MOSAIC Mosaic Size

400004Eh Not used


4000050h BLDCNT Color Special Effects Selection

4000052h BLDALPHA Alpha Blending Coefficients

4000054h BLDY Brightness (Fade-In/Out) Coefficient

4000056h Not used


4000060h SOUND1CNT_L Channel 1 Sweep register

4000062h SOUND1CNT_H Channel 1 Duty/Length/Envelope (NR11

4000064h SOUND1CNT_X Channel 1 Frequency/Control

4000066h Not used


4000068h SOUND2CNT_L Channel 2 Duty/Length/Envelope (NR21

400006Ah Not used


400006Ch SOUND2CNT_H Channel 2 Frequency/Control

400006Eh Not used


4000070h SOUND3CNT_L Channel 3 Stop/Wave RAM select (NR30)

4000072h SOUND3CNT_H Channel 3 Length/Volume

4000074h SOUND3CNT_X Channel 3 Frequency/Control

4000076h Not used


4000078h SOUND4CNT_L Channel 4 Length/Envelope

400007Ah Not used


400007Ch SOUND4CNT_H Channel 4 Frequency/Control

400007Eh Not used


4000080h SOUNDCNT_L Control Stereo/Volume/Enable (NR50 NR51)
4000082h SOUNDCNT_H Control Mixing/DMA Control

4000084h SOUNDCNT_X Control Sound on/off (NR52)
4000086h Not used


4000088h BIOS SOUNDBIAS Sound PWM Control

400008Ah - Not used

4000090h WAVE_RAM Channel 3 Wave Pattern RAM (2 banks!!)

40000A0h FIFO_A Channel A FIFO Data 0-3
40000A4h FIFO_B Channel B FIFO Data 0-3
40000A8h Not used


40000B0h DMA0SAD DMA 0 Source Address

40000B4h DMA0DAD DMA 0 Destination Address

40000B8h DMA0CNT_L DMA 0 Word Count

40000BAh DMA0CNT_H DMA 0 Control

40000BCh DMA1SAD DMA 1 Source Address

40000C0h DMA1DAD DMA 1 Destination Address

40000C4h DMA1CNT_L DMA 1 Word Count

40000C6h DMA1CNT_H DMA 1 Control

40000C8h DMA2SAD DMA 2 Source Address

40000CCh DMA2DAD DMA 2 Destination Address

40000D0h DMA2CNT_L DMA 2 Word Count

40000D2h DMA2CNT_H DMA 2 Control

40000D4h DMA3SAD DMA 3 Source Address

40000D8h DMA3DAD DMA 3 Destination Address

40000DCh DMA3CNT_L DMA 3 Word Count

40000DEh DMA3CNT_H DMA 3 Control

40000E0h Not used


4000100h TM0CNT_L Timer 0 Counter/Reload

4000102h TM0CNT_H Timer 0 Control

4000104h TM1CNT_L Timer 1 Counter/Reload

4000106h TM1CNT_H Timer 1 Control

4000108h TM2CNT_L Timer 2 Counter/Reload

400010Ah TM2CNT_H Timer 2 Control

400010Ch TM3CNT_L Timer 3 Counter/Reload

400010Eh TM3CNT_H Timer 3 Control

4000110h Not used


4000120h SIODATA32 SIO Data (Normal-32bit Mode; shared with below)

4000120h SIOMULTI0 SIO Data 0 (Parent) (Multi-Player Mode)

4000122h SIOMULTI1 SIO Data 1 (1st Child) (Multi-Player Mode)

4000124h SIOMULTI2 SIO Data 2 (2nd Child) (Multi-Player Mode)

4000126h SIOMULTI3 SIO Data 3 (3rd Child) (Multi-Player Mode)

4000128h SIOCNT SIO Control Register

400012Ah SIOMLT_SEND SIO Data (Local of MultiPlayer; shared below)

400012Ah SIODATA8 SIO Data (Normal-8bit and UART Mode)

400012Ch Not used


4000130h KEYINPUT Key Status

4000132h KEYCNT Key Interrupt Control

4000134h RCNT SIO Mode Select/General Purpose Data

4000136h IR Ancient - Infrared Register (Prototypes only)

4000138h Not used


4000140h JOYCNT SIO JOY Bus Control

4000142h Not used


4000150h JOY_RECV SIO JOY Bus Receive Data

4000154h JOY_TRANS SIO JOY Bus Transmit Data

4000158h JOYSTAT SIO JOY Bus Receive Status

400015Ah Not used


4000200h IE Interrupt Enable Register

4000202h IF Interrupt Request Flags / IRQ Acknowledge

4000204h WAITCNT Game Pak Waitstate Control

4000206h Not used


4000208h IME Interrupt Master Enable Register

400020Ah Not used


4000300h POSTFLG Undocumented - Post Boot Flag

4000301h HALTCNT Undocumented - Power Down Control

4000302h Not used


4000410h ? Undocumented - Purpose Unknown / Bug ??? 0FFh

4000411h Not used


4000800h ? Undocumented - Internal Memory Control (R/W)

4000804h Not used


4xx0800h ? Mirrors of 4000800h (repeated each 64K)





Learn Assembly for the Greatest Classic Processors:  Z80 - 6502 - 68000 - 8086 - ARM
Visit www.ChibiAkumas.com and www.ChibiAliens.com to get my games and their source code! | Support me on patreon

 

View Options
Default Dark
Simple (Hide this menu)
Print Mode (white background)

Top Menu
Youtube channel
ASM Programming Forums
GitHub
Dec/Bin/Hex/Oct/Ascii Table

Z80 Content
Learn Z80 Assembly
Hello World
Advanced Series
Multiplatform Series
Platform Specific Series
ChibiAkumas Series
Grime Z80
Z80 Downloads
Z80 Cheatsheet
Sources.7z
DevTools kit
Z80 Platforms
Amstrad CPC
Elan Enterprise
Gameboy & Gameboy Color
Master System & GameGear
MSX & MSX2
Sam Coupe
TI-83
ZX Spectrum
Camputers Lynx

6502 Content
Learn 6502 Assembly
Advanced Series
Platform Specific Series
Grime 6502
6502 Downloads
6502 Cheatsheet
Sources.7z
DevTools kit
6502 Platforms
Apple IIe
Atari 800 and 5200
Atari Lynx
BBC Micro
Commodore 64
Super Nintendo (SNES)
Nintendo NES / Famicom
PC Engine (Turbografx-16)
Vic 20

68000 Content
Learn 68000 Assembly
Platform Specific Series
Grime 68000
68000 Downloads
68000 Cheatsheet
Sources.7z
DevTools kit
68000 Platforms
Amiga 500
Atari ST
Neo Geo
Sega Genesis / Mega Drive
Sinclair QL (Quantum Leap)
X68000 (Sharp x68k)

My Game projects
Chibi Aliens
Chibi Akumas

Work in Progress
Learn 6809 Assembly
Learn 65816 Assembly
Learn 8086 Assembly (x86)
Wonderswan
MsDos
Learn ARM Assembly
Gameboy Advance
Risc Os

Misc bits
Ruby programming




If you want to support my work, please consider backing me on patreon!


Buy Chibi Akuma(s) from PolyPlay
Buy ChibiAkuma(s) games now!