FC自动演示修改教程
本帖最后由 yandagui 于 2015-10-28 19:02 编辑FC自动演示修改教程
作者:火焰烈旋风
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
1.找按键地址:
首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
2.找演示时按键的数据来源:
既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
07:C393:CA DEX
07:C394:10 F0 BPL $C386
07:C396:60 RTS
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
07:C378:A5 1D LDA $001D = #$07
07:C37A:29 04 AND #$04
07:C37C:D0 06 BNE $C384
07:C37E:A5 04 LDA $0004 = #$00
07:C380:05 05 ORA $0005 = #$00
07:C382:85 04 STA $0004 = #$00
07:C384:A2 01 LDX #$01
07:C386:B5 04 LDA $04,X @ $0004 = #$00
07:C388:A8 TAY
07:C389:55 F9 EOR $F9,X @ $00F9 = #$00
07:C38B:35 04 AND $04,X @ $0004 = #$00
07:C38D:95 F5 STA $F5,X @ $00F5 = #$00
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
07:C393:CA DEX
07:C394:10 F0 BPL $C386
07:C396:60 RTS
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
05:B3A5:A5 2E LDA $002E = #$C8
05:B3A7:C9 50 CMP #$50
05:B3A9:90 20 BCC $B3CB
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
05:B3AD:29 0F AND #$0F
05:B3AF:C9 01 CMP #$01
05:B3B1:F0 04 BEQ $B3B7
05:B3B3:C9 04 CMP #$04
.........
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
05:B3A5:A5 2E LDA $002E = #$C8
05:B3A7:C9 50 CMP #$50
05:B3A9:90 20 BCC $B3CB
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
05:B3AD:29 0F AND #$0F
看到
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
05:B392:95 5C STA $5C,X @ $005C = #$01
05:B394:C8 INY
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
05:B397:95 5A STA $5A,X @ $005A = #$00
05:B399:C8 INY
05:B39A:98 TYA
然后我们再上拉,得到如下指令:
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
05:B38E:C9 FF CMP #$FF
05:B390:F0 3D BEQ $B3CF
05:B392:95 5C STA $5C,X @ $005C = #$01
05:B394:C8 INY
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
05:B397:95 5A STA $5A,X @ $005A = #$00
05:B399:C8 INY
05:B39A:98 TYA
看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
3.修改演示:
打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
05:B392:95 5C STA $5C,X @ $005C = #$00
05:B394:C8 INY
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
05:B397:95 5A STA $5A,X @ $005A = #$00
05:B399:C8 INY
05:B39A:98 TYA
我们上拉看到了:
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
05:B38E:C9 FF CMP #$FF
05:B390:F0 3D BEQ $B3CF
05:B392:95 5C STA $5C,X @ $005C = #$00
05:B394:C8 INY
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
05:B397:95 5A STA $5A,X @ $005A = #$00
05:B399:C8 INY
05:B39A:98 TYA
看到
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
说明:演示按键地址的结构,以开始的00 21 01 03 00 0E 01 3D 04 06 05 33 00 0E 04 0A 05 01为例:第1个00是按键数值(无行动),第2个21是指按键数值21前的按键保持21(时间),第3个01是按键数值(向右走),第4个03是指按键数值03前的按键保持03(时间).......以此类推,判断根据:
05:B371:B5 5A LDA $5A,X @ $005A = #$7F
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
05:B375:A5 30 LDA $0030 = #$00
05:B377:0A ASL
05:B378:0A ASL
05:B379:85 08 STA $0008 = #$29
05:B37B:8A TXA
05:B37C:0A ASL
05:B37D:65 08 ADC $0008 = #$29
05:B37F:A8 TAY
05:B380:B9 D2 B3LDA $B3D2,Y @ $B3D7 = #$B4
05:B383:85 08 STA $0008 = #$29
05:B385:B9 D3 B3LDA $B3D3,Y @ $B3D8 = #$FC
05:B388:85 09 STA $0009 = #$B2
05:B38A:B4 5E LDY $5E,X @ $005E = #$02
05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
05:B38E:C9 FF CMP #$FF
05:B390:F0 3D BEQ $B3CF
05:B392:95 5C STA $5C,X @ $005C = #$00
05:B394:C8 INY
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
05:B397:95 5A STA $5A,X @ $005A = #$7F
05:B399:C8 INY
05:B39A:98 TYA
05:B39B:95 5E STA $5E,X @ $005E = #$02
05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)
05:B39F:B5 5C LDA $5C,X @ $005C = #$00
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
可以下载玩一玩
http://pan.baidu.com/s/1bnE0AwZ 我以前曾经也想改这个,看看游戏是否能演示到通关。
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
后来尝试其它修改,但是偶尔会造成花版或者死机。
深入研究,发现要以演示模式通关,需要做的事情还很多。
因为太麻烦,也没太多时间弄这个,最后放弃。 厉害啊,这个真厉害 啊哦,你来晚了,分享的文件已经被删除了,下次要早点哟。
页:
[1]