Werther
依然火星时代!
级别: 火花会员
编号: 8033
精华: 0
发帖: 479
威望: 0 点
配偶: 单身
火 花 币: 2 HHB
注册时间:2003-06-05
最后登陆:2024-09-24
|
SFC游戏的HACK讲解(二)
文:Werther WT: 同学们,晚上好!这次我们开始第二讲 [s:2] 。
同学甲:哦~
同学乙: 恩恩~~不过老师不是要回老家结婚吗!
WT:..................这....这个........
同学丙:(小声)阿乙~你太张目了~~
同学乙:???
同学丙:你们不知道咩~听说WT老师在老家被逼婚。
同学乙:哦?求内幕!
同学甲:同求!
同学丙:前段时间老师家老娘诈病骗老师回老家,然后就......
同学乙:就?
同学甲:阿丙,别吊胃口!
同学丙:听说那个女的很辣,老师老娘态度很强硬~听说是千辛万苦才逃出来!
同学甲:耶?真的呀?~我们可怜的WT老师~
同学乙:这么年轻就........哎!
同学甲:英年早逝.....
同学丙:哎~人生苦短......
WT:臭小子,在嘀咕什么!什么“这么年轻就........”什么“英年早逝”。(咚~·#¥~啪~$%~啾~~)
同学甲:啊..................
同学丙:I Am Dead~~
同学乙:妈妈咪呀~~~~~~~~~~~
WT:咳~~我们开始第二讲,恩~上一讲讲到哪了?......阿丙同学......阿丙,阿乙......阿甲~别装死了,快起来回答问题!
同学丙:老师,I Am Dead......
同学甲:(一动不动)
同学乙:(我这么英俊的脸蛋....呜~~)
WT:再装你们就真的要见Hades了~~
同学甲:Hades?
同学丙:就是阎王........!
同学乙:老师,讲完HACK工具的使用了~~
WT:哦~是了,那么这一讲我们就正式开始了,首先捏~同学们看看这个~
同学们玩《圣战的系谱》,是怎样看角色说的下一句话的?
同学乙:这女的是谁?
同学丙:不认识耶,年纪轻轻的就想嫁人了耶,而且是站在山顶上~难道就没人管一下么!
同学甲:老师果然对这个有怨念......!
WT:(泪流满面)...........你们不要这样.........
WT:......摁下“A”键就可以查看下一句话了~~每一款SFC的游戏,都有一个“手柄输入子程序”
用来处理手柄的操作,没有这个就无法进行游戏了,同学们只能看游戏了!这个“手柄输入子程序”对于我们接下来HACK游戏来说是很重要的,可以说是个根本~
那么,我们如何找到这个“手柄输入子程序”捏?每一款游戏的“手柄输入子程序”都是不一样的~~但是有个地方是一样的~就是它的手柄硬件寄存器(同一CPU嘛~),说的不同只是镜像的地址不同而已!
$4218就是主手柄的硬件积存器了,其他手柄的硬件积存器详细请参见“yoshi的SNES硬件资料”,上一讲中有提供下载地址!
那么我们来找下《圣战的系谱》的“手柄输入子程序”。
用ZSNES .v1.51运行系谱,停在这里等待摁“A”键。
摁键盘的F1进入DUBUGGER模式,直接摁下键盘“L”开始导运行程序~~(记得摁“1”忽略声音的处理)
游戏在等待玩家摁“A”时,游戏可是不会停止的,它会一直做一个循环的程序处理,比如:角色的抖动,闪烁等~
自然也有我们要找的“手柄输入子程序”了。大约10来秒就够了,摁键盘的“ESC”停止。打开模拟器根目录的debug.log
开始搜索“$4218”。这个值,如果你的模拟器手柄操作是设置为其他,例如副手柄操作,就搜索“$421A”,第三手柄来操作的就是“$421C”。我们搜索到这样一个循环体~JSL $808002这个子程序便是《圣战的系谱》的“手柄输入子程序”。
80aea8 JSL $808002 A:0000 X:0000 Y:0000 S:1fc6 DB:80 D:0000 P:81 e 808002 PHP A:0000 X:0000 Y:0000 S:1fc3 DB:80 D:0000 P:81 e 808003 SEP #$20 A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:81 e 808005 LDA $4212 [804212] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:a1 e 808008 AND #$01 A:0080 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:a1 e 80800a BNE $8005 [808005] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:23 e 80800c REP #$20 A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:23 e 80800e LDA $4218 [804218] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808011 STA $e4 [0000e4] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808013 AND #$0f A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808016 BEQ $801c [80801c] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80801c LDA $e4 [0000e4] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80801e EOR $f0 [0000f0] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808020 AND $e4 [0000e4] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808022 STA $e8 [0000e8] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808024 STA $ec [0000ec] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808026 LDA $e4 [0000e4] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808028 BEQ $803c [80803c] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80803c LDA $e0 [0000e0] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80803e STA $f6 [0000f6] A:000a X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:01 e 808040 LDA $e4 [0000e4] A:000a X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:01 e 808042 STA $f0 [0000f0] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808044 LDA $421a [80421a] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808047 STA $e6 [0000e6] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808049 AND #$0f A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80804c BEQ $8052 [808052] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808052 LDA $e6 [0000e6] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808054 EOR $f8 [0000f8] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808056 AND $e6 [0000e6] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808058 STA $ea [0000ea] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80805a STA $ee [0000ee] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80805c LDA $e6 [0000e6] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80805e BEQ $8072 [808072] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808072 LDA $e0 [0000e0] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 808074 STA $fe [0000fe] A:000a X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:01 e 808076 LDA $e6 [0000e6] A:000a X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:01 e 808078 STA $f8 [0000f8] A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80807a PLP A:0000 X:0000 Y:0000 S:1fc2 DB:80 D:0000 P:03 e 80807b RTL A:0000 X:0000 Y:0000 S:1fc3 DB:80 D:0000 P:81 e
//
重要地址1:$80:4218 // Joypad #0 手柄寄存器 重要地址2: $80:421a //Joypad #1 register
一般我只用Joypad #0,所以只注意$4218即可。 ------------------------------------------
$808002手柄子程序入口 分析:
开始$80:800e(SNES Address $C0:800E=>ROM Address 0x00820E=>Code:AD1842) LDA $4218 //载入#0手柄寄存器 STA $e4 //映像到$E4 AND #$0f //检查是否有摁键输入,有存$E4(真实地址:$00:00e4) BEQ $801c //如果没有输入摁键(即上步指令结果为0:什么也没有输入),执行下一地址$80:801c;
既然$E4是$4218的映像,$E6是$421a的映像,相应的那么$E5就是$4219的映像,$E7是$421b的映像 那么我要模拟手柄的"下"则: 80800e LDA $4218 [804218] A:0000 X:0000 Y:0000 S:1fdf DB:80 D:0000 P:03 e 808011 STA $e4 [0000e4] A:0000 X:0000 Y:0000 S:1fdf DB:80 D:0000 P:03 e 808013 AND #$0f A:0000 X:0000 Y:0000 S:1fdf DB:80 D:0000 P:03 e 》》》》》》》》》》》停住.... 键盘“M”输入:0000E5 值为:04
如果我要模拟摁" Start"键: 80800e LDA $4218 [804218] A:0000 X:0000 Y:0000 S:1fdf DB:80 D:0000 P:03 e 808011 STA $e4 [0000e4] A:0000 X:0000 Y:0000 S:1fdf DB:80 D:0000 P:03 e 808013 AND #$0f A:0000 X:0000 Y:0000 S:1fdf DB:80 D:0000 P:03 e 》》》》》》》》》》》停住....
M输入:0000E5 值为:10 -----------------附录 手柄键值参考 $4218 0010 R 0020 L 0040 X 0080 A
$4219 0100 right 0200 left 0400 down 0800 up 1000 START 2000 SELECT 4000 Y 8000 B
所以,我们摁键盘的“B”开始断点,输入地址808013(808013 AND #$0f)再摁回车,然后摁键盘的“M”,
修改内存0000e4的值为80(我们模拟了摁下A键)
摁键盘的“F1”返回游戏,发现菲说下一句话了~~
怎么样,很有趣吧~~同学们可以试下做做看~~~
同学甲:哦~~原来如此`~
同学丙:太有才了!
同学乙:还是直接摁“A”方便.........
///////////////////////////////////////////////一些游戏的手柄输入子程序
《不可思议的迷宫2风来之西林》《Fushigi no Dungeon 2 - Furai no Shiren》
80ddfd PHP A:0080 X:0000 Y:ddfc S:1eec DB:00 D:0000 P:27 e 80ddfe SEP #$20 A:0080 X:0000 Y:ddfc S:1eeb DB:00 D:0000 P:27 e 80de00 REP #$10 A:0080 X:0000 Y:ddfc S:1eeb DB:00 D:0000 P:27 e 80de02 PHK A:0080 X:0000 Y:ddfc S:1eeb DB:00 D:0000 P:27 e 80de03 PLB A:0080 X:0000 Y:ddfc S:1eea DB:00 D:0000 P:27 e 80de04 LDX #$0001 A:0080 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:a5 e 80de07 STX $0bca [800bca] A:0080 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:25 e 80de0a LDA $0bd6 [800bd6] A:0080 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:25 e 80de0d BEQ $de12 [80de12] A:0000 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:27 e 80de12 STX $0bcc [800bcc] A:0000 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:27 e 80de15 LDA $0bd8 [800bd8] A:0000 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:27 e 80de18 BEQ $de1d [80de1d] A:0000 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:27 e 80de1d LDA $4212 [804212] A:0000 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:27 e 80de20 LSR A A:0080 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:a5 e 80de21 BCS $de1d [80de1d] A:0040 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:24 e 80de23 LDX $4218 [804218] A:0040 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:24 e// 80de26 STX $0bce [800bce] A:0040 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:26 e 80de29 LDX $421a [80421a] A:0040 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:26 e 80de2c STX $0bd0 [800bd0] A:0040 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:26 e 80de2f LDA $4016 [804016] A:0040 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:26 e 80de32 LSR A A:0001 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:24 e 80de33 BCS $de3b [80de3b] A:0000 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:27 e 80de3b LDA $4017 [804017] A:0000 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:27 e 80de3e LSR A A:001c X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:25 e 80de3f BCS $de47 [80de47] A:000e X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:24 e 80de41 STZ $0bd0 [800bd0] A:000e X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:24 e 80de44 STZ $0bd1 [800bd1] A:000e X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:24 e 80de47 REP #$20 A:000e X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:24 e 80de49 LDA $0bd2 [800bd2] A:000e X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:04 e 80de4c AND $0bce [800bce] A:ffff X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:84 e 80de4f STA $0bd2 [800bd2] A:0000 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:06 e 80de52 LDA $0bd4 [800bd4] A:0000 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:06 e 80de55 AND $0bd0 [800bd0] A:0000 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:06 e 80de58 STA $0bd4 [800bd4] A:0000 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:06 e 80de5b PLP A:0000 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:06 e 80de5c RTL A:0000 X:0000 Y:ddfc S:1eec DB:80 D:0000 P:27 e
$0bce 是 $4218的镜像 测试:B输入80de21,回车单步到80de29 ...... 80de23 LDX $4218 [804218] A:0040 X:0001 Y:ddfc S:1eeb DB:80 D:0000 P:24 e 80de26 STX $0bce [800bce] A:0040 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:26 e 80de29 LDX $421a [80421a] A:0040 X:0000 Y:ddfc S:1eeb DB:80 D:0000 P:26 e 》》》》》》停住 M修改800bce的值为40 即模拟摁下了X键(游戏中调出道具菜单)
M修改800bcf的值为01 即模拟摁下了right键(游戏中右行)
《三国英杰传》《Sangokushi Eiketsu Den》
c09013 JSR $8e9b [c08e9b] A:0700 X:0001 Y:0000 S:076a DB:00 D:0000 P:37 e c08e9b SEP #$20 A:0700 X:0001 Y:0000 S:0768 DB:00 D:0000 P:37 e c08e9d LDA $4212 [004212] A:0700 X:0001 Y:0000 S:0768 DB:00 D:0000 P:37 e c08ea0 LSR A A:0780 X:0001 Y:0000 S:0768 DB:00 D:0000 P:b5 e c08ea1 BCS $8e9d [c08e9d] A:0740 X:0001 Y:0000 S:0768 DB:00 D:0000 P:34 e c08ea3 REP #$30 A:0740 X:0001 Y:0000 S:0768 DB:00 D:0000 P:34 e c08ea5 LDY #$0002 A:0740 X:0001 Y:0000 S:0768 DB:00 D:0000 P:04 e c08ea8 LDX #$0000 A:0740 X:0001 Y:0002 S:0768 DB:00 D:0000 P:04 e c08eab LDA $4218,X [004218] A:0740 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08eae LSR A A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08eaf BCS $8ec5 [c08ec5] A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08eb1 ASL A A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08eb2 AND #$f0 A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08eb5 STA $0c41,X [000c41] A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08eb8 AND $0c45,X [000c45] A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08ebb BEQ $8ec8 [c08ec8] A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e c08ec8 DEY A:0000 X:0000 Y:0002 S:0768 DB:00 D:0000 P:06 e B跟踪c08ea8,回车一步步跟踪到c08eb8 c08ea8 LDX #$0000 c08eab LDA $4218,X [004218] c08eae LSR A c08eaf BCS $8ec5 [c08ec5] c08eb1 ASL A c08eb2 AND #$f0 c08eb5 STA $0c41,X [000c41] c08eb8 AND $0c45,X [000c45] 》》》》》》》》》》》》》停住 M输入:000c41其值修改为80 发现游戏显示下一句对话~ $000c41为$4218的镜像,$000c42为$4219的镜像。
《圣龙战记》《Bahamut Lagoon》
da05a6 RTS A:141f X:003c Y:0b80 S:1fd9 DB:00 D:0000 P:60 e da1420 REP #$20 A:141f X:003c Y:0b80 S:1fdb DB:00 D:0000 P:60 e da1422 LDA $53 [000053] A:141f X:003c Y:0b80 S:1fdb DB:00 D:0000 P:40 e da1424 STA $59 [000059] A:0000 X:003c Y:0b80 S:1fdb DB:00 D:0000 P:42 e da1426 LDA $4218 [004218] A:0000 X:003c Y:0b80 S:1fdb DB:00 D:0000 P:42 e da1429 STA $53 [000053] A:0000 X:003c Y:0b80 S:1fdb DB:00 D:0000 P:42 e da142b STA $65 [000065] A:0000 X:003c Y:0b80 S:1fdb DB:00 D:0000 P:42 e da142d SEP #$20 A:0000 X:003c Y:0b80 S:1fdb DB:00 D:0000 P:42 e da142f RTS A:0000 X:003c Y:0b80 S:1fdb DB:00 D:0000 P:62 e
测试:B输入da1420开始跟踪~~ 到以下~~ da1426 LDA $4218 da1429 STA $53 da142b STA $65 》》》》》》》》停住 M输入:000053其值修改为80 显示下一句~ $000053是$4218的镜像,$000054是$4219的镜像。
《圣剑传说2》《Seiken Densetsu 2》
圣剑传说2的手柄输入子程序 cffe15 LDA $01 [0001df] A:0100 X:0000 Y:00fe S:01dd DB:00 D:01de P:27 e cffe17 BIT #$40 A:0100 X:0000 Y:00fe S:01dd DB:00 D:01de P:27 e cffe19 REP #$20 A:0100 X:0000 Y:00fe S:01dd DB:00 D:01de P:27 e cffe1b BEQ $fe34 [cffe34] A:0100 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe34 LDA $4218 [004218] A:0100 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe37 STA $0042 [000042] A:0000 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe3a LDA $421a [00421a] A:0000 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe3d STA $0044 [000044] A:0000 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe40 LDA #$00 A:0000 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe43 STA $0046 [000046] A:0000 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe46 PLB A:0000 X:0000 Y:00fe S:01dd DB:00 D:01de P:07 e cffe47 STA $13,S [nnnnnn] A:0000 X:0000 Y:00fe S:01de DB:00 D:01de P:07 e cffe49 TSC A:0000 X:0000 Y:00fe S:01de DB:00 D:01de P:07 e cffe4a CLC A:01de X:0000 Y:00fe S:01de DB:00 D:01de P:05 e cffe4b ADC #$12 A:01de X:0000 Y:00fe S:01de DB:00 D:01de P:04 e cffe4e TCS A:01f0 X:0000 Y:00fe S:01de DB:00 D:01de P:04 e cffe4f PLA A:01f0 X:0000 Y:00fe S:01f0 DB:00 D:01de P:04 e cffe50 PLP A:0000 X:0000 Y:00fe S:01f2 DB:00 D:01de P:06 e cffe51 PLD A:0000 X:0000 Y:00fe S:01f3 DB:00 D:01de P:37 e cffe52 RTL A:0000 X:0000 Y:00fe S:01f5 DB:00 D:0000 P:37 e 009521 PLP A:0000 X:0000 Y:00fe S:01f8 DB:00 D:0000 P:37 e 009522 AND #$ff A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:37 e 009524 BEQ $9527 [009527] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:37 e 009527 LDA $db [0000db] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:37 e 009529 BEQ $9526 [009526] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:37 e 009526 RTS A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:37 e 0093be REP #$20 A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:37 e 0093c0 LDA $42 [000042] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:17 e 0093c2 BIT #$0f A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:17 e 0093c5 BEQ $93c9 [0093c9] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:17 e 0093c9 CMP #$30 A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:17 e 0093cc BEQ $93b3 [0093b3] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:94 e 0093ce LDA $44 [000044] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:94 e 0093d0 BIT #$0f A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:16 e 0093d3 BEQ $93d7 [0093d7] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:16 e 0093d7 CMP #$30 A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:16 e 0093da BEQ $93b3 [0093b3] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:94 e 0093dc LDA $46 [000046] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:94 e 0093de BIT #$0f A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:16 e 0093e1 BEQ $93e5 [0093e5] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:16 e 0093e5 CMP #$30 A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:16 e 0093e8 BEQ $93b3 [0093b3] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:94 e 0093ea JSR $9434 [009434] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:94 e 009434 SEP #$30 A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:94 e 009436 LDX $ee [0000ee] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:b4 e 009438 BEQ $944b [00944b] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:36 e 00944b LDX $ef [0000ef] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:36 e 00944d BEQ $9460 [009460] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:36 e 009460 LDX $f0 [0000f0] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:36 e 009462 BEQ $9475 [009475] A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:36 e 009475 RTS A:0000 X:0000 Y:00fe S:01f9 DB:00 D:0000 P:36 e
$42是$4218的映像,$43是$4219的映像。 0093be REP #$20 A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:37 e 0093c0 LDA $42 [000042] A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:17 e 0093c2 BIT #$0f A:0000 X:0000 Y:00fe S:01fb DB:00 D:0000 P:17 e 》》》》》》》》停住
M输入000042,值为80模拟A键输入 对话显示下一句。
《圣剑传说3》《Seiken Densetsu 3》
圣剑传说3的手柄输入子程序 第一手柄 c0478d SEP #$20 A:0066 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:05 e c0478f LDA $005c [7f005c] A:0066 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:25 e c04792 BIT #$40 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:27 e c04794 BEQ $47aa [c047aa] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:27 e c047aa CPX #$0000 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:27 e c047ad BEQ $47ba [c047ba] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:27 e c047ba REP #$20 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:27 e c047bc CPX #$0002 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:07 e c047bf BEQ $47c3 [c047c3] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:84 e c047c1 BCS $47c9 [c047c9] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:84 e c047c3 LDA $004218,X [004218] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:84 e c047c7 BRA $47cc [c047cc] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:06 e c047cc REP #$20 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:06 e c047ce SEP #$20 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:06 e c047d0 STA $02 [000068] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047d2 AND #$f0 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047d4 STA $04 [00006a] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047d6 XBA A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047d7 STA $01 [000067] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047d9 LSR A A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047da LSR A A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047db LSR A A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047dc LSR A A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047dd ORA $04 [00006a] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047df STA $04 [00006a] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e
B到c047d2然后单步 c047d2 AND #$f0 A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047d4 STA $04 [00006a] A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e c047d6 XBA A:0000 X:0000 Y:1d50 S:0066 DB:7f D:0066 P:26 e 》》》》》》》停住 M输入00006a改其值为80,模拟A键摁下,下一对话出现。 $04是$4218的映像,$05是$4219的映像。
《财宝猎人G》《Treasure Hunter G》
8080a0 LDA $1d [00001d] A:0001 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080a2 STA $21 [000021] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080a4 LDA $1f [00001f] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080a6 STA $23 [000023] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080a8 LDA $4218 [804218] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080ab STA $1d [00001d] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080ad LDA $4219 [804219] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b0 STA $1f [00001f] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b2 ASL A A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b3 ROR $1d [00001d] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b5 ASL A A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b6 ROR $1d [00001d] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b8 LDA $1d [00001d] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080ba EOR $21 [000021] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080bc AND $1d [00001d] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080be STA $25 [000025] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080c0 LDA $1f [00001f] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080c2 EOR $23 [000023] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080c4 AND $1f [00001f] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080c6 STA $27 [000027] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080c8 LDA $1e [00001e] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 80ff7c JSL $8086dd A:0000 X:0008 Y:0000 S:1df1 DB:80 D:0000 P:36 e
B到8080ad单步到8080b2 8080ad LDA $4219 [804219] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b0 STA $1f [00001f] A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 8080b2 ASL A A:0000 X:0008 Y:0000 S:1df5 DB:80 D:0000 P:32 e 》》》》》》》》停住 M输入00001d其值改为80模拟A键摁下。下一句话出现 M输入00001f其值改为01模拟十字键的右键摁下。 $1d是LDA $4218的映像,$1f是LDA $4219的映像。
有了“手柄的输入子程序”我们就可以DUMP我们需要的程序来分析了,不然浩淼的游戏运行程序哪点是我们需要的?哪些
是不需要的,就迷糊了。例如你要分析角色的对话,来解析其大字库的位置和对话的编码,只需要在她说下一句前等待你
摁“A”确定时,进行模拟摁下这个键后,之后的就是处理下一句话的游戏程序了,就可以缩小了分析范围了,加上对SNES汇编的一点了解,很容易就可以找到需要的信息,数据无论是否压缩的,都可以推倒~~
例如我要分析《圣战的系谱》的对话, 摁“F1”进入DEBUGGER~
摁键盘的“B”开始断点,输入地址808013(808013 AND #$0f)再摁回车,然后摁键盘的“M”,
修改内存0000e4的值为80(我们模拟了摁下A键),再摁键盘的“C”清除下记数,摁“L”开始导出处理菲说下一句话的处理程序了。里面肯定包括了,对话的文本编码的读取,这个编码对应的字模跟她在大字库的位置的算法,以及如何写显的程序~~再个,如果我们要修改某个角色例如HP什么的,只要跟踪到她HP显示的程序和她HP改变的那段处理程序就知道改什么数值了。
WT:那么~同学们~~如何!!知道“手柄的输入子程序”的寻找方法和使用它的目的了吧!
同学甲:......
同学乙:(挖鼻孔中...)
同学丙:哦........
同学乙:你说“哦”,你懂了?
同学丙:哦~
同学甲:.......白痴!
WT:OK~~我们回到开头的那两个问题。
《圣战的系谱》的剑士的移动力的修改,《不可思议的迷宫2风来之西林》的初始HP的修改!
《圣战的系谱》的剑士的移动力HACK,我们从第一章开始并且收到艾拉后。为什么?这是因为这时只有艾拉一位剑士职业~分析起来相对有针对点~
在占领玛法城前吧~~~分析剑士的移动力有多个切入点,
一是大地图上移动角色的时候,在角色寻路计算过程必定有角色移动力的读取;这个过程无法看见移动力的表示。
二是如下图的从“部队”页查看角色信息时也会看到角色的移动力的显示。
三是查看个人资料页时候,也可以看到角色的移动力。
寻路计算过程因为无法看见移动力的表示,所以分析起来要复杂,也要求高的多!
那么我们就从另两个切入点来分析了。
恩~~同学们,你们知道玩《圣战的系谱》时,你们看到的信息显示,例如角色名、能力值等,是如何显示在荧幕上的么?
同学丙:.................
同学乙:.................
同学甲:老师(举手)
WT:甲同学,你知道?你来说说看!
同学甲:老师,我不懂!
WT:那你举手干什么
同学甲:我举手是想告诉老师,我不懂!
WT:............
WT:SFC在显示游戏信息时,对BG1~BG4的显示是这样的!
同学乙:老师,什么是BG1~BG4?
WT:恩......BG就是BackGround背景、图层的意思~这么干吧~同学们用Snes9X耍游戏时候,键盘上“1~5”是对应BG1~BG4和Sprite的显示~例如我们在查看角色信息时摁键盘的“3”键关闭BG3的显示。
看到左下角的“BG#3 off” 了吗!表示关闭BG3的显示了~
关了之后,发现那些角色名、攻击等文字呀和相应的数字都没有了~说明这些信息都上属于BG3层面的东东~
再摁次“3”信息的显示就就又回来了`~^_^,如果你关闭其他BG层~看看就知道那些是属于那个层的东东了~~
同学甲:哦~~~~原来这样`~
同学丙:真有趣,摁~消失了~~摁~~有了~(不停的摁中.....)
同学乙:接下来捏`~接下来捏~~
WT:SFC对BG1~BG4的东东显示这样来,先从ROM里(如果有压缩就解压到某段内存区再用DMA的方式传输到VRAM显存的某区域中)给VRAM的这段区域编号,然后再在某段VRAM区域中定义为“模拟屏幕”,然后写要显示的信息的编号到这个模拟显示屏的区域中,就可以在对应的位置显示出来了。
例如这图中
艾字是在VRAM的$80D0(这个从哪里来?请看第一讲的VRAM的DUMP)
VRAM的这个地址$80D0是在BG3($2109VRAM location register)内的,其编号是0D 00,$81D0的编号是 1D 00,
$8000(小字库开始地址)的编号就是 00 00了
因为是两个TILE组成的字~一个TILE一个编号~这个编号因中文化而被我用到“艾”的显示。但其编码是不改变的~
艾的上部分是0D 00 下部分是1D 00
游戏要显示这个字的时候,“艾”的写显过程~
8793fe LDA $00053a A:04e8 X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 879402 CLC A:2000 X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 879403 ADC $879471,X [879959] A:2000 X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 879407 STA [$33],Y [7e83cc] A:200d X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 879409 TYA A:200d X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 87940a CLC A:0044 X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 87940b ADC $04 [000004] A:0044 X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 87940d TAY A:0084 X:04e8 Y:0044 S:1fdb DB:83 D:0000 P:00 e 87940e LDA $00053a A:0084 X:04e8 Y:0084 S:1fdb DB:83 D:0000 P:00 e 879412 CLC A:2000 X:04e8 Y:0084 S:1fdb DB:83 D:0000 P:00 e 879413 ADC $879481,X [879969] A:2000 X:04e8 Y:0084 S:1fdb DB:83 D:0000 P:00 e 879417 STA [$33],Y [7e840c] A:201d X:04e8 Y:0084 S:1fdb DB:83 D:0000 P:00 e 879419 PLY A:201d X:04e8 Y:0084 S:1fdb DB:83 D:0000 P:00 e 87941a PLX A:201d X:04e8 Y:0044 S:1fdd DB:83 D:0000 P:00 e 87941b BRA $93bd [8793bd] A:201d X:9f7f Y:0044 S:1fdf DB:83 D:0000 P:80 e
把20 0d写到7e83cc;把20 1d写到7e840c,“艾”就显示出来了~
程序为什么不是写00 0D(艾的上部分编号0D 00的高低位互换 )和00 1D?而要加上2000?
如果你留意到那些数字,比如攻击、命中的数字值是有些特殊效果的~有点绿色包围~没错~~加上2000就是使用要显示的
信息添加特殊显示效果来的`~看下图~ 这个基值就是效果的基值~
大地图上光标查看到的角色名的效果基值是2400(显示这样的效果TILE号加上2400才可以显示)、进入个人信息时,角色名效果基值是2000、技巧等的数值是3800、技巧字模的有点黄的效果的基值上是3400。
这样剑士的移动“6”的的编号是:26 01 36 01,在个人资料里看~要显示出来加的效果值是2000,因为跟角色名的效果同~即最终要显示这个“6”字就要把
编号2126和2136(2000+0126=2126//2000+0136=2136)这两个编号写到模拟屏幕区域的某位置。
如果是在部队页查看~~“6”的效果是跟力、魔力等显示的数字效果基值同都是3800,即在部队页查看的剑士的移动力显示
程序把编号3926和3936这两个编号写到模拟屏幕区域的某位置,“6”才显示。
同学们,理解了吧~
同学甲:老师,你怎么知道这个位置的编号就是这个数?
WT:问的好~~请查看yoshi的SNES硬件资料。$2107~$210C硬件寄存器的说明~
同学甲:囧
同学乙:囧囧
同学丙:囧囧囧
WT:.........你们那是什么表情~ 同学丙:是~SORRY~ 同学乙:SORRY~ 同学甲:同上两位~
WT:。。。。。。。!
获得“6”的编号是很重要的~~下面我们回到之前的那两个切入点,从看个人资料和从部队页里看移动。
个人资料页,我们可以从看特技的说明再摁B返回到显示移动力的面板,因为看特技说明和显示移动的面板是同一区域~
是要重新写显的。不用往下拉面板这个我们不太确定是进入个人资料页就有移动力的写显,还是要下拉了面板后才写移动力显示这个困惑了。
那么我们DUMP程序了~~~
游戏中停在上面的左图中(显示特技说明),然后F1切换到DEBUGGER模式,B到808013 AND #$0f 停住M输入:0000E5修改其值为80(我们模拟摁下了B键),“C”清除下记数,然后“L”开始导之后处理显示指挥、恋人、移动等的写显处理的程序了。大约30秒,俺DUMP了95MB的数据。我们搜索“A:2126”,因为数字的就是金钱、斗技LV以及移动的而已,而且只有移动是的数值对应的编号是26 01 36 01,所以搜索出的项应该就是目标了,当然也有的游戏不是,会搜到其他,测试甄别下就可以了。如下图:
89a1e1 LDA $0000,Y [890000] A:0910 X:0910 Y:0000 S:1fcf DB:89 D:0000 P:02 e 89a1e4 CLC A:0006 X:0910 Y:0000 S:1fcf DB:89 D:0000 P:00 e 89a1e5 ADC $0a [00000a] A:0006 X:0910 Y:0000 S:1fcf DB:89 D:0000 P:00 e 89a1e7 PHA A:2126 X:0910 Y:0000 S:1fcf DB:89 D:0000 P:00 e 89a1e8 STA $7e8388,X [7e8c98] A:2126 X:0910 Y:0000 S:1fcd DB:89 D:0000 P:00 e 89a1ec PLA A:2126 X:0910 Y:0000 S:1fcd DB:89 D:0000 P:00 e 89a1ed CLC A:2126 X:0910 Y:0000 S:1fcf DB:89 D:0000 P:00 e 89a1ee ADC #$10 A:2126 X:0910 Y:0000 S:1fcf DB:89 D:0000 P:00 e 89a1f1 STA $7e83c8,X [7e8cd8] A:2136 X:0910 Y:0000 S:1fcf DB:89 D:0000 P:00 e
这里就是“6”的写显过程~~~ADC $0a为了达到“6”的编号量加的值。$0a的值是#$2120,是程序写入的:
89998d LDX #$2120
899990 STX $0a
暂时不管她先。
看变值A:0006是从这里来的89a1e1 LDA $0000,Y [890000]
$890000这个是SNES地址,就是$00一样的。往上
89a1a0 LDA $00 [000000] A:ffa2 X:0000 Y:0010 S:1fcd DB:89 D:0000 P:02 e 89a1a2 SEC A:0006 X:0000 Y:0010 S:1fcd DB:89 D:0000 P:00 e
再往上搜索$00的来源,往上几十行有了,这里的STA $00 是转换成十进制后的数值。
89a193 STA $00 [000000] A:0006 X:0910 Y:0010 S:1fcd DB:89 D:0000 P:81 e
再往上看20来句,就发现源头了
87a67c LDX $057a [83057a] A:9283 X:2008 Y:0010 S:1fc6 DB:83 D:0000 P:81 e 87a67f LDA $0019,X [839288] A:9283 X:926f Y:0010 S:1fc6 DB:83 D:0000 P:81 e 87a682 AND #$ff A:0306 X:926f Y:0010 S:1fc6 DB:83 D:0000 P:01 e 87a685 PLX A:0006 X:926f Y:0010 S:1fc6 DB:83 D:0000 P:01 e 87a686 PLP A:0006 X:2008 Y:0010 S:1fc8 DB:83 D:0000 P:01 e 87a687 PLB A:0006 X:2008 Y:0010 S:1fc9 DB:83 D:0000 P:81 e 87a688 RTL A:0006 X:2008 Y:0010 S:1fca DB:84 D:0000 P:81 e 849dcf BRA $9de4 [849de4] A:0006 X:2008 Y:0010 S:1fcd DB:84 D:0000 P:81 e
87a67f LDA $0019,X [839288] 就是我们要的目标了,真实地址$839288,ROM地址为$39488
用16进制打开ROM跳到地址$39488:06这个就是剑士的移动力了。改成其他值游戏里就发现剑士的移动变了`~
我们也可以从部队页这个切入点来进行这样的分析~如下图
但是,我们发现了迪奥这个盗贼职业的移动跟剑士的移动一样`~这样就会给我们造成一些干扰,同学们,怎么办?
同学甲:......我们把迪奥给杀了吧!
同学乙:阿甲,太有才了!!同意
同学丙:~~恩~~恩`~这样干吧!
迪奥:我反对~~我反对`~~
WT:..........为了公平~那我们来投票决定吧!同意杀迪奥的举手!(举手ING)
同学甲:!(举手ING)
同学乙:!(举手ING)
同学丙:!(举手ING)
WT:迪奥,对不起了,少数服从多数!你只能去死了!刚德鲁夫,你来当屠夫~
迪奥:阴谋~~~这是阴谋~~啊啊啊啊~~~~~
经过10数回合,刚德鲁夫这鸟人,太菜了,居然让迪奥升到6级了才RP杀了迪奥。下次就拿刚德鲁夫开刀~~
刚德鲁夫:囧`~~求求你们`~不要这样`~
WT:耶`~排除干扰~~我们来分析吧~~大地图上~调出战场菜单 就这样`~~
然后F1进入DEBUGGER模式,B到808013 AND #$0f 停住M输入:0000E4修改其值为80(我们模拟摁下了A键),“C”清除下记数,然后“L”开始DUMP之后的处理程序`~30秒够 `~
搜索“6”的编号A:3926或A:3936,获得的结果处理程序跟DUMP个人资料页的基本同
89a1e1 LDA $0000,Y [890000] A:0758 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:02 e 89a1e4 CLC A:0006 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1e5 ADC $0a [00000a] A:0006 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1e7 PHA A:3926 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1e8 STA $7e8388,X [7e8ae0] A:3926 X:0758 Y:0000 S:1fe6 DB:89 D:0000 P:00 e 89a1ec PLA A:3926 X:0758 Y:0000 S:1fe6 DB:89 D:0000 P:00 e 89a1ed CLC A:3926 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1ee ADC #$10 A:3926 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1f1 STA $7e83c8,X [7e8b20] A:3936 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e
往上搜索出$00的来源
89a1a0 LDA $00 [000000] A:ffa2 X:0000 Y:0006 S:1fe6 DB:89 D:0000 P:02 e 89a1a2 SEC A:0006 X:0000 Y:0006 S:1fe6 DB:89 D:0000 P:00 e 89a1a3 SBC $89a252,X [89a252] A:0006 X:0000 Y:0006 S:1fe6 DB:89 D:0000 P:01 e
继续往上
87a67c LDX $057a [83057a] A:9283 X:0016 Y:0002 S:1fdc DB:83 D:0000 P:81 e 87a67f LDA $0019,X [839288] A:9283 X:926f Y:0002 S:1fdc DB:83 D:0000 P:81 e 87a682 AND #$ff A:0306 X:926f Y:0002 S:1fdc DB:83 D:0000 P:01 e 87a685 PLX A:0006 X:926f Y:0002 S:1fdc DB:83 D:0000 P:01 e 87a686 PLP A:0006 X:0016 Y:0002 S:1fde DB:83 D:0000 P:01 e 87a687 PLB A:0006 X:0016 Y:0002 S:1fdf DB:83 D:0000 P:81 e
目标在这~~~跟看个人资料页的一样的LOAD地址~~真实地址$839288,ROM地址为$39488。
总结:剑士的移动力的显示的显示过程
程序从LDA $0019,X [839288] 地址读取剑士的移动力数值(16进制),然后经过一系列的SBC $89a252,X计算转换成十进制数值然后STA $00保存到$00这里。然后ADC $0a 加上$0a的基值达到显示的效果值范围,进而把组成剑士移动的“6”字模分上下部分写入“模拟屏幕”的一个位置,STA $7e8388,X和STA $7e83c8,X。
同学们~~知道移动力的显示原理了吧`~~~~
同学甲:原来如此,虽然不太懂~~
同学乙:.............
同学丙:老师,那可以不可以改成20或50的移动力?
WT:阿丙同学.......这个问题,本来不在我的讲解范围~就顺便提一下好了~改是可以,但没什么实际意义`~因为改的话~有两个方面要改~一是改她的显示~另一个是要改寻路过程的格子显示,实际寻路移动时,超过12的移动数值的话~寻路是会出错的~第二个改动工程太大`~~偶没那么多时间,也没那么大能耐~但可以简单的讲下系谱的寻路过程(按我自己的理解=_=b)~
还是以艾拉为例子:寻路的程序DUMP,你可以把光标停在艾拉的身上~
同学乙:身......身上
WT:滚......
WT:...........把光标停在艾拉的身上,F1进入DEBUGGER,模拟摁下“A”键后导出的就是处理艾拉的寻路了~~
系谱的寻路大概的过程:
87a67f LDA $0019,X [839288] A:9283 X:926f Y:0000 S:1fb3 DB:83 D:0000 P:80 e 87a682 AND #$ff A:0306 X:926f Y:0000 S:1fb3 DB:83 D:0000 P:00 e 87a685 PLX A:0006 X:926f Y:0000 S:1fb3 DB:83 D:0000 P:00 e 87a686 PLP A:0006 X:0076 Y:0000 S:1fb5 DB:83 D:0000 P:00 e 87a687 PLB A:0006 X:0076 Y:0000 S:1fb6 DB:83 D:0000 P:80 e 87a688 RTL A:0006 X:0076 Y:0000 S:1fb7 DB:84 D:0000 P:80 e 849d87 CLC A:0006 X:0076 Y:0000 S:1fba DB:84 D:0000 P:80 e 849d88 ADC $4c [00004c] A:0006 X:0076 Y:0000 S:1fba DB:84 D:0000 P:80 e 849d8a TAX A:0006 X:0076 Y:0000 S:1fba DB:84 D:0000 P:00 e 849d8b LDA $849d9c,X [849da2] A:0006 X:0006 Y:0000 S:1fba DB:84 D:0000 P:00 e 849d8f AND #$ff A:473d X:0006 Y:0000 S:1fba DB:84 D:0000 P:00 e 849d92 BRA $9d98 [849d98] A:003d X:0006 Y:0000 S:1fba DB:84 D:0000 P:00 e 849d98 PLX A:003d X:0006 Y:0000 S:1fba DB:84 D:0000 P:00 e 849d99 PLP A:003d X:0076 Y:0000 S:1fbc DB:84 D:0000 P:00 e 849d9a PLB A:003d X:0076 Y:0000 S:1fbd DB:84 D:0000 P:80 e 849d9b RTL A:003d X:0076 Y:0000 S:1fbe DB:88 D:0000 P:80 e 87b57a STA $18 [000018] A:003d X:0076 Y:0000 S:1fc1 DB:88 D:0000 P:80 e 87b57c JSL $87b59d A:003d X:0076 Y:0000 S:1fc1 DB:88 D:0000 P:80 e
从$839288这个地址读取了剑士移动力,再LDA $849d9c,X 即LOAD这个地址$849da2:3D的移动范围~
ROM地址$49F9C~$49FA8:01 0B 15 1F 29 33 3D 47 51 5B 65 6F 79这12个字节分别表示移动力1~12的范围!他们的数据间隔是“0A”,所以你改成13(0D)的移动力,程序会读取$49FA9:8B这个数值当作移动力范围,很遗憾~$49FA9开始是游戏的程序~8B的汇编是PHB,B压栈。所以之后的移动范围计算就会出错了~
$18(STA $18 )存放这个移动力范围值,这里开始移动力的范围处理~
87b601 LDA $18 [000018] A:0820 X:fffe Y:0820 S:1fba DB:7f D:0000 P:00 e 87b603 SEP #$20 A:003d X:fffe Y:0820 S:1fba DB:7f D:0000 P:00 e 87b605 STA $754a,Y [7f7d6a] A:003d X:fffe Y:0820 S:1fba DB:7f D:0000 P:20 e 87b608 REP #$20 A:003d X:fffe Y:0820 S:1fba DB:7f D:0000 P:20 e 87b60a STA $04 [000004] A:003d X:fffe Y:0820 S:1fba DB:7f D:0000 P:00 e 87b60c ASL A A:003d X:fffe Y:0820 S:1fba DB:7f D:0000 P:00 e 87b60d TAX A:007a X:fffe Y:0820 S:1fba DB:7f D:0000 P:00 e 87b60e LDA #$00 A:007a X:007a Y:0820 S:1fba DB:7f D:0000 P:00 e 87b611 STA $894a,X [7f89c4] A:0100 X:007a Y:0820 S:1fba DB:7f D:0000 P:00 e
移动力范围值转存到$04,之后的程序会不断的进行如下的计算
87b6f8 LDA $04 [000004] A:000a X:019c Y:0762 S:1fb6 DB:7f D:0000 P:21 e 87b6fa SEC A:0007 X:019c Y:0762 S:1fb6 DB:7f D:0000 P:21 e 87b6fb SBC $00 [000000] A:0007 X:019c Y:0762 S:1fb6 DB:7f D:0000 P:21 e 87b6fd BCC $b732 [87b732] A:00fd X:019c Y:0762 S:1fb6 DB:7f D:0000 P:a0 e
为什么要这样计算,因为要考虑地形对移动的影响~ROM地址$39AE9~$39B02这段数值是剑士的地形影响移动的数值~
$39AE9~$39B02把这段数值改为01即没有影响,移动的形状是这样的~下图
寻路过程有这样一段程序是LOAD地形影响值(如下的$8398ec,ROM地址$039AEC)
87b8d4 LDA $830000,X [8398ec] A:98ec X:98ec Y:0762 S:1fb0 DB:7f D:0000 P:80 e 87b8d8 AND #$ff A:0201 X:98ec Y:0762 S:1fb0 DB:7f D:0000 P:00 e 87b8db BIT #$80 A:0001 X:98ec Y:0762 S:1fb0 DB:7f D:0000 P:00 e 87b8de BNE $b8e6 [87b8e6] A:0001 X:98ec Y:0762 S:1fb0 DB:7f D:0000 P:02 e 87b8e0 ASL A A:0001 X:98ec Y:0762 S:1fb0 DB:7f D:0000 P:02 e 87b8e1 TAX A:0002 X:98ec Y:0762 S:1fb0 DB:7f D:0000 P:00 e 87b8e2 LDA $87b8ee,X [87b8f0] A:0002 X:0002 Y:0762 S:1fb0 DB:7f D:0000 P:00 e
在内存区$7F7BAA~$7F7F2A(.ZST存档地址$18770~$18BC0)存放着经过处理后的移动力移动范围~~(游戏中摁下“A”后移动显示后摁“F2”会生成.ZST存档)。
下图是不考虑地形效果的6移动力范围,从#$3D值(6的移动力范围)开始两边等值分配~最外围的#$80是攻击范围!
整个移动范围数值在.ZST存档地址$18770~$18BC0,$18970是中心。
我们看看移动是12(0C)的范围分布~
中心的最外围的#$80刚好满到$18970,如果大于12的移动力,$18970会被清空来填多出部分移动范围值~最后的表示移动(黄、绿的格子)就写显错。所以,除非把整个处理程序都改了`~~~就可以把移动力的限制解除,这我暂时没有更深入的探寻过..........略了......=_=b,然后就是开始显示格子~
以下是开始写格子程序
C88AA4: A94E28 LDA #$284E//////////////////可移动的绿色区域(绿色格子) C88AA7: 99DC06 STA $06DC,y C88AAA: A94F28 LDA #$284F C88AAD: 99DE06 STA $06DE,y C88AB0: 60 RTS C88AB1: A95E28 LDA #$285E C88AB4: 99DC06 STA $06DC,y C88AB7: A95F28 LDA #$285F C88ABA: 99DE06 STA $06DE,y C88ABD: 60 RTS//////////////////可移动的绿色区域
....................
C88B6D: A94E2C LDA #$2C4E//////////////////不可移动区域(黄色格子,.ZST存档地址$18770~$18BC0范围内的00) C88B70: 99DC06 STA $06DC,y C88B73: A94F2C LDA #$2C4F C88B76: 99DE06 STA $06DE,y C88B79: 60 RTS C88B7A: A95E2C LDA #$2C5E C88B7D: 99DC06 STA $06DC,y C88B80: A95F2C LDA #$2C5F C88B83: 99DE06 STA $06DE,y C88B86: 60 RTS//////////////////不可移动区域
还记得系谱的菜单字库中有这样的一块区域咩?
这4个TILE就是移动时那个绿的和黄的方格~她们的TILE号是4E 00 4F00 5E00 5F 00
游戏里显示的效果就要加上效果基值~+2800是绿色的,+2C00是黄色的。
另一个只是改显示数值的~~~
下面是在个人资料页修改可以显示2位十进制数值的方法`(似乎没多大用途~只属于显示层面的东东~)例如:我们把ROM地址$39488:06改为62,即移动力改为了98。 我们在游戏可以看到如下图:在个人资料页只能看到8一个数值显示,在部队页却可以看到完整的98数值显示~~
为什么捏?我们分别DUMP了这两个页面显示移动的数值的游戏程序~~(上面已经讲了如何DUMP)
这是在部队页的写显示过程:
89a1e1 LDA $0000,Y [890000] A:0758 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:02 e 89a1e4 CLC A:0008 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1e5 ADC $0a [00000a] A:0008 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1e7 PHA A:3928 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1e8 STA $7e8388,X [7e8ae0] A:3928 X:0758 Y:0000 S:1fe6 DB:89 D:0000 P:00 e 89a1ec PLA A:3928 X:0758 Y:0000 S:1fe6 DB:89 D:0000 P:00 e 89a1ed CLC A:3928 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1ee ADC #$10 A:3928 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1f1 STA $7e83c8,X [7e8b20] A:3938 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1f5 DEX A:3938 X:0758 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1f6 DEX A:3938 X:0757 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1f7 INY A:3938 X:0756 Y:0000 S:1fe8 DB:89 D:0000 P:00 e 89a1f8 INY A:3938 X:0756 Y:0001 S:1fe8 DB:89 D:0000 P:00 e 89a1f9 CPY $0e [00000e] A:3938 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:00 e 89a1fb BEQ $a219 [89a219] A:3938 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:80 e 89a1fd CPY $12 [000012] A:3938 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:80 e 89a1ff BNE $a1e1 [89a1e1] A:3938 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:80 e 89a1e1 LDA $0000,Y [890002] A:3938 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:80 e 89a1e4 CLC A:0009 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:00 e 89a1e5 ADC $0a [00000a] A:0009 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:00 e 89a1e7 PHA A:3929 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:00 e 89a1e8 STA $7e8388,X [7e8ade] A:3929 X:0756 Y:0002 S:1fe6 DB:89 D:0000 P:00 e 89a1ec PLA A:3929 X:0756 Y:0002 S:1fe6 DB:89 D:0000 P:00 e 89a1ed CLC A:3929 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:00 e 89a1ee ADC #$10 A:3929 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:00 e 89a1f1 STA $7e83c8,X [7e8b1e] A:3939 X:0756 Y:0002 S:1fe8 DB:89 D:0000 P:00 e
第一次写890000($00)的0008 值,第二次写890002($02)的0009数值,这样就组成了“98”的显示~
而分析在个人资料页写显时只写一次~890000($00)的0008 值就跳出了。为什么?
关键是这个:个人资料写显移动力时有这个判断
89a219 LDA $10 [000010] A:2138 X:090e Y:0002 S:1fcf DB:89 D:0000 P:03 e 89a21b CMP $0c [00000c] A:0002 X:090e Y:0002 S:1fcf DB:89 D:0000 P:01 e 89a21d BEQ $a216 [89a216] A:0002 X:090e Y:0002 S:1fcf DB:89 D:0000 P:01 e
$10存放的表示移动力的位数,0002表示是2位(我们已经修改为98的移动了,所以$10的值是#$0002),而$0c的值是游戏里允许的数值位,这里的$0c值是0001,表示移动力的写显只能是1位(十进制的1位0~9)。突破她的限制就要修改$0c的值,往上追踪出$0C的值来源~
在从ROM里LOAD了移动力数值后10来句就有了
899992 LDX #$0001 A:0062 X:2120 Y:0010 S:1fd4 DB:89 D:0000 P:01 e 899995 STX $0c [00000c] A:0062 X:0001 Y:0010 S:1fd4 DB:89 D:0000 P:01 e
我们把 LDX #$0001 改为 LDX #$0002就突破了只能显示1位的限制了~改成LDX #$0003是可以显示3位了~
使用我们第一讲提供的SNES Assembly Editor来修改源游戏汇编码~
同样在部队页也可以突破她只能显示2位的限制~
8bb23f LDA #$02 A:3920 X:0756 Y:0062 S:1fed DB:80 D:0000 P:00 e 8bb242 STA $0c [00000c] A:0002 X:0756 Y:0062 S:1fed DB:80 D:0000 P:00 e
8bb23f LDA #$02改为8bb23f LDA #$03就是可以显示3位了~
至于原来游戏里为什么在部队页她可以显示2位?因为,这时的移动力显示是跟力、魔力、技巧那些数值的效果一样,可以显示2位十进制数值。
改后情况如下:
突破2位改为3位的显示
挖哈哈哈哈`~~怎么样?很有趣吧~同学们~~不过没多大用处 ~~~
同学甲: .................
同学丙: .................
同学乙: .................
WT:我们对系谱里的角色移动力的寻找方法就讲到这里了!我们继续第一讲的另一个问题~~《不可思议的迷宫2风来之西林》,他的HP最大值是怎么改的~~这是跟系谱这种战棋不一样的游戏类型`~属于RPG或ARPG~
西林的HP值在游戏开始就被LOAD到一个固定的内存区域里存放`~~所以我们首先要找到他的HP值存放在内存的什么地方~~你也可以想到很多方法`~我们来用以下两种方法来~~
一种是,相当“苯”的方法。即搜索通过对HP的变化值来确定其内存的位置~首先用ZSNES模拟器游戏开始到这里跟个怪背对它站着不动摁F2存档~然后挥空拳让怪攻击自己~使自己HP减少~变13了~再F2存一个(记得把先前命名为其他不然覆盖了)
用HexCmp这个文件比较工具来比较这两个.ZST存档~然后比较出同一地址里的数值是不是我们要“0F”和被攻击后的“0D”
因为被攻击这个过程内存相当多数据是在改变的`~~所以这个搜索法是表示耗力的`~~通过不断比较~~
在地址$9217这里有我们的数据~我们要测试下`~~把这个值该为64(100)保存看看`~游戏里F4来LOAD这个即时存档
意外的发现就是这个地址了~~注:LOAD即时存档后要走一步更新游戏读取内存值才会看到如图显示~~
也有可能找到不是这个地址,那就继续找.....测试..........
同学甲:老大~那个!!无论怎么看似乎有点别扭?
同学乙:..........是觉得别扭~
同学丙:好象,倒过来的样子~
WT:是吗?
同学乙:..........啊`~我知道了`~~是不是西林反着走的原因捏?
WT:..................我们改的是现有HP,MAX的HP没有改~~~
同学乙:..........
同学丙:白痴~
WT:..................按照我们的直觉,附近就是MAX的HP了,看到$922B:0F这个数值了么?我们猜测它就是MAX的HP值了~~改成C8(200)进游戏测试看看`LOAD后走几步~就如下图~~~看来我们找对了`~而且一边走现有HP一边增加~
我们记下这两个地址$9217(现有HP在内存的位置),$922B(MAX的HP值)。
那么他们在ROM的什么位置?游戏开始后肯定会从ROM里读HP的初始值到这个内存位置,在哪里捏?
说到这里,额外的说明下ZSNES模拟器的即时存档.ZST的跟内存和显存的关系~
.ZST文档的地址$0C13~$20C13这段区域是内存区域~~
.ZST文档的地址$20C13~$30C12这段区域是显存区域~~
换句话说,你用TLP打开.ZST跳到地址$20C13看到的东东~~跟你用ZSNES V1.10DUMP出来的vram.dat看到的一样~
游戏在处理内存时,并不是使用$9217这样的地址~~还记得Hex2SNES么?
把$9217转换成游戏操作的内存地址$7E8604
同样$922B是:$7E8618
我们经常看到什么金手指$7exxx/$7fxxxx:yy这样的,就是改.ZST的对应的某地址的数值而已~~
所以我们只记这两个地址:$7E8604和$7E8618就可以了。
接下来.............
同学甲:恩~恩`~
同学丙:找他们在ROM的位置`恩~~恩~~
同学乙:快点`~快点`~~恩`~恩~
WT:我们来说下找这个内存值的另一个方法。
同学甲:
同学乙:.........
同学丙:积极性被打击了.......
WT:我们在上面讲系谱的时候,讲过,SFC游戏显示BG1~BG4的层面信息时,是先把要显示的信息存到VRAM的某段地址中并给它每个TILE编上号码,然后在一块“模拟屏幕”里写入要显示信息的TILE编号,就显示出来了。
我们用ZSNES V1.51(为什么不用可DUMP显存的1.10?.zst包含了显存区,省事)在下图中,摁F2即时存档。注:西林的HP等显示是在BG3层。
用TLP打开.ZST文档,显示模式改为GameBoy~把地址跳到$2F613
那么显示HP的数值“15”的TILE号就是:
“1”的上部TILE号00 A2;下部TILE号00 B5;“5”的上部00 A6;下部00 B9
游戏中显示HP数值是有效果的(有点灰那个),写入“模拟屏幕”的最终TILE号是36 A2 36 B5;36 A6 36 B9
现有HP的“15”字模的四个TILE号:在.ZST地址$2FDB0(VRAM地址$78CE)、$2FDB2、$2FDF0、$2FDF2
最大HP的“15”字模的四个TILE号:在.ZST地址$2FDB8、$2FDBA、$2FDF8、$2FDFA
我们只要追踪程序在写这四个TILE号进这个地址的原因就可知道HP在内存的值了。
你可以在察看“风来人排名”后摁“B”键返回,开始DUMP程序~到“溪谷宿场”和HP显示出来~ 也可以在跟怪战斗,自己的HP被减少那段时间里DUMP程序,就可以知道被改的TILE号~ 往上搜索出减HP的源,一般游戏是先经过攻击判定后,被攻击而减少了HP~进而LOAD $7e8604的HP值,对其写TILE号,显示出来`~同学们可以自己试下`~印象深刻点~ 回追到的程序一般如下~~c21135 LDA $85f1,X [7e8604]是现有HP~ c2113a LDA $8605,X [7e8618] 是MAX的HP 80e86f JSL $c21128 A:0013 X:0040 Y:0018 S:1fe1 DB:80 D:0000 P:00 e c21128 PHP A:0013 X:0040 Y:0018 S:1fde DB:80 D:0000 P:00 e c21129 SEP #$20 A:0013 X:0040 Y:0018 S:1fdd DB:80 D:0000 P:00 e c2112b REP #$10 A:0013 X:0040 Y:0018 S:1fdd DB:80 D:0000 P:20 e c2112d LDA #$487e A:0013 X:0040 Y:0018 S:1fdd DB:80 D:0000 P:20 e c2112f PHA A:007e X:0040 Y:0018 S:1fdd DB:80 D:0000 P:20 e c21130 PLB A:007e X:0040 Y:0018 S:1fdc DB:80 D:0000 P:20 e c21131 STZ $01 [000001] A:007e X:0040 Y:0018 S:1fdd DB:7e D:0000 P:20 e c21133 LDX $00 [000000] A:007e X:0040 Y:0018 S:1fdd DB:7e D:0000 P:20 e c21135 LDA $85f1,X [7e8604] A:007e X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c21138 STA $00 [000000] A:000e X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c2113a LDA $8605,X [7e8618] A:000e X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c2113d STA $01 [000001] A:000f X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c2113f LDA $8641,X [7e8654] A:000f X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c21142 STA $02 [000002] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c21144 LDA $8655,X [7e8668] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c21147 STA $03 [000003] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c21149 LDA $8669,X [7e867c] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c2114c STA $04 [000004] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c2114e LDA $8619,X [7e862c] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c21151 STA $05 [000005] A:0001 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c21153 LDA $8691,X [7e86a4] A:0001 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c21156 STA $06 [000006] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c21158 LDA $867d,X [7e8690] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:22 e c2115b CPX #$0013 A:0005 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:20 e c2115e BNE $1163 [c21163] A:0005 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c21160 LDA $8974 [7e8974] A:0005 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c21163 STA $07 [000007] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c21165 PLP A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c21166 RTL A:0000 X:0013 Y:0018 S:1fde DB:7e D:0000 P:00 e 80e873 LDA $00 [000000] A:0000 X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e875 AND #$ff A:0f0e X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e878 STA $04 [000004] A:000e X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e87a ASL A A:000e X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e87b CLC A:001c X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e87c ADC $04 [000004] A:001c X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e87e STZ $02 [000002] A:002a X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e880 CMP $01 [000001] A:002a X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:00 e 80e882 BEQ $e886 [80e886] A:002a X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:01 e 80e884 BCS $e899 [80e899] A:002a X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:01 e 80e899 JSL $c21184 A:002a X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:01 e c21184 PHP A:002a X:0013 Y:0018 S:1fde DB:7e D:0000 P:01 e c21185 SEP #$20 A:002a X:0013 Y:0018 S:1fdd DB:7e D:0000 P:01 e c21187 LDA $7e89b4 A:002a X:0013 Y:0018 S:1fdd DB:7e D:0000 P:21 e c2118b STA $00 [000000] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c2118d LDA $7e89b6 A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c21191 STA $01 [000001] A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c21193 PLP A:0000 X:0013 Y:0018 S:1fdd DB:7e D:0000 P:23 e c21194 RTL A:0000 X:0013 Y:0018 S:1fde DB:7e D:0000 P:01 e 80e89d LDA $00 [000000] A:0000 X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:01 e 80e89f AND #$ff A:0000 X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:03 e 80e8a2 BEQ $e8b7 [80e8b7] A:0000 X:0013 Y:0018 S:1fe1 DB:7e D:0000 P:03 e
获得了HP在内存的值就很简单的可以追源出它在ROM里的位置~~~ 命名角色后,开始出现黄金鸟副图,回车,开始DUMP,到显示“溪谷的宿场”,内存里就有了HP的初始值。 如下: c2380c BNE $383d [c2383d] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2380e LDA $c294a2,X [c294a2] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23812 STA $85f1,Y [7e8504] A:000f X:0000 Y:0013 S:1fdf DB:7e D:0000 P:30 e c23815 STA $8605,Y [7e8618] A:000f X:0000 Y:0013 S:1fdf DB:7e D:0000 P:30 e//MAX的HP c23818 LDA $c29562,X [c29562] A:000f X:0000 Y:0013 S:1fdf DB:7e D:0000 P:30 e c2381c STA $867d,Y [7e8690] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2381f LDA $c29622,X [c29622] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23823 STA $8691,Y [7e86a4] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23826 LDA $c297a2,X [c297a2] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2382a STA $8641,Y [7e8654] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2382d LDA $c29862,X [c29862] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23831 STA $8655,Y [7e8668] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23834 LDA $c29922,X [c29922] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23838 STA $8669,Y [7e867c] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2383b PLP A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2383c RTS A:0000 X:0000 Y:0013 S:1fe0 DB:7e D:0000 P:b0 e
地址$0296A2($c294a2):0F为初始HP/MAX HP:15
用这个方法,可以找到其他能力值~ ////////////////////////////////////////////////// 剑强度 c203ef STZ $8974 [7e8974] A:0301 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:31 e 程序写死~默认为0(STZ) 只能动态修改: 在ZSNES模拟器上点按ESC调出菜单,选CHEAT,ADD CODE,输入7e8974XX,XX是剑强度的16进制值 ///////////////////////////////////////////////// 盾强度: $c29622,ROM地址$029822:00改为FF,则盾强度显示为255最高 经验值1:$c297a2,ROM地址$0299A2:00改为FF,经验值显示为255 经验值2:$c29862,ROM地址$029A62:00 00改为FF 00经验值显示为65280 经验值3:$c29922,ROM地址$029B22:00 00改为0F FF经验值显示为983040 总经验值=经验值1+经验值2+经验值3 c23818 LDA $c29562,X [c29562] A:000f X:0000 Y:0013 S:1fdf DB:7e D:0000 P:30 e c2381c STA $867d,Y [7e8690] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2381f LDA $c29622,X [c29622] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23823 STA $8691,Y [7e86a4] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e//盾强度 c23826 LDA $c297a2,X [c297a2] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e//初始经验值1 c2382a STA $8641,Y [7e8654] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c2382d LDA $c29862,X [c29862] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e//初始经验值2 c23831 STA $8655,Y [7e8668] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e c23834 LDA $c29922,X [c29922] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e//初始经验值3 c23838 STA $8669,Y [7e867c] A:0000 X:0000 Y:0013 S:1fdf DB:7e D:0000 P:32 e
///////////////////////////////////////////////// 人物抖动2倍速 ROM地址$2034C:01表示抖动正常,改为02抖动为正常2倍。注:改超过2的值画面花屏~~~ c2014b LDA #$01 A:0000 X:0000 Y:0013 S:1fe2 DB:7e D:0000 P:32 e c2014d STA $876d,Y [7e8780] A:0001 X:0000 Y:0013 S:1fe2 DB:7e D:0000 P:30 e c20150 STA $880d,Y [7e8820] A:0001 X:0000 Y:0013 S:1fe2 DB:7e D:0000 P:30 e ///////////////////////////////////////////////// 滿腹度的变量$3E30A9:F9 13 $02 存放的是MAX滿腹度 $7e8943存放满腹度初试值。
ROM里地址$20559:03是初始满腹度100% $20559:03改为0F,则开始游戏后,初始满腹度为254% 若改为0E,则开始游戏后,初始满腹度为255%
ROM地址$2053A:08即是游戏开始时的最大力量值ちから值08 值修改为63,则ちから值为99,修改值大于63将不出现正常数值
第二讲~完~~[s:2],第三讲要过段时间再来吧~~ 同学甲:怎么早开始放寒假了? 同学乙:老师要去那里玩? WT:秘密~~~ 同学丙:难道是回家结婚...... WT:滚~~
|
长江后浪推前浪,前浪死在沙滩上。
|
[楼 主]
|
Posted:2008-10-12 22:44| |
顶端
| |