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

   经过一天的努力终于琢磨出怎么修改GBA的游戏文件也就是俗称的ROM文件,起因是因为偶然看到二手GBM,顿时抑制不住买了一台,可惜买得晚了,完美运行游戏又带金手指功能的烧录卡买不到了。SUPERCARD烧录卡看评论说费电,玩游戏会拖慢什么的,最后权衡再三买了个EZ4烧录卡,缺点就是不能开金手指。但是我这种从小开惯金手指的人没有金手指怎么驰骋游戏?好了废话不多说开始进入正题,看本文最好有80x86汇编语言基础,理解什么是代码段,什么是数据段,用CE OD调试修改过PC游戏的最佳。


   当然没有的话我也试着尽量让没基础的人能看懂,之前搜了半天百度只找到一篇很晦涩的博文说了这个方法,本人弄出来了就打算写篇图文教程造福广大没有条件开金手指的玩家。



   首先是工具:


1.UltraEdit  


   大名鼎鼎的16进制文件阅读/修改工具,这个工具主要是修改GBA ROM文件,并保存。


2.NO$GBA1.4C  


   这个并不是那个著名的NDS模拟器,虽然名字一样,但却是个GBA ROM的DEBUG调试工具,用它能帮助定位需要修改的代码段。


3.VisualBoyAdvance1.6


   一定得是这个低版本的GBA模拟器,我被卡了大概一早上就是因为我本来用的是1.72版本的,1.72和NO$GBA1.4C载入后的地址不一样,有偏移。


4.arm汇编手册(中文版)


   GBA的CPU用的是ARM汇编语言,有80x86汇编语言基础的朋友可以自己查手册,实现更自由的修改。


   http://download.csdn.net/detail/l198738655/9903635     本文提到的工具



   好了,我们开始,首先我们来学习怎么找或者说制造VisualBoyAdvance模拟器用的金手指,因为只有会找金手指代码了才能进行下一步的ROM修改。示例游戏是《牧场物语:矿石镇的伙伴》

   


   现在的钱是500,选择菜单栏中的 修改→搜索修改 


   



   按照图片上的设置来,然后点 开始→搜索


   


   出来一个结果,有时候会出现多个结果,这时候只能去买点东西让数值变动重新搜索,好在GBA游戏比较简单数据比较少,不会出现PC游戏一个数值几百上千个结果的事情,可能也是我这个存档是游戏刚开始,所以干扰数据比较少。


   


   然后选择“添加代码”


   


   然后选择 修改→修改代码列表 


   


   就能看到金手指了


   


   金手指已经生效,钱被修改成了800。此时要记下“修改代码列表”里的地址“020068b4”这就是存储金钱的地址,这个地址下存储着金钱数“320”这是个16进制数,换算成10进制正好是800,不清楚的人可以自己用WINDOWS的计算器点“查看”切换成程序员来换算。做到这一步就可以关闭VBA模拟器了,现在打开NO$GBA1.4C。


   
   


   首先选择 设置→模拟器设置 然后按照下图设置按键


   


   用鼠标点一下游戏画面才能开始操作游戏


   


   在红框框内 右键→GO to...


   
   
   然后再对话框内输入刚才找到的地址,输入完后点OK


   


   点击OK后跳转到了光标所在的地址,我此时游戏内的金钱是1600,换算成16进制数是“640”,但这里显示的是4006是怎么回事呢?这涉及到一个大端小端问题,弄过80x86汇编的人会知道,这里就不展开来说,这里用的是小端模式,计算机的数据都是以字节为单位显示的,一个字节简单来说就是两个数字“00”,所以1600的16进制也可以写成“0640”,小端模式就是要把数据按字节为单位前后颠倒,本来从左往右读的改成从右往左,两位两位的读,故改成“4006”。然后我们用快捷键Ctrl+B,然后在弹出的对话框中输入 [020068b4]!


   


   来设置条件断点,让游戏访问这个地址里的金钱数据时断下来,我们就能知道是那一段代码在访问这个内存地址,然后我们买个东西,花点钱让代码段访问以下这个地址


   


   


   买一袋种子后断在了红框框处,现在按一下键盘上的"Delete"键删除[020068b4]!这个断点。这一句我们不用理他,看这一句的上面一句


   


   sub是减法 这一句的意思是,r0寄存器里的值- r1寄存器里的值结果放回r0寄存器。r0=r0-r1


   


   我们在这一句上下一个断点,就是点一下这行末尾出现“BRK”就说明断点已经设立,然后买个120G的东西,又断下来了,我们看r0和r1寄存器此时的值


   


   r0为640就是10进制的1600;r1是78就是10进制的120。所以我们只要编辑这行代码让它由减变加,就能实现买东西反而倒找钱的功能了。在下了断点那行再点一下,"BRK"消失,取消断点,然后在此行上右键选择“Change Instruction”来修改代码

   


   


   修改成add r0,r0,r1,然后确定


   


   然后我们用鼠标点击一下游戏画面,让游戏跑起来


   


   因为我们在买的时候断下,修改代码后重新运行,此时游戏逻辑已经改变,现在钱变成了1720正好是1600+120,但是此时我们要把代码改回去,为何呢?因为这个调试器是无法保存我们的修改的,我们得改回去然后用之前提到的16进制文件编辑器来查找到这段代码,再修改后才能保存。改回去后记住红框框内的4个字节。


   


   我们要记下图片中的这4个字节:1C211A40,然后转换成小端形式:211c401a,然后我们用UltraEdit打开 牧场物语.gba 文件


   


   然后在这里按Ctrl+F搜索字符串:211c401a 
     
   


   看我们找到了,如果怕不是这个我们可以再搜索一次就会出现


   


   说明这4个字节的组合是唯一的


   


   我们要把sub修改成add,也就是要把 211c401a 改为 211c4018,选中a,用键盘改它为8,然后保存退出就修改成功了。此时把这个ROM文件拖入任何一个烧录卡,任何设备的GBA模拟器,修改都会生效,没有金手指也能纵横GBA世界。修改GBA ROM主要就是找SUB或ADD语句,下面再以机战OG2为例子,说一个用加法实现减钱效果的代码的修改。有时候代码实现减法不一定会用SUB而是用ADD,用一个正数加上一个负数也能实现减法。


   
   


   这一句的意思是r1=r1+r2,经过测试,去地图里杀敌后增加资金也是这段代码,把ADD改为SUB的话减钱就是加钱,加钱就减钱,问题在于资金数肯定有个上限,超出后恐怕会溢出导致存档损坏什么的,单纯的把加改成减并不安全,我的办法是把add r1,r1,r2改为add r1,r1,1,也就是不管买什么都只加1块钱。但问题来了,杀敌一台本来该加2000也变成了只加1。不过这也不是什么大问题,想加钱的时候换成正常ROM不想花钱了换成改过的ROM,存档是不受影响的。


   我已经把修改后的ROM文件一起打包到工具压缩包里了,有兴趣的同学可以自己拿模拟器或者GBA试试。



