HeavenTrain 发表于 2009-5-1 13:51:24

PS洛克X5不减命修改实例

应网友YZB的要求,因此写了此篇文章,我也是菜鸟一个,PS也就改了两三个游戏,只会改简单的XX不减,

有些只是经验之谈,对于MIPS汇编指令也不清楚,而且不一定每次修改都有效。旨在和大家交流下学习经验,
有什么错误及不足请多提出。

需要工具:HexCmp
PSX v1.13(Ps 调试器)
EmuCheat
MIPS汇编指令。

洛克人X5 EC:
人数:0d311d,2.

步骤1:载入洛克人X5镜像文件。点击File,再点击Insert CD Image,选择游戏打开。

步骤2:设置断点。运行游戏,等到洛克人X血值快为0时,暂停游戏,点击Debug-Monitor-r3000。
会出现调试器界面。
其中有两个小的,一个是设置断点的界面(Breakpoints),另一个是观察指令的
界面(Disassembly)。
右击Breakpoints的空白地,出现了添加命令的方框,点Add。


然后在adress处写入命数地址。先点Memory,再将read前的对勾取消,再点OK。
然后点Edit,会发现adress处变为:0x00000000,将其改为0x000d311d。点OK。

按F9,运行游戏。
死一条人后,来到了这里,看Disassembly。


步骤3:断到了00021cc8:sll>r2,r2,0x1800021600
上面的一条指令00021cc4:sb r2,0x0045(r6) 04410018.这个应该是减命的指令(自己猜测的,不过对

这个游戏是有效的,别的游戏一般也在断点附近,自己修改后测试)。

步骤4:用HexCmp打开镜像文件(直接打开IMG,ISO,BIN等都行,总之是最大的那个,游戏的主体部分)

搜索:ffff4224 4500C2a000160200 (将原来Disassembly里的数值倒着搜索)

到了这里,201afdcc.


将45 00 c2 a0的指令改为NOP(00 00 00 00)就行了,游戏运行后,死一条命,其指令却不执行,这就
达到了不减命的目的。

到此,就结束了。从头运行游戏看看,洛克人X和ZERO果然不减命了。

说明一下,NOP并不是对所有游戏的修改都适用的,想真正的改好,还是得看看MIPS汇编指令。
另外,本人也是菜鸟一个,MIPS也看不太懂。如果有什么跟汇编指令有关的问题,还请找高手来解决。

注意:请将SCPH1001.bin放进调试器的BIOS文件夹里,这样才能正常运行。(一般EPSxe中就有,可以复制

过去)。另PS游戏较大,改之前最好先做好备份。
将改过的IPS补丁也放上来。:loveliness:

[ 本帖最后由 HeavenTrain 于 2009-5-1 22:40 编辑 ]

shinwa 发表于 2009-5-1 14:09:10

呵呵 不错 支持下~~~~

顺便解释下
00021cb8:lbu r2,0x0045(r6)寄存器r6里的数据+0x0045作为地址(就是生命地址),把该地址的值传送到寄存器r2
00021cbc: nop
00021cc0: addiu r2,r2,0xffff 寄存器r2里的值+0xffff后送入r2加0xFFFF其实就是减1,因为是无符号的加法运算
00021cc4: sb r2,0x0045(r6)   把寄存器r2里的数据放回那个生命地址

从理论上来说,如果NOP掉 addiu 这条指令的话 效果就是从生命地址里取出这个数后放回去,应该也有不减命效果 如果取消sb这条指令的话 效果是从生命地址取出这个数后做了减法后没放回去,所以生命地址里的数没变,也有不减命效果

以上是个人浅见,希望高手别见笑~~~

[ 本帖最后由 shinwa 于 2009-5-1 14:28 编辑 ]

疾风之狼 发表于 2009-5-1 14:26:34

支持一下HeavenTrain。:loveliness:

kongmao45678 发表于 2009-5-1 17:54:48

好东西,有空学习学习:loveliness:

nianxu 发表于 2009-5-1 20:25:05

这个是好教材呀,谢谢。

yzb 发表于 2009-5-1 20:30:05

原帖由 HeavenTrain 于 2009-5-1 13:51 发表 http://bbs.emu618.com/forum/images/common/back.gif
应网友YZB的要求,因此写了此篇文章,我也是菜鸟一个,PS也就改了两三个游戏,只会改简单的XX不减,

有些只是经验之谈,对于MIPS汇编指令也不清楚,而且不一定每次修改都有效。旨在和大家交流下学习经验,
有什么 ...
多谢了,终于明白了,呵呵呵:loveliness:

原帖由 shinwa 于 2009-5-1 14:09 发表 http://bbs.emu618.com/forum/images/common/back.gif
呵呵 不错 支持下~~~~

顺便解释下
00021cb8:lbu r2,0x0045(r6)寄存器r6里的数据+0x0045作为地址(就是生命地址),把该地址的值传送到寄存器r2
00021cbc: nop
00021cc0: addiu r2,r2,0xffff 寄存器r2里的值 ...

还想问下日文兄,如果是想加一命的话是修改哪里呢?:$

shinwa 发表于 2009-5-1 21:18:10

原帖由 yzb 于 2009-5-1 20:30 发表 http://bbs.emu618.com/forum/images/common/back.gif

多谢了,终于明白了,呵呵呵:loveliness:



还想问下日文兄,如果是想加一命的话是修改哪里呢?:$

00021cc0: addiu r2,r2,0xffff改成 00021cc0: addiu r2,r2,0x01就可以了

HeavenTrain 发表于 2009-5-1 22:37:28

看来真正的合适的改法就是将00021cc0: addiu r2,r2,0xffff
的ffff改为0000啊。多谢shinwa了,以前不知道ffff就是-1的意思:L ,现在知道了,谢谢。

湘西小人物 发表于 2009-5-2 00:32:31

1.2楼真不是盖的
PS游戏太大了,以后再学习在学习这个教程
页: [1]
查看完整版本: PS洛克X5不减命修改实例