0% found this document useful (0 votes)
45 views35 pages

Programming The Nintendo Game Boy Advance: The Unofficial Guide

The document discusses programming for the Nintendo Game Boy Advance. It covers the basics of a Game Boy program including memory and the processor. It also discusses creating new projects and using development tools.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
45 views35 pages

Programming The Nintendo Game Boy Advance: The Unofficial Guide

The document discusses programming for the Nintendo Game Boy Advance. It covers the basics of a Game Boy program including memory and the processor. It also discusses creating new projects and using development tools.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Programming The Nintendo Game Boy Advance: The Unofficial Guide

Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com


!
" # $
$ %& %&
$
' $ (& ) * +' (

$
%& '
%& !
$

'
$
$

, -

% &
.
. '
/
.
0 %&

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
The Basics Of A Game Boy Program
+ * # $
1
( $ $ ' (2
1 $ 1
3
$
% &

1 $
% & $

+ 1 $
4

2 $ $

$
%& / $ +5 %& 4*

%& % %&
1 / '
$ $ $
%& $ $
)
% & ,+ ! $

What Makes It Tick?


& -* $ % & $3
%& 0)
%& $
1 $
& %&
6 1 $
' / %&

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
$ %&
1 ' 7 %&
$

$ *
%& $

"
& 8 $
9 $
'
$
# #
"

,
3 $ "
9 $
$ $ $ : 9

A Friendly Greeting
! ! 3
1 ' 7
$ %& %& " , +
1
, + %&
$ ' ' + "
1

$ ;
; $
%&
"

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
' :
# $ %& !
' 1 #
$
! " 1
$ 4

9 <

! # $
$ = (2 (" : 1 %

Creating A New Project


1 ! $
$
<><
? -@ @ : ' / : :
+ / AB

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
: + ' / AC ,
D? E < (% ( ,
$ ? $ )F

! " #
$ $ %
% ! $

$ $ / A5
$

&

! '
!

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
$ $ -
#include "mygba.h"

MULTIBOOT

int main(void)
{
ham_Init();
while(1)
{
}

return 0;
}

/* END OF FILE */

1 " * %
"
%& ? ? GG
%& '
' " ) 2 6 &) )
%& 8 $
"

Writing The Greeting Program Source Code


)$ 1 $ %
$
/
8 '
%

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
#include "mygba.h"

MULTIBOOT

int main(void)
{
ham_Init();

//initialize the text system


ham_InitText(0);

while(1)
{
//display a greeting message
ham_DrawText(0, 0, "Greetings!");
ham_DrawText(0, 2, "Welcome to the world of");
ham_DrawText(0, 4, "Game Boy Advance programming!");
}

return 0;
}

/* END OF FILE */

: 3
H. ' '
: $ H '
H. '
! $ ! %& '
$ $ 4

Compiling The Greeting Program


: 1 $
$ / AA +

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
) + &
$

%
( !

'
*
(<00) 0(
/
$
)

$
+? &

? . !0) "

Testing The Greeting Program In The Emulator


7 % +?
& + $
& G & / A I"

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
- !
/ AJ

)
%
( !*
(

+
,

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
8
& 8 7 8
) / A K"
8 B' A' !
1
"

-
!
.
/

Drawing Pixels
: 4 1 %&
$ %& $ "
: 8 1 1
BLL %&
9 '
4. ' $ *
& * F . 0 $
0 $ ? 9
$" % *
'
' "

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
:
? . !0)
@, @? LA@"; & 1
3 4
' ,
%& * <' ! $
. +' " '
' . ! $
1 & ' ' "

? $
* 1 : . +'
"

Writing the DrawPixel Program Source Code


6 ' $
%& 4 1 1
%& ' "
1 $ )$
1 '

//////////////////////////////////////////////////
// Programming The Game Boy Advance
// Chapter 4: Starting With The Basics
// DrawPixel Project
// main.c source code file
//////////////////////////////////////////////////

int main(void)
{
// create a pointer to the video buffer
unsigned short* videoBuffer = (unsigned short*)0x6000000;

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
// switch to video mode 3 (240x160 16-bit)
// by setting a memory register to a specific value
*(unsigned long*)0x4000000 = (0x3 | 0x400);

// draw a white pixel (16 bits) directly to video memory


// pixel location is centered on the screen (120,80)
videoBuffer[80 * 240 + 120] = 0xFFFF;

// continuous loop
while(1) { }

// end program
return 0;
}

.< $ $ / A=

1
2 #

32 4

+
' &
%& $

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
3 ?
$ %& 1
.<

,. F $
' 7 $ %&
/ -

*(unsigned long*)0x4000000 = (0x3 | 0x400);

L'5 5- CAL ' BJL BJ! L'ALL


$ C )0 M"
' +
/ %& $
$

' ! -

