#44462 - xyuri - Thu Jun 02, 2005 1:50 am
not new to programming, but trying to get started with GBA developement at the moment.
Started from one of the tutorials on this site but dont seem to be able to get it to compile ... I managed to get it to compile with a warning using different parameters but the result was incorrect (just showed a blank screen instead of blank with a different pixel)
The batch I'm using to compile is as follows:
C:\Documents and Settings\XyuRi\Desktop>cd C:\devkitadv\bin\
C:\devkitadv\bin>gcc -o "c:\test.elf" "c:\test.c"
C:\devkitadv\bin>objcopy -O "c:\test.bin" "c:\test.elf"
objcopy: st003808: Invalid bfd target
C:\devkitadv\bin>pause
Press any key to continue . . .
I have tried goooooogling that objcopy error and all I seem to find is that I'm trying to copy to a format that cannot be done... (or something like that)
Does anyone know what I could be doing wrong?
I appreciate any input on this. Thank you :-)
EDIT:
oh, and I have devkitadv installed. I've tried version 4 and version 5 alpha. there was no different between them in relation to this error ;-)
#44495 - xyuri - Thu Jun 02, 2005 8:12 am
Thank you very much tepples :-) got that working great.
There still arent any visuals for the little demo I'm trying ...
This is the code I'm using: (sorry, all in one file)
#include<stdio.h>
#ifndef GBA_HEADER
#define GBA_HEADER
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef signed char s8;
typedef signed short s16;
typedef signed long s32;
typedef unsigned char byte;
typedef unsigned short hword;
typedef unsigned long word;
#define OAMmem ((volatile u32*)0x7000000)
#define VideoBuffer ((volatile u16*)0x6000000)
#define BackBuffer ((volatile u16*)0x600A000)
#define OAMdata ((volatile u16*)0x6100000)
#define BGPaletteMem ((volatile u16*)0x5000000)
#define OBJPaletteMem ((volatile u16*)0x5000200)
#define REG_INTERUPT (*(volatile u32*)0x3007FFC)
#define REG_DISPCNT (*(volatile u32*)0x4000000)
#define REG_DISPCNT_L (*(volatile u16*)0x4000000)
#define REG_DISPCNT_H (*(volatile u16*)0x4000002)
#define REG_DISPSTAT (*(volatile u16*)0x4000004)
#define REG_VCOUNT (*(volatile u16*)0x4000006)
#define REG_BG0CNT (*(volatile u16*)0x4000008)
#define REG_BG1CNT (*(volatile u16*)0x400000A)
#define REG_BG2CNT (*(volatile u16*)0x400000C)
#define REG_BG3CNT (*(volatile u16*)0x400000E)
#define REG_BG0HOFS (*(volatile u16*)0x4000010)
#define REG_BG0VOFS (*(volatile u16*)0x4000012)
#define REG_BG1HOFS (*(volatile u16*)0x4000014)
#define REG_BG1VOFS (*(volatile u16*)0x4000016)
#define REG_BG2HOFS (*(volatile u16*)0x4000018)
#define REG_BG2VOFS (*(volatile u16*)0x400001A)
#define REG_BG3HOFS (*(volatile u16*)0x400001C)
#define REG_BG3VOFS (*(volatile u16*)0x400001E)
#define REG_BG2PA (*(volatile u16*)0x4000020)
#define REG_BG2PB (*(volatile u16*)0x4000022)
#define REG_BG2PC (*(volatile u16*)0x4000024)
#define REG_BG2PD (*(volatile u16*)0x4000026)
#define REG_BG2X (*(volatile u32*)0x4000028)
#define REG_BG2X_L (*(volatile u16*)0x4000028)
#define REG_BG2X_H (*(volatile u16*)0x400002A)
#define REG_BG2Y (*(volatile u32*)0x400002C)
#define REG_BG2Y_L (*(volatile u16*)0x400002C)
#define REG_BG2Y_H (*(volatile u16*)0x400002E)
#define REG_BG3PA (*(volatile u16*)0x4000030)
#define REG_BG3PB (*(volatile u16*)0x4000032)
#define REG_BG3PC (*(volatile u16*)0x4000034)
#define REG_BG3PD (*(volatile u16*)0x4000036)
#define REG_BG3X (*(volatile u32*)0x4000038)
#define REG_BG3X_L (*(volatile u16*)0x4000038)
#define REG_BG3X_H (*(volatile u16*)0x400003A)
#define REG_BG3Y (*(volatile u32*)0x400003C)
#define REG_BG3Y_L (*(volatile u16*)0x400003C)
#define REG_BG3Y_H (*(volatile u16*)0x400003E)
#define REG_WIN0H (*(volatile u16*)0x4000040)
#define REG_WIN1H (*(volatile u16*)0x4000042)
#define REG_WIN0V (*(volatile u16*)0x4000044)
#define REG_WIN1V (*(volatile u16*)0x4000046)
#define REG_WININ (*(volatile u16*)0x4000048)
#define REG_WINOUT (*(volatile u16*)0x400004A)
#define REG_MOSAIC (*(volatile u32*)0x400004C)
#define REG_MOSAIC_L (*(volatile u32*)0x400004C)
#define REG_MOSAIC_H (*(volatile u32*)0x400004E)
#define REG_BLDMOD (*(volatile u16*)0x4000050)
#define REG_COLEV (*(volatile u16*)0x4000052)
#define REG_COLEY (*(volatile u16*)0x4000054)
#define REG_SG10 (*(volatile u32*)0x4000060)
#define REG_SG10_L (*(volatile u16*)0x4000060)
#define REG_SG10_H (*(volatile u16*)0x4000062)
#define REG_SG11 (*(volatile u16*)0x4000064)
#define REG_SG20 (*(volatile u16*)0x4000068)
#define REG_SG21 (*(volatile u16*)0x400006C)
#define REG_SG30 (*(volatile u32*)0x4000070)
#define REG_SG30_L (*(volatile u16*)0x4000070)
#define REG_SG30_H (*(volatile u16*)0x4000072)
#define REG_SG31 (*(volatile u16*)0x4000074)
#define REG_SG40 (*(volatile u16*)0x4000078)
#define REG_SG41 (*(volatile u16*)0x400007C)
#define REG_SGCNT0 (*(volatile u32*)0x4000080)
#define REG_SGCNT0_L (*(volatile u16*)0x4000080)
#define REG_SGCNT0_H (*(volatile u16*)0x4000082)
#define REG_SGCNT1 (*(volatile u16*)0x4000084)
#define REG_SGBIAS (*(volatile u16*)0x4000088)
#define REG_SGWR0 (*(volatile u32*)0x4000090)
#define REG_SGWR0_L (*(volatile u16*)0x4000090)
#define REG_SGWR0_H (*(volatile u16*)0x4000092)
#define REG_SGWR1 (*(volatile u32*)0x4000094)
#define REG_SGWR1_L (*(volatile u16*)0x4000094)
#define REG_SGWR1_H (*(volatile u16*)0x4000096)
#define REG_SGWR2 (*(volatile u32*)0x4000098)
#define REG_SGWR2_L (*(volatile u16*)0x4000098)
#define REG_SGWR2_H (*(volatile u16*)0x400009A)
#define REG_SGWR3 (*(volatile u32*)0x400009C)
#define REG_SGWR3_L (*(volatile u16*)0x400009C)
#define REG_SGWR3_H (*(volatile u16*)0x400009E)
#define REG_SGFIF0A (*(volatile u32*)0x40000A0)
#define REG_SGFIFOA_L (*(volatile u16*)0x40000A0)
#define REG_SGFIFOA_H (*(volatile u16*)0x40000A2)
#define REG_SGFIFOB (*(volatile u32*)0x40000A4)
#define REG_SGFIFOB_L (*(volatile u16*)0x40000A4)
#define REG_SGFIFOB_H (*(volatile u16*)0x40000A6)
#define REG_DM0SAD (*(volatile u32*)0x40000B0)
#define REG_DM0SAD_L (*(volatile u16*)0x40000B0)
#define REG_DM0SAD_H (*(volatile u16*)0x40000B2)
#define REG_DM0DAD (*(volatile u32*)0x40000B4)
#define REG_DM0DAD_L (*(volatile u16*)0x40000B4)
#define REG_DM0DAD_H (*(volatile u16*)0x40000B6)
#define REG_DM0CNT (*(volatile u32*)0x40000B8)
#define REG_DM0CNT_L (*(volatile u16*)0x40000B8)
#define REG_DM0CNT_H (*(volatile u16*)0x40000BA)
#define REG_DM1SAD (*(volatile u32*)0x40000BC)
#define REG_DM1SAD_L (*(volatile u16*)0x40000BC)
#define REG_DM1SAD_H (*(volatile u16*)0x40000BE)
#define REG_DM1DAD (*(volatile u32*)0x40000C0)
#define REG_DM1DAD_L (*(volatile u16*)0x40000C0)
#define REG_DM1DAD_H (*(volatile u16*)0x40000C2)
#define REG_DM1CNT (*(volatile u32*)0x40000C4)
#define REG_DM1CNT_L (*(volatile u16*)0x40000C4)
#define REG_DM1CNT_H (*(volatile u16*)0x40000C6)
#define REG_DM2SAD (*(volatile u32*)0x40000C8)
#define REG_DM2SAD_L (*(volatile u16*)0x40000C8)
#define REG_DM2SAD_H (*(volatile u16*)0x40000CA)
#define REG_DM2DAD (*(volatile u32*)0x40000CC)
#define REG_DM2DAD_L (*(volatile u16*)0x40000CC)
#define REG_DM2DAD_H (*(volatile u16*)0x40000CE)
#define REG_DM2CNT (*(volatile u32*)0x40000D0)
#define REG_DM2CNT_L (*(volatile u16*)0x40000D0)
#define REG_DM2CNT_H (*(volatile u16*)0x40000D2)
#define REG_DM3SAD (*(volatile u32*)0x40000D4)
#define REG_DM3SAD_L (*(volatile u16*)0x40000D4)
#define REG_DM3SAD_H (*(volatile u16*)0x40000D6)
#define REG_DM3DAD (*(volatile u32*)0x40000D8)
#define REG_DM3DAD_L (*(volatile u16*)0x40000D8)
#define REG_DM3DAD_H (*(volatile u16*)0x40000DA)
#define REG_DM3CNT (*(volatile u32*)0x40000DC)
#define REG_DM3CNT_L (*(volatile u16*)0x40000DC)
#define REG_DM3CNT_H (*(volatile u16*)0x40000DE)
#define REG_TM0D (*(volatile u16*)0x4000100)
#define REG_TM0CNT (*(volatile u16*)0x4000102)
#define REG_TM1D (*(volatile u16*)0x4000104)
#define REG_TM1CNT (*(volatile u16*)0x4000106)
#define REG_TM2D (*(volatile u16*)0x4000108)
#define REG_TM2CNT (*(volatile u16*)0x400010A)
#define REG_TM3D (*(volatile u16*)0x400010C)
#define REG_TM3CNT (*(volatile u16*)0x400010E)
#define REG_SCD0 (*(volatile u16*)0x4000120)
#define REG_SCD1 (*(volatile u16*)0x4000122)
#define REG_SCD2 (*(volatile u16*)0x4000124)
#define REG_SCD3 (*(volatile u16*)0x4000126)
#define REG_SCCNT (*(volatile u32*)0x4000128)
#define REG_SCCNT_L (*(volatile u16*)0x4000128)
#define REG_SCCNT_H (*(volatile u16*)0x400012A)
#define REG_P1 (*(volatile u16*)0x4000130)
#define REG_P1CNT (*(volatile u16*)0x4000132)
#define REG_R (*(volatile u16*)0x4000134)
#define REG_HS_CTRL (*(volatile u16*)0x4000140)
#define REG_JOYRE (*(volatile u32*)0x4000150)
#define REG_JOYRE_L (*(volatile u16*)0x4000150)
#define REG_JOYRE_H (*(volatile u16*)0x4000152)
#define REG_JOYTR (*(volatile u32*)0x4000154)
#define REG_JOYTR_L (*(volatile u16*)0x4000154)
#define REG_JOYTR_H (*(volatile u16*)0x4000156)
#define REG_JSTAT (*(volatile u32*)0x4000158)
#define REG_JSTAT_L (*(volatile u16*)0x4000158)
#define REG_JSTAT_H (*(volatile u16*)0x400015A)
#define REG_IE (*(volatile u16*)0x4000200)
#define REG_IF (*(volatile u16*)0x4000202)
#define REG_WSCNT (*(volatile u16*)0x4000204)
#define REG_IME (*(volatile u16*)0x4000208)
#define REG_PAUSE (*(volatile u16*)0x4000300)
#endif
#ifndef __SCREENMODES__
#define __SCREENMODES__
#define SCREENMODE0 0x0 //Enable screen mode 0
#define SCREENMODE1 0x1 //Enable screen mode 1
#define SCREENMODE2 0x2 //Enable screen mode 2
#define SCREENMODE3 0x3 //Enable screen mode 3
#define SCREENMODE4 0x4 //Enable screen mode 4
#define SCREENMODE5 0x5 //Enable screen mode 5
#define BACKBUFFER 0x10 //Determine backbuffer
#define HBLANKOAM 0x20 //Update OAM during HBlank?
#define OBJMAP2D 0x0 //2D object (sprite) mapping
#define OBJMAP1D 0x40 //1D object(sprite) mapping
#define FORCEBLANK 0x80 //Force a blank
#define BG0ENABLE 0x100 //Enable background 0
#define BG1ENABLE 0x200 //Enable background 1
#define BG2ENABLE 0x400 //Enable background 2
#define BG3ENABLE 0x800 //Enable background 3
#define OBJENABLE 0x1000 //Enable sprites
#define WIN1ENABLE 0x2000 //Enable window 1
#define WIN2ENABLE 0x4000 //Enable window 2
#define WINOBJENABLE 0x8000 //Enable object window
#define SetMode(mode) (REG_DISPCNT = mode)
#endif
u16* theVideoBuffer = (u16*)VideoBuffer;
#define RGB(r,g,b) (r+(g<<5)+(b<<10))
int main()
{
SetMode( SCREENMODE3 | BG2ENABLE ); //Set screen mode
//int x = 10, y = 10; //Pixel location
//theVideoBuffer[ x + y * 240 ] = RGB( 31, 31, 31 ); //Plot our pixel
theVideoBuffer[10 + 10 * 240 ] = RGB( 21, 1, 21 ); //Plot our pixel
theVideoBuffer[10 + 11 * 240 ] = RGB( 21, 1, 1 ); //Plot our pixel
theVideoBuffer[11 + 10 * 240 ] = RGB( 21, 1, 21 ); //Plot our pixel
theVideoBuffer[11 + 11 * 240 ] = RGB( 21, 1, 1 ); //Plot our pixel
return 0;
}
I dont really understand the RGB function (how it works) and if its the best way to go about this. .. also why is it just a blank white screen?
#44497 - xyuri - Thu Jun 02, 2005 8:26 am
aaaah ... finally .... I got a pixel ! *w000000000t* Its a start right ;-)