GBA探索日记(-) (转)

GBA探索日记(-) (转)[@more@]

GBA探索日记(-)XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

mode0-2的BG与VRAM

 

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

.NET/develop/article/images/16428_1.jpg" align=baseline border=0>2.Rotation BG

在AgbLib任天堂提供的官方开发包里面是这么写出它的寄存器

#define REG_BASE  0x04000000  // Registers

#define REG_BG2CNT  (REG_BASE + 0x8)  // BG 0 Control

#define REG_BG3CNT  (REG_BASE + 0x8)  // BG 1 Control

Poriority是指的是显示的优先权.

0最高,4最低.

再看看关于BG大小的问题.
Screen Size Setting  Text Screen    Rotation/Scaling Screen 
  Screen Size  Screen Data Screen Size  Screen Data 
00    256×256    2 Kbytes 128×128    256 Bytes 
01    512×256    4 Kbytes 256×256    1 Kbyte 
10    256×512    4 Kbytes    512×512    4 Kbytes 
11    512×512    8 Kbytes    1024×1024   16 Kbytes 


为了显示一张BG.
你可以通过AgbLib中提供的bmp2map.exe来把一张bmp文件转换成GBA可以用的BG数据.
BG数据分三块.
1.Character Data
前面已经说了.mode0-2下的GBA屏幕是由图块组成的.这些图块都是8x8大的.
这些图块有些人把它叫做Tile,也有些人把它叫做Character(AgbLib里面就是这么叫的).
这些数据就是保存这些8x8图块的图象数据的.
Character Data最大能有256个.因为16KB = 16384 bytes =256*8*8
有些图片转换器不能提示这个最大限制,比如kaleid,即使你的bmp包含超过256个Character,但是它还是依旧给你转换,但是一旦在GBA程序里运行就会出现错误.所以建议使用AgbLib中的bmp2map.exe这个转换工具.
2.Map Data
Map Data可以说是图块的引索.它是记录Character Data的在屏幕中的排布的数据.
3.Palatte Data
这个不用说了,就是调色板

在显示一张BG前,应该把上面的上部分数据传输到GBA内存中.
看看下面的代码吧:
DmaArrayCopy(3,e1_Character, BG_VRAM, 32);
DmaArrayCopy(3,e1_Map, BG_VRAM+0x8000, 32);
DmaArrayCopy(3,e1_Palette, BG_PLTT+32*2, 32);

DmaArrayCopy是个数据传输的函数.当然,你也可以使用for(...)一个字节一个字节地写.但是GBA里有3个DMA通道(就是不经过cpu,专门用来传输大量数据的专线),它应该是就像memcpy那样的功能,它的传输速度比memcpy快得多.
上面的代码就是将e1图像文件Character,Map,Palette传输到GBA中对应的内存.
特别指出的是在使用16色的调色板的时候,你如果用bmp2map.exe来转换.那么就要注意这个程序中-p这个参数.它指出了这个Map用的哪个Paletee.比如我上面的那个e1的BG就是使用了-p2,即使用的第2个调色板.那么它在GBA中对应的内存地址应该是BG_PLTT+32*2(16色的调色板总共占32个字节).
你可能要问BG_VRAM,BG_PLTT是什么.
#define PLTT  0x05000000 
#define BG_PLTT  (PLTT +  0x0)
#define VRAM  0x06000000 
#define BG_VRAM  (VRAM +  0x0)
它们其实就是VRAM,Palette在内存中的指定位置.
Map Data,Character Data都是放在VRAM中的.
在mode0-2中,VRAM被分成许多Block,每个2KB(0x800).Character Data比较大一点,它一个要占8个Block(16KB).Map Data比较小一点,它一个占一个Block.
还是看看这张十分有用图片


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-993410/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-993410/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值