分享
 
 
 

GBA探索日记(-)

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

GBA探索日记(-)

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

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.

还是看看这张十分有用图片

Character Base Block的值为0-3

Screen Base Block(就是装Map Data的)的值为0-31

当然,不能让他们重复,否则先写的数据就被覆盖了.

再看看设置BG的寄存器的代码吧:

#define TEXTBG_SIZE_256x256 0x0

#define TEXTBG_SIZE_256x512 0x8000

#define TEXTBG_SIZE_512x256 0x4000

#define TEXTBG_SIZE_512x512 0xC000

#define ROTBG_SIZE_128x128 0x0

#define ROTBG_SIZE_256x256 0x4000

#define ROTBG_SIZE_512x512 0x8000

#define ROTBG_SIZE_1024x1024 0xC000

DmaArrayCopy(3,e1_Character, BG_VRAM, 32);

DmaArrayCopy(3,e1_Map, BG_VRAM+0x8000, 32);

DmaArrayCopy(3,e1_Palette, BG_PLTT+32*2, 32);

*(vu16 *)REG_BG0CNT =

BG_COLOR_16 | TEXTBG_SIZE_256x256 | BG_PRIORITY_0

| 16 << BG_SCREEN_BASE_SHIFT | 0 << BG_CHAR_BASE_SHIFT;

你对应前面的图看看.

16是Screen Base Block的值,0是Character Base Block的值.

0x8000就是Base Block 16的对应偏移址,0是Base Block 0的对应偏移址

GBA硬件上对有很多对BG处理的支持,比如旋转,移动,放大,Alpha,马塞克.

我们先看看BG的移动.

这同样也是通过对GBA的寄存器的写入来实现的.

在BG2(Rotation BG)中有两个寄存器控制它的位置.REG_BG2X,REG_BG2Y

还是看看它们的定义

#define REG_BASE 0x04000000 // Registers

#define REG_BG2X (REG_BASE + 0x28) // BG 2 Start X Coordinate

#define REG_BG2Y (REG_BASE + 0x2c) // BG 2 Start Y Coordinate

它们是只能写的寄存器,你可不要去读它们,否则读不出来什么有用的数据的.

但是你可以去写它们:

s32 x=10<<8;

s32 y=10<<8;

*(s32 *)REG_BG2X=x;

*(s32 *)REG_BG2Y=y;

需要记住的它们都是32位的数据,而且是有符号的.

x增大,BG向左移,x减小,BG向右移.

y增大,BG向上移,y减小,BG想下移.

当x或y每改变256,BG移动1个像素.

所以上面的x,y都使用了<<8

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有