GUC コードステーション情報
ソフト名 4-1.○○減らないコード編
ソフト品番情報
ソフト対応機種 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
までメールをいただけると大変ありがたいです。


4-1.技術コード作成技法(○○減らないコード編) 技術コードを作成するための「HBP」の 使い方に慣れたら、次はプログラムの操作についてです。 一言に技術コードといっても多種多様で、様々な機能のものがありますが、 その中で代表的なものについて解説していきます。 なお、今回からはアセンブラの解説が主体になります。 ------------------------------- ○○減らない(増えない)形式の作成法 技術コードの中でも、比較的よく見かける形式です。 その分難易度も低めなようで、最初はこの形式から 覚えていくのがベストでしょう。 例えば、ライフが減る処理は、内部的には 1.ライフの値を読み出し 2.ライフの値を減算 3.減らしたライフの値を書き込み の3ステップで実行されています。 前回紹介した「制限時間減らない」は3の処理を潰すことで 実現していましたが、 今回は、2の処理を変更してライフの値を減らなくします。 例1:ファイナルファンタジー8・メニュー画面でアイテムの個数減らない HBPに監視させるアドレスは、 1つ目のアイテムの個数を変化させて数値サーチした結果、 80076DBDと判明しました。 HBPの設定は、 Breakpoint Address:$80076DBD Address Mask :$0FFFFFFF Event :Write Break Count :$0001 となります。 結果、 $801e5db4 lbu v1,$0001(a1) ;アドレスa1+$1から1バイトの値をv1に読み込み $801e5db8 nop ;ロード待ち $801e5dbc blez v1,$801e5ddc ;v1がゼロ以下ならば$801e5ddcへ分岐 $801e5dc0 mov v0,zero ;v0にゼロを代入 $801e5dc4 addiu v1,v1,#$ffff ;v1=v1+$ffffffff(-1) $801e5dc8 beq v1,zero,$801e5dd8 ;v1がゼロならば$801e5dd8へ分岐 >$801e5dcc sb v1,$0001(a1) ;v1の値をアドレスa1+$1に1バイト分書き込み $801e5dd0 j $801e5ddc ;$801e5ddcへ分岐 $801e5dd4 li v0,#$0001 ;v0に$1を代入 と表示されました。 v1、a1などの用語がありますが、これらはレジスタといって、 xやyなどの変数のようなものです。 ここでは、v1レジスタにアイテムの個数が入っているので、 v1レジスタの変化を追っていくと、 801e5dc4の addiu v1,v1,$ffff に行きつきました。($ffffは-1と解釈されます。) ここの-1を加算する部分ゼロを加算するように変更するわけですが、 addiu v1,v1,$ffffはプログラムデータでは2463ffffになっています。 下の2バイトが加算する数値に対応しているので、 「アイテムの個数減らない」は、PARコードで 801E5DC4 0000 とすればよいわけです。 ただし、これで完成ではありません。 というのも、アドレス801E5DC4はメニュー画面以外では別の プログラムやデータがロードされているので、 常に0000を書き込み続けると最悪の場合、ゲームが止まってしまいます。 それを回避するためには、Dコードを使用します。 Dコードは改造ツールの互換性から、アドレスの末尾が0,4,8,Cで データ部分が7FFF以下にするのが好ましいので、 801E5DC4の値FFFFを使用するのは避け、一つ手前の 801E5DC0の値1021をDコードとして使用します。 ここでの注意点は、出現頻度の高い0000をDコードの値に 使用すると、誤動作する恐れがあるということです。 よって、完成版「アイテムの個数減らない」は、 D01E5DC0 1021 801E5DC4 0000 となります。 例2:ファイナルファンタジー8・ショップで買い物してもお金が減らない HBPに監視させるアドレスは、 実際にいくつか買い物して所持金を変化させて数値サーチした結果、 801FAA78と判明しました。 一般的な所持金のアドレス80076BA4を使用すると正しく動作しないので注意。 HBPの設定を、 Breakpoint Address:$801FAA78 Address Mask :$0FFFFFFF Event :Write Break Count :$0001 とした結果、 $801e6dbc lw v0,$0028(s1) ;アドレスs1+$28から4バイトの値をv0に読み込み $801e6dc0 mflo v1 ;v1に特殊レジスタloの値を代入 $801e6dc4 subu v0,v0,v1 ;v0=v0-v1 $801e6dc8 lui v1,#$801f ;v1の上位2バイトに$801fを代入 $801e6dcc addiu v1,v1,#$b818 ;v1=v1+$ffffb818(v1=801eb818) $801e6dd0 addu v1,a1,v1 ;v1=a1+v1 >$801e6dd4 sw v0,$0028(s1) ;v0の値をアドレスs1+$28に4バイト分書き込み $801e6dd8 lbu v0,$0000(v1) ;アドレスv1+$0から1バイトの値をv0に読み込み このようになりました。 関係のない命令が多くて厄介ですが、注目するのはv0レジスタです。 801e6dc4の subu v0,v0,v1 というのがあります。こちらは引き算です。 ここではv0の値からv1の値を減算する代わりに ゼロを減算するようにすれば所持金が減らなくなるはずです。 幸い、R3000には常に値がゼロというzeroレジスタがあります。 つまり、v1をzeroに変更するわけですが、これが面倒です。 subu v0,v0,v1をプログラムデータに直すと00431023、 分かりにくい値です。 subu xx,yy,zzは2進数で表すと 000000yy yyyzzzzz xxxxx000 00100011 と表記されます。R3000にはレジスタが32個あるので、 レジスタの識別番号は5ビットとなります。 zeroレジスタの識別番号は0、 つまり、上位2バイトの下5ビット分をゼロにする、 もっと分かりやすくいえば0020単位で切り捨て処理をするわけです。 0040〜005Fならば0040、0200〜021Fならば0200になります。 subu v0,v0,v1では、上位2バイトは0043なので、0040に変更します。 これに先ほどの誤動作防止のDコードをつけ加えます。 今回は801e6dc4の1023が使えそうです。 よって、「ショップで買い物してもお金が減らない」は、 D01E6DC4 1023 801E6DC6 0040 ということになります。 ------------------------------- まとめ ○○減らない(増えない)形式の作成法 HBPでヒットしたアドレスからさかのぼって、 (ヒットした書き込み命令で使用しているレジスタを 追いかけていくと分かりやすい) addiu(またはaddi)xx,yy,$zzzz となっている場合はzzzzを0000に変更 =命令の下位2バイトを0000に変更する subu(またはsub)xx,yy,zzや addu(またはadd)xx,yy,zzの場合は zzをzeroに変更 =命令の上位2バイトを0020単位で切り捨てる 今回紹介したことで、ライフ減らない・所持金減らない 制限時間減らない・プレイ時間増えない等が実現できます。 これらにキー判定のDコードを加えればさらに 使いやすくなること間違いないでしょう。



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