[FC][按键开关][修改教程]
本帖最后由 yandagui 于 2017-5-19 10:51 编辑[按键开关][修改教程]
时间:2017.5.18
作者:FlameCyclone
工具:FCEUX 2.2.3,Hxd 1.7.7
ROM一个:魂斗罗(J)_Mapper4.nes
修改思路:
1.先在$C000-$FFFF之间找到一段足够写程序的空白空间,通常是一段连续的FF或者00,是在找不到可以切页(切有空间的bank,注意用完切回原bank)或者扩容后再切页。
2.再查找一个系统里没有进行读写的内存地址作为开关,一般在$0000-$07FF之间查找。
3.查找暂停地址,一般暂停和运行时内存中有一个地址会变化。
4.查找按键地址,找到单次按键,就是按一次变化一次的按键地址,按键一般有连续按键和单次按键。(如果没有单次可以自己想办法添加)。
5.写按键开关程序,程序思路:当暂停时执行开关程序,非暂停时读取开关的状态,开启就干嘛干嘛,关闭就干嘛干嘛。
6.写跳转,将按键程序跳转到按键开关程序。
程序流程图(假设暂停后,按上键切换无敌锁定的开关):
http://www.emu618.org/data/attachment/album/201705/18/225022v7fcyvt99wt7t9nq.jpg
接下来开始修改:
用FCEUX打开rom:
http://www.emu618.org/data/attachment/album/201705/18/225022nipshlfpsbhsthof.jpg
然后查找修改中需要的地址空间:
这里我就不慢慢找了,直接给出:
空白空间:$FB30-$FBFF
http://www.emu618.org/data/attachment/album/201705/18/225023lwifdwpxw8g6vpp6.jpg
开关地址:$07A0:
http://www.emu618.org/data/attachment/album/201705/18/225023zts3h3lqg3kszgff.jpg
暂停地址:$0025;
单次按键地址:$00F5,X(X=0是为P1的$00F5,X=1是为P2的$00F6);
按键程序断点:
打开调试器,设置写断点$00F5:
http://www.emu618.org/data/attachment/album/201705/18/225024tqiji1g1hakigw6x.jpg
http://www.emu618.org/data/attachment/album/201705/18/225024ichdfoaanudhtucn.jpg
http://www.emu618.org/data/attachment/album/201705/18/225025dj9xj7yjp97ukzuy.jpg
然后程序暂停了:
http://www.emu618.org/data/attachment/album/201705/18/225026j1rzfw030009gy7a.jpg
由此知道按键程序断点在$C1EF;
然后开始编写程序:
推荐使用6502 Simulator编写,由于本篇教程需要的程序不算复杂,我就直接写机器码了:
打开Hxd,新建一个文件:
http://www.emu618.org/data/attachment/album/201705/18/225026y5waqozrax3ooub3.jpg
然后开始写程序:
95 F5 94 F1 48 A5 25 C9 01 D0 1F B5 F5 C9 08 D0 19 BD A0 07 29 08 D0 0A BD A0 07 09 08 9D A0 07 D0 08 BD A0 07 29 F7 9D A0 07 BD A0 07 29 08 F0 04 A9 03 95 B0 68 60
http://www.emu618.org/data/attachment/album/201705/18/225026zzdfzgbzj6kz3bra.jpg
反编译解释:
95 F5 STA $F5,X 送入单次按键
94 F1 STY $F1,X 送入连续按键
48 PHA 累加器A入栈
A5 25 LDA $25 读取暂停状态
C9 01 CMP #$01 与暂停值#$01比较
D0 1F BNE 不同则跳转到 开关读取
读取按键值:
B5 F5 LDA $F5,X 读取单次按键键值
C9 08 CMP #$08 与上键键值比较
D0 19 BNE不同则跳转到 开关读取
读取开关当前状态:
BD A0 07 LDA $07A0 读取开关数据
29 08 AND #$08 判断D4位是否设置
D0 0A BNE 不同则跳转到 清除开关的D4位
设置开关的D4位:
BD A0 07 LDA $07A0,X 读取开关数据
09 08 ORA #$08 设置D4位
9D A0 07 STA $07A0,X 送入开关
D0 08 BNE 不同则跳转到 开关读取
清除开关的D4位:
BD A0 07 LDA $07A0,X读取开关数据
29 F7 AND #$F7 清除D4位
9D A0 07 STA $07A0,X 送入开关
开关读取:
BD A0 07 LDA $07A0,X读取开关数据
29 08 AND #$08 判断D4位是否设置
F0 04 BEQ 如果未设置则跳转到 出栈并返回
无敌锁定:
A9 03 LDA #$05 取一个立即数#$03
95 B0 STA $B0,X 送入无敌地址
出栈并返回:
68 PLA 累加器A出栈
60 RTS 子程序返回
然后把程序粘贴到NES内存$FB50对应的ROM地址:
单击右键:
http://www.emu618.org/data/attachment/album/201705/18/225027us559nw3i1i9awz9.jpg
http://www.emu618.org/data/attachment/album/201705/18/225027mkpxefxfpkkzshh0.jpg
http://www.emu618.org/data/attachment/album/201705/18/225028uszzv1sfyvo5wszu.jpg
http://www.emu618.org/data/attachment/album/201705/18/225028tfgbqioldi6iy1uk.jpg
然后跳转到按键程序地址$C1EF对应的ROM地址:
http://www.emu618.org/data/attachment/album/201705/18/225028nnuwdujoxlgk0gku.jpg
Ctrl+A:
http://www.emu618.org/data/attachment/album/201705/18/225029blcmpy53j6zv3ylg.jpg
http://www.emu618.org/data/attachment/album/201705/18/225029ad7s7wflw7l7r8ws.jpg
http://www.emu618.org/data/attachment/album/201705/18/225030iuvt31kkkxo7gaen.jpg
单击右键:
http://www.emu618.org/data/attachment/album/201705/18/230244ny4mvtmmkrk9tddv.png
http://www.emu618.org/data/attachment/album/201705/18/225030wz7wwm7ywydsb2km.jpg
把源指令修改为20 50 FB EA
JSR $FB50 跳转到$FB50
NOP 无动作
注:
如果不修改最后的F1,那么系统会把F1当做操作码来执行,后果不可预知,所以改为NOP才正确。
http://www.emu618.org/data/attachment/album/201705/18/225031l7z98yqs33lzg2mv.jpg
然后双击断点取消断点,再点击运行按钮继续运行:
http://www.emu618.org/data/attachment/album/201705/18/225031nciluiclqt0nu549.jpg
暂停后如下:
http://www.emu618.org/data/attachment/album/201705/18/225032z6z2vyfq42f9p46j.jpg
按一次上键:
无敌马上生效了,取消暂停后也一样保持无敌不会掉:
http://www.emu618.org/data/attachment/album/201705/18/225032oigmj8wwy888s3wm.jpg
暂停后然后再按一次上键
此时无敌还没有消失,因为暂停时无敌时间不会减,所以不会消失.
http://www.emu618.org/data/attachment/album/201705/18/225033twmbe4p9vjgnvgqq.jpg
按下开始键取消暂停:
马上无敌就失效了:
http://www.emu618.org/data/attachment/album/201705/18/225033gfhfqfpllpkfyzh9.jpg
测试成功,没有什么BUG,接下来保存文件:
http://www.emu618.org/data/attachment/album/201705/18/225034dz7yxx6gllqnqzeu.jpg
http://www.emu618.org/data/attachment/album/201705/18/225034avdedjnunnvsxk1l.jpg
到此为止修改结束。
**** Hidden Message ***** 非常给力的按键修改教程 大学生就是头脑厉害! 我发现付费没人看,一免费就有人来看了,唉.................... 感谢发布教程! 好复杂啊、、、、 支持一下,很好的教程! 高手。。。。。。。。。。 技术活。。。。。。。。。 感谢楼主分享,回复看一下
页:
[1]