videoBuffer[80 * 240 + 120] = 0xFFFF;

' 5 CAL '


BJL BCL ' =L
! ' 1>7 " -

Memory Location = Y * Screen Width + X

&
9 '
L'//// L'//// ' L'
A 8 LNO N/ BJ "
L'//// BJ! ' 5 BJ!
' + ' '
0 % & " 9
'

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
Compiling the DrawPixel Program
: 1

" /I
'

Testing the DrawPixel Program in the Emulator


+ & G &
/K $ $ " . +'
/ AO . '
3

5
2 #
! #
,(

Filling The Screen


: ' 1 $
' 4
1 $
+ ' 1 $ $ 3

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
Writing the FillScreen Program Source Code
7
1
"
/ , 1
%& 1 3"
%&
%& ' ? (% & 0 ("
$ $ $ $

0<% H. ,+?: $ $ -

#define REG_DISPCNT *(unsigned long*)0x4000000

1 ? 1 ' $ $
?" P
*
0<% H. ,+? : Q Q"L'ALLLLLL 4 1

%& *
%& $
$
, %& * 1 ,
*
L'5 ( (
$ 3 1 $ 1 '
1

! & $ 9

%&

' -

#define MODE_3 0x3

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
8 . +'
5 CAL ' BJL BJ! &
) . <H5 1 ' 8 L'5

"

' -

#define BG2_ENABLE 0x400

. +'
) 01 L'5 L'ALL $
C + 1

#define RGB(r,g,b) (unsigned short)(r + (g << 5) + (b << 10))

$ 0% & BJ!

/ . +' 5 -

void DrawPixel3(int x, int y, unsigned short c)


{
videoBuffer[y * 240 + x] = c;
}

' 5
. +'
>7
: -

//////////////////////////////////////////////////
// Programming The Game Boy Advance
// Chapter 4 - Starting With The Basics
// FillScreen Project

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
// main.c source code file
//////////////////////////////////////////////////

//define register for changing the video mode


#define REG_DISPCNT *(unsigned long*)0x4000000

//video mode 3 = 240x160 16-bit


#define MODE_3 0x3

//use background 2
#define BG2_ENABLE 0x400

//macro to pack an RGB color into 16 bits


#define RGB(r,g,b) (unsigned short)(r + (g << 5) + (b << 10))

//create a pointer to the video buffer


unsigned short* videoBuffer = (unsigned short*)0x6000000;

//draw a pixel on the mode 3 video buffer


void DrawPixel3(int x, int y, unsigned short c)
{
videoBuffer[y * 240 + x] = c;
}

//////////////////////////////////////////////////
// Function: main()
// Entry point for the program
//////////////////////////////////////////////////
int main(void)
{
int x, y;

//switch to video mode 3 (240x160 16-bit)


REG_DISPCNT = (MODE_3 | BG2_ENABLE);

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
//fill the screen
for (x = 0; x < 239; x++)
{
for (y = 0; y < 159; y++)
{
DrawPixel3(x, y, RGB(0,(255-y),x));
}
}

// continuous loop
while(1)
{
// do nothing
}

// end program
return 0;
}

