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的行數內)。