GBA上的推箱子程序

作者:杨超

本文地址:http://sokoban.ws/blog/?p=678

GBA是日本的任天堂公司于2001年3月发行的一款掌上游戏机。国庆在老家翻出了我十年前手抄的GBA硬件技术文档和GBA使用的ARM7tdmi微处理器的指令和汇编语言技术文档。那是我在2002年大三暑假的时候对着电脑上的PDF文件抄的,抄这玩意大概花了我一个月的时间。当时抄的目的只有一个,就是为了写一个在GBA上运行的推箱子程序。

之所以有写一个GBA上的推箱子程序的想法,主要有那么几个原因。一是当时我有一部GBA,二是从同学JimmyZ那里弄到一个基于gcc的GBA开发包DevKitAdv,三是我对推箱子莫名的喜爱,在那之前已经写过一个Windows下的推箱子程序了。

虽然我费了很大力气抄写了技术文档,但最终用到的却不多。因为GBA是没有操作系统的,程序直接运行在硬件上,所以对我来说还是有比较多新奇的东西。如检查按键可以直接读取某固定地址的内存。下面代码判断A和L键是否同时按下。

#define REG_P1         *(u16*)0×4000130
#define KEY_A 1
#define KEY_L 512

short int key=REG_P1;
if( (key & KEY_L)==0 && (key & KEY_A)==0 ) {…}

对显存的操作要复杂一些,十年之后我扫了几眼源代码还是不能明白个大概。显存主要支持背景和小精灵(sprite)等面向2D游戏的功能。

经过一番努力,先是在当年的8月底成功编写出一个可以在模拟器上运行的推箱子程序,用的时间似乎比抄技术文档的时间还少。我主要用VisualBoyAdvance来测试。

再过了几个月,有了烧录卡之后,在GBA真机上也成功运行了。GBA在运行一个卡带之前,要先CRC验证,若验证不对则终止运行,而模拟器往往忽略这个验证。所以要在真机上运行,还要用一个工具把正确的CRC写到二进制文件的恰当位置。我当时编译使用的批处理文件如下,其中GBARM就是用来计算并写入CRC的。

path=C:\devkitadv\bin
gcc  -o skb.elf skb.cpp  -lm
objcopy -O binary skb.elf skb.bin
GBARM -v skb.bin

因为我在编程过程中对显存的操作不够合理,这个推箱子程序的运行速度很慢,想测试一下的朋友可以到魔方吧推箱子版下载Sokoban for GBA,这是2009年推箱子版刚开版时发在那里的。

此条目发表在 推箱子, 编程 分类目录。将固定链接加入收藏夹。