GBA程序开发入门3

原创 2003年06月13日 17:07:00

下面我将一一讲解上篇的程序

前三行:

typedef unsigned char u8;

typedef unsigned short u16;

typedef unsigned long u32;

定义GBA程序自己的数据类型,因为这样我们就很容易知道每个数据在GBA中占的字节数.

#define REG_DISPCNT *(u16*)0x04000000         // 显示寄存器地址

REG_DISPCNT是设置显示模式的寄存器.GBA中有mode0-mode5六个显示模式.我们这个程序的显示模式是mode4,也就是240x1608位色(256)的双缓冲显示模式.比如mode3,就是240x16016位真彩色的单缓冲显示模式.

#define VRAM 0x06000000                         // 图像缓冲区地址

#define PALETTE 0x5000000                      // 调色板地址

VRAM就是GBA的显示内存,简单地说VRAM中的数据就是屏幕上的图象.跟我们的平常用的计算机一样的.PALETTE就是调色板地址,简单地说就是装图像调色板的地方.

#define MODE_4 0x04                                // mode4标志

#define BG2_ENABLE 0x0400                      // BG_2标志

MODE_4BG2_ENABLE都是设置REG_DISPCNT的值.

我们再看看main函数主要做了些什么.

首先是SetMode (MODE_4 | BG2_ENABLE); 把显示模式设置成mode_4.然后是执行Draw函数,把我们刚刚转换的helloworld.h里面的图像数据和调色板数据复制指定的内存去.Draw这个函数里面,都是使用了for循环一个一个地把调色板数据和图象数据复制到内存中去的.

 

前面提到过,GBAMODE4支持的是240*160并且256色的显示方式,那么显示内存VRAM中一个字节就对应屏幕上的一点的颜色.这么算来,整张240*160大小的屏幕就应该有240*160=38400个字节.所以我们在helloworld.h中的helloworld_gfx38400/2=19200个元素(一个u16是占两个字节).而且我们还可以通过公式来计算得到屏幕中一点对应在VRAM的地址.这样就可以得到下面的写点函数.特别指出的是,对于VRAM的访问只能是u16大小的数据类型,而不能是u8(包括char).而一个u16类型的数据表示着两个点的信息,8位对应的是前面的点,8位对应的是后面的点. 所以我们需要一些算法来实现对屏幕中单独一个点的读写,请看下面的写点函数

 

void SetPixel(int x,int y,u8 color)

{

       register u16 *tc;

    tc= video_buffer+y*120+x/2;

       if(x&1)  // 如果x是奇数

              *tc=((*tc&0x00FF)+(color<<8));

    else

                  *tc=(*tc&0xFF00)+color;

 

}

其中video_buffer就是显示内存VRAM的地址.屏幕上的点与VRAM中的值是按线性一一对应的.VRAM中第1个字节的信息就是屏幕中(0,0)这个点的颜色在调色板上的引索,第2个字节就是屏幕(1,0)的颜色信息,第3个字节就是(2,0)的颜色信息,一次类推.到第241个字节就是屏幕(0,1)的颜色信息.然后第242就是(1,1)的信息...由此关系,我们可以找出公式,在屏幕上(x,y)点的信息应该是储存于VRAM中第 y*240+x 个字节里,那么我们如果要画(x,y)这一点,就只需要修改VRAM中第y*240+x个字节的信息就OK了.可是这里又有个问题困扰着我们,那就是上面黑体字写的,GBA中对于VRAM的访问不能是单单的一个字节的访问,而必须是16位两个字节的访问.这也就是说你每次写点的同时会影响到旁边的点的信息.还好,我们可以通过简单的位运算可以在避开影响旁边点的同时,完成对(x,y)的写点工作.代码已经在上面了.由于*tc是16位的指针,所以tc加1就等于移动了16位两个字节的距离.所以在代码中,tc=video_buffer+ y*120+ x/2 而不是前面所说的tc=video_buffer+ y*240 +x.至于后面的代码我也就不多讲了,如果你觉得有问题,那么应该去查看一下C语言书籍.

 

通过这个函数,你就可以在屏幕上画线,画圆,画矩型等,甚至还可以写汉字.

 

 

4.更多的资料和信息

 

