今回はメモ書きその2 pad2のパッドアドレスとMコードで記載したパッドコードに関する事の
追加情報というかまとめです。
あまり実用性のあるものではないですが、データとして知っておいても良いかもしれません。

今回使用するラベルの移植用のpisファイルをおいておきますので保存して下さい。
pisファイル

コードは見やすくするために未暗号化状態です。
10進数・16進数・2進数に変換するツールはBabyBinny(簡易数値表現ツール)Ver1.1がおすすめです。

内容として
・1Pコントローラー(以降1P)・2Pコントローラー(以降2P)どちらでも動作するパッドコードプラス形式を作る。
・1Pと2Pのアドレスを別にしてパッドコードプラス形式を作る。
・1Pと2Pのパッドコードマイナス形式のアドレスを調べる。
なお、ソフトによっては1P・2Pではなく1Pのパッドコードが2種類となり、
コードで作ったパッドコードは通常のものより動作が鈍い場合がある。

パッドコードプラス形式のデータ部は以下のようになる
0001=L2
0002=R2
0004=L1
0008=R1
0010=△
0020=○
0040=×
0080=□
0100=SELECT
0200=L3
0400=R3
0800=START
1000=上
2000=右
4000=下
8000=左

パッドコードマイナス形式のデータ部は以下のようになる
FFFE=SELECT
FFFD=L3
FFFB=R3
FFF7=START
FFEF=上
FFDF=右
FFBF=下
FF7F=左
FEFF=L2
FDFF=R2
FBFF=L1
F7FF=R1
EFFF=△
DFFF=○
BFFF=×
7FFF=□

ps2disでCtrl+Gでラベルのリストを出し、
以下の内のどちらかを見つけて下さい
"libpad: buffer addr is not 64 byte align. %08x\n"
"libpad2: buffer addr is not 64 byte align. %08x\n"
便宜上、上だとpad1。下だとpad2として区別します。

〜pad1の場合〜

上記のpad1のラベルのへジャンプした後その先頭をスペースでマークし、
F3で参照箇所へ行き、その処理から1or2つ下の処理にあるjr raにフックをかける
以降このアドレスはフックアドレスとしておきます

処理の先頭にスペースをしてF3で参照箇所を見ていき
v0を基にしたロード
lbu v0, $0070(v0)
lbu v0, $0071(v0)
daddu a0, v0, zeroによってベースとなるレジスタがa0になる場合もある
このロードがあればスペースでマークしたものがフックアドレスの処理となります
ちなみにフックアドレスの処理はpad1の初期の頃に移植できたscePadGetDmaStrのラベルが付く処理です

もっと簡単にできるよう先に上げたpisファイルのpad1その1.pisもしくはpad1その2.pisをCtrl+Iで移植
Ctrl+Gでラベルのリストを出し、“ここのjr raにフック”というラベルにジャンプした処理が
フックアドレスがある処理です

以下はフックアドレスがある処理の返し値v0+2hがパッドコードマイナス形式のアドレスとなる事を
基に作ったコードです。

パッドコードプラス形式をアドレス000FD000に作る
200FC000 904B0002
200FC004 904C0003
200FC008 716C5E88
200FC00C 01605827
200FC010 3C0C0010
200FC014 03E00008
200FC018 A58BD000
2xxxxxxx 0803F000
xxxxxxx=フックアドレス
000FD000のパッドコードを使用する際はこのコードを併用する
1P・2Pどちらでも動作します

処理内容
000fc000 lbu   t3, $0002(v0)
000fc004 lbu   t4, $0003(v0)
000fc008 pextlb t3, t3, t4       
000fc00c nor   t3, t3, zero      

000fc010 lui   t4, $0010        t4=$00100000
000fc014 jr   ra
000fc018 sh   t3, $d000(t4)      [000fd000]
pextlbについては雑記 メモ書きを参照。

