大体のゲームには最大値チェックという物が存在します
よく、お金や経験値が999999999から増えなくなったり
アイテムが99個以上は持てないう事はありませんか?
これは、俗に言う「カウンターストップ(カンスト)」です

何故、お金やステータス、アイテムなどでカンストするかと言うと
開発者があらかじめ、プログラムで上限を設定して
カウンターが一定値から増えないように制御しているからです。

実は、この制限を利用した改造方法があります
まずは実践に入る前にPS2の解析作業とはどういう物なのか
最大値チェックの説明と一緒にちょっと見ていきましょう。
ただし、R5900の命令をある程度理解していないと難しいです。


基本的な最大値チェックの動作は
プログラムで設定してあるカンスト値(最大値)と
戦闘終了後などに増加した値とを比較する物が殆どで
「上限を超えていなければ修正はしない
上限を超えていた場合は修正してストア」という物です。

例として、良くある流れは以下のようになります
00230000 lui v1, $0045
00230004 lw v0, $1234(v1)
00230008 addu v0, v0, a0
0023000C sw v0, $1234(v1)
00230010 lw v0, $1234(v1)
00230014 lui t0, $0098
00230018 ori t0, t0, $967F
0023001C sltu at, v0, t0
00230020 bne at, $0023002C
00230024 nop
00230028 sw t0,$1234(v1)
0023002C nop
各命令の意味などはR5900命令表を参照して下さい

00230000〜0023000C
までは数値の加算を処理しています
まずは上限を超えていてもストアする事が多いです

00230010で加算後の数値をロードして
00230014と00230018で上限値をt0レジスタに設定(0098967F)
0023001Cでv0の現在値とt0の上限値とを比較します
ここで上限を超えていればatレジスタには0000が
超えていなければatレジスタには0001が格納されます

00230020の時点で現在値が上限値を上回っていた場合
atレジスタには0000が格納されているので分岐命令は無効になり
00230028のストア命令で最大値に修正されます

しかし00230020の時点で上限を超えていなかった場合
つまりatレジスタに0001が格納されていた場合は処理が分岐し
ストア命令は通過せずに進みます


この例で言えば、分岐命令で分岐しなかった場合には
00230028のストア命令で最大値に修正されるという動作なので
コードでこの分岐命令を潰すとお金がMAXになります
プログラムを書き換えて効果を出すので
俗に言うプログラムコードですね。

他にもv1レジスタ+1234hのアドレスからロードした数値と
上限値とを比較しているので、このv1+1234hが
現在値が格納されているアドレスであると予想できます。
この例の場合は00450000をv1レジスタにlui命令で格納して
その後lw命令、sw命令では00450000に1234を足して処理しているので
00451234が現在値が格納されているお金のワークアドレスになります。


PS2解析とは、このように一つの情報から
いくつもの考えといくつもの答えを導き出すものです
必ずしも一つの問いに一つの答えとは限りません。