¡i¦p¦ó¦bWin32¨t²Î¤W¥ÎGCC¶}µoGBAÀ³¥Î³nÅé¡jHow To Setup the Enviroment?

¡D­ì¼¶¤å§@ªÌ¡GAnders Linden
¡D¤¤¤å½Ķ¡GHungJia

­ì»¡©ú¤å¥ó¤U¸ü

Download!!

§Ç¨¥

³o¥÷¤å¥ó¡A¬Oµ¹©Ò¦³·Q¦bWin32¨t²Î¤W¥ÎGCC¶}µoGBAÀ³¥Îµ{¦¡ªº¨Ï¥ÎªÌ¾É¤Þ¡A²³æ¨Ó»¡´N¬O¶}µoÀô¹Ò³]©w¡C

¦w¸Ë

²Ä¤@­Ó¨BÆJ§Y¬O¦w¸ËDevKit Advance¡ADevKit Advance¬OGCCªº¤@­Óª©¥»¡A¥¦¥i¥H½s¥X¤ä´©Arm³B²z¾¹ªºÀ³¥Îµ{¦¡(³nÅé)¡C
¶¶¹D¤@´£¡ADevKit Advanceªº§@ªÌ¬OJason Wilkins¡Aºô¯¸¦ì§}¦³§ó°Ê¹L¡A½Ðª`·N¡C

§A¥i¥H¥ý¨ì§@ªÌºô¯¸¤U¸üDevKit Advance(·s¯¸)

http://devkitadv.sourceforge.net/download.html (¤U¸ü­¶­±)

http://devkitadv.sourceforge.net/ (§@ªÌ­º­¶)

­n¤U¸üªºÀɮײM³æ¦p¤U¡G

Ć agb-win-core-r5.zip
Ć agb-win-binutils-r4.zip
Ć agb-win-gcc-r4.zip
Ć agb-win-newlib-r4.zip
Ć agb-win-libstdcpp-r4.zip (If you want to be able to use the c++ compiler g++).
Ć agb-win-patch-r4.zip
(«ØÄ³¥ýDownload¥H¤W¤»ÀÉ®×§Y¥i)

¦w¸Ë¨BÆJ¤@¡B
¤U¸ü§¹¦¨«á¡A±N©Ò¦³ªºÀɮ׸ÑÀ£ÁY( Unzip )¨ì¦P¤@­Ó¸ê®Æ§X¤º¡C­nª`·Nªº¬O¡Aagb-win-patch-r4.zip­n©ñ¦b³Ì«á¤@­Ó¸ÑÀ£ÁY¡A¦]¬°¥¦·|¥ÎÂл\ªº¤è¦¡¨Ó§ó·s¬Y¨Ç¸ê®Æ¡C«ØÄ³§A±N¸ê®Æ¦w¸Ë¦b®ÚºÏºÐ¼Ñ¸Ì ( ¤@¯ë¨Ó»¡¬°C:\ )

C:\devkitadv

©Ò¦³¸ê®Æ§¨¸ÌªºÀɮצp¤U¹Ï -

¦w¸Ë¨BÆJ¤G¡B
±µ¤U¨Ó§Ú­Ì­n­×§ïÀô¹ÒÅܼƸô®|( Environment Variable Path)¡C¦b­×§ï¥ý¡A½Ð¥ý°O¦í§ADevKitAdv¦w¸Ëªº¦ì§}(¨Ò¡Gc:\devkitadv)¡C

­×§ïªº¤èªk¬Û·í²³æ¡C¦b¡u§Úªº¹q¸£¡v¤W«ö¥kÁä¡A¿ï¾Ü¡u¤º®e¡v¡AÂI¿ï¡u¶i¶¥¡v­¶¡A¦A¬d¬Ý¡uÀô¹ÒÅܼơv¡C

¦p¹Ï¡C

§A¥i¥H¬Ý¨ì¤GºØÅܼơA¤@¬O¨Ï¥ÎªÌÅܼơA¤@¬°¨t²ÎÅܼơCÁÙ¦³¤G­Ó³]©w¡C

