基本が難しい場合がほとんどなので
解析をやり初めたばかりの方は
初めのうちは読み飛ばしておいた方が良いです


パッド操作で好きなタイミングでコードをON
不具合防止にパッドでコードON
色んな使い方が出来るパッドコード
見つけ易いゲームはとことん見つけ易いです

今までやった中で一番簡単だったソフトが
カプコンの「カオスレギオン」です
今回はこれを題材に説明したいと思います

まず、scePadReadラベルを移植します
カオスレギオンにはシンボルが無いので
他のソフトから移植してくる必要があります

scePadReadが存在するアドレスは
00215598です、このアドレスをマークし
参照先のプログラムを調べます
すると00234EB8と0023CA40の2箇所が見つかります

このうち、00234EB8以降の流れを見て下さい

lbuで2箇所からデータを読み出して
シフト、論理和などを使用して加工した後に
sw命令で数値をストアしています
実はこのswの書き込み先である
005C49A0がパッドアドレスになります

この画像に似た場所を探して
swやshなどストアしている場所があれば
そこがパッドアドレスになるのですが
このように書き込み先が見えてるのは珍しく
大体は何も表示されていない状態です

こういう場合は、関数を遡ってレジスタ値を調べたり
(TOD2は遡って見つける事が出来ます)
空きメモリへ処理を飛ばして
お金のアドレスにレジスタ値をストアさせて
数値を調べるなどの方法が必要になります

珍しいケースとしてディスガイアがあります
ワークコードの大半が、セーブデータロードで
改造チェックに引っ掛かってしまうので
パッドで対処しようと思ったのですが
これは普通のパッドアドレスでは効果がありません
(あいうそさんが言っていた気がしますが
そもそものチェックを外さないとダメ?みたいです)
これはパッド情報を別のアドレスへ写して
そのアドレスを使って回避する事が出来ました。


簡単そうに見えて難しい事もあるので
実力が付いてきたと思っている方は
是非、パッドにも挑戦して見て下さい
利用する事が無い場合も結構ありますけど(汗)



ここから先は興味のある方向けです

例えば、セレクトボタンを押した場合
005C4982にFFFEという数値が格納されます
このアドレスもパッド入力に比例して数値が変わるので
これもパッドアドレスとして使う事も出来ます

このFFFEなどのマイナス形式を、以下の処理をして
良く見かけるようなプラス形式へ変換します

lbu a0, $0102(s1)
a0=000000FE
lbu v1, $0103(s1)
v1=000000FF
それぞれのアドレスからそれぞれのレジスタへロード

sll a0, a0, 8
a0=0000FE00
a0を8ビット左へシフトさせる

or v1, a0, v1
v1=0000FEFF
シフトしたa0へv1を論理和する
下位8ビットが00なのでFFがそのまま入ります
詳しい論理和の動作は個人的書き物の
フラグの項目を読んで見て下さい

xori v1, v1, $ffff
v1=00000100
最後にv1とFFFFで排他的論理和をします
排他的論理和はビット単位(2進数)で計算します
動作は、計算するお互いの2進数での数値が
1同士だったら0、0同士だったら0
どちらかが0でもう片方が1だったら1
が格納されるという物です

つまり、xori v1, v1, $ffff 命令は
v1 =1111111011111111
即値=1111111111111111
↑をxor→0000000100000000→16進数化→0100
という処理をするようになっています
これで良く見るプラス形式の数値に変換します

初めからプラス形式で管理していないのは
PS2で何かの制約があるからでしょうか?
多分「しない」では無く「出来ない」のかも知れません