// Here is some simple type defs for the code
typedef unsigned short Uint16;
typedef unsigned int Uint32;
typedef Uint16 Color;
#define MEM_IO 0x04000000
#define MEM_VRAM 0X06000000
// Video Modes
// These are tiled modes
#define VID_MODE0 0
#define VID_MODE1 0x0001
#define VID_MODE2 0x0002
// These are bitmap modes
#define VID_MODE3 0x0003 // 240x160 16 color no page flipping
#define VID_MODE4 0x0004 // 240x160 8 color page flipping
#define VID_MODE5 0x0005 // 160x128 16 color page flipping
// These are additional mode for background stuff
#define VID_BG0 0x0100
#define VID_BG1 0x0200
#define VID_BG2 0x0400
#define VID_BG3 0x0800
// More mode later
#define VRAM ((Color*)MEM_VRAM)
#define VID_CNT *(Uint32*)(MEM_IO+0x0000)
#define RGB15(r, g, b) (r | (g<<5) | (b<<10))
int main() {
//*(unsigned int*)0x04000000 = 0x403;
VID_CNT = VID_MODE3 | VID_BG2;
//((unsigned short*)0x06000000)[120+80*240] = 0x001F;
VRAM[120+80*240] = RGB15(31, 0, 0);
while(1);
return 0;
}
A lot more readable isn't it. Its still quite simple though. Like before it using video mode 3 on background 2. And it still colors a pixel red at 120x80. Still quite simple. But it looks nicer.
Now as you can see the gba has 6 different vid modes. The first 3 are tile mode. These mode do hardware accelerated tile-mapping. Most gba games use these 3 mode because they are extremely quick (NOTE: gba was built from the ground up for 2d games not 3d so the hardware was built specifically to speed up 2d apps. Its possible to do 3d on the gba if you don't mind software rendering which really suck. )
The mode I'll show here for now is bitmap mode which isn't really built for games unless you are doing a doom type game using ray casting. But its easier than the tile modes when starting out.
Enough chit chat more demo. This demo is still boring and not real fun at all. Its just a damn red dot in the middle of the screen. Lets try a simple yet kind of cool effect.
// Here is some simple type defs for the code
typedef unsigned short Uint16;
typedef unsigned int Uint32;
typedef Uint16 Color;
#define MEM_IO 0x04000000
#define MEM_VRAM 0X06000000
// Video Modes
// These are tiled modes
#define VID_MODE0 0
#define VID_MODE1 0x0001
#define VID_MODE2 0x0002
// These are bitmap modes
#define VID_MODE3 0x0003 // 240x160 16 color no page flipping
#define VID_MODE4 0x0004 // 240x160 8 color page flipping
#define VID_MODE5 0x0005 // 160x128 16 color page flipping
// These are additional mode for background stuff
#define VID_BG0 0x0100
#define VID_BG1 0x0200
#define VID_BG2 0x0400
#define VID_BG3 0x0800
// More mode later
#define VRAM ((Color*)MEM_VRAM)
#define VID_CNT *(Uint32*)(MEM_IO+0x0000)
#define RGB15(r, g, b) (r | (g<<5) | (b<<10))
#define M3_WIDTH 240
int main() {
int i, j, c = 0;
VID_CNT = VID_MODE3 | VID_BG2;
for(i = 0; i < 240; i++) {
for(j = 0; j < 160; j++) {
VRAM[i+j*M3_WIDTH] = RGB15(i, j, c);
}
c++;
}
while(1);
return 0;
}
This code produces something like this...
I did this because it looks cool :D. Try rearranging the simple source code and see what type of crap you can load on the VRAM. What the code is doing btw is it looping through the width and the height of the gba's screen then it changes the color of the pixel using the i, j and c variables. i sets red, j sets green and c sets blue during the loops life time. So it produces a really cool effect. Oh well I'm getting tired need sleep, night.
Links for the demos
Demo 1
http://www.filehosting.org/
Demo2
http://www.filehosting.org/
No comments:
Post a Comment