( I )
±N¦b¨t²ÎÅܼƤ¤ªº¡uPathÅܼơv°µ¤@ÂI­×§ï¡CÂI¿ïPath¡A«ö½s¿è¡A¦bÅܼƭȳ̫á¤@¦æ¥[¤WDevKitAdv\bin³o­Ó¸ô®|¡C¦]¬°gcc compiler©ñ¦b¸ÌÀY¡C¥t¥~­nª`·Nªº¬O¡A¤£¦Pªº°Ñ¼Æ­n¥Î¤À¸¹¹j¶}¡C

¨Ò¡G"C:\Program Files\Symantec\Norton Ghost 2003\";c:\devkitadv\bin

( II )
¦b¨t²ÎÅܼƷs¼W¤@ÅܼơA¦WºÙ¬°DevKitAdv¡A¤º®e¶ñdevkitadv¦w¸Ë¦ì§}¡C

µù¡G¦pªG§A·s¼W¦b¨Ï¥ÎªÌÅܼƸ̡A·í§A¤£¬O¥Î§A¨­¥÷µn¤J®É¡A·íµMªº¤]´N¬Ý¤£¨ì§A©Ò³]©wªºÅܼƸô®|Åo¡C

¨ì³o¸Ì¡AÀô¹ÒÅܼƳ]©w¤j­P¤W´N§¹¦¨¤F¡C§A¥i¥H¶}¤@­ÓDos©R¥Oµ¡¨Ó´ú¸Õ¬Ý³]©w¦³¨S¦³µo¥Í®Ä¥Î¡C¤U¤@­Ó¡ugcc¡v©R¥O¬Ý¬Ý¡A¨S°ÝÃDªº¸Ü·|¥X²{

gcc: no input files
¦ý¦pªG§A¬Ý¨ì¡G
¡¥gcc¡¦¤£¬O¤º³¡©Î¥~³¡©R¥O¡B¥i°õ¦æªºµ{¦¡©Î§å¦¸ÀÉ¡C

¦^ÀY¥hÀˬd¤@¤U¦w¸Ë¬O§_¦³µo¥Í¤p¿ù»~§a¡C

¶}©l·sªºProjcet®É¡A§AÁٻݭn±N¤U­±¤G­ÓÀɮשM±M®×¤º®e(µ{¦¡)©ñ¦b¤@°_¡C
Ć Lnkscript
Ć Crt0.s
¤U¸üÂI¤@¡Ghttp://www.devrs.com/gba/files/crtls.zip (Ãø¤U¸ü)
¤U¸üÂI¤G¡Ghttp://www.suddenpresence.com/bbatutorial/chapter02/crtls.zip
(Jeff Frohwein's crt0.s and lnkscript)


¨C¦¸¶}©l³]­p«eÁÙ¦³¤°»ò­nª`·Nªº¡C