返し値v0+2hがパッドコードマイナス形式のアドレスであるため、そのデータ部の1バイト目と
2バイト目の位置をpextlbによって変え、否定論理和(nor)によってビットの反転をさせることによって
プラス形式のようにして000FD000にストアするというものです


パッドコードプラス形式を以下のアドレスに作る
1P->000FD000 2P->000FD004
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC030 24010001
200FC034 916F0002
200FC038 916E0003
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC048 01A0582D
200FC04C 258C0004
200FC050 1420FFF8
200FC054 2421FFFF
200FC058 03E00008
2xxxxxxx 0803F000
xxxxxxx=フックアドレス
000FD000・000FD004のパッドコードを使用する際はこのコードを併用する

処理内容
000fc000 lui   t4, $0010        t4=$00100000
000fc004 lw   t3, $d008(t4)      t3=$000fd008
000fc008 beql  t3, zero, $000fc058
000fc00c sw   v0, $d008(t4)      [000fd008]
000fc010 lw   t5, $d00c(t4)      t5=$000fd00c
000fc014 bne   t5, zero, $000fc030
000fc018 nop
000fc01c pmaxw  t5, t3, v0
000fc020 beq   t3, v0, $000fc058
000fc024 pminw  t3, t3, v0
000fc028 sw   t3, $d008(t4)      [000fd008]
000fc02c sw   t5, $d00c(t4)      [000fd00c]
000fc030 addiu  at, zero, $0001     at=$00000001
000fc034 lbu   t7, $0002(t3)
000fc038 lbu   t6, $0003(t3)
000fc03c pextlb t7, t7, t6
000fc040 nor   t7, t7, zero
000fc044 sh   t7, $d000(t4)      [000fd000]
000fc048 daddu  t3, t5, zero
000fc04c addiu  t4, t4, $0004      t4=$00100004
000fc050 bne   at, zero, $000fc034
000fc054 addiu  at, at, $ffff
000fc058 jr   ra
pextlbについては雑記 メモ書きを参照。

返し値v0の値2種類を比較し小さい方を000FD008,大きい方を000FD00Cにストアし。
その値を基に先のコードと同様にプラス形式のようにして
1P=000FD000,2P=000FD004にストアするというものです


1Pと2Pのパッドコードマイナス形式のアドレスを調べる
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC034 904F0002
200FC038 904E0003
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC04C yyyyyyyy
200FC050 AD8BD004
200FC058 03E00008
2xxxxxxx 0803F000
xxxxxxx=フックアドレス
yyyyyyyy=〜bitずつのところに記載してます

以下のものをパッドコードプラス形式D00FD000 0000xxxx(このコードで000FD000をパッドアドレスとしている)を使用して
指定するbit範囲等の効果を切り替える

1P:パッドアドレスを調べる場合
200FC030 00000000
2P:パッドアドレスを調べる場合
200FC030 01A0582D

4bitずつ
yyyyyyyy=316B000F
右へ0bitシフト
200FC048 000B5802
右へ4bitシフト
200FC048 000B5902
右へ8bitシフト
200FC048 000B5A02
右へ12bitシフト
200FC048 000B5B02
右へ16bitシフト
200FC048 000B5C02
右へ20bitシフト
200FC048 000B5D02
右へ24bitシフト
200FC048 000B5E02

8bitずつ
yyyyyyyy=316B00FF
右へ0bitシフト
200FC048 000B5802
右へ8bitシフト
200FC048 000B5A02
右へ16bitシフト
200FC048 000B5C02
右へ24bitシフト
200FC048 000B5E02

12bitずつ
yyyyyyyy=316B0FFF
右へ0bitシフト
200FC048 000B5802
右へ12bitシフト
200FC048 000B5B02

16bitずつ
yyyyyyyy=316BFFFF
右へ0bitシフト
200FC048 000B5802
右へ16bitシフト
200FC048 000B5C02

32bit全て
yyyyyyyy=00000000
200FC048 00000000

なお、上位4bit(x0000000のxの部分)は必要がないので省いてあるものもあります

