[FC][子弹数修改教程]
作者: FlameCyclone
时间: 2016.06.11
工具: FCEUX,待实验ROM一个
步骤:
1.打开rom,进入游戏;
2.打开十六进制编辑器:
3.连发子弹,观察十六进制窗口中数据的变化,找到与子弹有关的地址.
这里我以040B为例,由于最后一发子弹打出后,最后的相关地址为040B(其实是子弹的横坐标移动速度)
4.游戏无动作时添加040B的写入断点:
5.打开追踪记录器,单击开始记录:
6.按子弹连发,马上调试器窗口暂停:
7.查看记录追踪器:
由于调试器窗口中:
06:884B:9D 08 04 STA $0408,X @ $040B = #$00
06:884E:9D E8 03 STA $03E8,X @ $03EB = #$00
06:8851:9D F8 03 STA $03F8,X @ $03FB = #$00
06:8854:9D D8 03 STA $03D8,X @ $03DB = #$00
故我们需要找到与X相关的程序.
上拉滚动条,不难发现:
$819F:A9 03 LDA #$03 A:80 X:00 Y:00 S:E6
$81A1:A2 0A LDX #$0A A:03 X:00 Y:00 S:E6
$81A3:85 00 STA $0000 = #$7A A:03 X:0A Y:00 S:E6
$81A5:A4 11 LDY $0011 = #$00 A:03 X:0A Y:00 S:E6
$81A7:D0 02 BNE $81AB A:03 X:0A Y:00 S:E6
$81A9:A2 00 LDX #$00 A:03 X:0A Y:00 S:E6
$81AB:BD 88 03 LDA $0388,X @ $0388 = #$01 A:03 X:00 Y:00 S:E6
$81AE:F0 06 BEQ $81B6 A:01 X:00 Y:00 S:E6
$81B0:E8 INX A:01 X:00 Y:00 S:E6
$81B1:C6 00 DEC $0000 = #$03 A:01 X:01 Y:00 S:E6
$81B3:10 F6 BPL $81AB A:01 X:01 Y:00 S:E6
$81AB:BD 88 03 LDA $0388,X @ $0389 = #$01 A:01 X:01 Y:00 S:E6
$81AE:F0 06 BEQ $81B6 A:01 X:01 Y:00 S:E6
$81B0:E8 INX A:01 X:01 Y:00 S:E6
$81B1:C6 00 DEC $0000 = #$02 A:01 X:02 Y:00 S:E6
$81B3:10 F6 BPL $81AB A:01 X:02 Y:00 S:E6
$81AB:BD 88 03 LDA $0388,X @ $038A = #$01 A:01 X:02 Y:00 S:E6
$81AE:F0 06 BEQ $81B6 A:01 X:02 Y:00 S:E6
$81B0:E8 INX A:01 X:02 Y:00 S:E6
$81B1:C6 00 DEC $0000 = #$01 A:01 X:03 Y:00 S:E6
$81B3:10 F6 BPL $81AB A:01 X:03 Y:00 S:E6
$81AB:BD 88 03 LDA $0388,X @ $038B = #$00 A:01 X:03 Y:00 S:E6
$81AE:F0 06 BEQ $81B6 A:00 X:03 Y:00 S:E6
$81B6:A4 11 LDY $0011 = #$00 A:00 X:03 Y:00 S:E6
$81B8:A9 0F LDA #$0F A:00 X:03 Y:00 S:E6
$81BA:99 CE 00 STA $00CE,Y @ $00CE = #$0D A:0F X:03 Y:00 S:E6
$81BD:20 22 88 JSR $8822 A:0F X:03 Y:00 S:E6
$8822:A9 00 LDA #$00 A:0F X:03 Y:00 S:E4
$8824:9D 88 03 STA $0388,X @ $038B = #$00 A:00 X:03 Y:00 S:E4
$8827:9D 68 03 STA $0368,X @ $036B = #$00 A:00 X:03 Y:00 S:E4
$882A:9D 78 03 STA $0378,X @ $037B = #$00 A:00 X:03 Y:00 S:E4
$882D:9D 38 04 STA $0438,X @ $043B = #$00 A:00 X:03 Y:00 S:E4
接下来分析程序:
$819F:A9 03 LDA #$03 A:80 X:00 Y:00 S:E6
寄存器A取立即数#03
$81A1:A2 0A LDX #$0A A:03 X:00 Y:00 S:E6
变址寄存器X取立即数#0A
$81A3:85 00 STA $0000 = #$7A A:03 X:0A Y:00 S:E6
寄存器数据送入地址$0000
$81A5:A4 11 LDY $0011 = #$00 A:03 X:0A Y:00 S:E6
读取地址$11的值送入变址寄存器Y
$81A7:D0 02 BNE $81AB A:03 X:0A Y:00 S:E6
不为0就跳过2字节,否则继续
$81A9:A2 00 LDX #$00 A:03 X:0A Y:00 S:E6
变址寄存器X取立即数#00
$81AB:BD 88 03 LDA $0388,X @ $0388 = #$01 A:03 X:00 Y:00 S:E6
读取地址0388+X的数据
$81AE:F0 06 BEQ $81B6 A:01 X:00 Y:00 S:E6
为0就跳过6字节,否则继续
$81B0:E8 INX
变址寄存器X加1
$81B1:C6 00 DEC $0000 = #$03 A:01 X:01 Y:00 S:E6
地址$00减1
$81B3:10 F6 BPL $81AB A:01 X:01 Y:00 S:E6
为正数跳回$100-$F6=10字节
$81AB:BD 88 03 LDA $0388,X @ $0389 = #$01 A:01 X:01 Y:00 S:E6
读取地址0388+X的数据
$81AE:F0 06 BEQ $81B6 A:01 X:01 Y:00 S:E6
为0就跳过6字节,否则继续
$81B0:E8 INX A:01 X:01 Y:00 S:E6
变址寄存器X加1
$81B1:C6 00 DEC $0000 = #$02 A:01 X:02 Y:00 S:E6
地址$00减1
$81B3:10 F6 BPL $81AB A:01 X:02 Y:00 S:E6
为正数跳回$100-$F6=10字节
$81AB:BD 88 03 LDA $0388,X @ $038A = #$01 A:01 X:02 Y:00 S:E66
读取地址0388+X的数据
$81AE:F0 06 BEQ $81B6 A:01 X:02 Y:00 S:E6
为0就跳过6字节,否则继续
$81B0:E8 INX A:01 X:02 Y:00 S:E6
变址寄存器X加1
$81B1:C6 00 DEC $0000 = #$01 A:01 X:03 Y:00 S:E6
地址$00减1
$81B3:10 F6 BPL $81AB A:01 X:03 Y:00 S:E6
为正数跳回$100-$F6=10字节
$81AB:BD 88 03 LDA $0388,X @ $038B = #$00 A:01 X:03 Y:00 S:E66
读取地址0388+X的数据
$81AE:F0 06 BEQ $81B6 A:00 X:03 Y:00 S:E6
为0就跳过6字节,否则继续
$81B6:A4 11 LDY $0011 = #$00 A:00 X:03 Y:00 S:E6
$81B8:A9 0F LDA #$0F A:00 X:03 Y:00 S:E6
$81BA:99 CE 00 STA $00CE,Y @ $00CE = #$0D A:0F X:03 Y:00 S:E6
$81BD:20 22 88 JSR $8822 A:0F X:03 Y:00 S:E6
$8822:A9 00 LDA #$00 A:0F X:03 Y:00 S:E4
$8824:9D 88 03 STA $0388,X @ $038B = #$00 A:00 X:03 Y:00 S:E4
$8827:9D 68 03 STA $0368,X @ $036B = #$00 A:00 X:03 Y:00 S:E4
$882A:9D 78 03 STA $0378,X @ $037B = #$00 A:00 X:03 Y:00 S:E4
$882D:9D 38 04 STA $0438,X @ $043B = #$00 A:00 X:03 Y:00 S:E4
$8830:9D 48 04 STA $0448,X @ $044B = #$00 A:00 X:03 Y:00 S:E4
$8833:9D 18 04 STA $0418,X @ $041B = #$00 A:00 X:03 Y:00 S:E4
$8836:9D 78 04 STA $0478,X @ $047B = #$00 A:00 X:03 Y:00 S:E4
$8839:9D 98 04 STA $0498,X @ $049B = #$00 A:00 X:03 Y:00 S:E4
$883C:9D 88 04 STA $0488,X @ $048B = #$00 A:00 X:03 Y:00 S:E4
$883F:9D A8 04 STA $04A8,X @ $04AB = #$00 A:00 X:03 Y:00 S:E4
$8842:9D 58 04 STA $0458,X @ $045B = #$00 A:00 X:03 Y:00 S:E4
$8845:9D 68 04 STA $0468,X @ $046B = #$00 A:00 X:03 Y:00 S:E4
$8848:9D 28 04 STA $0428,X @ $042B = #$00 A:00 X:03 Y:00 S:E4
该程序的大意就是读取地址0388+X的数据,比较不为0后,X加1,$00减1,当$00不为#00是就循环,所以修改对$00的赋值程序就可以了.这里我们修改前面的819F:A9 03为A9 09,
然后停止追踪记录:
双击停止断点:
回到游戏试玩:
连发的子弹达到了10发(子弹闪烁,这里截图只能看到5发......)
大功告成,另存为即可.
注意:子弹数不是想改成多少就改成多少,因为内存的分配是一定的,一般改成10发左右即可.