ソフトを正常に動作させるための修正をパッチと呼ぶのに対しデータを改竄しプレイすることを便宜上チートと呼びます。

ここでは『PS2 チート』等で検索することで入手できるPARコードをPCSX2で適用する方法を解説します。


チートファイルの作り方

PCSX2で使われる .pnach (.patchではない)ファイルの実体はただのテキストファイルです。
このファイルに所定の書式でチートコードを書き込み、ファイル名を適用したいゲームのCRCとして、PCSX2の cheats フォルダに入れる事でチートが適用されます。

CRCの見つけ方

目的のゲームを起動し、ログウィンドウを見ます。
タイトルバーに表示される8文字の英数字がそのゲームのCRCとなっています。

この例であれば、チートファイルの名前は「8C78493E.pnach」となります。
現行のQt版であれば、ゲームリスト上部の Type とか Code とかあるところを右クリックして「CRC」にチェックを入れれば起動しなくても確認できるようになります。

が、このままでは非常にわかりづらく、数が増えてくると管理が大変になってしまいます。
ファイル名の最初の8文字がCRCでさえあれば後ろに何かがついていても認識されるので、「8C78493E - Crazy Taxi.pnach」といったように後ろにゲーム名をつけると良いでしょう。日本語も使用可能です。

チートの有効化

  • 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=で始まる行でタイトル名、制作者、コメントを残すことができます。


コードタイプ

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=0,EE,20285F54,extended,456789AB
アドレス部の先頭をAから2に変換して、「patch=1」の1を0に変換します。
起動時に一度だけ書き込まれる以外は上述の2コードと同じです。

先頭が A のままだと動作しないので注意。

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コードを使用する場合も同じです。
最終更新:2022年12月28日 15:31