処理内容
000fc000 lui   t4, $0010        t4=$00100000
000fc004 lw   t3, $d008(t4)      t3=$000fd008
000fc008 beql  t3, zero, $000fc058
000fc00c sw   v0, $d008(t4)      [000fd008]
000fc010 lw   t5, $d00c(t4)      t5=$000fd00c
000fc014 bne   t5, zero, $000fc030
000fc018 nop
000fc01c pmaxw  t5, t3, v0
000fc020 beq   t3, v0, $000fc058
000fc024 pminw  t3, t3, v0
000fc028 sw   t3, $d008(t4)      [000fd008]
000fc02c sw   t5, $d00c(t4)      [000fd00c]
000fc030 nop               2P:パッドアドレスを調べる場合;daddu t3, t5, zero
000fc034 lbu   t7, $0002(v0)
000fc038 lbu   t6, $0003(v0)
000fc03c pextlb t7, t7, t6
000fc040 nor   t7, t7, zero
000fc044 sh   t7, $d000(t4)      [000fd000]
000fc048 srl   t3, t3, 4        右にシフトするbit指定(詳細は上のリストを参照)
000fc04c andi  t3, t3, $000f      yyyyyyyyのところ
000fc050 sw   t3, $d004(t4)      [000fd004]
000fc054 nop
000fc058 jr   ra
pextlbについては雑記 メモ書きを参照。

返し値v0の値2種類を比較し小さい方を000FD008,大きい方を000FD00Cにストア。
その値を基に先のコードと同様に000FD000にプラス形式のパッドコードを作り、
返し値であるv0の数値を右シフトと論理積の組み合わせによって指定したbit範囲を
000FD004にストアするというものです。
指定するbit範囲はプラス形式のパッドコード000FD000を併用することで切り替えます。

バイトコピーや所持金等の数値表示に使用されるロードするアドレスを000FD004に変える事で
表示させて下さい。ただし表示できる数値が15未満である場合はこのままでは無理ですので
下記のように右シフトと論理積の組み合わせを各自修正して下さい
2bitずつ
右へ0bitシフト
000fc048 srl   t3, t3, 0
000fc04c andi  t3, t3, $0003
右へ2bitシフト
000fc048 srl   t3, t3, 2
000fc04c andi  t3, t3, $0003
右へ4bitシフト
000fc048 srl   t3, t3, 4
000fc04c andi  t3, t3, $0003
右へ6bitシフト
以下省略
2bitだと表示できる値が3でもできますが、確認作業が4bitずつの場合の2倍になるので
できる限り大きい値のものを使用して下さい
2bitずつの場合下記のように表示される値(10進数)を2進数へ変更し、次に調べたものとあわせて16進数化すると良いと思います
右へ0bitシフト
2->10
右へ2bitシフト
3->11
1110=E
右へ4bitシフト
3->11
右へ6bitシフト
1->01
0111=7
最下位1バイト=7E

所持金のアドレスが004E06C8である場合
D00FD000 00000101
204E06C8 00000000
500FD004 0000000x
004E06C8 00000000
SELECT+L2で一度所持金をゼロにして余計なデータが表示させないようにした上で
バイトコピーでxバイト分を表示させます
xの値は表示できる数値によって変えて下さい

0〜255(FF)=1
0〜65535(FFFF)=2
0〜16777215(FFFFFF)=3
0〜16777216(1000000)以上=4

上にある指定するbit範囲で何bitずつのものを使用するかも表示できる数値によって
変えて下さい。可能であるなら下の方を使用した方が確認作業が少なくて良いです
15(F)以上=4bitずつ
255(FF)以上=8bitずつ
4095(FFF)以上=12bitずつ
65535(FFFF)以上=16bitずつ
33554431(1FFFFFF)以上=32bit全て(アドレスが02000000以上のコードを見たことがないのでこの場合は32bitでも大丈夫だと思います)


