PCSX2でパッドコード付き改造コードを使うには?(自作プログラムエリア確保編)

調査

※アセンブラ言語を多少理解していないと難しいと思います;
こんなところでAndroidルート化の知識が役立つとはね・・・

PS2の改造コードを探していると、パッドコードやパッドアドレスと言った単語が飛び交います。
これはパッドの特定のキーを押したときにコード有効にしたり無効にしたりします。

ですがそれらのコードはPCSX2では作動しません

理由はパッドコードはプロアクションリプレイやXPLOADER(XPLOADERにパッドコードが有るのかは実際は知らないです)等といった改造ソフトと連係しているからです。

要するにマスターコードって奴と連携しているのですが、仮にマスターコードに値するPCSX2上のメモリを書き換えてもプロアクションリプレイプログラムがメモリに読みこまれていないので動作しない訳なんですね。

と言ってもPCSX2でチートをするのは別に難しくありません。
外部のメモリエディタ(最近はチートエンジンを使ってますね)から直接メモリを検索したり、書き換え出来るのでパッドコードが必要になる場合があまりないからです。

しかし、例えば自分の投稿しているSSX3ではUBERトリックをイベント中に切り替えるチートをサーチしましたが外部メモリエディタを使うのはTAS動画を作る際には少し問題がでます。

SSX3では操作キャラにおいてどのUBERトリックを装備しているか管理しているメモリがあるのでそこを書き換えればイベント中でもトリックが切り替わりますが、TAS動画の場合はキー操作を記録して最終的に意図的にリプレイ状態を作り上げるのですが、キー操作には当然外部のメモリエディタの動作は記録されないのでリプレイがおかしくなるか、頑張ってタイミングにあわせてリプレイ中にメモリ操作が必要になってきます。

SSX3の場合は実際はトリック名を作成する文字列操作関数をフッキングしてそこにUBERトリックのアドレスを書き換える関数を自作しましたが、後々を考えるとパッドコードを作った方が潰しが効きそうなので少し考えてみました。

目的は?

さて、パッドコード、パッドコード言っていますが、実際のところ最終目的はパッドコードを使えるようにする事ではなくリプレイ時に改造コードが適切に動く状態にすることです。

そう考えたときに、アプローチが今のところ2通りあります
①R5900を勉強して、正式な改造プログラムコードを作る
②エミュを改造してパッドの状態に反応してメモリ書き換えが行われるようにする

というか自分のやりたい事を実現するなら恐らく②の方が簡単そうな予感・・・

ですが今日は①について考えてみたいと思います。

PS2PARのマスターコードとその解釈

これは私の調べた範囲での解釈です。所々にきっと違っていることもあるでしょうがまぁ概ねあっているはずだと思います。

まずPS2の実機での改造コードを利用するには外部メモリエディタなんてものはないので、PS2のメモリ内にPS2の言語で「ここのアドレスをこの数字に書き換えて」と配置しておかないといけません。

さらに言えば、命令を配置しておいただけではダメで命令に処理が回ってこなければ意味がありません。

そこでマスターコードと言うもので通常の処理に横入りしていると言うわけです。
「あなたの処理が終わった後に、ちょっと私の処理もやってくれ」
と言ったイメージになります。

そのためマスターコードを埋め込むには頻繁に実行される処理が望ましくパッド状態を読み取る関数や、描画を行う関数に埋め込むのが定石とされています。

改造プログラムがやってることを簡単にイメージしてみると以下の感じかと思います

・通常
 処理A > 処理B > 処理C
 
・改造プログラムあり
 処理A(マスターコード埋め込み)> 改造プログラムのエリアにジャンプ > 処理B > 処理C

具体的にPCSX2に落とし込むには以下がやることリストになります
・マスターコードサーチ(元々PARでの改造コードのサーチとおおむね同じ作業)
・パッドコードを使うならパッドアドレスサーチ(元々PARでの改造コードのサーチとおおむね同じ作業でもエミュなら簡単)
・マスターコードのフック(PARの場合は自動だがこの場合は手動)
・自作プログラムの展開(PARの場合は自動だがこの場合は手動)
・処理の復帰(PARの場合は自動だがこの場合は手動)

