GUC コードステーション情報
ソフト名 3.技術コード作成入門
ソフト品番情報
ソフト対応機種 PS(PlayStaition)
改造対応ツール
投稿者(敬称略) D-RAM【GUC】
投稿者連絡先 mopro@jade.dti.ne.jp
登録日 1999/07/26
更新日 1999/07/26
サーチ環境
コメント 「何か動作がおかしい」とか、「こういうことができるコードが欲しい」
また、「ここはこうするべきでは」等のご意見がありましたら、お手数ですが
D-RAM【GUC】
e-mail mopro@jade.dti.ne.jp
までメールをいただけると大変ありがたいです。


3.技術コード作成入門(HBPの使い方) お待たせしました、いよいよゲームプログラムを操作する 技術コードの作成方法です。 今回あたりから内容が急激に難しくなりますが、 頑張ってついてきて下さい(^^; まずは、技術コードの概要です。 利点 ・○○すべてそろう等を数行のコードで済ますことができ、 ステータス系では全員に効果が現れるので、入力し直す手間が省ける。 ・制限解除など、特殊なことができるようになる。 ・データ部分のアドレスが変動するゲームに対応できる 欠点 ・特定の条件でしか効果が現れないため、 動作させる為には、ある操作をしなければならない。 ・コードの入力を間違えるとゲームが止まる危険性が高い。 ・動作確認に手間がかかり、場面によっては 予期しない不具合が起こることがある。 その他の特徴 ・ゲーム中にコードをOFFにしても、ゲームを リセットするまで効果が持続するものがある。 だいたいこんなところです。プログラムを操作する点で、 アセンブラの知識が必要になることから、上級者向けのコードといえます。 数値サーチ・比較サーチのみでは発見できないので、 「サーチする」ではなく「作成する」という表現になるわけです。 その技術コードを作成するに当たっては、 「HBP」(ハードウェアブレークポイント)を使用します。 これは、実行中のプログラムに割り込んで、 特定のアドレスのデータを監視することができます。 逆アセンブル機能のあるサーチツールには、 HBPも扱っていることが多いようです。 ------------------------------- 技術コードを作成する では、早速技術コードの実践に入ります。 手始めにまず、ファイナルファンタジー8で 時限イベントの制限時間カウントを停止するコードです。 最初にHBPで監視するアドレス(ここでは制限時間のアドレス) を探し出す必要があります。 制限時間は時間とともに減るものなので、 比較サーチの「LESS」サーチを使用します。 まずはメモリイメージを取り込んでから、 「LESS」サーチを繰り返すだけで、候補は絞れてきます。 結果、このようになりました。 1回目、LESSで比較サーチ =>候補数:177 2回目、LESSで比較サーチ =>候補数:32 3回目、LESSで比較サーチ =>候補数:6 4回目、LESSで比較サーチ =>候補数:3 この時点での候補は、 80076D6C 06CF 06D6 06DB 06E1 06F6 800821F6 CF37 D635 DB03 E115 F621 801FFEAC 06CE 06D5 06DA 06E0 06F5 以上の3つのコードを1つずつONにしたところ、 80076D6C 制限時間カウントが停止 800821F6 制限時間のコロンの点滅のみ停止 801FFEAC 変化なし 制限時間のアドレスは80076D6Cであることが判明しました。 この時点では制限時間を一定の数値で固定することによって カウントが停止しています。 見つけたついでに、制限時間を思いっきり長くしましょう。 というのも、短いとこの先の段階で時間切れを起こして ゲームオーバーになる恐れがあるからです(笑) ------------------------------- HBPを使用してみる 次に、プログラムのどこの部分で制限時間のカウントを行っているかを 知るために、HBPを使用します。 ここでは、PS X−LINK(DOS版)のHBPについて 説明していきます。 まず、メモリエディット画面に入り、F1キーで 逆アセンブルモードに切り替えます。 その状態で、F12キーを押すと、「Breakpoint Editor」 というウィンドウが出現します。これがHBPです。 いくつか項目があるので、説明すると、 :Breakpoint Address HBPに監視させるアドレスです。16進で入力して下さい。 :Address Mask 監視するアドレスの範囲を指定するものです。 関係のないアドレスが対象になっては困るので、 1バイト単位で監視したいところですが、 初期値の$0FFFFFFEでは2バイト単位になってしまいます。 よって、1バイト単位の$0FFFFFFFをお勧めします。 下手に数値を入力すると動作がおかしくなるので、 間違ってもアドレス値等を入力しないよう注意。 :Event HBPは監視するアドレスに何らかの変化があった場合、 ゲームの実行を一時中断し、その時点でのプログラム情報を 表示します。(ブレイクする、と言う) ここでは、その条件を指定します。 Read:監視するアドレスの値がプログラム上から参照された場合に、 実行を一時中断する。 Write:監視するアドレスの値が変化した場合に、 実行を一時中断する。 Execute:プログラム実行中に監視するアドレスを通過した場合に、 実行を一時中断する。 Executeはプログラム部分に対して使用します。 また、Read&Writeなど、これらの条件をを複数指定することもできます。 :Break Count Eventで指定した条件を何度満たしたら実行を一時中断するかを指定します。 通常は1回($0001)とします。 今回の例では、 Breakpoint Address:$80076D6C Address Mask :$0FFFFFFF Event :Write Break Count :$0001 このように設定します。 設定し終わったら、「Wait for breakpoint」を選択します。 X−LINKのHBPは一般的なHBPとは少々違うようで、 ブレークしても実行は止まらず、またブレークした部分の プログラム命令がスキップされてしまうようです。 そのため、X−LINKでHBPをかける場合は、 常に何らかの不具合が起こる可能性がつきまといます。 また、ExecuteでHBPをかけるとハングしてしまうことも多々あります。 -------------------------- プログラムを変更する HBPの設定が間違っていなければ、すぐに 次のような画面が表示されると思います。 --Break result-- Break Address = $800117bc (Address:80076d6C Event:On Write) R3000 Register dump at:80060000 v0:0000065e v1:80076098 a0:00000001 a1:00000001 a2:1f801070 t0:00000000 t1:00000000 t2:014b004d t3:ffffffff t4:014b0001 t5:00000000 t6:1320004d t7:13200001 s0:8005c380 s1:00000004 s2:8005b2cc s3:00000001 s4:8005b2cc s5:00000000 s6:00000000 s7:00000000 t8:13200001 t9:00007568 k0:1f0230c8 k1:00006418 gp:8005da28 sp:8005c280 s8:80070000 ra:800116f4 Hex / ASCII dump $80011790 : 43 14 02 00 10 00 40 10 07 80 02 3C 98 60 43 24 $800117A0 : D4 0C 62 8C 00 00 00 00 0C 00 40 10 01 00 02 24 $800117B0 : D4 0C 62 8C 00 00 00 00 FF FF 42 24>D4 0C 62 AC $800117C0 : 06 80 02 3C 7C DE 42 8C 00 00 00 00 FF FF 42 30 $800117D0 : 06 80 01 3C 7C DE 22 AC 01 00 02 24 06 80 01 3C Quick disassembly $800117A4 : nop $800117A8 : beq v0,zero,$800117dc $800117AC : li v0,$1 $800117B0 : lw v0,$cd4(v1) $800117B4 : nop $800117B8 : addiu v0,v0,$ffff >$800117BC : sw v0,$cd4(v1) $800117C0 : lui v0,#$8006 $800117C4 : lw v0,$de7c(v0) $800117C8 : nop $800117CC : andi v0,v0,#$ffff $800117D0 : lui at,#$8006 $800117D4 : sw v0,$de7c(at) WriteでHBPをかけたので、 制限時間が書き込みされたのは、 800117BCということになります。 $800117BC : sw v0,$cd4(v1) ここの部分です。 これを何もしない命令(nop)に変更すれば、 制限時間は減らなくなります。 おそらく、もっとも手軽な方法だと思われます。 具体的には800117BCを00000000で書き換えることになります。 4バイト書き込むので、PAR(X−T)用にすると、 800117BC 0000 800117BE 0000 の2行になります。。 ただし一つ注意、メモリエディットで直接書き換える場合、 途中でそこの部分が実行されてしまうと、ゲームが止まる恐れがあります。 面倒ですが、一旦プレステの実行を止めてから書き換えたほうが無難です。 X−LINKではメインメニュー・オプションメニューで F12キーを押すとプレステの実行を一時的に中断できます。 プレステの実行を復旧させる場合は、もう一度F12キーです。 このコードを使用すると制限時間が一切減らなくなりますが、 イベント等のウェイトも減らなくなり、 ゲームが進まなくなることがあるようです。 そのような場合は、キー判定コードと組み合わせて 制限時間減らない (セレクト+L2を押すと制限時間がゼロになる) 800117BC 0000 800117BE 0000 D0081B0E 0101 80076B6C 0000 上記のように変更するとうまく回避できます。



無断転載・無断商用利用・無断直接リンク禁止
ホームページサイト登録はこちらゲーム個別検索登録はこちら