戦国BASARA2の場合
所持金のワークアドレス=004E06C8
フックアドレス=00270C08

パッドコードプラス形式をアドレス000FD000に作る
200FC000 904B0002
200FC004 904C0003
200FC008 716C5E88
200FC00C 01605827
200FC010 3C0C0010
200FC014 03E00008
200FC018 A58BD000
20270C08 0803F000フックアドレスを入れるところ
000FD000のパッドコードを使用する際はこのコードを併用する
1P・2Pどちらでも動作します

動作確認用
D00FD000 00000101
204E06C8 00000001
D00FD000 00000102
204E06C8 00000003
SELECT+L2=所持金が1,SELECT+R2=所持金が3
1P・2P共通


パッドコードプラス形式を以下のアドレスに作る
1P->000FD000 2P->000FD004
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC030 24010001
200FC034 916F0002
200FC038 916E0003
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC048 01A0582D
200FC04C 258C0004
200FC050 1420FFF8
200FC054 2421FFFF
200FC058 03E00008
20270C08 0803F000フックアドレスを入れるところ

動作確認用
D00FD000 00000101
204E06C8 00000001
D00FD004 00000102
204E06C8 00000003
1PでSELECT+L2=所持金が1,2PでSELECT+R2=所持金が3


1Pと2Pのパッドコードマイナス形式のアドレスを調べる
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC034 904F0002
200FC038 904E0003
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC04C 316B00FFyyyyyyyyのところ
200FC050 AD8BD004
200FC058 03E00008
20270C08 0803F000フックアドレスを入れるところ

以下のコードでボタン操作で表示する範囲を切り替えます
SELECT+L2で一度所持金をゼロにして余計なデータが表示させないようにした上で
バイトコピーで1バイト分を所持金に表示させます
D00FD000 00000101
204E06C8 00000000
500FD004 00000001
004E06C8 00000000
L2+R2で1Pのアドレスを調べる
D00FD000 00000003
200FC030 00000000
L1+R1で2Pのアドレスを調べる
D00FD000 0000000C
200FC030 01A0582D
上+R2で右へ0bitシフト(アドレスの000000xxの部分を調べる)
D00FD000 00001002
200FC048 000B5802
右+R2で右へ8bitシフト(アドレスの0000xx00の部分を調べる)
D00FD000 00002002
200FC048 000B5A02
下+R2で右へ16bitシフト(アドレスの00xx0000の部分を調べる)
D00FD000 00004002
200FC048 000B5C02
左+R2で右へ24bitシフト(アドレスのxx000000の部分を調べる)
D00FD000 00008002
200FC048 000B5E02

操作方法
まずSELECT+L2で一度所持金をゼロにする
L2+R2で1Pのアドレスを調べる状態にする(ゲーム起動時はこの状態になっています)
上+R2でアドレスの000000xxの部分を所持金に10進数で表示させる
右+R2でアドレスの0000xx00の部分を所持金に10進数で表示させる
下+R2でアドレスの00xx0000の部分を所持金に10進数で表示させる
左+R2でアドレスのxx000000の部分を所持金に10進数で表示させる
L1+R1で2Pのアドレスを調べる状態にする
上+R2でアドレスの000000xxの部分を所持金に10進数で表示させる
以下上に同じ

以上により10進数で表示された値を16進数に変更しxxへと入れていった結果
1P
005440C0
2P
00544440
先にフックアドレスの特定方法の部分で述べた
フックアドレスがある処理の返し値v0+2hがパッドコードマイナス形式のアドレスとなる事から

パッドコードマイナス形式
1P
D05440C2 0000xxxx
2P
D0544442 0000xxxx

結果を基に動作確認をしてみます
1PでL2+R2を押すと所持金1
D05440C2 0000FCFF
204E06C8 00000001
1PでL1+R1を押すと所持金2
D05440C2 0000F3FF
204E06C8 00000002
2PでL1+L2を押すと所持金3
D0544442 0000FAFF
204E06C8 00000003
2PでR1+R2を押すと所持金4
D0544442 0000F5FF
204E06C8 00000004
動作の確認をするとこれで良いようです


