银河漫步 - 2017/8/22 10:22:04
翻了一下其他游戏的金手指里
能看懂的
04AAAAAA BBBBBBBB 表示4字节写入
02AAAAAA 0000BBBB 表示2字节写入
00AAAAAA 000000BB 表示1字节写入
00AAAAAA 00XX00BB 表示1字节连续写入XX次
其他的比如
条件判断码
结束码
按键判断码
压缩码
指针码等
有没有相关的格式说明?
其他还好
关键是条件判断码比较重要
Blader - 2017/8/22 12:22:05
银河漫步 - 2017/8/22 12:35:09
看说明
条件等于判断码应该是0CXXXXXX YYYYYYYY
了解了
有了这个就好做金手指了
银河漫步 - 2017/8/22 12:46:12
发现直写码也有点问题
04XXXXXX YYYYYYYY
但是gc世界地址范围是80000000 - 817FFFFF
但XXXXXX是6位
而实际内存范围可能到7位
超过了FFFFFF的内存部分金手指怎么写?
是不是变成05XXXXXX YYYYYYYY
Blader - 2017/8/22 12:53:07
如果是那樣的話
代碼開頭直接改為01,03或05就可以了(分別對應00,02或04)
可以適用於大部分的代碼上
熟悉論理運算的話,其地址是依以下運算得到實際地址
0xXXXXXXXX & 0x01FFFFFF | 0x80000000
舉例而言01234567 00001234
意思是在地址0x81234567至0x81234579連續寫入1字節數值0x34
银河漫步 - 2017/8/22 13:22:14
如果是那樣的話 代碼開頭直接改為01,03或05就可以了(分別對應00,02或04) 可以適用於大部分的代碼上 熟悉論理運算的話,其地址是依以下運算得到實際地址 0xXXXXXXXX & 0x01FFFFFF | 0x80000000 舉例而言01234...... Blader 发表于 8/22/2017 12:53:07 PM |
刚才测试判断码似乎无效
0D21DA38 A804002A
0521DA3C 60000000
想要判断
121DA38 如果= A804002A 则
121DA3C 写入 60000000
用以上代码似乎无效
Blader - 2017/8/22 13:36:50
代碼基本上是有作用的,但我不確定Dolphin的作弊碼需不需要加密
或許不能直接使用RAW代碼也說不定,正在找網路文章看有沒有相關說明...
補充:應該是能直接使用RAW代碼,或許是Dolphin的代碼支持有問題
我在MECC上使用同樣的代碼就有作用,但Dolphin則沒有效果
Blader - 2017/8/22 15:42:57
發現問題的原因了,Dolphin預設是不啟用作弊碼功能的
需要到設置中啟用作弊碼功能才會有效
如果還是不行,GC的內存是大尾數據排列
或許將指定的數值逆向書寫可以成功使用作弊碼
jiqigou - 2017/8/22 21:11:09
看看这个文章,我以前也是看了这个才知道怎么做金手指的
Action Replay格式(復號化)
直接寫入碼
8bits
00aaaaaa YYYYYYXX
把連續的YYYYYY+1個XX寫入到aaaaaa。
16bits
02aaaaaa YYYYXXXX
把連續的YYYY+1個XXXX寫入到aaaaaa。
32bits
04aaaaaa XXXXXXXX
把XXXXXXXX寫入到aaaaaa。
壓縮碼
8bits
00000000 80aaaaaa
000000XX VVNNZZZZ
把NN+1個字節的XX寫入aaaaaa,每次aaaaaa遞增ZZZZ,XX遞增VV。
16bits
00000000 82aaaaaa
0000XXXX VVNNZZZZ
把NN+1個字節的XXXX寫入aaaaaa,每次aaaaaa遞增ZZZZ,XXXX遞增VV。
32bits
00000000 84aaaaaa
XXXXXXXX VVNNZZZZ
把NN+1個字節的XXXXXXXX寫入aaaaaa,每次aaaaaa遞增ZZZZ,XXXXXXXX遞增VV。
條件碼
8bits如果等於
08aaaaaa 000000XX
如果aaaaaa上的8bits値等於XX,執行下面的一行代碼,否則下面的一行代碼不執行。
48aaaaaa 000000XX
如果aaaaaa上的8bits値等於XX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
88aaaaaa 000000XX
如果aaaaaa上的8bits値等於XX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。(其實和下面的D0開頭的碼完全一樣)
C8aaaaaa 000000XX
如果aaaaaa上的8bits値等於XX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。(其實和下面的90開頭的碼完全一樣)
8bits如果不等於
10aaaaaa 000000XX
如果aaaaaa上的8bits値不等於XX,執行下面的一行代碼,否則下面的一行代碼不執行。
50aaaaaa 000000XX
如果aaaaaa上的8bits値不等於XX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
90aaaaaa 000000XX
如果aaaaaa上的8bits値不等於XX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。(其實和上面的C8開頭的碼完全一樣)
D0aaaaaa 000000XX
如果aaaaaa上的8bits値不等於XX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。(其實和上面的88開頭的碼完全一樣)
8bits如果小於(無符號)
28aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,執行下面的一行代碼,否則下面的一行代碼不執行。
68aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
A8aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
E8aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
8bits如果小於(有符號)
18aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,執行下面的一行代碼,否則下面的一行代碼不執行。
58aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
98aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
D8aaaaaa 000000XX
如果aaaaaa上的8bits値小於XX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
8bits如果大於(無符號)
30aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,執行下面的一行代碼,否則下面的一行代碼不執行。
70aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
B0aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
F0aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
8bits如果大於(有符號)
20aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,執行下面的一行代碼,否則下面的一行代碼不執行。
60aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
A0aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
E0aaaaaa 000000XX
如果aaaaaa上的8bits値大於XX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
16bits如果等於
0Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値等於XXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
4Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値等於XXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
8Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値等於XXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。(其實和下面的D2開頭的碼完全一樣)
CAaaaaaa 0000XXXX
如果aaaaaa上的16bits値等於XXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。(其實和下面的92開頭的碼完全一樣)
16bits如果不等於
12aaaaaa 0000XXXX
如果aaaaaa上的16bits値不等於XXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
52aaaaaa 0000XXXX
如果aaaaaa上的16bits値不等於XXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
92aaaaaa 0000XXXX
如果aaaaaa上的16bits値不等於XXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。(其實和上面的CA開頭的碼完全一樣)
D2aaaaaa 0000XXXX
如果aaaaaa上的16bits値不等於XXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。(其實和上面的8A開頭的碼完全一樣)
16bits如果小於(無符號)
2Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
6Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
AAaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
EAaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
16bits如果小於(有符號)
1Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
5Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
9Aaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
DAaaaaaa 0000XXXX
如果aaaaaa上的16bits値小於XXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
16bits如果大於(無符號)
32aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
72aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
B2aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
F2aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
16bits如果大於(有符號)
22aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
62aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
A2aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
E2aaaaaa 0000XXXX
如果aaaaaa上的16bits値大於XXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
32bits如果等於
0Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値等於XXXXXXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
4Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値等於XXXXXXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
8Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値等於XXXXXXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。(其實和下面的D4開頭的碼完全一樣)
CCaaaaaa XXXXXXXX
如果aaaaaa上的32bits値等於XXXXXXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。(其實和下面的94開頭的碼完全一樣)
32bits如果不等於
14aaaaaa XXXXXXXX
如果aaaaaa上的32bits値不等於XXXXXXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
54aaaaaa XXXXXXXX
如果aaaaaa上的32bits値不等於XXXXXXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
94aaaaaa XXXXXXXX
如果aaaaaa上的32bits値不等於XXXXXXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。(其實和上面的CC開頭的碼完全一樣)
D4aaaaaa XXXXXXXX
如果aaaaaa上的32bits値不等於XXXXXXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。(其實和上面的8C開頭的碼完全一樣)
32bits如果小於(無符號)
2Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
6Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
ACaaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
ECaaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
32bits如果小於(有符號)
1Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
5Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
9Caaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
DCaaaaaa XXXXXXXX
如果aaaaaa上的32bits値小於XXXXXXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
32bits如果大於(無符號)
34aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
74aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
B4aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
F4aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
32bits如果大於(有符號)
24aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,執行下面的一行代碼,否則下面的一行代碼不執行。
64aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,執行下面的兩行代碼,否則下面的兩行代碼不執行。
A4aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼不執行。
E4aaaaaa XXXXXXXX
如果aaaaaa上的32bits値大於XXXXXXXX,不執行下面的所有代碼(僅限同一組密碼),否則下面的所有代碼執行。
指針碼
8bits
40aaaaaa YYYYYYXX
把XX寫入到aaaaaa上的基地址+YYYYYY後的地址。
16bits
42aaaaaa YYYYXXXX
把XXXX寫入到aaaaaa上的基地址+YYYY*2後的地址。
32bits
44aaaaaa XXXXXXXX
把XXXXXXXX寫入到aaaaaa上的基地址上的地址。(幾乎沒用,因爲沒法指定偏移量,寧可拆成2個16bits的指針碼)
變値碼
8bits
80aaaaaa 000000XX
把aaaaaa上的8bits値增加XX(有符號),如果XX是負數就是作減法,例如:
805A2000 00000020 (+20)
805A2000 000000E0 (-20)
16bits
82aaaaaa 0000XXXX
把aaaaaa上的16bits値增加XXXX(有符號),如果XXXX是負數就是作減法,例如:
825A2000 00000020 (+20)
825A2000 0000FFE0 (-20)
32bits
84aaaaaa XXXXXXXX
把aaaaaa上的32bits値增加XXXXXXXX(有符號),如果XXXXXXXX是負數就是作減法,例如:
845A2000 00000020 (+20)
845A2000 FFFFFFE0 (-20)
jiqigou - 2017/8/22 21:23:16
Gecko格式
Wii有不同的内存區域,不過衹有2個被遊戲使用(也被金手指使用):
MEM1: 從0x80000000到0x81800000
MEM2: 從0x90000000到0x94000000
然而,MEM2的頂部是無法訪問的(嘗試從那兒讀寫會使Wii死機)。那得取決於遊戲,但似乎你可以自由訪問從0x90000000到0x93400000的區域。
ba:基地址。每次代碼處理器執行後設置在0x80000000。每次基地址會加上一個代碼地址,代碼處理器執行:地址=地址+(基地址&0xFE000000)。你可以更改它,但如果你這麼幹了,別忘了事後還原成它本來的値。
po:指針。每次代碼處理器執行後設置在0x80000000。每次指針會加上一個代碼地址,代碼處理器執行:地址=地址+指針。你可以隨意更改它。
grN:“Gecko寄存器N”。它不是一個眞正的寄存器類似r0或r1。它是個32bits的値,因爲Gecko在内存中保留了一片區域存放N。N可以是0x0到0xF的値。你可以在裡面存儲/載入任意値,但要注意其它的代碼可能會覆蓋你的値。別指望代碼處理器每次也會執行它。如果你希望存儲一個不能被改變的値,嘗試用代碼處理器以外的眞正的地址,或用46/4E結合goto代碼類型。注意grN比gecko/代碼處理器優先被存儲。那意味著它們總是在一個靜態地址上被訪問:0x80001804,[0x80001804]=gr0,[0x80001808]=gr1,……,[0x80001840]=grF。你可以直接訪問它們,例如在插入一個彙編指令時。
bN:“區塊N”。一個區塊由2個32bits的値組成。它們用來存儲重復/返回/轉到/轉到下一子程序代碼的信息。比如b0的數據存儲在0x80001844,b1的在0x8000184C……
CT:代碼類型。範圍從0到7。它是一個代碼的第一個數字的開頭3個bit(譯者按:從最低位數起)。因爲這個你會注意到代碼的所有代碼類型事實上被乘以2:CT 1:2……,CT 2:4……,CT 3:6……,CT 7:E。第4個bit用來告訴代碼處理器使用指針還是基地址。那意味著你可以通過觀察代碼的第一個數字知道基地址是否被使用。如果是偶數就是基地址,如果是奇數就是指針。
CST:代碼子類型。它是一個代碼的第二個數字的開頭3個bit(譯者按:從最低位數起)。因爲這個你會注意到代碼的所有代碼子類型事實上被乘以2:CST1:2……,CST2:4……,CST3:6……,CST7:E。第4個bit事實上是地址 (____)的一部分。
____:它是一些將被使用的代碼的地址部分。它的範圍從0x00000000到0x01FFFFFF。事實上“____”被稱作地址是不完整的,圍繞在“____”周圍的一些數字也是地址的一部分。比如0x00FFFFFF以上的部分,地址會變更代碼子類型中的“look”部分,把它標記成一個奇數。
[]:比如[XXXXXXXX]。括弧把XXXXXXXX定義爲内存區域,不是一個値。所以[XXXXXXXX]表示“存儲在XXXXXXXX上的數據”。無論如何括弧内的値必須是個有效地址,否則Wii會死機。
+=:比如pa+=XXXXXXXX表示pa=pa+XXXXXXXX。
對條件代碼(If……)來說所有的比較都是無符號的,這表示數字範圍是從0x00000000到0xFFFFFFFF,然而遊戲有時會用有符號的數字。比如你在遊戲中的X坐標會從1到0再到-1,在16進制中表示從0x00000001到0x00000000再到0xFFFFFFFF。所以由於代碼處理器使用無符號的數字,在這種情況下你必須先尋找一個“小於”値(從0x00000001到0x00000000),然後才是“大於”値。
你會找到代碼類型盡可能詳細的完整列表。爲了幫助新來的理解代碼類型,有需要時我把類型分成了使用基地址和使用指針的。
做代碼前的一點建議,特別是使用指針時:在寫入你從内存中載入的値到一個地址時確保地址是有效的。代碼處理器不檢查地址範圍的,如果地址是錯的仍會盲目地寫入(接著Wii死機)。 看來Wii的内存是重度的被使用/被塡充,一個用來存儲地址的地方也會稍後被用來存儲數據。那表示檢查地址是否是00000000的機制並不是一直有效的。
所以在你寫入從内存載入的値到一個地址前你必須確保地址是有效的。可以用CE/DE If……代碼類型來判斷。
舉例:
對MEM1:
CE000000 80008180:檢查基地址是否在[80000000,81800000]範圍内。
DE000000 80008180 :檢查指針是否在[80000000,81800000]範圍内。
對MEM2:
CE000000 90009340:檢查基地址是否在[90000000,93400000]範圍内。
DE000000 90009340:檢查指針是否在[90000000,93400000]範圍内。
如果你想檢查基地址/指針是在MEM1還是MEM2内:
CE000000 80008180:檢查基地址是否在[80000000,81800000]範圍内。
66000001 00000000:如果代碼執行後的狀態是true則跳過下一行。
CE000001 90009340:結束上一個判斷,然後檢查基地址是否在[90000000,93400000]。
DE000000 80008180:檢查指針是否在[80000000,81800000]。
66000001 00000000:如果代碼執行後的狀態是true則跳過下一行。
DE000001 90009340 :結束上一個判斷,然後檢查指針是否在[90000000,93400000]。
那表示你先載入你要的數據,然後用一個(或多個)CE/DE代碼是否是一個有效地址。
同樣的卽使指針有時被某些遊戲重度地使用,有時不可能找到一個穩定的指針。比如《超級馬里奧銀河》,每個角色有他們自己的數據,所有的數據是動態的,不可能找到靜態的地址,在這些特殊的情況下你除了用彙編指令修改外別無選擇。還是在《超級馬銀》中,每個角色有他們自己的AI程序。通過找到你要的角色的程序並hook它,你會得到訪問它的指針(通常存儲在Wii的寄存器中)。你也可以把指針寫入一個已知的、修正的位置,然後用它和別的代碼一起去修改角色的數據,或寫一個起同樣的修改效果的彙編程序。
所以緊記指針是很危險的,人們總是認爲他們找到了衹對自己起效的眞指針但往往是假指針。
確保多測試幾次依賴指針的代碼,必須改變等級、角色的代碼,甚至新建一個存檔來測試。如果效果停止了(卽使沒發生可見的副作用)或在某個點引起死機了,別再使用它了(嘗試去找個新的指針或用彙編修改遊戲)。別發表還沒被重度確認/測試的代碼。
CT0:直接寫入/塡充到内存
CST0:8bits寫入&塡充
00______ YYYY00XX:8bits内存寫入&塡充到(基地址)
把連續的YYYY+1個XX寫入到基地址+地址
10______ YYYY00XX:8bits内存寫入&塡充到(指針)
把連續的YYYY+1個XX寫入到指針+地址
CST1:16bits寫入&塡充
02______ YYYYXXXX:16bits内存寫入&塡充到(基地址)
把連續的YYYY+1個XXXX寫入到基地址+地址
12______ YYYYXXXX:16bits内存寫入&塡充到(指針)
把連續的YYYY+1個XXXX寫入到指針+地址
CST2:32bits寫入
04______ XXXXXXXX:32bits内存寫入到(基地址)
把XXXXXXXX寫入到基地址+地址
14______ XXXXXXXX:32bits内存寫入到(指針)
把XXXXXXXX寫入到指針+地址
CST3:字符串代碼
06______ YYYYYYYY:把代碼d1d2d3d4 d5d6d7d8……補丁到(基地址)
把d1d2d3d4 d5d6d7d8……寫入到基地址+地址。YYYYYYYY是寫入的字節數。
16______ XXXXXXXX:把代碼d1d2d3d4 d5d6d7d8……補丁到(指針)
把d1d2d3d4 d5d6d7d8……寫入到指針+地址。YYYYYYYY是寫入的字節數。
CST4:壓縮碼
08______ 000000XX:8bits壓縮碼(基地址)
0NNNZZZZ VVVVVVVV
把NNN+1個字節的XX寫入基地址+地址,然後XX+=VVVVVVVV(XX=XX+VVVVVVVV),地址+=ZZZZ(地址=地址+ZZZZ)
18______ 000000XX:8bits壓縮碼(指針)
0NNNZZZZ VVVVVVVV
把NNN+1個字節的XX寫入指針+地址,然後XX+=VVVVVVVV(XX=XX+VVVVVVVV),地址+=ZZZZ(地址=地址+ZZZZ)
08______ 0000XXXX:16bits壓縮碼(基地址)
1NNNZZZZ VVVVVVVV
把NNN+1個雙字節的XXXX寫入基地址+地址,然後XXXX+=VVVVVVVV(XXXX=XXXX+VVVVVVVV),地址+=ZZZZ(地址=地址+ZZZZ)
18______ 0000XXXX:16bits壓縮碼(指針)
1NNNZZZZ VVVVVVVV
把NNN+1個雙字節的XXXX寫入指針+地址,然後XXXX+=VVVVVVVV(XXXX=XXXX+VVVVVVVV),地址+=ZZZZ(地址=地址+ZZZZ)
08______ XXXXXXXX:32bits壓縮碼(基地址)
2NNNZZZZ VVVVVVVV
把NNN+1個四字節的XXXXXXXX寫入基地址+地址,然後XXXXXXXX+=VVVVVVVV(XXXXXXXX=XXXXXXXX+VVVVVVVV),地址+=ZZZZ(地址=地址+ZZZZ)
18______ XXXXXXXX:32bits壓縮碼(指針)
2NNNZZZZ VVVVVVVV
把NNN+1個四字節的XXXXXXXX寫入指針+地址,然後XXXXXXXX+=VVVVVVVV(XXXXXXXX=XXXXXXXX+VVVVVVVV),地址+=ZZZZ(地址=地址+ZZZZ)
CT1 常規條件代碼 (16/32 bits)
CST0:32bits如果等於
20______ YYYYYYYY:32bits如果等於(基地址)
比較[基地址+地址]上的32bits値是否等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
30______ YYYYYYYY:32bits如果等於(指針)
比較[指針+地址] 上的32bits値是否等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
20_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果等於(基地址)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的32bits値是否等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
30_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果等於(指針)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的32bits値是否等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST1:32bits如果不等於
22______ YYYYYYYY:32bits如果不等於(基地址)
比較[基地址+地址]上的32bits値是否不等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
32______ YYYYYYYY:32bits如果不等於(指針)
比較[指針+地址]上的32bits値是否不等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
22_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果不等於(基地址)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的32bits値是否不等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
32_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果不等於(指針)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的32bits値是否不等於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST2:32bits如果大於
24______ YYYYYYYY:32bits如果大於(基地址)(有符號)
比較[基地址+地址]上的32bits値是否大於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
34______ YYYYYYYY:32bits如果大於(指針)(有符號)
比較[指針+地址]上的32bits値是否大於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
24_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果大於(基地址)(有符號)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的32bits値是否大於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
34_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果大於(指針)(有符號)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的32bits値是否大於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST3:32bits如果小於
26______ YYYYYYYY:32bits如果小於(基地址)(有符號)
比較[基地址+地址]上的32bits値是否小於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
36______ YYYYYYYY:32bits如果小於(指針)(有符號)
比較[指針+地址]上的32bits値是否小於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
26_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果小於(基地址)(有符號)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的32bits値是否小於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
36_____1 YYYYYYYY:上一個條件碼的結束行,然後32bits如果小於(指針)(有符號)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的32bits値是否小於YYYYYYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST4:16bits如果等於
28______ ZZZZYYYY:16bits如果等於(基地址)
比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
(譯者按:ZZZZ充當了掩碼,如果用來判斷Joker Adress的話可以用ZZZZ忽略掉不想判斷的Joker Digits。下同。)
38______ ZZZZYYYY:16bits如果等於(指針)
比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
28_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果等於(基地址)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
38_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果等於(指針)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST5:16bits如果不等於
2A______ ZZZZYYYY:16bits如果不等於(基地址)
比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否不等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
3A______ ZZZZYYYY:16bits如果不等於(指針)
比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否不等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
2A_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果不等於(基地址)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否不等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
3A_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果不等於(指針)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否不等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST6:16bits如果大於
2C______ ZZZZYYYY:16bits如果大於(基地址)
比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否大於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
3C______ ZZZZYYYY:16bits如果大於(指針)
比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否大於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
2C_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果大於(基地址)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否大於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
3C_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果大於(指針)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否大於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST7:16bits如果小於
2E______ ZZZZYYYY:16bits如果小於(基地址)
比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否小於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
3E______ ZZZZYYYY:16bits如果小於(指針)
比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否小於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
2E_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果小於(基地址)
作爲上一個條件碼的結束行,然後比較[基地址+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否小於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
3E_____1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果小於(指針)
作爲上一個條件碼的結束行,然後比較[指針+地址] 上的値同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否小於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
jiqigou - 2017/8/22 21:25:59
16bits的條件代碼常用來配合Joker Digits當作Joker Code使用,Joker Digits見附1。
CT2 基地址/指針操作碼
CST0:載入到基地址
40TYZ00N XXXXXXXX:
40000:基地址=[XXXXXXXX]
40010:基地址=[基地址+XXXXXXXX]
50010:基地址=[指針+XXXXXXXX]
40001:基地址=[Gecko寄存器N+XXXXXXXX]
40011:基地址=[基地址+Gecko寄存器N+XXXXXXXX]
50011:基地址=[指針+Gecko寄存器N+XXXXXXXX]
40100:基地址+=[XXXXXXXX]
40110:基地址+=[基地址+XXXXXXXX]
50110:基地址+=[指針+XXXXXXXX]
40101:基地址+=[Gecko寄存器N+XXXXXXXX]
40111:基地址+=[基地址+Gecko寄存器N+XXXXXXXX]
50111:基地址+=[指針+Gecko寄存器N+XXXXXXXX]
CST1:設置成基地址
42TYZ00N XXXXXXXX:
42000:基地址=XXXXXXXX
42010:基地址=基地址+XXXXXXXX
52010:基地址=指針+XXXXXXXX
42001:基地址=Gecko寄存器N+XXXXXXXX
42011:基地址=基地址+Gecko寄存器N+XXXXXXXX
52011:基地址=指針+Gecko寄存器N+XXXXXXXX
42100:基地址+=XXXXXXXX
42110:基地址+=基地址+XXXXXXXX
52110:基地址+=指針+XXXXXXXX
42101:基地址+=Gecko寄存器N+XXXXXXXX
42111:基地址+=基地址+Gecko寄存器N+XXXXXXXX
52111:基地址+=指針+Gecko寄存器N+XXXXXXXX
CST2:基地址存儲到
440YZ00N XXXXXXXX:
44000:[XXXXXXXX]=基地址
44010:[XXXXXXXX+基地址]=基地址
54010:[XXXXXXXX+指針]=基地址
44001:[XXXXXXXX+Gecko寄存器N]=基地址
44011:[XXXXXXXX+基地址+Gecko寄存器N]=基地址
54011:[XXXXXXXX+指針+Gecko寄存器N]=基地址
CST3:把下一行代碼所在的位置存儲到基地址
4600XXXX 00000000=基地址會存儲下一行代碼所在位置+XXXX上的値(XXXX是個有符號的16bits値:0xFFFF=-1)。
46000000 00000000=基地址指向下一行代碼的第一個32bits値。
46000004 00000000=基地址指向下一行代碼的第二個32bits値。
CST4:載入到指針
48TYZ00N XXXXXXXX:
48000:指針=[XXXXXXXX]
48010:指針=[基地址+XXXXXXXX]
58010:指針=[指針+XXXXXXXX]
48001:指針=[Gecko寄存器N+XXXXXXXX]
48011:指針=[基地址+Gecko寄存器N+XXXXXXXX]
58011:指針=[指針+Gecko寄存器N+XXXXXXXX]
48100:指針+=[XXXXXXXX]
48110:指針+=[基地址+XXXXXXXX]
58110:指針+=[指針+XXXXXXXX]
48101:指針+=[Gecko寄存器N+XXXXXXXX]
48111:指針+=[基地址+Gecko寄存器N+XXXXXXXX]
58111:指針+=[指針+Gecko寄存器N+XXXXXXXX]
CST5:設置成指針
4ATYZ00N XXXXXXXX:
4A000:指針=XXXXXXXX
4A010:指針=基地址+XXXXXXXX
5A010:指針=指針+XXXXXXXX
4A001:指針=Gecko寄存器N+XXXXXXXX
4A011:指針=基地址+Gecko寄存器N+XXXXXXXX
5A011:指針=指針+Gecko寄存器N+XXXXXXXX
4A100:指針+=XXXXXXXX
4A110:指針+=基地址+XXXXXXXX
5A110:指針+=指針+XXXXXXXX
4A101:指針+=Gecko寄存器N+XXXXXXXX
4A111:指針+=基地址+Gecko寄存器N+XXXXXXXX
5A111:指針+=指針+Gecko寄存器N+XXXXXXXX
CST6:指針存儲到
4C0YZ00N XXXXXXXX:
4C000:[XXXXXXXX]=指針
4C010:[XXXXXXXX+基地址]=指針
5C010:[XXXXXXXX+指針]=指針
44001:[XXXXXXXX+Gecko寄存器N]=指針
44011:[XXXXXXXX+基地址+Gecko寄存器N]=指針
54011:[XXXXXXXX+指針+Gecko寄存器N]=指針
CST7:把下一行代碼所在的位置存儲到指針
4E00XXXX 00000000=指針會存儲下一行代碼所在位置+XXXX上的値(XXXX是個有符號的16bits値:0xFFFF=-1)。
4E000000 00000000=指針指向下一行代碼的第一個32bits値。
4E000004 00000000=指針指向下一行代碼的第二個32bits値。
CT3 重復/轉到/轉到下一子程序/返回碼
CST0:設置重復
6000NNNN 0000000P=設置重復
存儲下一行代碼的地址和NNNN(重復的次數)到區塊P。
CST1:執行重復
62000000 0000000P=執行重復
如果存儲在區塊P内的NNNN>0,它會遞減並且代碼處理器跳到存儲在區塊P内的下一行代碼的地址。
CST2:返回
64000000 0000000P=如果true則返回
如果代碼執行後的狀態是true,代碼處理器跳到存儲在區塊P内的下一行代碼的地址(不涉及NNNN)。
64100000 0000000P=如果false返回
如果代碼執行後的狀態是false,代碼處理器跳到存儲在區塊P内的下一行代碼的地址(不涉及NNNN)。
64200000 0000000P=返回
代碼處理器跳到存儲在區塊P内的下一行代碼的地址(不涉及NNNN),無視代碼執行後的狀態。
CST3:轉到
6600XXXX 00000000=如果true則轉到
如果代碼執行後的狀態是true,代碼處理器跳到(下一行代碼+XXXX行)。XXXX是有符號數。
6610XXXX 00000000=如果false則轉到
如果代碼執行後的狀態是false,代碼處理器跳到(下一行代碼+XXXX行)。XXXX是有符號數。
6620XXXX 00000000=轉到
代碼處理器跳到(下一行代碼+XXXX行)。XXXX是有符號數。
CST4轉到下一子程序
6800XXXX 0000000P=如果true則轉到下一子程序
如果代碼執行後的狀態是true,代碼處理器存儲下一行代碼的地址到區塊P,然後跳到(下一行代碼+XXXX行)。XXXX是有符號數。
6810XXXX 0000000P=如果false則轉到下一子程序
如果代碼執行後的狀態是false,代碼處理器存儲下一行代碼的地址到區塊P,然後跳到(下一行代碼+XXXX行)。XXXX是有符號數。
6820XXXX 0000000P=轉到下一子程序
代碼處理器存儲下一行代碼的地址到區塊P,然後跳到(下一行代碼+XXXX行)。XXXX是有符號數。
CT4 Gecko寄存器操作碼
CST0:設置成Gecko寄存器
80SY000N XXXXXXXX:
8000:Gecko寄存器N=XXXXXXXX
8001:Gecko寄存器N=XXXXXXXX+基地址
9001:Gecko寄存器N=XXXXXXXX+指針
8010:Gecko寄存器N+=XXXXXXXX
8011:Gecko寄存器N+=XXXXXXXX+基地址
9011:Gecko寄存器N+=XXXXXXXX+指針
CST1:載入到Gecko寄存器
82UY000N XXXXXXXX:
8200:Gecko寄存器N=[XXXXXXXX]上的8bits
8201:Gecko寄存器N=[XXXXXXXX+基地址]上的8bits
9201:Gecko寄存器N=[XXXXXXXX+指針]上的8bits
8210:Gecko寄存器N=[XXXXXXXX]上的16bits
8211:Gecko寄存器N=[XXXXXXXX+基地址]上的16bits
9211:Gecko寄存器N=[XXXXXXXX+指針]上的16bits
8220:Gecko寄存器N=[XXXXXXXX]上的32bits
8221:Gecko寄存器N=[XXXXXXXX+基地址]上的32bits
9221:Gecko寄存器N=[XXXXXXXX+指針]上的32bits
CST2: Gecko寄存器存儲到
84UYZZZN XXXXXXXX:
8400:在[XXXXXXXX]處連續寫入ZZZ+1個Gecko寄存器N上的8bits數據
8401:在[XXXXXXXX+基地址]處連續寫入ZZZ+1個Gecko寄存器N上的8bits數據
9401:在[XXXXXXXX+指針]處連續寫入ZZZ+1個Gecko寄存器N上的8bits數據
8410:在[XXXXXXXX]處連續寫入ZZZ+1個Gecko寄存器N上的16bits數據
8411:在[XXXXXXXX+基地址]處連續寫入ZZZ+1個Gecko寄存器N上的16bits數據
9411:在[XXXXXXXX+指針]處連續寫入ZZZ+1個Gecko寄存器N上的16bits數據
8420:在[XXXXXXXX]處連續寫入ZZZ+1個Gecko寄存器N上的32bits數據
8421:在[XXXXXXXX+基地址]處連續寫入ZZZ+1個Gecko寄存器N上的32bits數據
9421:在[XXXXXXXX+指針]處連續寫入ZZZ+1個Gecko寄存器N上的32bits數據
CST3:Gecko寄存器/直接値操作
CST3:Gecko寄存器/直接値操作
86TY000N XXXXXXXX:
86T0:Gecko寄存器N=(Gecko寄存器N?XXXXXXXX)
86T1:Gecko寄存器N=([Gecko寄存器N]?XXXXXXXX)
86T2:Gecko寄存器N=(Gecko寄存器N?[XXXXXXXX])
86T3:Gecko寄存器N=([Gecko寄存器N]?[XXXXXXXX])
?=T:
0:加(+)
1:乘(*)
2:邏輯或(|)
3:邏輯與(&)
4:邏輯非(^)
5:邏輯左位移(<<)
6:邏輯右位移(>>)
7:循環左位移
8:算術右位移
A:單精度浮點加
B:單精度浮點乘
CST4:Gecko寄存器之間的操作
88TY000N 0000000M:
88T0:Gecko寄存器N=(Gecko寄存器N ? Gecko寄存器M)
88T1:Gecko寄存器N=([Gecko寄存器N] ? Gecko寄存器M)
88T2:Gecko寄存器N=(Gecko寄存器N ? [Gecko寄存器M])
88T3:Gecko寄存器N=([Gecko寄存器N] ? [Gecko寄存器M])
?=T:
0:加(+)
1:乘(*)
2:邏輯或(|)
3:邏輯與(&)
4:邏輯非(^)
5:邏輯左位移(<<)
6:邏輯右位移(>>)
7:循環左位移
8:算術右位移
A:單精度浮點加
B:單精度浮點乘
CST5:內存複製1
8AYYYYNM XXXXXXXX
從[Gecko寄存器N]複製YYYY字節到[Gecko寄存器M]+XXXXXXXX,Gecko寄存器M不能爲F。
8AYYYYNF XXXXXXXX
從[Gecko寄存器N]複製YYYY字節到基地址+XXXXXXXX
9AYYYYNF XXXXXXXX
從[Gecko寄存器N]複製YYYY字節到指針+XXXXXXXX
CST6:內存複製2
8CYYYYNM XXXXXXXX
從[Gecko寄存器N]+XXXXXXXX複製YYYY字節到[Gecko寄存器M] ,Gecko寄存器M不能爲F。
8CYYYYFM XXXXXXXX
從基地址+XXXXXXXX複製YYYY字節到[Gecko寄存器M]
9CYYYYFM XXXXXXXX
從指針+XXXXXXXX複製YYYY字節到[Gecko寄存器M]
CT5:特殊條件代碼(16bits)
CT5 第1部分:未知値比較
注意:在第1部分的代碼中,如果N或M=0xF,那麼[地址+基地址/指針]將被用來取代Gecko寄存器F(開頭是A0用基地址取代,B0用指針取代)。
CST0:16bits如果等於
A0______ NM00YYYY:16bits如果等於
比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否等於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
A0_____1 NM00YYYY:上一個條件碼的結束行,然後16bits如果等於
作爲上一個條件碼的結束行,然後比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否等於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST1:16bits如果不等於
A2______ NM00YYYY:16bits如果不等於
比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否不等於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
A2_____1 NM00YYYY:上一個條件碼的結束行,然後16bits如果不等於
作爲上一個條件碼的結束行,然後比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否不等於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST2:16bits如果大於
A4______ NM00YYYY:16bits如果大於
比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否大於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
A4_____1 NM00YYYY:上一個條件碼的結束行,然後16bits如果大於
作爲上一個條件碼的結束行,然後比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否大於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST3:16bits如果小於
A6______ NM00YYYY:16bits如果小於
比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否小於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
A6_____1 NM00YYYY:上一個條件碼的結束行,然後16bits如果小於
作爲上一個條件碼的結束行,然後比較[Gecko寄存器N] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果是否小於[Gecko寄存器M] 上的値同YYYY(YYYY要先作邏輯非運算)邏輯與運算的結果。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CT5 第2部分:16bits計數器校驗
注意:每次遇到條件計數器代碼,代碼處理器按以下的規則執行:
-如果計數器代碼大於等於1則作爲上一個條件碼的結束行。
-校驗了當前的執行狀態後,如果是true計數器加1,如果是false計數器清0。
-最終像執行普通條件碼那樣執行條件技術器代碼!!!
另外如果代碼的第1部分以8(比如沒有作爲上一個條件碼的結束行)或9(作爲上一個條件碼的結束行)結束而不是0或1,當條件計數器代碼的狀態是true時計數器會被清0!!!
計數器存儲在XXXX
CST4:16bits如果計數器的値等於
A80XXXX0 ZZZZYYYY:16bits如果等於
比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
(譯者按:常用來延遲別的碼執行的時機,比如《波斯王子 遺忘之沙》的那個防hook死機碼就需要用到它。)
A80XXXX1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果等於
作爲上一個條件碼的結束行,然後比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST5:16bits如果計數器的値不等於
AA0XXXX0 ZZZZYYYY:16bits如果不等於
比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否不等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
AA0XXXX1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果不等於
作爲上一個條件碼的結束行,然後比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否不等於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST6:16bits如果計數器的値大於
AC0XXXX0 ZZZZYYYY:16bits如果大於
比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否大於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
AC0XXXX1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果大於
作爲上一個條件碼的結束行,然後比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否大於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CST7:16bits如果計數器的値小於
AE0XXXX0 ZZZZYYYY:16bits如果小於
比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否小於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
AE0XXXX1 ZZZZYYYY:上一個條件碼的結束行,然後16bits如果小於
作爲上一個條件碼的結束行,然後比較XXXX同ZZZZ(ZZZZ要先作邏輯非運算)邏輯與運算的結果是否小於YYYY。如果是,下面的代碼將被執行(否則下面的代碼不執行)。
CT6 彙編、開關和地址範圍檢查碼
CST0:執行以下的彙編代碼
C0000000 NNNNNNNN:執行ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
4E800020 00000000
執行下面的NNNNNNNN行的彙編指令代碼。彙編指令必須以blr(0x4E800020,跳回到lr寄存器存儲的地址)作爲結尾。
(譯者按:其實這個碼可以代替前面所有的碼了,因爲可以用這個碼編寫彙編指令實現和前面的各類碼同樣作用的密碼出來,甚至前面的那些碼實現不了的修改也能用這個碼實現!從老外那裡打聽回來的消息是r0、r3、r5、r9、r10、r11、r12、r14、r17、r18和r19通用寄存器可以在這個碼中隨意調用,f9、f10、f11、f12和f13浮點寄存器也能隨意調用。如果還不夠用的話可以用堆棧指針r1寄存器備份和還原其它寄存器的値,詳見附2)
CST1:在游戲中插入彙編代碼
C2XXXXXX NNNNNNNN:在XXXXXXXX+基地址處插入彙編指令
ZZZZZZZZ ZZZZZZZZ
ZZZZZZZZ ZZZZZZZZ
60000000 00000000
這個代碼會把指向ZZZZZZZZ所在處的分歧指令替換在基地址+XXXXXXXX處。被替換的指令不會保留,代碼作者必須手動把被替換的指令放入到他的代碼中(如果有需要的話)。同樣彙編指令必須以一個00000000作爲結尾,因爲代碼處理器會在那裡添加一個“b (基地址+XXXXXX)”指令。如果你的彙編代碼塡滿了整行,在下面另起一行添加60000000 00000000(把這行也計入NNNNNNNN的行數內)。
银河漫步 - 2017/8/22 22:00:34
谢谢楼上
那篇英文资料我也看懂了
就是当操作7位地址的数据时操作不了
6位地址没问题
max55336 - 2017/8/22 23:49:41
膜拜大神啊!!
Blader - 2017/8/23 5:56:22
回复 12楼银河漫步的帖子可是我這邊親測有效
我看版主的代碼也沒察覺個所以然
基本沒有任何錯誤啊
真是不可思議