(本文章原始記錄於 2008 年 9 月 3 日並於當日 Post 於巴哈姆特)

[Code Type(金手指碼類別)]

一段金手指碼會以「8 位數 + 8 位數」的方式組成,中間以一個空白字元隔開,
(例如「4A000000 80000000」或者「144F2AE4 000003E7」)
左邊 8 位數的前兩個位數為 Code Type(簡稱 CT),亦即金手指碼類別,
右邊 8 位數則是根據不同的 Code Type 就有不同的寫法,大致上如下:

******* 記憶體直接寫入碼 *******

00XXXXXX ZZZZ00YY(設定 8-bits 值到 80000000+偏移量的位址)
XXXXXX 表示要加到 80000000 的偏移量,YY 表示要設定的 8-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。

02XXXXXX ZZZZYYYY(設定 16-bits 值到 80000000+偏移量的位址)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要設定的 16-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。

04XXXXXX YYYYYYYY(設定 32-bits 值到 80000000+偏移量的位址)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要設定的 32-bits 值(全部用上),因為後八位數全部用上,所以這邊就沒有前述的 ZZZZ 需要填入。

******* 指標+偏移值寫入碼 *******

(前方通常要加上 4A48 行來指定指標,否則預設成 80000000 或前一指標)
10XXXXXX ZZZZ00YY(設定 8-bits 值到指標+偏移量的位址)
XXXXXX 表示要加到指標位址的偏移量,YY 表示要設定的 8-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。

12XXXXXX ZZZZYYYY(設定 16-bits 值到指標+偏移量的位址)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要設定的 16-bits 值,ZZZZ 則為資料數,ZZZZ 尚不明確,基本上全部填入 0 就可以了。

14XXXXXX YYYYYYYY(設定 32-bits 值到指標+偏移量的位址)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要設定的 32-bits 值(全部用上),因為後八位數全部用上,所以這邊就沒有前述的 ZZZZ 需要填入。

******* 條件判斷碼 *******

(當條件成立時則執行,否則不執行)(只提供 32-bits 和 16-bits 判斷)
20XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

30XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

22XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「不等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「不等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

32XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「不等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「不等於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

24XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「大於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「大於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

34XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「大於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「大於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

26XXXXXX YYYYYYYY(32-bits 條件判斷位址資料是否「小於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當 80000000 + XXXXXX 位址的值「小於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

36XXXXXX YYYYYYYY(32-bits 條件判斷指標+位址資料是否「小於」)
XXXXXX 表示要加到指標位址的偏移量,YYYYYYYY 表示要比較的 32-bits 值,
當指標位址 + XXXXXX 位址的值「小於」YYYYYYYY 時,才執行後面的金手指碼,否則不執行。

28XXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「等於」YYYY 時,才執行後面的金手指碼,否則不執行。

38XXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「等於」YYYY 時,才執行後面的金手指碼,否則不執行。

2AXXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「不等於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「不等於」YYYY 時,才執行後面的金手指碼,否則不執行。

3AXXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「不等於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「不等於」YYYY 時,才執行後面的金手指碼,否則不執行。

2CXXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「大於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「大於」YYYY 時,才執行後面的金手指碼,否則不執行。

3CXXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「大於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「大於」YYYY 時,才執行後面的金手指碼,否則不執行。

2EXXXXXX ZZZZYYYY(16-bits 條件判斷位址資料是否「小於」)
XXXXXX 表示要加到 80000000 的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當 80000000 + XXXXXX 位址的值「小於」YYYY 時,才執行後面的金手指碼,否則不執行。

3EXXXXXX ZZZZYYYY(16-bits 條件判斷指標+位址資料是否「小於」)
XXXXXX 表示要加到指標位址的偏移量,YYYY 表示要比較的 16-bits 值,
ZZZZ 尚不明確,基本上全部填入 0 就可以了。
當指標位址 + XXXXXX 位址的值「小於」YYYY 時,才執行後面的金手指碼,否則不執行。

******* 指標偏移碼 *******

4A000000 XXXXXXXX(設定指標位址,將用於加到後方金手指碼的偏移量上)
XXXXXXXX 表示想設定的指標,通常為 80000000,會將此數加上 Offset 來指定正確位址。由於位址都為 32-bits 八位數,而金手指碼前兩位數都用來指定 Code Type,扣除二位數之後只剩下六位數可以用,因此可以利用此 Code Type 來設定指標,然後再加上下一行金手指所指定的六位數(當成 Offset 偏移量)就可正確指定位址了,例如要鎖定 804F2AE4 這個位址 16-bits 的值為 999 的話,就可以先設定指標到 80000000 (Wii 記憶體安全區為 80000000~81800000,此為最前面的位址),寫成 4A000000 80000000,然後再寫一行 124F2AE4 000003E7 ,如此一來,就會從 80000000+4F2AE4 位址起寫入 16-bits 的資料(亦即 804F2AE4 和 804F2AE5)。

48000000 XXXXXXXX(讀入指標所指位址)
XXXXXXXX 表示想讀入的指標位址,該位址所記錄的是一組記憶體位址而非一般數值。
當搜尋到正確的指標位址後,真正要鎖定的不是指標位址的值,而是指標所指位址的偏移位址,
所以是要「讀入」指標位址中的「位址值」,然後再將它加上 Offset,才會找到正確位址。

******* 位址範圍檢查碼 *******

CE000000 XXXXYYYY
檢查要鎖定的記憶體值是否介於 XXXX 與 YYYY 之間(XXXX < Address < YYYY), 如果是的話就繼續鎖定值,如果在範圍外就會暫停鎖定。 通常會是 CE000000 80008180,表示會檢查是否 80000000 < Address < 81800000。當 Address 跑到範圍外,則鎖定會中斷而避免當機。 DE000000 XXXXYYYY
檢查要鎖定的指標所指記憶體是否介於 XXXX 與 YYYY 之間(XXXX < Address < YYYY)。 如果是的話就繼續鎖定值,如果在範圍外就會暫停鎖定。 通常會是 DE000000 80008180,表示會檢查是否 80000000 < 指標所指位址 < 81800000。當指標所指位址的值跑到範圍外,則鎖定會中斷而避免當機。 由於指標所指位址有可能在過關或跳出某一關卡之後會清掉,變成 00000000, 如果 Offset 為 2AE,就會變成鎖定 000002AE 這個位址(超出記憶體安全範圍區), 很容易導致當機,為了避免鎖定到錯誤的位址,可以透過這個檢查碼來中斷鎖定。

******* 終結碼 *******

E0000000 XXXXYYYY
檢查還原目前的記憶體設定位址及指標設定位址。如果記憶體位址不是 0000,則設定成 XXXX,如果指標位址不是 0000,則設定成 YYYY。通常為 E0000000 80008000。
如果上一個碼曾設定過指標來使用,而下一個碼在使用前沒有清除前一個指標的話,
就會參考到前一個指標。當後面的碼並不需要用到指標,而又沒清除指標時,
要鎖定的位址就有可能誤加上前一個指標,而鎖定到錯誤的位址(也可能導致當機)。
所以通常寫完一塊有參考到指標的金手指碼後,最後一行會加上 E0000000 80008000 來終結。

基本的 Code Type 可以參考 dexter0 Hacking Tutorial 一篇:
http://members.cox.net/dexter0/WiiHacking/wiirdhacking.shtml
詳細的 Code Type 一覽可以參考 Kenobi 文件說明:
http://www.thegshi.org/faqs/wiicodetypes.html