前段时间用C#写了一个光线追踪程序,可以渲染圆球,平面这种基本图形,反射,光照,阴影,都大致尝试做了一下。
↑ C#实现的光线追踪
↑ GBA上C实现的光线追踪
然而,在我打算继续深入优化的时候,我失去了我的好帮手强强电脑,换成了超极本。看来继续做技术密集型光线追踪是不行的了。就在这时,我看到了一些GBA的开发文章,我又刚好有一台GBA,于是我产生了一个大胆的想法——在GBA上实现光线追踪。GBA架构清晰简明,入手门槛低,而且还有一个官方的编程指南,很适合我这种人折腾。
旧版GBA
在写程序之前,我要先花点时间了解GBA。GBA(Game Boy Advance)是任天堂2001年的推出的彩色游戏掌机,它的前身是黑白掌机GB。
GBA有一个16位色深,240x160的液晶屏幕,初代无背光。
它有一个频率为16.78Mhz的32位RISC类型的CPU(ARM7TDMI)。虽然和现在的几GHz的处理器比起来实在太低,但只要使用得当,还是可以做出很多东西的。
除此之外,它机身的内存有两部分,一个是32KB的内部工作内存,还有一个256KB的外部工作内存。这两个内存都是掉电数据就没了的ROM。插入机身的游戏卡容量最大32M,游戏卡大部分内存是只读的,但一部分可擦写储存游戏存档。
详细的功能和GBA的运行原理我就先不讲了,我们从最迫切的配置开发和编译的环境开始,之后再慢慢介绍功能。
本来我想直接从写代码开始讲的,但是现在网络上GBA的中文资料很少,而GBA简单的硬件又很适合学习系统底层和嵌入式开发,所以我还是详细的讲述我了解到的所有知识,希望能吸引更多人了解并入门GBA编程。
更好的教程:TONC教程:建立开发环境
开发前的准备
Windows系统的电脑,因为我只有这个。
GBA主要使用C语言,虽然也许能找到C++编译到GBA的编译器,但GBA上运行的是裸机代码,C速度快,也适合和底层交互。因此要想玩好GBA,要熟悉C语言,了解系统底层原理,不过即使不太会也没关系,我也不会,用着用着 踩多几个坑就熟悉了。
为了方便测试,当然要有一个GBA的模拟器,这样就不用每次都把程序放到真机上运行了。我推荐mGBA,这是一个新开发(2013年)的模拟器,开发它的人希望兼顾准确性和速度。它不仅可以显示地图,精灵,调色板,还可以使用GDB调试(虽然我还不会)
如果你想在真机上运行,可以采用两种方法。1、使用flash烧录卡,将程序写入到烧录卡里就可以插入到GBA上运行。但烧录卡一般比较贵,即使是GBA完全不流行的现在也要150~1000元。2、使用multiboot线,直接把程序送到机子256kB的内存里,不用插卡就能运行。这其实是利用了GBA多人连线游戏的功能,这个功能可以让一台机子通过连接线把小游戏发给其他机子,这样大家就可以一起玩小游戏了。我们通过把电脑假装成一台主机,就可以实现传输自己的程序。这种特制线一般买不到,需要的话可以自制,不太难成本也低。
要用什么编译器?
对于这种嵌入式的开发,最重要的是要有一套工具链。工具链是指编译器、连接器、解释器和调试器这些组成的一套工具,它可以把我们的代码编译成在特定机器上运行的机器代码。不同的机器的工具链一般不通用,例如ARM公司就提供了它自己的产品的工具链。
ARM的官方编译器
GBA用的就是ARM的CPU,因此可以从ARM那里找到工具链,但是时代久远,有点难找,而且可能是收费的。
gcc编译器
除此之外我们可以使用gcc的编译器,gcc是免费开源的编译器,是开源计划里的重要组成部分,这个东西大概程序员都知道,程序员们希望世界上所有程序都是开源的,可以自由修改,于是他们一起做了一个开源的编译器(gcc),然后通过编译器做了开源的系统(linux),然后在系统上写了开源的软件。一般的gcc是编译到linux的,但也有编译到ARM的gcc-arm。我们只需要针对GBA配置一个就可以了,当然我不会,不过一些GBA爱好者已经为我们做好了。
DevKitAdv:这个比较旧,需要使用.bat脚本管理编译。
devkitPro:整合了多个游戏机的工具链,支持GBA,NDS,PSP,NS等,可以按需下载,有这个新的就没必要用旧的了。这个工具内有一些makefile模板,可以使用makefile方便的管理要编译的内容,输入make就可以编译,很有了解的必要。
这些工具链中也提供了用于GBA的库libgba,包含了常用类型和数学运算库,内存操作,中断系统等一些常用的功能。
安装工具链
我这里介绍devkit Pro的安装:
去论坛里下载devkit Pro的Windows安装包,名称是devkitProUpdater,选择安装位置(建议C盘根目录),点选需要的组件(GBA),之后就会开始联网下载。
选择devkitPro组件
安装之后打开安装目录,看看包含什么:
devkitARM:这就是工具链
examples:示例文件,里面有图像、音频演示,xboo连接线项目,还有一个空的项目模板。
libgba: devkitPro的GBA库;
libtonc:tonc教程的作者写的GBA库。
tools:一些小工具,例如修复rom头部,图像转换。
sys2等一些安装文件。
测试工具链
现在来测试能不能正常使用工具链。
打开examples->gba->graphics->SimpleBGScroll,在这里打开cmd(shift+右键菜单)(win10下是powershell)
在cmd下输入 make ,看看有没有编译出一个build文件夹和.gba的rom文件。
成功编译的输出
如果成功了,恭喜你,可以开始写代码了!
错误的解决方法
如果有错误,我这里列出了2种可能的原因:
1、cmd/PowerShell的目录地址不在 \divkitPro\examples\gba\graphics\SimpleBGScroll。
2、make指令是调用工具链里make.exe,如果没有添加Path,系统会找不到这个程序。
打开环境变量的窗口,检查是否已经配置了变量。正常情况下,应该有四个:1) 在Path里的“c:\devkitPro\msys2\usr\bin”,2) 名称为DEVKITARM的“/opt/devkitpro/devkitARM”,3) 名称为DEVKITPPC的“/opt/devkitpro/devkitPPC” ,4) 名称为DEVKITPRO的“/opt/devkitpro”。
如果检查无误还是不行,可以试试卸载重装orz
配置开发环境
我也不知道怎么配置一个既可以一键编译,又可以进行调试的开发环境。我只能介绍一下我摸索出来的勉强能用的方法。
我使用的是VisualStudio 2019,好像很多人觉得vs不适合嵌入式和Linux开发,但我vs用惯了,能不换就不换。vs2017后加入了Linux的开发组件,我觉得还是很好用的。如果你使用的不是vs,可以直接看文章末尾的TONC教程和附录里的其他方法。
首先我们需要安装VS2019的c/c++开发组件,还有Linux开发组件(为了可以建立makefile项目)
安装完成之后启动vs,新建一个makefile项目(翻译为生成文件项目)。
之后我们需要在项目属性的NMake里设置include文件的位置和make等命令。
包含搜索路径 设置为 /divkitPro/libgba/include和/libtonc/include的地址。
生成命令行 输入 make
最后一步,我们到devkitPro的examples里把示例文件的makefile复制到我们的项目根目录下。
生成
如果源文件里已经有main.c了,现在按生成->生成*你的项目名称* 或者Ctrl + B 应该就可以编译代码生成.gba文件了。
新建源文件
之后如果我们要新建一个源文件,在解决方案资源管理器的源文件里新建项,名称为xxx.c ,后缀为c,目录为项目里的/source
新建头文件
解决方案资源管理器的头文件里新建项,选择.h文件,并新建一个include文件夹。如果新建了include文件夹,要记得把这个文件夹地址加入项目的包含搜索路径。此外我们还要修改添加makefile里的include路径,不然编译器不知道。
由于makefile已经写好了模板,所以我们只需要在INCLUDES := 后面写include,他就会自动识别为项目目录/include。如果项目目录里有多个include文件夹,可以在include后加空格,再写名称。
makefile模板里有3处include地址:
1、我们写的 INCLUDES := xxx ,是项目目录里的。
2、devkitPro自带的两个库里的include
3、项目编译后产生的Build目录
到这里应该已经介绍完配置环境的问题了,之后要学的就是如何编程使用GBA上的硬件。在下一篇文章之前,我先推荐一些对学习GBA编程很有帮助的内容。
开发资料推荐
GBA编程手册。这个好像是官方的手册,中文版翻译到第六章就没了。里面说明了GBA的硬件和功能,相当于GBA的说明书,应该是最有用的资料。
GBA教程TONC。非常全面,很有深度,但有些地方难度也比较大。这个教程也讲了如何配置环境,包括visual c++ 和 NP2编辑器的配置。此外还讲了makefile的原理和编写方法。(可惜中国打不开)
GBA开发网站。存了很多开发的软件和资料,还有别人做好的游戏。
下一篇文章我会再讲讲GBA的硬件和基本运行原理,之后就开始写光线追踪程序。
如果有机会我会再写一篇文章讲讲如何调试GBA程序。
附录
原文地址:https://www.cnblogs.com/h5l0/p/11602879.html