サモンナイト4の場合
フックアドレス=00123b20

パッドコードプラス形式をアドレス000FD000に作る
200FC000 904B0002
200FC004 904C0003
200FC008 716C5E88
200FC00C 01605827
200FC010 3C0C0010
200FC014 03E00008
200FC018 A58BD000
20123B20 0803F000フックアドレスを入れるところ
2Pで動作しないため1Pと2Pのパッドコードマイナス形式のアドレスを調べるコードを使用して
返し値v0を調べたところ
003b9280
003b9300
以上の2つであったため、これに+2hしたものをパッドコードマイナス形式のアドレスとして
効果の確認をすると双方共に1Pで動作しました

以上のことから必ずしも1P,2Pのパッドコードのアドレスとなるのではなく、1Pのパッドコードが
2つできるソフトがある
ようです。後にも記載してありますがこの結果はpad2でもみられます

〜pad2の場合〜

"libpad2: buffer addr is not 64 byte align. %08x\n"のpad2のラベルのへジャンプした後
その先頭をスペースでマークし、F3で参照箇所へ行き、その処理から9つ下の処理にあるjr raにフックをかける
以降このアドレスはフックアドレスとしておきます

こちらもわかりやすくするため先に上げたpisファイルのpad2.pisをCtrl+Iで移植
Ctrl+Gでラベルのリストを出し、“ここのjr raにフック”というラベルにジャンプして下さい
“ここのjr raにフック”というラベルは2箇所に付きますが、下の方がフックアドレスがある処理です
見分け方はjal命令の1つ上にaddiu a1, a0, $0100がある方の処理

以下はフックアドレスがある処理の返し値v0+1Chがパッドコードマイナス形式のアドレスとなる事を
基に作ったコードです。
赤くマークしてあるところ以外はpad1と同じで説明も同じであるため細かい説明は省略します

パッドコードプラス形式をアドレス000FD000に作る
200FC000 904B001C
200FC004 904C001D
200FC008 716C5E88
200FC00C 01605827
200FC010 3C0C0010
200FC014 03E00008
200FC018 A58BD000
2xxxxxxx 0803F000
xxxxxxx=フックアドレス
000FD000のパッドコードを使用する際はこのコードを併用する
1P・2Pどちらでも動作します

処理内容
000fc000 lbu   t3, $001C(v0)
000fc004 lbu   t4, $001D(v0)
000fc008 pextlb t3, t3, t4       
000fc00c nor   t3, t3, zero      

000fc010 lui   t4, $0010        t4=$00100000
000fc014 jr   ra
000fc018 sh   t3, $d000(t4)      [000fd000]
pextlbについては雑記 メモ書きを参照。


パッドコードプラス形式を以下のアドレスに作る
1P->000FD000 2P->000FD004
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC030 24010001
200FC034 916F001C
200FC038 916E001D
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC048 01A0582D
200FC04C 258C0004
200FC050 1420FFF8
200FC054 2421FFFF
200FC058 03E00008
2xxxxxxx 0803F000
xxxxxxx=フックアドレス
000FD000・000FD004のパッドコードを使用する際はこのコードを併用する

処理内容
000fc000 lui   t4, $0010        t4=$00100000
000fc004 lw   t3, $d008(t4)      t3=$000fd008
000fc008 beql  t3, zero, $000fc058
000fc00c sw   v0, $d008(t4)      [000fd008]
000fc010 lw   t5, $d00c(t4)      t5=$000fd00c
000fc014 bne   t5, zero, $000fc030
000fc018 nop
000fc01c pmaxw  t5, t3, v0
000fc020 beq   t3, v0, $000fc058
000fc024 pminw  t3, t3, v0
000fc028 sw   t3, $d008(t4)      [000fd008]
000fc02c sw   t5, $d00c(t4)      [000fd00c]
000fc030 addiu  at, zero, $0001     at=$00000001
000fc034 lbu   t7, $001C(t3)
000fc038 lbu   t6, $001D(t3)
000fc03c pextlb t7, t7, t6
000fc040 nor   t7, t7, zero
000fc044 sh   t7, $d000(t4)      [000fd000]
000fc048 daddu  t3, t5, zero
000fc04c addiu  t4, t4, $0004      t4=$00100004
000fc050 bne   at, zero, $000fc034
000fc054 addiu  at, at, $ffff
000fc058 jr   ra
pextlbについては雑記 メモ書きを参照。


