スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ファイナルファンタジーをサーチしよー 3回目

ファイナルファンタジー
スクウェア・エニックス (2007/04/19)
売り上げランキング: 25
早くも3回目
今回は、前回のつづき。
前回見つけた、アドレス088769dcの周辺をみてみよう。
ff_0003.jpg

サムネイルになってるの拡大するにはクリックしてね。
アドレス088769c4 ori at, at, $8481(_001e8481)
atに数値001e8481を入れてるね。
これは10進数で2000001だから、前回見つけた
最大値2000000に+1した数値。
つぎに

アドレス088769cc sltu at, v1, at
atとv1の値を比較

アドレス088769d0  bnel at, zero, $088769e4
その結果により分岐。
この分岐を詳しく見ると
分岐せずにそのまま次のアドレスの命令に進むか
アドレス088769e4の命令まで飛ぶかになるのね。
実際は遅延スロットなどあるから少し違うんだけど。

分岐した場合は
アドレス088769d4  sw v1, $0000(a1)
v1の値をそのまま書き込むと。まあv1の値はいじりませんよってこと。
これが遅延スロットってやつ。

そして分岐せずに進んだ場合は
アドレス088769dc ori v1, v1, $8480(_001e8480)
を通り、そう検索で見つけたアドレスだね。
v1に2000000(001e8480h)を入れて
アドレス088769e0  sw v1, $0000(a1)
2000000(001e8480h)に変更したv1の値を書き込むと。

まとめると
v1の値が
2000001(001e8481h)未満なら
v1の値は変更せず
2000001(001e8481h)以上なら
v1の値を2000000(001e8480h)に変更して
それを書き込むといった感じ。

このことから、常に分岐をしないようにすれば
経験値と思われるv1の値は2000000に固定されることが予測できるね。
ということで、試しに分岐を消してみましょうか。
アドレス088769d0の分岐命令をnopに書き換えと。
ff_0009.jpg

088769d0 00000000
となるんだけど
dumpファイルを開くときに、メモリアドレスを08800000に指定したよね
そこでこの数値をアドレスから引いて
000769d0 00000000
これが、書き換えるアドレス。
実際に書き換えて
ff_0007.jpg

経験値を獲得すると
また長いLvアップ・・・
ステータス画面で確認すると無事にけいけんちが最大に。
これでv1には経験値が入っていることが確定。

さていよいよn倍の話。
長かったー。
アドレス088769cc
atとv1の値を比較していて
atには最大値+1、v1には経験値が入っていることはもうわかっているね
そこでその上のアドレス088769c8をみると
addu v1, a0, v1
v1にa0の値とv1の値を足した値をいれている
v1 = a0 + v1
式にするとこうかな。
ここからa0,v1のどちらかが、その戦闘で獲得した経験値
で残りがそれまでに獲得した合計経験値と予想できると思う。
ここでさらに上のほうをみてみると
するとアドレス088769c0  andi v1, a2, $ffff
これはa2と$ffffの論理積を求めてその結果をv1に入れるといったことをしている
わかりにくかったら、関数電卓で
経験値の最大値001e8480を入力し
ffffをandしてみて欲しい。
すると8480となり下位4桁以外の数値は消えてしまう。
つまりそういうことをしているわけ。

このことからv1には合計経験値ではなく、獲得経験値が
入っていると予想できるね。
ということで経験値をn倍、今回は4倍にするには
v1の値を4倍にすればよいということがわかる。
さて問題はこの処理をどこで行うかなんだけど
アドレス088769c0andi v1, a2, $ffff
この処理はきっとなくても平気だろうと感じたので
ここを使わせてもらうことに。
前に少し説明したけどv1にはa2とffffの論理積が入っていたよね
つまりこの命令が実行されるまでは
v1には獲得経験値は入ってなく、a2に入っているわけ。
ということで
andi v1, a2, $ffffの命令を
a2の値を4倍したものを、v1に入れる命令
sll v1, a2, 2に変更。
1bitシフトするごとに倍になるのを利用。
詳しくはR5900命令表のシフト命令sllを参照。
088769c0 00061880
こんな感じ。
アドレスから08800000を引き
000769c0 00061880
実際に書き換え確認すると無事に
表示される獲得経験値を4倍したものを入手 V(δoδ)

自分で読んでも分かりづらいので
質問などあったらコメントを。
非公開コメント

解析の幅を広める意味でもこの機会にps2disにも手を出してみようかと思います。
命令を理解するのに時間と根気が要りそうですが…行き詰まった際は宜しくお願い致します。
PS.ご挨拶ありがとうございました。

GNRさん、こんにちは。
命令は、命令表を見ながら調べているうちになんとなく覚え、理解できると思います。
サーチの記事のほうは書いたわたし自身が読んでもわかり辛いなと思うところが
何箇所かあるので、遠慮なく質問してください。
それとリンクの件ありがとうございました。

モンガさん初めまして。
いつもお世話になっています。
今回、解析を勉強したいと思ってこのページを見てみました。
こうやって解析していくんだと半分納得しつつ読み進めています。
これを機会に他のゲームでx倍にチャレンジしてみようと思います。
丁寧な解説で感動しました!
これからも応援しています。

>ゆうきさん、はじめまして。
記事がお役に立ちなによりです。
リンクにある
RITZ CODEさんの解析資料も
PSPを扱っていてとても参考になりますよ。
解析がんばってくださいね。
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
広告

最近のコメント
最新の記事
カテゴリー
ブログ検索
過去ログ
プロフィール

モンガ ☆04OLS0ko

Author:モンガ ☆04OLS0ko

RSSフィード
RSS
カウンター
フリーエリア

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。