转载请注明出处尊重一下鄙人的劳动成果多谢多谢

  • 17
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
devkitadv GBA开发工具 任天堂GBA官方开发包安装及开发环境的设置 Romandoo 解压安装包至某目录后,安照以下步骤操作: 一: 安装CYGWIN工具 运行CYGWIN_SETUP目录下setup.exe进行cygwin的安装 选INSTALL FROM LOCAL DIRECTORY 在SELECT INSTALL ROOT diretory 选择安装目录 next> 再NEXT 在弹出的窗口中,在Perv Curr Exp 中选Curr 点开列表栏中各项, 选 base 的 cygwin ash bash login sh-utils 选 devel 的 autoconf automake binutils gcc gdb make 选 shell下的 ash bash sh-utils 置NEW栏显示版本号,表示将其安装,而其它的工具选为skip表示跳过不安装 最后选next开始安装! (注意,我为了节省空间,我删除了许多不重要的东西,其实cygwin下有高达几百m的各式各样的工具,今后你可根据自已需要到网上下载安装去) 二、安装任天堂官方开发包 在 AGB LIBRARY3.0中点 agbsetup1安装 注意,一定要安装到c:\agb目录下,因为这是官方的默认目录,有一些例子与这个目录关连了 所以最好选这个目录 ,不然可能编不过去。否则自已设置会麻烦一点的。 修改c:\autoexec.bat 文件增加如下代码行 SET AGBDIR=C:\AGB 三、安装CYGWIN补丁 (由于刚安装完的cygwin版本并不支持arm cpu,所以需要将某些程序、库覆盖成arm相关的程序库) 将arm-thumb-elf连目录一起copy到安装好的cygwin目录的\lib\gcc-lib下 将bin-patch目录下的所有文件copy到cygwin目录的bin下面覆盖 将include patch目录下文件copy到cygwin目录的include下面 四:编绎例子程序 OK!前三步已经将我们的开发环境构好了!! 现在我们可以正式进行开发了,至于开发技术吗,在agb目录的doc下应有尽有,大家可以好好研究一下子。 下面我就介绍如何编绎代码了。 编绎也是很简单的一件事情了。 官方资料里有许多的例子,和两个游戏demo源代码。 我们就拿里面的一个具有代表性的例子编绎吧 functional_sample 在编绎之前,你必须重起你的机器,因为刚才我们修改了 autoexec.bat 而设置此时需要生效才行。(当然也有其它办法不必重起就生效,说来话长了) 好,重起之后,我们运行刚才装好的cygwin程序 进入了一个控制台窗口 这个控制台shell,命令行支持的是类式linux的指令,你可能不太了解,不过你不用担心呵 我们不需要记太多的命令指令,很简单的几句这可以了 就当是dos命令,只不过命令名称变了而已 下面是几个对应 ls 相当于dos下的dir指令 cd 相当于dos下的cd 指令 你也就需要这两个指令就搞定了,呵 行,那么我们正式开始: cd c: cd agb cd src cd samples cd functional_sample //以上几步作的就是进入c:\agb\src\samples\functional_sample目录下,和dos一样吧,呵 然后注意了,忘了提醒有关functional_sample这个例子的一个问题, 就是这个例子源代码share.c 中定义了 vu16 Cont; vu16 Trg; 但是在share.h中又申明为 extern u16 Cont; extern u16 Trg; 该编绎器检查认为是错误,所以你要改一下 将share.h文件里改成 extern vu16 Cont; extern vu16 Trg; 否则编绎报错。 好,改好share.h之后,我们输入 make 回车! 好,你可以看到现在开始正式编绎了,太爽了,官方的例子在被编绎,呵 过了几十秒编绎完成之后,就会生成了bin与elf文件 你用visualBoyAdvance打开bin文件看一看是 什么例子,哇,原来是个非常强的GBA各个功能展示,有alpha混合,有图层显示 有马塞可显示,有放大缩小,有精灵移动,旋转,字体显示,声音,有地图显示,有窗口模式。 但是需要注意的一个问题:::::: 如果你想使用gcc里面的库函数 需要在makefile里面修改一下 CFLAGS 中加入 -I"C:\cygwin\include" LDFLAGS 中加入 -lm 否则你将无法使用sin,cos,sqrt等有用的库函数 编完这个,你可以再去试试看

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值