¡i¦p¦ó¦bWin32¨t²Î¤W¥ÎGCC¶}µoGBAÀ³¥Î³nÅé¡jHow To Setup the Enviroment?
¡Dì¼¶¤å§@ªÌ¡GAnders Linden
¡D¤¤¤å½Ķ¡GHungJia
컡©ú¤å¥ó¤U¸ü
§Ç¨¥
³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¤º¡Cnª`·Nªº¬O¡Aagb-win-patch-r4.zipn©ñ¦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¤jP¤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)¡AY¬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.oY§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 )¡Ctypedef 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 2void 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¤jP¦p¤U¡C
test.gba: test.elf
objcopy -O binary test.elf test.gbatest.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ª©¥»ªº³¡¤À¡Cld¥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¤Ï¤§¡AY¬°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.elfY¬°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.elfmake³]©w¦n«á¡A¥u»Ýn°õ¦æmakeÀ³¸Ó´N¯à½sͤF¡C
HungJiaªº¸Ü¡G
§Ú¬O¥Î¥t¤@ºØ½sͤèªk¡A´N¬Omake.bat¡A§Úµo²{¥un±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¡Cgcc -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·Qn²{¦¨©Î¬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.