基本が難しい場合がほとんどなので 解析をやり初めたばかりの方は 初めのうちは読み飛ばしておいた方が良いです パッド操作で好きなタイミングでコードを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で何かの制約があるからでしょうか? 多分「しない」では無く「出来ない」のかも知れません