1Pと2Pのパッドコードマイナス形式のアドレスを調べる
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC034 904F001C
200FC038 904E001D
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC04C yyyyyyyy
200FC050 AD8BD004
200FC058 03E00008
2xxxxxxx 0803F000
xxxxxxx=フックアドレス
yyyyyyyy=〜bitずつのところに記載してます

1P:パッドアドレスを調べる場合
200FC030 00000000
2P:パッドアドレスを調べる場合
200FC030 01A0582D

4bitずつ
yyyyyyyy=316B000F
右へ0bitシフト
200FC048 000B5802
右へ4bitシフト
200FC048 000B5902
右へ8bitシフト
200FC048 000B5A02
右へ12bitシフト
200FC048 000B5B02
右へ16bitシフト
200FC048 000B5C02
右へ20bitシフト
200FC048 000B5D02
右へ24bitシフト
200FC048 000B5E02

8bitずつ
yyyyyyyy=316B00FF
右へ0bitシフト
200FC048 000B5802
右へ8bitシフト
200FC048 000B5A02
右へ16bitシフト
200FC048 000B5C02
右へ24bitシフト
200FC048 000B5E02

12bitずつ
yyyyyyyy=316B0FFF
右へ0bitシフト
200FC048 000B5802
右へ12bitシフト
200FC048 000B5B02

16bitずつ
yyyyyyyy=316BFFFF
右へ0bitシフト
200FC048 000B5802
右へ16bitシフト
200FC048 000B5C02

32bit全て
yyyyyyyy=00000000
200FC048 00000000

なお、上位4bit(x0000000のxの部分)は必要がないので省いてあるものもあります

処理内容
000fc000 lui   t4, $0010        t4=$00100000
000fc004 lw   t3, $d008(t4)      t3=$000fd008
000fc008 beql  t3, zero, $000fc058
000fc00c sw   v0, $d008(t4)      [000fd008]
000fc010 lw   t5, $d00c(t4)      t5=$000fd00c
000fc014 bne   t5, zero, $000fc030
000fc018 nop
000fc01c pmaxw  t5, t3, v0
000fc020 beq   t3, v0, $000fc058
000fc024 pminw  t3, t3, v0
000fc028 sw   t3, $d008(t4)      [000fd008]
000fc02c sw   t5, $d00c(t4)      [000fd00c]
000fc030 nop               2P:パッドアドレスを調べる場合;daddu t3, t5, zero
000fc034 lbu   t7, $001C(v0)
000fc038 lbu   t6, $001D(v0)
000fc03c pextlb t7, t7, t6
000fc040 nor   t7, t7, zero
000fc044 sh   t7, $d000(t4)      [000fd000]
000fc048 srl   t3, t3, 4        右にシフトするbit指定
000fc04c andi  t3, t3, $000f      yyyyyyyyのところ
000fc050 sw   t3, $d004(t4)      [000fd004]
000fc054 nop
000fc058 jr   ra
pextlbについては雑記 メモ書きを参照。



幻想水滸伝5の場合
このソフトも1P,2Pのパッドコードのアドレスとなるのではなく、1Pのパッドコードが
2つできるソフトですが使い方は1P,2Pのパッドコードのアドレスとなる場合と同じですので
便宜上1Pと2Pのパッドコードとしています
1Pと2Pのパッドコードができるソフトの例としてはキングダムハーツU ファイナルミックス+ですが
セーブデータを消したようなので幻想水滸伝5の場合でやります