$ ( (
- > 7
. +' 5 > 7 7

Compiling the FillScreen Program


: /I
1 '

$ "
'
0
? > 8 '
$

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
Testing the FillScreen Program in the Emulator
:
$ $ )
' $ $
$ & G & /K

6 %&
9 '& * ! %& "

% ?? %& $
$ ;
2
$

%
%& / A BL

7
8

,(
#

7 $ / ,
%& 8
' &
'

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
, !
"

& / 4
9
R, S )$ 1
1 1 $ # $
%&

' ? K (0 2
, ( 1 ! !
! 4: ?
J ( !& ( $ &
' & 1
%&

Detecting Button Presses


& 9 49 %&
& 1
? BL ( * & ( '
$
4 & H. ' '

('("
/H? 06 : +2 H2 +H+0<,,<.
"

Writing the ButtonTest Program Source Code


&
" &
$ %&
/ 8 H
: ' H ' L"
8 ' $ $

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
$ + " 8
H. '

/ &
/ /
: : + : + '
/ A BB , D?E < / (& (
$ :
1 '

! " #

: ' $
& )
$
T 1
1
"

8 8
,. F
? . !0) $ $
9 $
$

& -

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
//////////////////////////////////////////////////
// Programming The Game Boy Advance
// Chapter 4: Starting With The Basics
// ButtonTest Project
// main.c source code file
//////////////////////////////////////////////////

// include the main ham library


#include "mygba.h"

// enable multi-boot support


MULTIBOOT

//////////////////////////////////////////////////
// Function: main()
// Entry point for the program
//////////////////////////////////////////////////
int main()
{
// initialize hamlib
ham_Init();

// initialize ham for text output


ham_InitText(0);

// display the button names


ham_DrawText(0,0,"BUTTON INPUT TEST");
ham_DrawText(3,2,"UP");
ham_DrawText(3,3,"DOWN");
ham_DrawText(3,4,"LEFT");
ham_DrawText(3,5,"RIGHT");
ham_DrawText(3,6,"A");
ham_DrawText(3,7,"B");
ham_DrawText(3,8,"L");

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
ham_DrawText(3,9,"R");
ham_DrawText(3,10,"START");
ham_DrawText(3,11,"SELECT");

// continuous loop
while(1)
{
// check UP button
if (F_CTRLINPUT_UP_PRESSED)
ham_DrawText(0,2,"X");
else
ham_DrawText(0,2," ");

// check DOWN button


if (F_CTRLINPUT_DOWN_PRESSED)
ham_DrawText(0,3,"X");
else
ham_DrawText(0,3," ");

// check LEFT button


if (F_CTRLINPUT_LEFT_PRESSED)
ham_DrawText(0,4,"X");
else
ham_DrawText(0,4," ");

// check RIGHT button


if (F_CTRLINPUT_RIGHT_PRESSED)
ham_DrawText(0,5,"X");
else
ham_DrawText(0,5," ");

// check A button
if (F_CTRLINPUT_A_PRESSED)
ham_DrawText(0,6,"X");

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
else
ham_DrawText(0,6," ");

// check B button
if (F_CTRLINPUT_B_PRESSED)
ham_DrawText(0,7,"X");
else
ham_DrawText(0,7," ");

// check L button
if (F_CTRLINPUT_L_PRESSED)
ham_DrawText(0,8,"X");
else
ham_DrawText(0,8," ");

// check R button
if (F_CTRLINPUT_R_PRESSED)
ham_DrawText(0,9,"X");
else
ham_DrawText(0,9," ");

// check START button


if (F_CTRLINPUT_START_PRESSED)
ham_DrawText(0,10,"X");
else
ham_DrawText(0,10," ");

// check SELECT button


if (F_CTRLINPUT_SELECT_PRESSED)
ham_DrawText(0,11,"X");
else
ham_DrawText(0,11," ");
}

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
// end program
return 0;
}

&
$ $ / A BC

(
! 9
"
! "
"

Compiling the ButtonTest Program


: 1 & T 1 1
/ + &
/ A B5

: $ $
$
$ .< $ $ / A BA :

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
&
: %( !

%
! "
! $

Testing the ButtonTest Program in the Emulator


) 1 $ 1
& %& $
.< + & G & / A BI
/K $

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
)
( !* (

/ A BJ

+
(
"
! !

Running Programs Directly on the GBA


% &
$

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
%& 9
/ & C & C" %& +?
/ 6 $
"

, 1
$ " *
& C / 6 $ +?
1
$ ?. !0) "

# 9
%& 9
#

The Multiboot Cable


$ & C & C"
%& $ $ %& 1
* %& <'
%&
9 ; 8 " , / A BK
& C %

-
(
"
,(
!

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
& C !
! & C
& C
" +? $
%& 0 %&
%& :
%&

$ $ / A B= + & C
T /I
& C /=
%& %& & C
"

1
8 (

"$
% (

/ A BO & C $ $
& C $ $
& C & C$ *
-UU $! 7 $
( ! (
$ "

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
5
( ' %
! ! ! ' !
'

The Flash Advance Linker


/ 6 $ / A CL"
%& %&
$ %&
0)
%& $

7
!< 0 '

"

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
/ 6 $ 8 JA
BC= CIJ IBC B LCA JA / A CB
/ 6 $

" !
!< 0 ' !
" ,( !

2 $ & C $
%& / 6 $ $ #
+? %& / A CC

!< 0 ' ! <


! !
! " !

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
Summary

$ $

%&

%&

Challenges

? . !0)

. +' '
'

/ ,
/ , 0% &

Chapter Quiz
$ # 8 '.

B * $ % & 3
?GG
& &
? ?
. +

C * ' 3
H. '
& H. '

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
? H+ '
. H, '

5 * %& $ "3
&
& % <
? % & !< 2
. * %&

A / - $

& /

I * 53
5CL ' CAL
& CJL ' B=L
? BCL ' =L
. CAL ' BJL

J * $ ! " $3

&
?
. . F !

K * 53
=
& BJ
? CA
. 5C

= * 3
0<% H? % ) .
& 0<% H ) . <?
? 0<% H. ,+? :
. 0<% H. LB

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com
O * 8 ' 3
H, '
& H6 '
? H& '
. H '

BL * <' %&
%& 3
& C
& C"
& & & "
? / 6 $ /6 "
. 6 & 6&"

Programming The Nintendo Game Boy Advance: The Unofficial Guide


Copyright (c)2003 by Jonathan S. Harbour -- http://www.jharbour.com

You might also like