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

GBA探索日记(-)相关推荐

  1. 掌上游戏机开发指南GBA探索日记(9)(转)

    掌上游戏机开发指南GBA探索日记(9)(转)[@more@] 这一节我们讨论如何正常结束声音播放的问题.不要觉得这是个小问题,当初这个小问题难倒了我们所有研究GBA的爱好者.我总觉得这一点似乎是GBA ...

  2. Mac2019-XcodeVS安装指南_建立C探索日记

    本篇非技术帖,以下为内容提要: 1.#Xcode2019&VS安装指南 2. #Xcode2019menu中英版(note) //先表明我是个只会粗暴点安装键的人,跌跌撞撞终于安装成功? 以下 ...

  3. GBA程序开发入门3

    下面我将一一讲解上篇的程序 前三行: typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; ...

  4. 值得回忆的本科四年学习

    1. 加入金点工作室 来到成都已经快四年了,在川大也已经学习了四年,本科的学习就这么结束了.这四年来发生在我自己身上的事情实在太多了,琐事虽然可以不再提,但是这四年来改变我一生的那么多事情我觉得还是有 ...

  5. 值得回忆的本科四年学习(1-6)

    值得回忆的本科四年学习 1. 加入金点工作室 来到成都已经快四年了,在川大也已经学习了四年,本科的学习就这么结束了.这四年来发生在我自己身上的事情实在太多了,琐事虽然可以不再提,但是这四年来改变我一生 ...

  6. 自定义拍照时 拍照界面_满地金黄!正是拍照打卡时

    原标题:满地金黄!正是拍照打卡时 时值深秋,乐山城区老霄顶.滨江路中段等等种植了银杏的路段,颜色每天都在变幻,美不胜收.乐山还有哪些地方可以欣赏到金黄的银杏?11日,记者打探到这些美美的银杏林,揣好这 ...

  7. 人工智能小白日记 语音情感分析探索之2 CNN相关及实验

    人工智能小白日记 语音情感分析探索之2 CNN相关及实验 前言 正文内容 1 关于CNN 2 在tensorflow上搭建CNN 2-1 CNN MNIST分类器 2-1-1 输入层 2-1-2 卷积 ...

  8. GBA MOD音乐播放探索!

    这是一篇老文章了,最早放在CGDS上. GBA MOD音乐播放探索  写在前面  我并不是搞音乐的,甚至五音不全,仅仅是为了能在GBA上播放MOD音乐,我进行了一些学习,  找了大量资料后,基本有一个 ...

  9. 用计算机探索规律数学周记,关于数学日记合集六篇

    关于数学日记合集六篇 数学日记 篇1 地球妈妈用她丰富的资源养育了无数儿女,我们幸福的沉浸在地球妈妈那用之不尽的资源中.可是,换个角度看看,现在的儿女们长大了,为了自身的利益,却将她侵蚀得体无完肤.当 ...

最新文章

  1. Dependence Injection
  2. Mvc 页面缓存 OutputCache VaryByCustom
  3. Json-转自菜鸟教程
  4. 疫情之下网络安全如何保障?Akamai防护方案前来“保驾护航”
  5. HTML+CSS+JS实现 ❤️爱心文字3D旋转动画特效❤️
  6. php微信网页开发实现自动登录注册功能实例
  7. ARMv8体系结构基础03:加载和存储指令
  8. jquery通过ajax方法获取json数据不执行success
  9. WebView的详细讲解
  10. P-Called-Party-ID头域
  11. 转:: 刺鸟:用python来开发webgame服务端(5)
  12. JavaSE项目——嗖嗖移动大厅(详细注释,java基础知识基本上都包含了)
  13. Dtop环球嘉年华全球Web3.0分布式私域电商生态发展峰会圆满举办
  14. U盘图标不显示(转)
  15. eve-ng模拟器安装在部署使用
  16. 【杂谈】360极速浏览器本地收藏夹的文件在哪里?
  17. 用户选择好用的投票小程序最有用的投票小程序微信推送里投票制作教程
  18. 常用算法解析------二分法
  19. VUE的两种跳转push和replace对比区别
  20. Java后端--67--Springboot的响应式编程

热门文章

  1. html5 圆圈扩散,CSS3地图动态实例代码(圆圈向外扩散)
  2. 【视频分享】尚硅谷HTML5前端视频_Vue核心技术视频
  3. 汕尾市海陆丰民间开胃小食摘录
  4. 系统里能看服务器型号,操作系统如何查看服务器型号
  5. Hadoop/Spark集群搭建图文全攻略
  6. 习题3-5 三角形判断 (15 分)-PTA浙大版《C语言程序设计(第4版)》
  7. 微信分享连接个别手机、ios转发不显示图片的,缩略图不出来
  8. 电脑电池出场容量与目前最大容量查询查询
  9. 站长如何打造个人品牌
  10. 解决把一篇word文档复制到另一篇word文档时, 更改标题格式