今更ですが、パッドコードを作るきっかけはデビルメイクライ3SEでフリースタイルモードを作るのが目的ですのでデビルメイクライ3SEを教材としましょう。

マスターコードサーチ

サーチ方法は今は無くなってしましましたが、自然さんのサイトが参考になります。アーカイブにてマスターコードサーチ上級編に沿って行いました。
またシンボル残りソフトと言うのも必要ですが、私ははじめの一歩2を持っていたのでそれを使いました。

手順としては

①シンボル残りリストを移植し、「scePadRead」に飛ぶ ↓

②下の方に行って「memcopy」を探す

と言う事で、まずマスターコードアドレスとして、00122a14をメモしておきましょう。

パッドコードサーチ

今日は使いませんが、ついでにサーチ

エミュなら自然さんのパッドコード作成法-Bか変動サーチが簡単です。

作成法-Bであれば、「PadInfo」ラベルのアドレスをメモし(00622d50)

エミュのメモリを覗けば良いですね。

パッドアドレスは006C3540と判明しました。

※チートエンジン等でPCSX2のメモリを覗く時は、コードのアドレスに+20000000hex足したアドレスが仮想PS2のアドレスです。(画像では20622D50を覗いています。)

マスターコードのフックと自作関数展開、処理の復帰

さて、これらの処理はすべて同時に考える必要がありますが、その中でも1番にやることは自作関数の展開です。

今はテストなので「何もしない」と言う自作関数をつくってみますが、 作る命令はないので、展開先のメモリアドレスを決定すればOKです。なお、メモリアドレスは自然さんで学んでくると000F0000を使えとの事です。

次に展開する場所が決まったので、マスターコードのフックを行います。

PCSX2には優秀なデバッガが付いているので、それを使えばらくちんです。

デバッガを開き、 00122a14にExecuteとしてブレークポイントを仕掛けます。(画像はもう仕掛けてあります)

仕掛けると、PS2の処理がここを通るときに、下の図のように止まります。ここが「memcopy」に飛ぶ処理と言う事ですが、ここを000F0000に飛ぶようにしてみます。

行を右クリックし、「assemble opcode」から「jal 0x000F0000」としてOKしてみましょう。(画像はすでにOKを押した後です。)命令が「 jal 0x000F0000 」に変わりました

ここでデバッガの「Step into」を押してみましょう。処理が000F0000に飛びます。(何も処理命令はないですが)ここが最終的に自作処理を書いていくエリアになります。

さて、ここでデバッガの「Run」を押してみましょう。PCSX2が壊れるはずです。これはプログラムが変な所に飛ばされた上に、復帰処理をちゃんとしていないからですね。

復帰処理

では次は復帰処理のテストです

自作関数エリアの2、3行下の所で、memcopyに帰るとしましょう。
帰るには、「j」と言うジャンプ関数でmemcopyに飛べばよいです。
「jal」ではダメです

また、帰るときには「scePadRead」の流れにいきなり帰ってはいけませんよ。まだmemcopyの処理は実行していないですからね。

PCSX2のデバッガにて先ほどと同じように、まずは 00122a14 に 「jal 0x000F0000」 を仕掛けて、「Step into」までしておきましょう。(下の図)

次は、000F0008あたりに復帰処理を書きましょう。「memcopy」に飛びたいので、とび先は001282d0になります。

画像に alt 属性が指定されていません。ファイル名: image-4.png

PCSX2にて 「assemble opcode」から「j 0x001282d0 」 としてください。

この状態で「Run」を押せば今度は壊れなかったと思います。

が、追加の処理もしていないので何も起きませんが・・・
しかし、これで自作プログラムを配置する器は作成できました。

「 j 0x001282d0 」より上の部分に自作処理を置けば良いって事です。
※行が増えれば「j」は下にずらしましょう。

と言う事で、フッキングとワークスペースの確保ができましたが、長くなりましたのでは今回はこんな所で終わりとします。

コメント

タイトルとURLをコピーしました