GBA的VRAM总共96KB,在mode3-5中,VRAM跟计算机的显示内存一样.屏幕上一个点对应一个显示内存地址.
可以看看下面两个函数,都是在mode4下的写点函数.
void PlotPixel(int x,int y, unsigned short int c)
{
m_VideoBuffer[(y) * 120 + (x)] = (c);
}
void SetPixel(int x,int y,u8 color)
{
register u16 *tc;
tc=m_VideoBuffer+y*120+x/2;
if(x&1)
*tc=((*tc&0x00FF)+(color<<8));
else
*tc=(*tc&0xFF00)+color;
}
由于GBA支持的最小数据传输单位为16位,而16位在mode4(256色)下为两个点的信息.
所以上面的PlotPixel是对两个点的写法.而SetPixel是通过一些简单的位移运算来实现对单个点的写入.
特别指出的是一个VRAM里的u16的值低8位对应的是前面的点,高8位对应的是后面的点.
说了这么多mode4的,下面看看GBA最精彩的部分mode0-2
设置REG_DISPCNT这个寄存器
不说多了,它就是指定你要显示的模式和支持的BG.
比如看这个的语句:
*(vu16 *)REG_DISPCNT = DISP_MODE_1 | DISP_BG0_ON ;
这段语句就是说让GBA支持MODE1的显示模式,并支持BG0
当然你也可以
*(vu16 *)REG_DISPCNT = DISP_MODE_1 | DISP_BG0_ON | DISP_BG1_ON |DISP_BG2_ON;
但是你不能把BG3也加进来.因为mode1只能支持BG0,BG1,BG2.
mode0-2都是运用tile(图块)先来组成整个屏幕的.
而mode0-2每个都有不同的BG
一个屏幕可以由多个BG组合显示出来.比如你可以安排地面为一个BG,天空为一个BG等等.
每个BG对应一个寄存器
Text BG:就是不能旋转的,似乎只能使用16色.当然,如果使用16色的调色板,当然可以使用最多到16个调色板.
Rotation BG:就是可以旋转的,放大的.只能使用256色.如果使用了256色的调色板,就不能使用16色的调色板了.因为GBA的BG调色板就只有256x2=512那么大.
再看看不同模式下的BG分配
mode 0: 4个Text BG
mode 1: Text BG: BG0 BG1
Rotation BG: BG2
mode 2: Raotation BG: BG2,BG3
接下来就看看控制这些BG的寄存器:
1.Text BG
在AgbLib任天堂提供的官方开发包里面是这么写出它的寄存器
#define REG_BASE 0x04000000 // Registers
#define REG_BG0CNT (REG_BASE + 0x8) // BG 0 Control
#define REG_BG1CNT (REG_BASE + 0x8) // BG 1 Control

2.Rotation BG
在