¥ý«Ø¥ß­Ó¸ê®Æ§¨¦s©ñµ{¦¡ÀɮסA°£¤Flnkscript©Mcrt0.s¤§¥~¡CÁÙ¦³¤G­ÓÀÉ®×­n©ñ¶i¥h¡A¤À§O¬Ocrtbegin.o©Mcrtend.o¡C

½Æ»s¨ì¸ê®Æ§¨ªº®É­Ô­nª`·N¨ä¬O§_¬°¥¿½Tªºª©¥»¡C³]­pGBAªºµ{¦¡®É¥i¥H¦³¤TºØ®æ¦¡¡GARM¡BTHUMB¡BInterwork¡A¤TªÌ¦³¦ó®t²§©O¡H

ARM¦³«Ü¦h«ü¥O¡A¦]¬°¥¦¬O¦³µÛ32¦ì¤¸°O¾ÐÅé¦s¨ú¯à¤O¡A©Ò¥H°õ¦æ®Ä²v«Ü¦n¡C¯ÊÂI¬Ocodeªºªø«×·|¤jÂI¤F¡C¨C­Ó¹Bºâ(¤@­Ó«ü¥O)·|¥Î±¼¥|­Óbytes (ARM Format)¡A­Y¬OTHUMB«hÁY´î¦¨2bytes

¦pªG§A¼gªº¬OARM Fromatªºµ{¦¡¡A±N¤U­±¤G­ÓÀÉ®×Copy¨ìProject¸ê®Æ§¨¤¤
¡E e:\devkitadv\lib\gcc-lib\arm-agb-elf\3.0.2\crtbegin.o and
¡E e:\devkitadv\lib\gcc-lib\arm-agb-elf\3.0.2\crtend.o

­Y§A¼gªº¬OTHUMB Fromatªºµ{¦¡¡A«hcopy¤U¦C¤G­ÓÀɮסC
¡E e:\devkitadv\lib\gcc-lib\arm-agb-elf\3.0.2\thumb\crtbegin.o and
¡E e:\devkitadv\lib\gcc-lib\arm-agb-elf\3.0.2\thumb\crtend.o

¤°»ò¤S¬OInterwork©O¡H¦]¬°§Ú¦Û¤v¤]¨S¦³¨Ï¥Î¹L¡A©Ò¥H³o¸Ì´N¦h´£¡A§Ú¥uª¾¹D¥¦¬OARM©MTHUMB®æ¦¡ªºµ²¦X¡C¦pªG§A·Q¥ÎInterwork Format¡A«hcopy¤U¦C¤G­ÓÀɮסC

¡E e:\devkitadv\lib\gcc-lib\arm-agb-elf\3.0.2\interwork\crtbegin.o and
¡E e:\devkitadv\lib\gcc-lib\arm-agb-elf\3.0.2\interwork\crtend.o

¤@­Óµ{¦¡½d¨Ò

³o½d¨Òªº¤º®e¤j·§¥]§t¤F¡A²³æ¬õ¦â©³¹Ï¡A¥ÎA¡BBÁä±±¨î¥Õ¦â¦r¼Ð¡C
±Ncrtbegin.o©Mcrtend.o½Æ»s¨ìµ{¦¡¸ê®Æ§¨( Arm Format )¡C

typedef unsigned short u16;
typedef unsigned int u32;
#define RGB16(r,g,b) ((r)+(g<<5)+(b<<10))
#define screenbuffer ((u16 *)0x6000000)
#define REG_DISPCNT *(u32*)0x4000000
#define MODE3 0x3
#define BG2_ENABLE 0x400
#define REG_KEYS *(volatile u16*)0x4000130
#define REG_VCOUNT *(volatile u16*)0x4000006
#define KEY_A 1
#define KEY_B 2

void AgbMain()
{
int i;
u16 keys;
int position=0;
REG_DISPCNT=MODE3 | BG2_ENABLE;
for (i=1; i<240*160; i++)
screenbuffer[i]=RGB16(31,0,0);
screenbuffer[0]=RGB16(31,31,31);

for (;;){
while (REG_VCOUNT!=159);
while (REG_VCOUNT!=160);
keys=REG_KEYS;
if ((keys & KEY_B)==0)
{
if (position>0)
{
screenbuffer[position]=RGB16(31,0,0);
screenbuffer[--position]=RGB16(31,31,31);
}
}

if ((keys & KEY_A)==0)
{
if (position<239)
{
screenbuffer[position]=RGB16(31,0,0);
screenbuffer[++position]=RGB16(31,31,31);
}
}
}
}

°£¦¹¤§¥~¡AÁٻݭn¼g¤@­ÓMakeFile¡C¦b¦w¸ËDevkit®É¦P®É¤]¥]§t¤FmakeÀ³¥Îµ{¦¡¦b¸ÌÀY¡C
MakeFileªº¤º®e¤j­P¦p¤U¡C


test.gba: test.elf
objcopy -O binary test.elf test.gba

test.elf: crt0.o main.o
ld -L${DEVKITADV}/lib/gcc-lib/arm-agb-elf/3.0.2 \
-L${DEVKITADV}/arm-agb-elf/lib \
crt0.o main.o -o test.elf

main.o: main.c
gcc -c -marm main.c

crt0.o: crt0.s
as crt0.s -o crt0.o


¦bMakeFile¸Ì¡A§Ú­Ì¥i¥H¬Ý¨ì¤§«e³]©wªºDEVKITADVÀô¹ÒÅܼƵo¥Í¤F§@¥Î¡A¡A§Y¨Ï­«·s¸Ë¤@¦¸Devkit¡AMakefileÁÙ¬O¥i¥H­«·s®M¥Î¡A»Ý­n§ó§ïªº¦a¤è¥i¯à¥u¦³¡u3.0.2¡vÃö©óGCCª©¥»ªº³¡¤À¡C

ld¥i¥H§i¶D¹q¸£¥h§ä¨ì§Ú­Ì¤Þ¥Îªºlibaries¦ì¸m¡C
¦pªG§A½s¿è¬OArm Formatªºµ{¦¡¡Ald«á§ä¨ìªº¬OArm Formatªºlibraryªº¦ì§}¡C
¦p¤U~~
test.elf: crt0.o main.o
ld -L${DEVKITADV}/lib/gcc-lib/arm-agb-elf/3.0.2 \
-L${DEVKITADV}/arm-agb-elf/lib \
crt0.o main.o -o test.elf

¤Ï¤§¡A­Y¬°Thumb Formatªºµ{¦¡¡A±o°µÂI¤p¤p§ó°Ê¡C

test.elf: crt0.o main.o
ld -L${DEVKITADV}/lib/gcc-lib/arm-agb-elf/3.0.2/thumb \
-L${DEVKITADV}/arm-agb-elf/lib/thumb \
crt0.o main.o -o test.elf

­Y¬°Interwork¡A«h¥Î¡C

test.elf: crt0.o main.o
ld -L${DEVKITADV}/lib/gcc-lib/arm-agb-elf/3.0.2/interwork \
-L${DEVKITADV}/arm-agb-elf/lib/interwork \
crt0.o main.o -o test.elf

make³]©w¦n«á¡A¥u»Ý­n°õ¦æmakeÀ³¸Ó´N¯à½sͤF¡C

HungJiaªº¸Ü¡G
§Ú¬O¥Î¥t¤@ºØ½sͤèªk¡A´N¬Omake.bat¡A§Úµo²{¥u­n±N¤WÀYmain.c¨º­Óµ{¦¡ªº¥D¨ç¼Æ¦WºÙAgbMain()§ï¦¨main.c¡A¥Î¤U­±ªºmake.bat¨Ó°µ¤]¬O¥i¥H¦¨¥\ªº¡C¤£¹L§Ú¥u¬O¦n¹B­è¦n½s¦¨¥\¦Ó¤w¡A¹ê»Ú¤W§ÚÁÙ¬O¤£ª¾¹D¤GªÌªº®t²§¦b¨º¡A¥i¨£±o¥\¤Ò¨S¾Ç¨ì®a¡A¦³«Ý§ó¶i¤@¨B¬ã¨s¡C

gcc -o test.elf main.c -lm
objcopy -O binary test.elf test.gba
pause

Ãö©óGBA.h

²{¦b¥i¥H¶}©l¼gµ{¦¡¤F¡C§A¥i¯à·|»Ý­n¦³¤@°ï©w¸q¥i¥HÅý§A¤Þ¥Îªº¼ÐÀYÀÉ¡A¦W¬°gba.h¡C¦b§O¤HªºDEMO§@«~¤¤¡A§A¥i¥Hµo²{¤º®e¤£¦Pªºgba.h¡A³q±`³£¬ODemoµ{¦¡·|¥Î¨ìªº©w¸q¡Agba.h¸Ì¤~·|©ñ¡C¦pªG§A·Q­n²{¦¨©Î¬O¦nªºgba.hÀÉ¡A¥i¥H¦bºô¸ô¤W©Î¦bwww.gba.org³£§ä¨ì¡C

§A¤]¥i¥H¶q¨­¥´³y¦Û¤vªºgba.h¡A³o¼Ë¼g°_µ{¦¡¨Ó·|§ó¦³®Ä²v¡C

³Ì«á§ó·s¤G¹s¹s¤T¦~¤G¤ë¤G¤Q¤C¤é&Edit By HungJia.