所持金のワークアドレス=00984EF0
フックアドレス=0020798C

パッドコードプラス形式をアドレス000FD000に作る
200FC000 904B001C
200FC004 904C001D
200FC008 716C5E88
200FC00C 01605827
200FC010 3C0C0010
200FC014 03E00008
200FC018 A58BD000
2020798C 0803F000フックアドレスを入れるところ

動作確認用
D00FD000 00000101
20984EF0 00000001
D00FD000 00000102
20984EF0 00000003
SELECT+L2=所持金が1,SELECT+R2=所持金が3
1P・2P共通


パッドコードプラス形式を以下のアドレスに作る
1P->000FD000 2P->000FD004
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC030 24010001
200FC034 916F001C
200FC038 916E001D
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC048 01A0582D
200FC04C 258C0004
200FC050 1420FFF8
200FC054 2421FFFF
200FC058 03E00008
2020798C 0803F000フックアドレスを入れるところ

動作確認用
D00FD000 00000101
20984EF0 00000001
D00FD004 00000102
20984EF08 00000003
1PでSELECT+L2=所持金が1,2PでSELECT+R2=所持金が3

1Pと2Pのパッドコードマイナス形式のアドレスを調べる
200FC000 3C0C0010
200FC004 8D8BD008
200FC008 51600013
200FC00C AD82D008
200FC010 8D8DD00C
200FC014 15A00006
200FC01C 716268C8
200FC020 1162000D
200FC024 716258E8
200FC028 AD8BD008
200FC02C AD8DD00C
200FC034 904F001C
200FC038 904E001D
200FC03C 71EE7E88
200FC040 01E07827
200FC044 A58FD000
200FC04C 316B00FFyyyyyyyyのところ
200FC050 AD8BD004
200FC058 03E00008
2020798C 0803F000フックアドレスを入れるところ

以下のコードでボタン操作で表示する範囲を切り替えます
SELECT+L2で一度所持金をゼロにして余計なデータが表示させないようにした上で
バイトコピーで1バイト分を所持金に表示させます
D00FD000 00000101
20984EF0 00000000
500FD004 00000001
00984EF0 00000000
L2+R2で1Pのアドレスを調べる
D00FD000 00000003
200FC030 00000000
L1+R1で2Pのアドレスを調べる
D00FD000 0000000C
200FC030 01A0582D
上+R2で右へ0bitシフト(アドレスの000000xxの部分を調べる)
D00FD000 00001002
200FC048 000B5802
右+R2で右へ8bitシフト(アドレスの0000xx00の部分を調べる)
D00FD000 00002002
200FC048 000B5A02
下+R2で右へ16bitシフト(アドレスの00xx0000の部分を調べる)
D00FD000 00004002
200FC048 000B5C02
左+R2で右へ24bitシフト(アドレスのxx000000の部分を調べる)
D00FD000 00008002
200FC048 000B5E02

結果
1P
0082d900
2P
0082d980
先にフックアドレスの特定方法の部分で述べた
フックアドレスがある処理の返し値v0+1Chがパッドコードマイナス形式のアドレスとなる事から

パッドコードマイナス形式
1P
D082D91C 0000xxxx
2P
D082D99C 0000xxxx

結果を基に動作確認をしてみます
1PでL2+R2を押すと所持金1
D082D91C 0000FCFF
20984EF0 00000001
1PでL1+R1を押すと所持金2
D082D91C 0000F3FF
20984EF0 00000002
2PでL1+L2を押すと所持金3
D082D99C 0000FAFF
20984EF0 00000003
2PでR1+R2を押すと所持金4
D082D99C 0000F5FF
20984EF0 00000004
動作確認したところこれで良いとわかりました

というわけで、かなり長くなりましたがこんな感じでパッドコードマイナス形式を調べたりできます。

戻る