GBA上的mode4下第一个程序虽然做出来了,但是想要真正地做GBA开发那还远远不够的.GBA里面支持Bg(Background)背景,OBJ(Object)精灵等东西,那些才是GBA游戏中常用的技术.通过Bg和OBj才能进一步使用GBA硬件上的Alpha混合,Face in/out,马塞克等特效支持.可惜我不可能在这里把这些东西都详细讲解出来.你可以到www.gpgame.net网站上找到我写的十分详细的GBA资料,名字叫做GBA探索日记.同时也可以到www.gbadev.org去查看许多国外的教程.www.gbadev.org是个十分齐全的GBA开发网站,你可以在上面找很多国外的朋友写的demo,开发工具,源代码,文章等等.虽然目前国内还没有正式的GBA开发网站,但是可以到http://www.wodenstar.com/cgdn/bbs/index.php 论坛上找到很多已经在做GBA开发的朋友.在这里我要提醒大家的是,开发GBA程序其实是很简单的事情,困难的是资料的缺乏,尤其是中文资料.最后我把我的联系方式告诉大家,如果大家在做GBA过程有什么问题,希望我能帮上你.QQ:8664220,email:tangl_99@sohu.com,msn:tangl_99@hotmail.com

GBA编程和汉化常用软件汇总

内容来自GBA吧中的痴狂小黑,本人只是做个汇总和搬运。 1.简易图片导入导出套装(PicSimpleImEx & AutoPicRock)Ver1.0 这两个软件是用C#写的,想要用,先装...
  • u012260499
  • u012260499
  • 2016年10月19日 10:33
  • 536

自己动手丰衣足食-自己动手修改GBA ROM游戏文件

经过一天的努力终于琢磨出怎么修改GBA的游戏文件也就是俗称的ROM文件,起因是因为偶然看到二手GBM,顿时抑制不住买了一台,可惜买得晚了,完美运行游戏又带金手指功能的烧录卡买不到了。SUPERCARD...
  • l198738655
  • l198738655
  • 2017年03月21日 12:06
  • 3161

linux强大的游戏模拟器--GBA

Linux强大的游戏模拟器,模拟的效果以及CPU的占用都非常低,主要是用来玩GBA和FC的游戏,玩GBA游戏比Linux版VBA强的不是一点半点,Linux版VBA可以说就是一个半成品,不说功能方面,...
  • qinxiongxu
  • qinxiongxu
  • 2013年01月31日 21:50
  • 8388

教程 修复GBM和GBA SP的耳朵键(LR键)(NDS系列通用)(不需要焊接)

相信大家都遇到GBA或NDS耳朵键(L或R键)失灵的情况。这个故障在任天堂掌机里算非常常见的故障。楼主有一台GBM和一台GBA SP,前段时间耳朵键都有个失灵了,十分不爽。自己网上搜索了半天,找到了这...
  • shallen320
  • shallen320
  • 2015年04月28日 10:55
  • 1968

黑莓Q10 bb10 系统 gba等模拟器 retroArch全教程

先看最终成果 这是之前在发掘黑莓原生软件的时候无意中找到的好东西 retroArch是什么 是一个集合了很多模拟器的模拟器,支持的模拟器内核很多,我已经亲测FC,GBA等等都可以完美运行 ...
  • sinat_18497785
  • sinat_18497785
  • 2016年10月21日 16:30
  • 5673

(转载)Halcon学习(二十一)摄像机标定常用函数(二)

1.read_cam_par( : : CamParFile : CameraParam) 从文件夹中读取相机的内参数。 2.disp_caltab( : : WindowHandle...
  • u013404374
  • u013404374
  • 2015年07月18日 14:39
  • 472

GBA游戏卡带的几种记忆类型

转自maxzhou88:http://tieba.baidu.com/p/1513244819 由于没有全面找到原装的GBA卡带,所以我一直没有真正见过不同记忆类型的GBA游戏卡。非常感谢一...
  • lrb2010
  • lrb2010
  • 2013年05月23日 18:29
  • 1329

GBA模拟器 My Boy!的远程连接-wifi连接联机教程

因为有些平板没有蓝牙,所以写了这个教程 有些人不会用,所以。。。 例如两台手机,  A手机和B手机 在A手机里打开“系统设置”-“无线和网络”-“绑定和便携式热点”,然后用户名和密码随便设置{不设置也...
  • hdfg159
  • hdfg159
  • 2013年08月28日 21:02
  • 3764

NESASM教程——第一天——开始NES汇编

关于NES汇编: 我的天,你正准备学习
  • kkk584520
  • kkk584520
  • 2014年11月09日 15:17
  • 1715

有关The Last Promise的汉化①<国外高手的FE7 hack版>

这里就不多说什么了,博客了有一篇详解找字库的文章,这里我就大致的分析The Last Promise的程序 ①下断点,找到此断程序, 注:此段程序与烈火之剑的中文版有很大的不同,仔细分析一下.不过显...
  • u012718252
  • u012718252
  • 2013年11月06日 12:40
  • 1215
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GBA程序开发入门3
举报原因:
原因补充:

(最多只允许输入30个字)