ソフトを正常に動作させるための修正を
パッチと呼ぶのに対しデータを改竄しプレイすることを便宜上チートと呼びます。
ここでは『PS2 チート』等で検索することで入手できるPARコードをPCSX2で適用する方法を解説します。
チートファイルの作り方
PCSX2で使われる .pnach (.patchではない)ファイルの実体はただのテキストファイルです。
このファイルに所定の書式でチートコードを書き込み、ファイル名を適用したいゲームのCRCとして、PCSX2の cheats フォルダに入れる事でチートが適用されます。
CRCの見つけ方
目的のゲームを起動し、ログウィンドウを見ます。
タイトルバーに表示される8文字の英数字がそのゲームのCRCとなっています。
この例であれば、チートファイルの名前は「8C78493E.pnach」となります。
現行のQt版はデフォルトではログが表示されませんが、[ツール]>[ログウィンドウを有効化] にチェックを入れると表示されます。
また、ゲームリスト上部の Type とか Code とかあるところを右クリックして「CRC」にチェックを入れると、起動しなくても確認できるようになります。
が、このままでは非常にわかりづらく、数が増えてくると管理が大変になってしまいます。
ファイル名の最初の8文字がCRCでさえあれば後ろに何かがついていても認識されるので、「8C78493E - Crazy Taxi.pnach」といったように後ろにゲーム名をつけると良いでしょう。日本語も使用可能です。
ちなみにQt版であればゲーム起動中に [ツール]>[チートを編集] を選ぶと自動的にチートファイルが作成されるので、自分でファイルを作る手間が省けます。
チートの有効化
- wxWidget版(旧UI)の場合
(v1.6.0まで)メニューの「システム」→「チート有効化」にチェック
(v1.7.0から)メニューの「システム」→「Game Settings」→「チート有効化」にチェック
- Qt版(新UI)の場合
メニューの「Settings」→「Emulation」→「Enable Cheats」にチェック。
復号化
有志が公開しているコードはPARが殆どで、それらの多くは暗号化されています。
PCSX2のチートファイルは暗号化されたままでは動作しませんので、手動で復号化する必要があります。
(復号化については『PS2 PAR コード変換』で検索してください)
書式
パッチと基本的に同じです。
例えば以下のようなコードの場合、
PAR |
1CE47CA0 14921C65 |
復号化 |
2075FB78 004C4B40 |
patch=1,EE,2075FB78,extended,004C4B40
意味と機能:
patch |
1 |
EE |
2075FB78 |
extended |
004C4B40 |
有効にしたい行はpatchで始めること |
1=常時書き込み・動作 0=ゲーム起動時に1回だけ書き込み |
原則EE 他にIOPがあるが通常使わない |
コードの前半部 通常はアドレス |
コードタイプ extendedにすることでPAR生コードが使用可能になる それ以外は単純な書き込みのみ |
コードの後半部 通常は書き込む値 |
1行につき1コードのみ記述して、複数のコードを書くときは改行します。
スラッシュ2つ(//)でその行の以降の文章をコメントアウトできます。
コードを無効化する時やメモ書きに使用できます。
他にgametitle=、author=、comment=で始まる行でタイトル名、制作者、コメントを残すことができます。
コード名
Qt版ではコード名をつけられるようになっています。
コード名はブラケットで囲い、以下のように記述します。
[コード名]
patch=1,EE,2075FB78,extended,004C4B40
こうすることでプロパティのチート一覧に表示され、個別にON/OFFができるようになります。
また、上記の記述例では省いていますが、Qt版ではauthor=(作成者)やcomment=(説明)もコードごとにつけられます。
コードタイプ
extended
extended では単純な書き込みだけではなく条件判定コードなどにも対応しており、PARのコードがほぼそのまま使用可能です。
ただし、加算減算、条件判定コードなどに細かなフォーマットの違いが存在するようです。
復号化したコード前半部の先頭1桁は命令の種類を表していて、例えば「0コード」や「Dコード」、「Eコード」などと呼ばれます。
0コード: 1バイト書き込み
patch=1,EE,00285F54,extended,000000AB |
1コード: 2バイト書き込み
patch=1,EE,10285F54,extended,000089AB |
2コード: 4バイト書き込み
patch=1,EE,20285F54,extended,456789AB |
(0,1,2コード共通の説明)
指定されたアドレスに値を書き込み続ける。
1コードでは偶数アドレスを、2コードではアドレスの1番下の桁が0, 4, 8, Cであるアドレスを指定するのが好ましいです。
3コード: 数値加算・数値減算
30X0vvvv 0aaaaaaa
※X=4, 5の場合 30X00000 0aaaaaaa vvvvvvvv 00000000 |
aaaaaaa |
アドレス |
X |
加算 0: 1バイト 2: 2バイト 4: 4バイト |
減算 1: 1バイト 3: 2バイト 5: 4バイト |
vvvvvvvv |
加減算する数値 |
※X=4, 5の場合のみ、2行で1セット
指定したアドレスの値に対して、vvで指定した値を加算または減算し続けます。
PARの3コードと比べるとX(モード番号)が1つずつ下にズレていることに注意。
(PARでは1~6なのに対し、こちらは0~5。順番は同じなので単純に-1すれば良い)
加えて、PARの3000コード(バイト列書き込み)は実装されていないため使用できません。
ほとんど目にする事の無い形式ではありますが、もし該当するコードを使用したい場合は手動で0, 1, 2コードに変換する必要があります。
4コード: シリアルコード
4aaaaaaa nnnnssss vvvvvvvv dddddddd |
aaaaaaa |
開始アドレス |
nnnn |
反復回数 |
ssss |
アドレス加算値の1/4 |
vvvvvvvv |
書き込みデータ |
dddddddd |
データ加算値 |
※2行で1セット
下記の例では、アドレス 4A2B88 から4バイトごとに、1F1F1F1F を24(0x18)回書き込むという意味になります。
patch=1,EE,404A2B88,extended,00180001 patch=1,EE,1F1F1F1F,extended,00000000 |
5コード: メモリコピー
5aaaaaaa nnnnnnnn 0bbbbbbb 00000000 |
aaaaaaa |
コピー元アドレス |
nnnnnnnn |
バイトサイズ |
bbbbbbb |
コピー先アドレス |
※2行で1セット
例:アドレス00492A88からの16バイトをアドレス005B6608にコピーする
patch=1,EE,50492A88,extended,00000010 patch=1,EE,005B6608,extended,00000000 |
6コード: ポインターコード
6aaaaaaa vvvvvvvv 000Xnnnn iiiiiiii (kkkkkkkk kkkkkkkk) |
aaaaaaa |
開始アドレス |
vvvvvvvv |
書き込む値 |
X |
書き込みバイト数 0=1バイト 1=2バイト 2=4バイト |
nnnn |
ポインターの数 通常は1 多重ポインタなら2以上 |
iiiiiiii |
ポインターのオフセット |
(kkkkkkkk) |
追加のオフセット (4バイトごと、必要な数だけ) |
例1:
アドレス0x50A438に格納された値に0x30を足した値を書き込み先アドレスとする。
そのアドレスに1バイトで0xFFを書き込む
patch=1,EE,6050A438,extended,000000FF patch=1,EE,00000001,extended,00000030 |
例2: 多重ポインタ(ポインターのポインター)
アドレス0x907E08に格納された値に0x4Cを足した値をアドレス1とする。
アドレス1に格納された値に0x130を足した値をアドレス2とする。
アドレス2に2バイトで0x03E7を書き込む。
patch=1,EE,60907E08,extended,000003E7 patch=1,EE,00010002,extended,0000004C patch=1,EE,00000130,extended,00000000 |
7コード: ビット操作
7aaaaaaa 00X0vvvv |
aaaaaaa |
アドレス |
X |
0=OR(1バイト) 1=OR(2バイト) |
2=AND(1バイト) 3=AND(2バイト) |
4=XOR(1バイト) 5=XOR(2バイト) |
vvvv |
オペランド |
特定のフラグだけを立てたい・消したいといった時に使用する。
Aコード: 1回書き込み (パッチコード)
patch=1,EE,20285F54,extended,456789AB |
アドレス部の先頭をAから2に変えてください。
つまるところ上述の2コードと同じです。
(より忠実にするならば patch=0 にすべきですが、そうするとゲーム起動前にONにしていないと効果がでなくなります)
Dコード: 条件判定
Daaaaaaa yyXzdddd |
aaaaaaa |
アドレス |
yy |
スキップする行数(16進数) |
X |
比較条件 0=値が等しい 1=値が等しくない 2=dddd未満 3=ddddよりも大きい 4=NAND 5=AND 6=NOR 7=OR |
z |
0=2バイト比較 1=1バイト比較 |
dddd |
比較する値 |
アドレスaaaaaaaから1~2バイト分のデータとddddを指定した条件Xで比較し、その結果が真である時のみ以降のyy行のコードを実行します(偽である時はスキップされます)。
スキップの対象となる行には必ずextendedタイプのチートのみを置くようにしてください。それ以外のコードタイプ(wordなど)が混ざっていた場合、正常な動作にならない可能性があります。
v1.7.3638にてOPLの拡張形式に対応して複数行スキップなどが実装され、現在ではEコードと完全互換となっています。
※注釈
- PARのコードをそのまま持ってくるとyy=0となっていますが、そのままでも次の1行はちゃんとスキップされます。
- z=1(1バイト比較)の場合は、ddddも下の1バイトだけ(00dd)として扱われます。
v1.7.3637以前のバージョンを使用している場合はOPLの拡張形式に対応していないため、以下の折りたたみを参照。
+
|
~v1.7.3637の場合 |
~v1.7.3637の場合
Daaaaaaa 00X0dddd |
aaaaaaa |
アドレス |
X |
比較条件 0=値が等しい 1=値が等しくない 2=dddd未満 3=ddddよりも大きい |
dddd |
比較する値 |
アドレスaaaaaaaから2バイト読み取り、その値とddddを指定された条件で比較して、それが真である時のみ1行下のコードを実行します。偽となった場合はスキップされます。
比較条件が2か3の時、値が等しくなった場合は偽となるので注意。
Dコードの次の行には必ずextendedタイプのチートを置くようにしてください。それ以外のコードタイプ(wordなど)を置いてしまった場合、正常な動作にならない可能性があります。
1バイト比較が存在しないので、1バイトのみの比較を行いたい場合はEコードを使います。
|
Eコード: 条件判定 (複数行スキップ)
Ezyydddd Xaaaaaaa |
z |
0=2バイト比較 1=1バイト比較 |
yy |
スキップする行数(16進数) |
dddd |
比較する値 |
X |
比較条件 0=値が等しい 1=値が等しくない 2=dddd未満 3=ddddよりも大きい 4=NAND* 5=AND* 6=NOR* 7=OR* *はv1.7.3638以降のみ対応 |
aaaaaaa |
アドレス |
動作や注意点などはDコードと完全に同じなのでそちらを参照。
extended以外
extended以外に以下のようなコードタイプがあります。
byte: 1バイト書き込み
指定されたアドレスに1バイトのデータを書き込む。
復号化 |
00285F54 00000045 |
パッチファイル |
patch=1,EE,00285F54,byte,00000045 |
short: 2バイト書き込み
指定されたアドレスに2バイトのデータを書き込む。
復号化 |
10285F54 00004567 |
パッチファイル |
patch=1,EE,00285F54,short,00004567 |
word: 4バイト書き込み
指定されたアドレスに4バイトのデータを書き込む。
復号化 |
20285F54 456798AB |
パッチファイル |
patch=1,EE,00285F54,word,456789AB |
その他
上記に加え、v1.7.0以降のバージョンでは「leshort」「leword」というコードタイプもサポートしています。
これらはメモリエディタ等におけるバイトの見え方のままコードを書くことができるのが利点です。
例:
PS2はデータをリトルエンディアンで扱うため、例えば上記4バイト書き換えコードの場合では
|
54 |
55 |
56 |
57 |
00285F50 |
AB
|
89
|
67
|
45
|
このように表記とは逆順で書き込まれます。
同じコードでも、wordではなくlewordを使った場合は
|
54 |
55 |
56 |
57 |
00285F50 |
45
|
67
|
89
|
AB
|
このように表記した順番のまま書き込まれます。
マスターコードに関して
公開されているPARコードにはマスターコード(先頭が「E」、復号化すると「F」)も併記されていますが、それはPS2実機でPARを有効にするためのコードなのでチートファイルへ転記する必要はありません。
むしろマスターコードを記述するとほぼ起動しません。
ただ、一部のゲームはチート対策が施されており、それを潰すためのコードもまとめて「マスターコード」として掲載されている場合もあります。
9C987780 1456E7A5のように、先頭が「9」(復号化すると「A」)のコードがそれです。
それらは必要なので、他のコードと同じように
パッチファイルに加えましょう。
これは外部ツールでPARコードを使用する場合も同じです。
最終更新:2024年11月17日 18:23