PS2 PAR3 Code Types

- v1.10 -

無断転載すると、このページの内容が変わったときに混乱を招くので、 無断転載せずに、このページにリンクを張ってください。


コードの形式
[ab]xxxxxx yyyyyyyy
一般にこのように表記されている場合は次の様に解釈する。
アドレス部は
ab000000 + アドレス
となる。具体的には例えば、
[C4]xxxxxx yyyyyyyy
で、アドレスが、00123456なら、アドレス部は、
C4000000 + 00123456 = C4123456
となる。注意することは、アドレスが、01234567の場合は、
C4000000 + 01234567 = C5234567
となり、アドレス部の上位1バイトが変わってしまうことである。

制御コード・制御フラグについて

比較関連のコードで制御フラグが1や2にセットされることがある。
制御フラグが2の時は通常のコードはスキップされ、制御コードのみしか受け付けなくなる。
つまり、制御コードで制御フラグをゼロクリアするまでのコードを無効にすることが可能になる。
制御フラグがゼロでない(1または2)時は、制御フラグがゼロになるまでコードを実行し続ける。この間はゲームプログラム自体に処理が返らない。

PAR3ルーチン

PAR3のコード処理ルーチンは$f0000から展開されるので、自作プログラムに 処理をとばすコードを作る場合は注意してください。
今後のバージョンアップ等で展開プログラムの容量が増えるかもしれないので、 安全のため、$f5000以降に自作プログラムを入れてください。

Master Code

[C4]xxxxxx 000abb0c
パッドルーチン等に普通にフックをかけるのであれば、
[C4]xxxxxx 00030800
としておけばよい。
Master Codeの詳細を知りたい場合はここへ。

[C6]xxxxxx zzzzzzzz
アドレス$12000000 | xxxxxxxにワード値zzzzzzzzを書き込む。
xxxxxxx = e0にすれば、画面の背景色を変えられるため、Mコードの動作チェックができる。

Code Types

[00]xxxxxx yyyyyyzz
アドレスxxxxxxxからyyyyyy+1回、バイト値zzを連続で書き込む。
特にyyyyyy=0の時は一回書き込むのと同じ。

[02]xxxxxx yyyyzzzz
アドレスxxxxxxxからyyyy+1回、ワード値zzzzを連続で書き込む。
特にyyyy=0の時は一回書き込むのと同じ。

[04]xxxxxx zzzzzzzz
アドレスxxxxxxxにワード値zzzzzzzzを書き込む。

[40]xxxxxx yyyyyyzz
xxxxxxxに格納されているアドレス + yyyyyy にバイト値zzを書き込む。
yyyyyyは符号拡張される。

[42]xxxxxx yyyyzzzz
xxxxxxxに格納されているアドレス + yyyy*2 にハーフワード値zzzzを書き込む。
yyyyは符号拡張される。

[44]xxxxxx zzzzzzzz
xxxxxxxに格納されているアドレスにワード値zzzzzzzzを書き込む。

[80]xxxxxx 000000zz
バイト値zzをxxxxxxxに格納されているバイト値に加算。
オーバーフローは無視される。

[82]xxxxxx 0000zzzz
ハーフワード値zzzzをxxxxxxxに格納されているハーフワード値に加算。
オーバーフローは無視される。

[86]xxxxxx zzzzzzzz
xxxxxxxに格納されている浮動小数に符号無し整数zzzzzzzzを加算。
ただし、マシン誤差があるため期待通りの動作をしない可能性がある。

00000000 [80]xxxxxx
000000zz aaaabbcc
データ初期値をバイト値zz、データ増分をcc、アドレスの増分をaaaaとして bb回、アドレスxxxxxxxにバイトで連続で書き込む。
aaaa及びccは符号拡張される。

00000000 [82]xxxxxx
0000zzzz aaaabbcc
データ初期値をハーフワード値zzzz、データ増分をcc、アドレスの増分をaaaa*2として bb回、アドレスxxxxxxxにハーフワードで連続で書き込む。
aaaa及びccは符号拡張される。

