アドレスでアセンブルは、ワークコードから そのアドレスに関係するプログラムを割り出す解析方法です すでに私がワークコードを出しているゲームを使い それをベースにして作ってみましょう。 今回もFF]インターナショナルを例に書きます まず、プログラムを割り出したいワークコードを復号化して PS2DISでそのアドレスへ飛びます、今回は 戦闘終了後AP MAX Tidus(ティーダ) 1CA87B18 1DBC9E0C のコードを使い、戦闘後にAPを加算してる場所を見つけます。 上記のコードを複合化すると 2031F8F0 3B9AC9FFになると思います アドレス部分の先頭の2の部分はコードの動作を決める物なので 通常はここが0です、解析も0の状態で行いますので 0031F8F0が使用するアドレスとなります。 では、アドレス部分の0031F8F0に ツールバーの編集→指定アドレスにジャンプで行きます 0031F8F0についたら、キーボードのスペースキーを押して 参照先アドレスに指定し、F3を押してくださいすると、いくつかの参照先候補が出てきますが その中に最大値検索で登場したような値が近くに存在する場所がありました 恐らくここはAPの最大値チェックをしていると考えられます
v0レジスタにTidus(ティーダ)のアドレスを設定した後 s0レジスタにadduでv0の数値を加算してs0レジスタに格納しています つまりs0レジスタにもTidus(ティーダ)のアドレスが入ったという事です その後の処理を見ていくと 001DCD94でa2レジスタに3B9AC9FFという数値が格納され 001DCD98のlw命令でAPの現在値をa0レジスタにロードして 001DCD9Cのjal命令で他の場所へ一端処理を移動させていますが 001DCDA0のaddu命令はjal命令と一緒に処理されます
このjal命令の先で上画像の命令を実行したあと 001DCDA4のsw命令まで処理が戻ってきます このsw命令に注目です、このストア命令はv0の数値を s0レジスタに+0000hしたアドレスに書き込むという意味があります ここで、v0レジスタの数値をストアさせるのではなく 最大値らしき数値が格納されているa2レジスタの数値を ストアしたらどうなるでしょうか? 恐らく戦闘後の獲得APが最大になると考えられます。 早速、ストア命令を書き換えてテストします PS2DISの行の編集機能で、命令を以下のものに書き換えます sw a2, $0000(s0) すると、数値(Data)がこの命令の物に変換されるので それをコードにすればOKです。
実際に効果を試してみた所 APを入手したキャラ全員がAPを大量にゲットする事が出来ました という事でワークコードからプログラムの追跡に成功しました。