http://wiird.l0nk.org/codetypes.htmlを翻訳したもの。かなりてきとー。
http://wiibrew.org/wiki/GeckoOS#Technical_Jargon PPCわかる人は.sを見たほうが早いかも?GCPAR/PS2AR3+NITROHAX/DSAR見たいな感じ?
#標準ベース,ポインタオフセット=0x80000000
通常書き込み(0x00,0x10,0x02,0x12,0x04,0x14)
パッチ(0x06,0x16)
シリアル(0x08,0x18)
条件判定32bit(0x20~0x26)
条件判定16bit0x28~0x3C)
ベースオフセット(0x40,0x50,0x42,0x52,0x44,0x54,0x46)
ポインタオフセット(0x48,0x58,0x4A,0x5A,0x4C,0x5C,0x4E)
レジスタ(0x80~0x8C)
アセンブリ(0xC0~0xCE)
判定終了(0xE0~0xF0)
[通常書き込みコード]
8bit
00aaaaaa YYYY00VV
ベースオフセット+aaaaaaに値VVをYYYY+1回書き込む
10aaaaaa YYYY00VV
ポインタオフセット+aaaaaaに値VVをYYYY+1回書き込む
18bit
02aaaaaa YYYYVVVV
ベースオフセット+aaaaaaに値VVVVをYYYY+1回書き込む
12aaaaaa YYYYVVVV
ポインタオフセット+aaaaaaに値VVVVをYYYY+1回書き込む
32bits
04aaaaaa VVVVVVVV
ベースオフセット+aaaaaaに値VVVVVVVVをYYYY+1回書き込む
14aaaaaa XXXXXXXX
ポインタオフセット+aaaaaaに値VVVVVVVVをYYYY+1回書き込む
[パッチコード]
06aaaaaa 0000YYYY
d1d2d3d4 d5d6d7d8
....
ベースオフセット+aaaaaaに下記のデータをYYYYバイト分書き込む
16aaaaaa 0000YYYY
d1d2d3d4 d5d6d7d8
...
ポインタオフセット+aaaaaaに下記のデータをYYYYバイト分書き込む
[シリアルコード]
8bit
08aaaaaa 000000WW
0NNNXXXX 000000VV
ベースオフセット+aaaaaaからの値VVをXXXXの間隔でNNN+1回書き込む。
このとき値VVもWWずつ増加する。
18aaaaaa 000000WW
0NNNXXXX 000000VV
ポインタオフセット+aaaaaaからの値VVをXXXXの間隔でNNN+1回書き込む。
このとき値VVもWWずつ増加する。
16bit
08aaaaaa 0000WWWW
1NNNXXXX 0000VVVV
ベースオフセット+aaaaaaからの値VVをXXXXの間隔でNNN+1回書き込む。
このとき値VVVVもWWWWずつ増加する。
18aaaaaa 0000WWWW
1NNNXXXX 0000VVVV
ポインタオフセット+aaaaaaからの値VVVVをXXXXの間隔でNNN+1回書き込む。
このとき値VVVVもWWWWずつ増加する。
32bit
08aaaaaa WWWWWWWW
2NNNXXXX VVVVVVVV
ベースオフセット+aaaaaaからの値VVVVVVVVをXXXXの間隔でNNN+1回書き込む。
このとき値VVVVVVVVもWWWWWWWWずつ増加する。
18aaaaaa WWWWWWWW
2NNNXXXX VVVVVVVV
ポインタオフセット+aaaaaaからの値VVVVVVVVをXXXXの間隔でNNN+1回書き込む。
このとき値VVVVVVVVもWWWWWWWWずつ増加する。
[32bit条件判定コード]
aaaaab=aaaaaa|0x1
32bit一致
20aaaaaa YYYYYYYY
ベースオフセット+aaaaaaにある値がYYYYYYYYの時下のコードを実行する。
20aaaaab YYYYYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値がYYYYYYYYの時下のコードを実行する。
30aaaaaa YYYYYYYY
ポインタオフセット+aaaaaaにある値がYYYYYYYYの時下のコードを実行する。
30aaaaab YYYYYYYY
直前の判定をとじてから、ポインタオフセット+aaaaaaにある値がYYYYYYYYの時下のコードを実行する。
32bit不一致
22aaaaaa YYYYYYYY
ベースオフセット+aaaaaaにある値がYYYYYYYYでない時下のコードを実行する。
22aaaaab YYYYYYYY
直前の判定をとじてから、ポインタオフセット+aaaaaaにある値がYYYYYYYYでない時下のコードを実行する。
32aaaaaa YYYYYYYY
ポインタオフセット+aaaaaaにある値がYYYYYYYYでない時下のコードを実行する。
32aaaaab YYYYYYYY
直前の判定をとじてから、ポインタオフセット+aaaaaaにある値がYYYYYYYYでない時下のコードを実行する。
32bit比較小
26aaaaaa YYYYYYYY
ベースオフセット+aaaaaaにある値がYYYYYYYYより小さい時下のコードを実行する。
26aaaaab YYYYYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値がYYYYYYYYより小さい時下のコードを実行する。
36aaaaaa YYYYYYYY
ポインタオフセット+aaaaaaにある値がYYYYYYYYより小さい時下のコードを実行する。
36aaaaab YYYYYYYY
直前の判定をとじてから、ポインタオフセット+aaaaaaにある値がYYYYYYYYより小さい時下のコードを実行する。
32bit比較大
24aaaaaa YYYYYYYY
ベースオフセット+aaaaaaにある値がYYYYYYYYより大きい時下のコードを実行する。
24aaaaab YYYYYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値がYYYYYYYYより大きい時下のコードを実行する。
34aaaaaa YYYYYYYY
ポインタオフセット+aaaaaaにある値がYYYYYYYYより大きい時下のコードを実行する。
34aaaaab YYYYYYYY
直前の判定をとじてから、ポインタオフセット+aaaaaaにある値がYYYYYYYYより大きい時下のコードを実行する。
[16bit条件判定コード]
#ZZZZ=FF00で8bit判定,???? & 0xFF
16bit一致
28aaaaaa ZZZZYYYY
ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致する時下のコードを実行する。
28aaaaab ZZZZYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致する時下のコードを実行する。
38aaaaaa ZZZZYYYY
ポインタオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致する時下のコードを実行する。
38aaaaab ZZZZYYYY
直前の判定をとじてから、ポインタオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致する時下のコードを実行する。
不一致
2Aaaaaaa ZZZZYYYY
ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致しない時下のコードを実行する。
2Aaaaaab ZZZZYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致する時下のコードを実行する。
3Aaaaaaa ZZZZYYYY
ポインタオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致しない時下のコードを実行する。
3Aaaaaab ZZZZYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYと一致しない時下のコードを実行する。
比較小
2Eaaaaaa ZZZZYYYY
ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより小さい時い時下のコードを実行する。
3Eaaaaaa ZZZZYYYY
ポインタオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより小さい時下のコードを実行する。
2Eaaaaab ZZZZYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより小さい時下のコードを実行する。
3Eaaaaab ZZZZYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより小さい時下のコードを実行する。
比較大
2Caaaaaa ZZZZYYYY
ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより大きい時下のコードを実行する。
3Caaaaaa ZZZZYYYY
ポインタオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより大きい時下のコードを実行する。
2Caaaaab ZZZZYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより大きい時下のコードを実行する。
3Caaaaab ZZZZYYYY
直前の判定をとじてから、ベースオフセット+aaaaaaにある値と否定ZZZZとの論理積がYYYYより大きい時下のコードを実行する。
[ベースオフセットコード]
ベース読込
40TYZ00N XXXXXXXX
40000 アドレスXXXXXXXXにある値を読み込む
40010 ベースオフセット+XXXXXXXXにある値を読み込む
50010 ポインタオフセット+XXXXXXXXにある値を読み込む
4000100N レジスタN+XXXXXXXXにある値を読み込む
4001100N ベースオフセット+レジスタN+XXXXXXXXにある値を読み込む
5001100N ポインタオフセット+レジスタN+XXXXXXXXにある値を読み込む
40100000 ベースオフセット += [XXXXXXXX] 読んだあと+?
40110000 ベースオフセット += [ベースオフセット+XXXXXXXX]
50110000 ベースオフセット += [ポインタオフセット+XXXXXXXX]
4010100N ベースオフセット += [レジスタN+XXXXXXXX]
4011100N ベースオフセット += [ベースオフセット+レジスタN+XXXXXXXX]
5011100N ベースオフセット += [ポインタオフセット+レジスタN+XXXXXXXX]
ベース代入
42TYZ00N XXXXXXXX
42000 ベースオフセット = XXXXXXXX
42010 ベースオフセット = ベースオフセット+XXXXXXXX
52010 ベースオフセット = ポインタオフセット+XXXXXXXX
42001 ベースオフセット = レジスタN+XXXXXXXX
42011 ベースオフセット = ベースオフセット+レジスタN+XXXXXXXX
52011 ベースオフセット = ポインタオフセット+レジスタN+XXXXXXXX
42100 ベースオフセット += XXXXXXXX
42110 ベースオフセット += ベースオフセット+XXXXXXXX
52110 ベースオフセット += ポインタオフセット+XXXXXXXX
42101 ベースオフセット += レジスタN+XXXXXXXX
42111 ベースオフセット += ベースオフセット+レジスタN+XXXXXXXX
52111 ベースオフセット += ポインタオフセット+レジスタN+XXXXXXXX
ベース保存
440YZ00N XXXXXXXX
44000 [XXXXXXXX]=ベースオフセット
44010 [XXXXXXXX+ベースオフセット]=ベースオフセット
54010 [XXXXXXXX+ポインタオフセット]=ベースオフセット
44001 [XXXXXXXX+レジスタN]=ベースオフセット
44011 [XXXXXXXX+ベースオフセット+レジスタN]=ベースオフセット
54011 [XXXXXXXX+ポインタオフセット+レジスタN]=ベースオフセット
[ポインタオフセットコード]
ポインタ読込
48TYZ00N XXXXXXXX :
48000 ポインタオフセット = [XXXXXXXX]
48010 ポインタオフセット = [ベースオフセット+XXXXXXXX]
58010 ポインタオフセット = [ポインタオフセット+XXXXXXXX]
48001 ポインタオフセット = [レジスタN+XXXXXXXX]
48011 ポインタオフセット = [ベースオフセット+レジスタN+XXXXXXXX]
58011 ポインタオフセット = [ポインタオフセット+レジスタN+XXXXXXXX]
48100 ポインタオフセット += [XXXXXXXX]
48110 ポインタオフセット += [ベースオフセット+XXXXXXXX]
58110 ポインタオフセット += [ポインタオフセット+XXXXXXXX]
48101 ポインタオフセット += [レジスタN+XXXXXXXX]
48111 ポインタオフセット += [ベースオフセット+レジスタN+XXXXXXXX]
58111 ポインタオフセット += [ポインタオフセット+レジスタN+XXXXXXXX]
ポインタ代入
4ATYZ00N XXXXXXXX :
4A000 ポインタオフセット = XXXXXXXX
4A010 ポインタオフセット = ベースオフセット+XXXXXXXX
5A010 ポインタオフセット = ポインタオフセット+XXXXXXXX
4A001 ポインタオフセット = レジスタN+XXXXXXXX
4A011 ポインタオフセット = ベースオフセット+レジスタN+XXXXXXXX
5A011 ポインタオフセット = ポインタオフセット+レジスタN+XXXXXXXX
4A100 ポインタオフセット += XXXXXXXX
4A110 ポインタオフセット += ベースオフセット+XXXXXXXX
5A110 ポインタオフセット += ポインタオフセット+XXXXXXXX
4A101 ポインタオフセット += レジスタN+XXXXXXXX
4A111 ポインタオフセット += ベースオフセット+レジスタN+XXXXXXXX
5A111 ポインタオフセット += ポインタオフセット+レジスタN+XXXXXXXX
ポインタ保存
4C0YZ00N XXXXXXXX
4C000 [XXXXXXXX]=ポインタオフセット
4C010 [XXXXXXXX+ベースオフセット]=ポインタオフセット
5C010 [XXXXXXXX+ポインタオフセット]=ポインタオフセット
44001 [XXXXXXXX+レジスタN]=ポインタオフセット
44011 [XXXXXXXX+ベースオフセット+レジスタN]=ポインタオフセット
54011 [XXXXXXXX+ポインタオフセット+レジスタN]=ポインタオフセット
[レジスタコード]
レジスタ代入
80SY000N XXXXXXXX :
8000 レジスタN = XXXXXXXX
8001 レジスタN = XXXXXXXX+ベースオフセット
9001 レジスタN = XXXXXXXX+ポインタオフセット
8010 レジスタN += XXXXXXXX
8011 レジスタN += XXXXXXXX+ベースオフセット
9011 レジスタN += XXXXXXXX+ポインタオフセット
レジスタ読み込み
82UY000N XXXXXXXX :
8200 レジスタN = 8bits [XXXXXXXX]
8201 レジスタN = 8bits [XXXXXXXX+ベースオフセット]
9201 レジスタN = 8bits [XXXXXXXX+ポインタオフセット]
8210 レジスタN = 16bits [XXXXXXXX]
8211 レジスタN = 16bits [XXXXXXXX+ベースオフセット]
9211 レジスタN = 16bits [XXXXXXXX+ポインタオフセット]
8220 レジスタN = 32bits [XXXXXXXX]
8221 レジスタN = 32bits [XXXXXXXX+ベースオフセット]
9221 レジスタN = 32bits [XXXXXXXX+ポインタオフセット]
レジスタ保存
84UYZZZN XXXXXXXX:
8400 8bits書き込み レジスタN ZZZ+1回 [XXXXXXXX]
8401 8bits書き込み レジスタN ZZZ+1回 [XXXXXXXX+ベースオフセット]
9401 8bits書き込み レジスタN ZZZ+1回 [XXXXXXXX+ポインタオフセット]
8410 16bits書き込み レジスタN ZZZ+1回 [XXXXXXXX]
8411 16bits書き込み レジスタN ZZZ+1回 [XXXXXXXX+ベースオフセット]
9411 16bits書き込み レジスタN ZZZ+1回 [XXXXXXXX+ポインタオフセット]
8420 32bits書き込み レジスタN ZZZ+1回 [XXXXXXXX]
8421 32bits書き込み レジスタN ZZZ+1回 [XXXXXXXX+ベースオフセット]
9421 32bits書き込み レジスタN ZZZ+1回 [XXXXXXXX+ポインタオフセット]
レジスタ即値演算
86TY000N XXXXXXXX
86T0 レジスタN = (レジスタN ? XXXXXXXX)
86T1 レジスタN = ([レジスタN] ? XXXXXXXX)
86T2 レジスタN = (レジスタN ? [XXXXXXXX])
86T3 レジスタN = ([レジスタN] ? [XXXXXXXX])
? = T :
0 加算 (+)
1 乗算 (*)
2 論理和 (|)
3 論理積 (&)
4 排他的論理和 (^)
5 左シフト (<<)
6 右シフト (>>)
7 左回転
8 算術右シフト
A 単精度浮動小数加算
B 単精度浮動小数乗算
レジスタ同士での演算
88TY000N 0000000M
88T0 レジスタN = (レジスタN ? レジスタM)
88T1 レジスタN = ([レジスタN] ? レジスタM)
88T2 レジスタN = (レジスタN ? [レジスタM])
88T3 レジスタN = ([レジスタN] ? [レジスタM])
? = T :
0 加算 (+)
1 乗算 (*)
2 論理和 (|)
3 論理積 (&)
4 排他的論理和 (^)
5 左シフト (<<)
6 右シフト (>>)
7 左回転
8 算術右シフト
A 単精度浮動小数加算
B 単精度浮動小数乗算
メモリコピー
8AYYYYNM XXXXXXXX
レジスタNからレジスタM+XXXXXXXXにYYYYバイト分コピーする
8AYYYYNF XXXXXXXX
レジスタNからベースオフセット+XXXXXXXXにYYYYバイト分コピーする
9AYYYYNF XXXXXXXX
レジスタNからポインタオフセット+XXXXXXXXにYYYYバイト分コピーする
メモリコピー2
8CYYYYNM XXXXXXXX
レジスタN+XXXXXXXXからレジスタMにYYYYバイト分コピーする
8CYYYYFM XXXXXXXX
ベースオフセット+XXXXXXXXからレジスタMにYYYYバイト分コピーする
9CYYYYFM XXXXXXXX
ポインタオフセット+XXXXXXXXからレジスタMにYYYYバイト分コピーする
[特殊判定コード]
レジスタN,Mが0xFの場合、ベース/ポインタオフセット+aaaaaaaが使われる。
16bit一致
A0aaaaaa NM00YYYY
"[レジスタN]と否定YYYYの論理積"と"[レジスタM]と否定YYYYの論理積"が一致する時以下のコードを実行する。
A0aaaaab NM00YYYY
直前の判定をとじてから"[レジスタN]と否定YYYYの論理積"と"[レジスタM]と否定YYYYの論理積"が一致する時以下のコードを実行する。
16bits不一致
A2aaaaaa NM00YYYY
"[レジスタN]と否定YYYYの論理積"と"[レジスタM]と否定YYYYの論理積"が一致しない時以下のコードを実行する。
A2aaaaab NM00YYYY
直前の判定をとじてから"[レジスタN]と否定YYYYの論理積"と"[レジスタM]と否定YYYYの論理積"が一致しない時以下のコードを実行する。
16bits比較小
A6aaaaaa NM00YYYY
"[レジスタN]と否定YYYYの論理積"より"[レジスタM]と否定YYYYの論理積"小さい時以下のコードを実行する。
A6aaaaab NM00YYYY
直前の判定をとじてから"[レジスタN]と否定YYYYの論理積"より"[レジスタM]と否定YYYYの論理積"小さい時時以下のコードを実行する。
16bits比較大
A4aaaaaa NM00YYYY
"[レジスタN]と否定YYYYの論理積"より"[レジスタM]と否定YYYYの論理積"大きい時以下のコードを実行する。
A4aaaaab NM00YYYY
直前の判定をとじてから"[レジスタN]と否定YYYYの論理積"より"[レジスタM]と否定YYYYの論理積"大きい時以下のコードを実行する。
[アセンブリコード]
アセンブリ実行
C0000000 NNNNNNNN
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
4E800020 00000000
次のNNNNNNNN行分のアセンブリコードが挿入される。最後はblr (0x4E800020)で閉じる必要がある。
(挿入場所は不明、たぶんHOOKの最後?)。
アセンブリ挿入
C2aaaaaa NNNNNNNN
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
60000000 00000000
ベースオフセット+aaaaaaaに0x800029**あたりにジャンプするようbranchが自動挿入され、そこからNNNNNNNN行分のアセンブリコードが挿入される。
最後の00000000 の箇所が"b ベースオフセット+aaaaaaa+4"になるので,00000000で閉じる必要がある(無い時はnop 60000000を入れる)。
D2XXXXXX NNNNNNNN
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ 00000000
ポインタオフセット+aaaaaaaに、0x800029**あたりにジャンプするようbranchが自動挿入され、そこからNNNNNNNN行分のアセンブリコードが挿入される。
最後の00000000 の箇所が"b ポインタオフセット+aaaaaaa+4"になるので,00000000で閉じる必要がある(無い時はnop 60000000を入れる)。
ジャンプ挿入
C6aaaaaa YYYYYYYY
aaaaaa+ベースオフセットからYYYYYYYYへジャンプするようbranchを書き込む。
aaaaaa+ベースオフセットに"b YYYYYYYY"が挿入される。
D6aaaaaa YYYYYYYY
aaaaaa+ポインタオフセットからYYYYYYYYへジャンプするようbranchを書き込む。
aaaaaa+ポインタオフセットに"b YYYYYYYY"が挿入される。
オン・オフスイッチ
CC000000 00000000
条件判定コードの途中に挿入され、コードを切り替える
アドレス範囲チェック
CE000000 XXXXYYYY = ベースオフセットが0xXXXX0000;0xYYYY0000の範囲のとき
CE000001 XXXXYYYY = ベース判定の終了
DE000000 XXXXYYYY = ポインタオフセットが0xXXXX0000;0xYYYY0000の範囲のとき
DE000001 XXXXYYYY = ポインタ判定の終了
#XXXX>=YYYYのときコードは実行されない。
[判定終了コード]
Full Terminator
E0000000 XXXXYYYY
すべてのフラグをリセットする
XXXXが0以外のとき, ベースオフセットが0xXXXX0000になる
YYYYが0以外のとき, ポインタオフセットが0xYYYY0000になる
Endif (+else)
E20000VV XXXXYYYY
Applies VV endifs.
XXXXが0以外のとき, ベースオフセットが0xXXXX0000になる
YYYYが0以外のとき, ポインタオフセットが0xYYYY0000になる
E21000VV XXXXYYYY = endifs + else
Applies VV endifs, and inverse the code execution status (="else").
If XXXX!=0, ベースオフセット = 0xXXXX0000
If YYYY!=0, ポインタオフセット = 0xYYYY0000
[開始コード]
00D0C0DE 00D0C0DE
GCTファイルの最初に挿入され、コードの開始を表す。
[終端コード]
F0000000 00000000
GCTファイルの末尾に挿入され、コードの終了を表す。
Gecko 1.8以降
ASM挿入 16-bit XORチェックサムあり
F2XXXXXX YYZZZZNN
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ 00000000
F4XXXXXX YYZZZZNN
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ 00000000
サーチコード
F60000NN XXXXYYYY
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