00000000 [84]xxxxxx
zzzzzzzz aaaabbcc
データ初期値をワード値zzzzzzzz、データ増分をcc、アドレスの増分をaaaa*4として bb回、アドレスxxxxxxxにワードで連続で書き込む。
aaaa及びccは符号拡張される。

比較コード

同値比較

[08]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと異なるとき、次のコードをスキップ。

[48]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと異なるとき、次の二つのコードをスキップ。

[88]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと異なるとき、制御フラグを2にセット。等しいとき、制御フラグを1にセット。

[C8]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと等しくなるまで待ってから次のコードを実行。

[0A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと異なるとき、次のコードをスキップ。

[4A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと異なるとき、次の二つのコードをスキップ。

[8A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと異なるとき、制御フラグを2にセット。等しいとき、制御フラグを1にセット。

[CA]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと等しくなるまで待ってから次のコードを実行。

[0C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと異なるとき、次のコードをスキップ。

[4C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと異なるとき、次の二つのコードをスキップ。

[8C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと異なるとき、制御フラグを2にセット。等しいとき、制御フラグを1にセット。

[CC]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと等しくなるまで待ってから次のコードを実行。

[10]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと等しいとき、次のコードをスキップ。

[50]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと等しいとき、次の二つのコードをスキップ。

[90]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと等しいとき、制御フラグを2にセット。異なるとき、制御フラグを1にセット。

[D0]xxxxxx 000000zz
xxxxxxxに格納されているバイト値がzzと異なるまで待ってから次のコードを実行。

[12]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと等しいとき、次のコードをスキップ。

[52]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと等しいとき、次の二つのコードをスキップ。

[92]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと等しいとき、制御フラグを2にセット。異なるとき、制御フラグを1にセット。

[D2]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値がzzzzと異なるまで待ってから次のコードを実行。

[14]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと等しいとき、次のコードをスキップ。

[54]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと等しいとき、次の二つのコードをスキップ。

[94]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと等しいとき、制御フラグを2にセット。異なるとき、制御フラグを1にセット。

[D4]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値がzzzzzzzzと異なるまで待ってから次のコードを実行。


符号付き大小比較

注:比較する値は符号拡張されます。
[18]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≧zzのとき、次のコードをスキップ。

[58]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≧zzのとき、次の二つのコードをスキップ。

[98]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≧zzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[D8]xxxxxx 000000zz
xxxxxxxに格納されているバイト値<zzになるまで待ってから次のコードを実行。

[1A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≧zzzzのとき、次のコードをスキップ。

[5A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≧zzzzのとき、次の二つのコードをスキップ。

[9A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≧zzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[DA]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値<zzzzになるまで待ってから次のコードを実行。

[1C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≧zzzzzzzzのとき、次のコードをスキップ。

[5C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≧zzzzzzzzのとき、次の二つのコードをスキップ。

[9C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≧zzzzzzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[DC]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値<zzzzzzzzになるまで待ってから次のコードを実行。

[20]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≦zzのとき、次のコードをスキップ。

[60]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≦zzのとき、次の二つのコードをスキップ。

[A0]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≦zzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[E0]xxxxxx 000000zz
xxxxxxxに格納されているバイト値>zzになるまで待ってから次のコードを実行。

[22]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≦zzzzのとき、次のコードをスキップ。

[62]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≦zzzzのとき、次の二つのコードをスキップ。

[A2]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≦zzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[E2]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値>zzzzになるまで待ってから次のコードを実行。

[24]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≦zzzzzzzzのとき、次のコードをスキップ。

[64]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≦zzzzzzzzのとき、次の二つのコードをスキップ。

[A4]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≦zzzzzzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[E4]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値>zzzzzzzzになるまで待ってから次のコードを実行。


無符号大小比較

注:比較される値を無符号として扱います。
[28]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≧zzのとき、次のコードをスキップ。

[68]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≧zzのとき、次の二つのコードをスキップ。

[A8]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≧zzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[E8]xxxxxx 000000zz
xxxxxxxに格納されているバイト値<zzになるまで待ってから次のコードを実行。

[2A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≧zzzzのとき、次のコードをスキップ。

[6A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≧zzzzのとき、次の二つのコードをスキップ。

[AA]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≧zzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[EA]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値<zzzzになるまで待ってから次のコードを実行。

[2C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≧zzzzzzzzのとき、次のコードをスキップ。

[6C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≧zzzzzzzzのとき、次の二つのコードをスキップ。

[AC]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≧zzzzzzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[EC]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値<zzzzzzzzになるまで待ってから次のコードを実行。

[30]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≦zzのとき、次のコードをスキップ。

[70]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≦zzのとき、次の二つのコードをスキップ。

[B0]xxxxxx 000000zz
xxxxxxxに格納されているバイト値≦zzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[F0]xxxxxx 000000zz
xxxxxxxに格納されているバイト値>zzになるまで待ってから次のコードを実行。

[32]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≦zzzzのとき、次のコードをスキップ。

[72]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≦zzzzのとき、次の二つのコードをスキップ。

[B2]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値≦zzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[F2]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値>zzzzになるまで待ってから次のコードを実行。

[34]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≦zzzzzzzzのとき、次のコードをスキップ。

[74]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≦zzzzzzzzのとき、次の二つのコードをスキップ。

[B4]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値≦zzzzzzzzのとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[F4]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値>zzzzzzzzになるまで待ってから次のコードを実行。


AND比較

[38]xxxxxx 000000zz
xxxxxxxに格納されているバイト値 AND zzが0のとき、次のコードをスキップ。

[78]xxxxxx 000000zz
xxxxxxxに格納されているバイト値 AND zzが0のとき、次の二つのコードをスキップ。

[B8]xxxxxx 000000zz
xxxxxxxに格納されているバイト値 AND zzが0のとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[F8]xxxxxx 000000zz
xxxxxxxに格納されているバイト値 AND zzが0でなくなるまで待ってから次のコードを実行。

[3A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値 AND zzzzが0のとき、次のコードをスキップ。

[7A]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値 AND zzzzが0のとき、次の二つのコードをスキップ。

[BA]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値 AND zzzzが0のとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[FA]xxxxxx 0000zzzz
xxxxxxxに格納されているハーフワード値 AND zzzzが0でなくなるまで待ってから次のコードを実行。

[3C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値 AND zzzzzzzzが0のとき、次のコードをスキップ。

[7C]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値 AND zzzzzzzzが0のとき、次の二つのコードをスキップ。

[BC]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値 AND zzzzzzzzが0のとき、制御フラグを2にセット。違う場合は制御フラグを1にセット。

[FC]xxxxxx zzzzzzzz
xxxxxxxに格納されているワード値 AND zzzzzzzzが0でなくなるまで待ってから次のコードを実行。


制御コード

00000000 00000000
制御フラグをゼロクリアし、通常コードの先頭に移動させる。
PAR3内部用なので、通常このコードを使うことはない。

00000000 40000000
制御フラグをゼロクリアする。

00000000 60000000
制御フラグが2なら何もしない。
それ以外の場合は制御フラグを1にセットする。


Master Codeの詳細

[C4]xxxxxx 000wyy0z
xxxxxxxはフックをかけるアドレス。ただし、スレッドやIntc割り込みを利用する場合は、このアドレスは使われないので任意でよい。

wでフックのパターンを変えることが出来る。
wが1のとき、スレッド利用(zを1にすること)
wが2のとき、Intc割り込み利用(zを1にすること)
wが0,3,8,9,a,bのとき、アドレスxxxxxxxにフックをかける(zは0)
wがcのとき、アドレスxxxxxxxにフックをかける。ただし、フック位置は関数からリターンする位置(jr ra)でなければならない。(zは0)

デフォルトでは、一回のフック処理につき、コードは8個処理されるが、これを yyで指定する個数に変更できる。通常はyyを08にしておく。

Mコードの前に制御コードを置き、制御フラグが1になった状態でMコード処理になると、Mコードに続くコードは初回のみ実行される。つまり、 一回のみ書き換えるという動作をさせることが可能である。

Mコードとしては最大50行まで入力することが可能である。
注:PAR3のバグにより、スレッドおよびIntcを利用したMコードは機能しない。
(システムコールの中でシステムコールを呼んでいるので、返り先が不明になっているため。)