您现在的位置: 电玩巴士 >> GBA >> 掌机学院 >> 掌机开发 >> 文章正文

GBA探索日记(一):mode0-2的BG与VRAM

GBAVRAM总共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

[1] [2] [3] [4] 下一页

相关文章:
【编辑:admin】  【文章来源:tangl_99 金点时空】  【更新时间:2004-12-31 4:05:04】
巴士全站中的精华
24小时热点推荐
我们向您隆重推荐的内容