FC按键修改教程(BY flamecyclone)
前言:此文仅用于修改FC,若想达到更好的修改水平,建议学习6502汇编,若有该汇编基础,将更容易理解。
准备工具:1.FCEU EX汉化绿色版(www.9553.com搜索下载即可)2.HXD 1.7绿色版(www.xiazaiba.com搜索下载即可)3.学会使用FCEU EX的断点并熟悉
本文以大家熟悉的经典射击类魂斗罗为例,讲解下载其切换子弹的修改方法。我们以美版为例(先确认修改的文件是否有空白地址可用,一般8000--BFFF为可切页地址,C000--FFFF为固定地址,若有空间则可以改,若没有只有扩容,相关教程自己找):
修改思路:改变按键地址的走向,使其跳转到我们写的程序,本篇仅以按键换子弹为例,执行完后回到本该执行的程序。
1.先查找按键地址,具体方法本文不再重复讲述,请参考其他资料。
我找到主机的为F1和F5,前者为重复写入的地址(按键保持变化,可累加数值),后者为仅改变写入地址(按一次按键后恢复00,不可累加数值),我们的目的是按一次选择键换一次子弹,所以用F5作为切换子弹的按键。
我们先以F1为断点,找到如下指令:
C38D: 95 F5 STA 00F5 ,X将累加器A值送F5+X的存储器M
C38F: 94 F1 STY 00F1,,X 将累加器Y值送F1+X存储器M
C391: ......
然后找空白地址,在F620处,这里是一片FF。
好了,我们在十六进制窗口中按Ctrl+A跳转到C39D,把95 F5 94 F1改为4C 20 F6(JMP $F620 跳转到地址F620)。此时点击查看工具栏切换为CPU内存,跳转到地址F620,不要进行游戏。
打开HXD,随便新建一个文件,然后输入:
95 F5 LDA $F5,X 送入存储器
94 F1 LDY $F1,X 送入存储器(由于我们把原程序改为跳转,所以必须补上)
48 PHA A入栈(保护寄存器的数据)
B5 F5 LDA $F5,X 读取存储器的值(比较主机按键)
C9 20 CMP $#20 与立即数比较(是否按选择键)
D0 14 BNE 不同跳过0×14字节(不是就跳转到出栈并跳回去的指令)
B5 AA LDA $AA,X 读取存储器的值(比较子弹)
C9 04 CMP $#04 与立即数比较(是否为未加速的L弹,当子弹已为未加速L弹时,在此值加1明显不对,所以检查当前子弹)
D0 04 BNE 不同跳过0×4字节
A9 0F LDA $#0F 取立即数(这是为了换成加速普通弹,最后有一条存储器加1指令,0F+1=10,即加速普通弹)
95 AA STA $AA,X 送存储器
C9 14 CMP $#14 与存储器比较(比较是否为加速L弹)
D0 04 BNE 不同跳过0×4字节
A9 FF LDA $#FF 取立即数(要切换成普通弹,由于后面的加1指令,这里取FF,输出结果为FF+1=00)
95 AA STA $AA,X 送存储器
F6 AA INA $AA,X 存储器加1(将子弹地址的数据加1)
68 PLA A出栈(还原A寄存器)
4C 91 C3 JMP $C391跳转到绝对地址(我们要跳转到打断程序将执行的下一条程序处)
然后把在HXD中输入的内容复制下来,回到FCEU的十六进制编辑器上,把内容粘贴到F620地址。
接下来是测试文件,取消断点并点击运行,看看能否按选择键换子弹…
我这里测试成功,即每按一次选择键子弹向后切换,反复测试没有出错,说明修改没问题。
最后,回到十六进制编辑器,点击文件工具栏,选择存储为,改个名如:魂斗罗按键换弹版by火焰烈旋风.nes,点保存就行了。
前言:此文仅用于修改FC,若想达到更好的修改水平,建议学习6502汇编,若有该汇编基础,将更容易理解。
准备工具:1.FCEU EX汉化绿色版(www.9553.com搜索下载即可)2.HXD 1.7绿色版(www.xiazaiba.com搜索下载即可)3.学会使用FCEU EX的断点并熟悉
本文以大家熟悉的经典射击类魂斗罗为例,讲解下载其切换子弹的修改方法。我们以美版为例(先确认修改的文件是否有空白地址可用,一般8000--BFFF为可切页地址,C000--FFFF为固定地址,若有空间则可以改,若没有只有扩容,相关教程自己找):
修改思路:改变按键地址的走向,使其跳转到我们写的程序,本篇仅以按键换子弹为例,执行完后回到本该执行的程序。
1.先查找按键地址,具体方法本文不再重复讲述,请参考其他资料。
我找到主机的为F1和F5,前者为重复写入的地址(按键保持变化,可累加数值),后者为仅改变写入地址(按一次按键后恢复00,不可累加数值),我们的目的是按一次选择键换一次子弹,所以用F5作为切换子弹的按键。
我们先以F1为断点,找到如下指令:
C38D: 95 F5 STA 00F5 ,X将累加器A值送F5+X的存储器M
C38F: 94 F1 STY 00F1,,X 将累加器Y值送F1+X存储器M
C391: ......
然后找空白地址,在F620处,这里是一片FF。
好了,我们在十六进制窗口中按Ctrl+A跳转到C39D,把95 F5 94 F1改为4C 20 F6(JMP $F620 跳转到地址F620)。此时点击查看工具栏切换为CPU内存,跳转到地址F620,不要进行游戏。
打开HXD,随便新建一个文件,然后输入:
95 F5 LDA $F5,X 送入存储器
94 F1 LDY $F1,X 送入存储器(由于我们把原程序改为跳转,所以必须补上)
48 PHA A入栈(保护寄存器的数据)
B5 F5 LDA $F5,X 读取存储器的值(比较主机按键)
C9 20 CMP $#20 与立即数比较(是否按选择键)
D0 14 BNE 不同跳过0×14字节(不是就跳转到出栈并跳回去的指令)
B5 AA LDA $AA,X 读取存储器的值(比较子弹)
C9 04 CMP $#04 与立即数比较(是否为未加速的L弹,当子弹已为未加速L弹时,在此值加1明显不对,所以检查当前子弹)
D0 04 BNE 不同跳过0×4字节
A9 0F LDA $#0F 取立即数(这是为了换成加速普通弹,最后有一条存储器加1指令,0F+1=10,即加速普通弹)
95 AA STA $AA,X 送存储器
C9 14 CMP $#14 与存储器比较(比较是否为加速L弹)
D0 04 BNE 不同跳过0×4字节
A9 FF LDA $#FF 取立即数(要切换成普通弹,由于后面的加1指令,这里取FF,输出结果为FF+1=00)
95 AA STA $AA,X 送存储器
F6 AA INA $AA,X 存储器加1(将子弹地址的数据加1)
68 PLA A出栈(还原A寄存器)
4C 91 C3 JMP $C391跳转到绝对地址(我们要跳转到打断程序将执行的下一条程序处)
然后把在HXD中输入的内容复制下来,回到FCEU的十六进制编辑器上,把内容粘贴到F620地址。
接下来是测试文件,取消断点并点击运行,看看能否按选择键换子弹…
我这里测试成功,即每按一次选择键子弹向后切换,反复测试没有出错,说明修改没问题。
最后,回到十六进制编辑器,点击文件工具栏,选择存储为,改个名如:魂斗罗按键换弹版by火焰烈旋风.nes,点保存就行了。