(New page: {{Template:EnHacklopedia Header}} {{Template: EnHacklopedia_Legal}} Category: EnHacklopedia) |
No edit summary |
||
| (4 intermediate revisions by one other user not shown) | |||
| Line 1: | Line 1: | ||
{{Template:EnHacklopedia Header}} | {{Template:EnHacklopedia Header}} | ||
==Encryption on GCN AR Codes== | |||
Encryption is a mask on data which may or may not contain more data itself.<br /><br /> Encrypted codes are formatted for use in the Action Replay. They look like this:<br />''All Evidence Max''<br /> G12C-TMX0-WRT5C<br /> G2ND-C1RJ-G4TZ1<br /><br /> Decrypted codes are in raw format and can be edited. They look like this:<br />''All Evidence Max''<br /> 00690E90 000004FF<br /><br /> Codes for the GCN AR are encrypted for a number of reasons, just the top line of every encrypted code does three things meant to prevent user error: | |||
# Tells what region the code is for. | |||
#* USA [often called NTSC or NTSC-U] | |||
#* EU [often called PAL] | |||
#* Japan [sometimes called JP or NTSC-J] | |||
# Tells if the code has already been entered. | |||
#* Each code has a unique ID among the codes for that game.<br />[[#How to Encrypt/Decrypt Codes|GCNCrypt]] gives each code its own random ID and has such a small chance of overlapping at any random point that it wasn't even worth mentioning. | |||
# Tells what game the code is for via the "Game ID" which can be seen at the bottom of [#encryption_how_to GCNCrypt]. | |||
The encryption of the codes also allows the Action Replay to check for accuracy of what was entered beyond where it belongs. When a new code is entered into the AR it decrypts it, if it could not decrypt it then an "Invalid Code" error shows up. | |||
===How to Encrypt/Decrypt Codes=== | |||
Encrypting and Decrypting codes for the GameCube Action Replay requires Parasyte's [[Tools#GCNcrypt|GCNCrypt]] program from the [[Tools#GCN Tools|GCN Tools]].<br /> Note: Once a game's AR code is decrypted in GCNCrypt, if the Auto Identifier box is checked, it will set the Game ID and Region so any code can be changed or added then encrypted for the same game.<br /><br /> To decrypt an encrypted code, paste the encrypted code into the left text box in GCNCrypt then press the "Decrypt" button at the bottom. Output is on the right and can be copy/pasted onto the left for editing.<br /> Many times after decrypting a code, the output won't be used. Hackers often decrypt codes from a game to automatically set the Region and Game ID for their new codes.<br /> However, if a code was decrypted to be edited.. this is important:<br /> Take the encrypted code, say this one:<br />''All Evidence Max''<br /> G12C-TMX0-WRT5C<br /> G2ND-C1RJ-G4TZ1<br /><br /> and then decrypt it in GCNCrypt, and this is the output:<br />''All Evidence Max''<br /> 01E22DC2 08000000<br /> 00690E90 000004FF<br /><br /> If the Auto Identifier box is checked (it should be) then copy the output over to the left and delete the top line of the code. This is done because- as said before- each time a code is encrypted, the top line gets added according to the Region and Game ID.<br /> After that what's left is:<br />''All Evidence Max''<br /> 00690E90 000004FF<br /><br /> Now the code can be edited according to the AR code types below. After editing is done simply press "Encrypt" and copy the output on the right! | |||
==AR Code Types== | |||
The single-line GameCube ActionReplay code types are the first two hex digits of a decrypted code. GameCube's memory range is from 0x80000000 to 0x817FFFFF so if the code's address is greater or equal to 0x81000000 then the code type gets 0x01 added to it. For the addresses used in the code types below, "rrrrrr" signifies that address. These are of course, decrypted. | |||
{| class="EnHack-codetypes" | |||
! class="EnHack-type" | Type | |||
! class="EnHack-desc" | Description | |||
|- | |||
! class="EnHack-type" colspan="2" | RAM Writes | |||
|- | |||
| class="EnHack-type" | | |||
* '''RAM Write and Fill''' | |||
** ''8-Bit''<br /> 00rrrrrr xxxxxxyy | |||
** ''16-Bit''<br /> 02rrrrrr xxxxyyyy | |||
** ''32-Bit''<br /> 04rrrrrr yyyyyyyy | |||
| class="EnHack-desc" | xxxxxx: Number of bytes to write, zero-based (000000 writes yy to 0x80rrrrrr, 000001 writes yy to 0x80rrrrrr and to rrrrrr+0x01) <br /> yy: Byte to write.<br /><br /> xxxx: Number of halfwords to write, zero-based (0000 writes yyyy to 0x80rrrrrr, 0001 writes yy to 0x80rrrrrr and to 0x80rrrrrr+0x02) <br /> yyyy: Halfword to write.<br /><br /> yyyyyyyy: Word to write.<br /><br /> | |||
|- | |||
| class="EnHack-type" | | |||
* '''Struct Write (Pointers)''' | |||
** ''8-Bit''<br /> 40rrrrrr xxxxxxyy | |||
** ''16-Bit''<br /> 42rrrrrr xxxxyyyy | |||
** ''32-Bit''<br /> 44rrrrrr yyyyyyyy | |||
| class="EnHack-desc" | xxxxxx: Byte offset from pointer.<br /> yy: Byte to write to address ((pointer at 80rrrrrr)+offset)<br /><br /> xxxx: Halfword offset from pointer.<br /> yyyy: Halfword to write to address ((pointer at 80rrrrrr)+offset*2)<br /><br /> yyyyyyyy: Word to write to pointed address (value at the pointer address of 80rrrrrr)<br /><br /> | |||
|- | |||
| class="EnHack-type" | | |||
* '''RAM Fill and Slide''' | |||
** ''8-Bit''<br /> 00000000 80rrrrrr<br /> 000000yy xxvvzzzz | |||
** ''16-Bit''<br /> 00000000 82rrrrrr<br /> 0000yyyy xxvvzzzz | |||
** ''32-Bit''<br /> 00000000 84rrrrrr<br /> yyyyyyyy xxvvzzzz | |||
| class="EnHack-desc" | yy: Byte to write for fill and slide, beginning at address<br /> xx: Value increment (signed)<br /> vv: Number of bytes to write, zero-based<br /> zzzz: Address increment (signed)<br /><br /> yyyy: Halfword to write for fill and slide, beginning at address<br /> xx: Value increment (signed)<br /> vv: Number of halfwords to write, zero-based<br /> zzzz: Address increment (signed)<br /><br /> yyyyyyyy: Word to write for fill and slide, beginning at address<br /> xx: Value increment (signed)<br /> vv: Number of words to write, zero-based<br /> zzzz: Address increment (signed)<br /><br /> TODO: Check and note what happens when vv is 00, 01, etc.<br /><br /> | |||
|- | |||
| class="EnHack-type" | | |||
* '''Signed Increment/Decrement''' | |||
** ''8-Bit''<br /> 80rrrrrr 000000yy | |||
** ''16-Bit''<br /> 82rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 84rrrrrr yyyyyyyy | |||
** ''Extended''<br /> 86rrrrrr yyyyyyyy | |||
| class="EnHack-desc" | | |||
Note: For signed values see "[[Generic_Code_Hacking#Signed_Searches|Signed Searches]]" in Generic Code Hacking.<br /><br /> yy: Signed byte to add to the value at address.<br /><br /> yyyy: Signed halfword to add to the value at address.<br /><br /> yyyyyyyy: Signed word to add to the value at address.<br /><br /> yyyyyyyy: Number to add to single precision (32-bit) float at address.<br /> Note: Number should be entered as a decimal value.<br /> TODO: Check exactly what kind of values this code type uses. (float, signed hex, unsigned hex, decimal[?], etc)<br /><br /> | |||
|- | |||
! class="EnHack-type" colspan="2" | Conditional: If Equal | |||
|- | |||
| class="EnHack-type" | | |||
* '''Next Line''' | |||
** ''8-Bit''<br /> 08rrrrrr 000000yy | |||
** ''16-Bit''<br /> 0Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 0Crrrrrr yyyyyyyy | |||
* '''Next 2 Lines''' | |||
** ''8-Bit''<br /> 48rrrrrr 000000yy | |||
** ''16-Bit''<br /> 4Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 4Crrrrrr yyyyyyyy | |||
* '''All until.. (see note)''' | |||
** ''8-Bit''<br /> 88rrrrrr 000000yy | |||
** ''16-Bit''<br /> 8Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 8Crrrrrr yyyyyyyy | |||
* '''All Codes''' | |||
** ''8-Bit''<br /> C8rrrrrr 000000yy | |||
** ''16-Bit''<br /> CArrrrrr 0000yyyy | |||
** ''32-Bit''<br /> CCrrrrrr yyyyyyyy | |||
| class="EnHack-desc" | yy: Byte for comparison to the value at address.<br /><br /> yyyy: Halfword for comparison to the value at address.<br /><br /> yyyyyyyy: Word for comparison to the value at address.<br /><br />'''All until..''' note:<br /> The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) | |||
|- | |||
! class="EnHack-type" colspan="2" | Conditional: If Not Equal | |||
|- | |||
| class="EnHack-type" | | |||
* '''Next Line''' | |||
** ''8-Bit''<br /> 10rrrrrr 000000yy | |||
** ''16-Bit''<br /> 12rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 14rrrrrr yyyyyyyy | |||
* '''Next 2 Lines''' | |||
** ''8-Bit''<br /> 50rrrrrr 000000yy | |||
** ''16-Bit''<br /> 52rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 54rrrrrr yyyyyyyy | |||
* '''All until.. (see note)''' | |||
** ''8-Bit''<br /> 90rrrrrr 000000yy | |||
** ''16-Bit''<br /> 92rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 94rrrrrr yyyyyyyy | |||
* '''All Codes''' | |||
** ''8-Bit''<br /> D0rrrrrr 000000yy | |||
** ''16-Bit''<br /> D2rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> D4rrrrrr yyyyyyyy | |||
| class="EnHack-desc" | yy: Byte for comparison to the value at address.<br /><br /> yyyy: Halfword for comparison to the value at address.<br /><br /> yyyyyyyy: Word for comparison to the value at address.<br /><br />'''All until..''' note:<br /> The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) | |||
|- | |||
! class="EnHack-type" colspan="2" | Conditional: If Less (Signed) | |||
|- | |||
! class="EnHack-desc" colspan="2" | | |||
Note: For signed values see "[[Generic_Code_Hacking#Signed_Searches|Signed Searches]]" in Generic Code Hacking. | |||
|- | |||
| class="EnHack-type" | | |||
* '''Next Line''' | |||
** ''8-Bit''<br /> 18rrrrrr 000000yy | |||
** ''16-Bit''<br /> 1Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 1Crrrrrr yyyyyyyy | |||
* '''Next 2 Lines''' | |||
** ''8-Bit''<br /> 58rrrrrr 000000yy | |||
** ''16-Bit''<br /> 5Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 5Crrrrrr yyyyyyyy | |||
* '''All until.. (see note)''' | |||
** ''8-Bit''<br /> 98rrrrrr 000000yy | |||
** ''16-Bit''<br /> 9Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 9Crrrrrr yyyyyyyy | |||
* '''All Codes''' | |||
** ''8-Bit''<br /> D8rrrrrr 000000yy | |||
** ''16-Bit''<br /> DArrrrrr 0000yyyy | |||
** ''32-Bit''<br /> DCrrrrrr yyyyyyyy | |||
| class="EnHack-desc" | yy: Byte for comparison to the value at address.<br /><br /> yyyy: Halfword for comparison to the value at address.<br /><br /> yyyyyyyy: Word for comparison to the value at address.<br /><br />'''All until..''' note:<br /> The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) | |||
|- | |||
! class="EnHack-type" colspan="2" | Conditional: If Greater (Signed) | |||
|- | |||
! class="EnHack-desc" colspan="2" | | |||
Note: For signed values see "[[Generic_Code_Hacking#Signed_Searches|Signed Searches]]" in Generic Code Hacking. | |||
|- | |||
| class="EnHack-type" | | |||
* '''Next Line''' | |||
** ''8-Bit''<br /> 20rrrrrr 000000yy | |||
** ''16-Bit''<br /> 22rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 24rrrrrr yyyyyyyy | |||
* '''Next 2 Lines''' | |||
** ''8-Bit''<br /> 60rrrrrr 000000yy | |||
** ''16-Bit''<br /> 62rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 64rrrrrr yyyyyyyy | |||
* '''All until.. (see note)''' | |||
** ''8-Bit''<br /> A0rrrrrr 000000yy | |||
** ''16-Bit''<br /> A2rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> A4rrrrrr yyyyyyyy | |||
* '''All Codes''' | |||
** ''8-Bit''<br /> E0rrrrrr 000000yy | |||
** ''16-Bit''<br /> E2rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> E4rrrrrr yyyyyyyy | |||
| class="EnHack-desc" | yy: Byte for comparison to the value at address.<br /><br /> yyyy: Halfword for comparison to the value at address.<br /><br /> yyyyyyyy: Word for comparison to the value at address.<br /><br />'''All until..''' note:<br /> The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) | |||
|- | |||
! class="EnHack-type" colspan="2" | Conditional: If Less (Unsigned) | |||
|- | |||
! class="EnHack-desc" colspan="2" | | |||
Note: For unsigned values see "[[Generic_Code_Hacking#Signed_Searches|Signed Searches]]" in Generic Code Hacking. | |||
|- | |||
| class="EnHack-type" | | |||
* '''Next Line''' | |||
** ''8-Bit''<br /> 28rrrrrr 000000yy | |||
** ''16-Bit''<br /> 2Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 2Crrrrrr yyyyyyyy | |||
* '''Next 2 Lines''' | |||
** ''8-Bit''<br /> 68rrrrrr 000000yy | |||
** ''16-Bit''<br /> 6Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 6Crrrrrr yyyyyyyy | |||
* '''All until.. (see note)''' | |||
** ''8-Bit''<br /> A8rrrrrr 000000yy | |||
** ''16-Bit''<br /> AArrrrrr 0000yyyy | |||
** ''32-Bit''<br /> ACrrrrrr yyyyyyyy | |||
* '''All Codes''' | |||
** ''8-Bit''<br /> E8rrrrrr 000000yy | |||
** ''16-Bit''<br /> EArrrrrr 0000yyyy | |||
** ''32-Bit''<br /> ECrrrrrr yyyyyyyy | |||
| class="EnHack-desc" | yy: Byte for comparison to the value at address.<br /><br /> yyyy: Halfword for comparison to the value at address.<br /><br /> yyyyyyyy: Word for comparison to the value at address.<br /><br />'''All until..''' note:<br /> The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) | |||
|- | |||
! class="EnHack-type" colspan="2" | Conditional: If Greater (Unsigned) | |||
|- | |||
! class="EnHack-desc" colspan="2" | | |||
Note: For unsigned values see "[[Generic_Code_Hacking#Signed_Searches|Signed Searches]]" in Generic Code Hacking. | |||
|- | |||
| class="EnHack-type" | | |||
* '''Next Line''' | |||
** ''8-Bit''<br /> 30rrrrrr 000000yy | |||
** ''16-Bit''<br /> 32rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 34rrrrrr yyyyyyyy | |||
* '''Next 2 Lines''' | |||
** ''8-Bit''<br /> 70rrrrrr 000000yy | |||
** ''16-Bit''<br /> 72rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 74rrrrrr yyyyyyyy | |||
* '''All until.. (see note)''' | |||
** ''8-Bit''<br /> B0rrrrrr 000000yy | |||
** ''16-Bit''<br /> B2rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> B4rrrrrr yyyyyyyy | |||
* '''All Codes''' | |||
** ''8-Bit''<br /> F0rrrrrr 000000yy | |||
** ''16-Bit''<br /> F2rrrrrr 0000yyyy | |||
** ''32-Bit''<br /> F4rrrrrr yyyyyyyy | |||
| class="EnHack-desc" | yy: Byte for comparison to the value at address.<br /><br /> yyyy: Halfword for comparison to the value at address.<br /><br /> yyyyyyyy: Word for comparison to the value at address.<br /><br />'''All until..''' note:<br /> The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) | |||
|- | |||
! class="EnHack-type" colspan="2" | Conditional: If Bitwise AND | |||
|- | |||
! class="EnHack-desc" colspan="2" | | |||
Note: For Bitwise AND see "[[Number_and_Data_Encoding_Formats#AND|AND]]" in Number Formats. | |||
|- | |||
| class="EnHack-type" | | |||
* '''Next Line''' | |||
** ''8-Bit''<br /> 38rrrrrr 000000yy | |||
** ''16-Bit''<br /> 3Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 3Crrrrrr yyyyyyyy | |||
* '''Next 2 Lines''' | |||
** ''8-Bit''<br /> 78rrrrrr 000000yy | |||
** ''16-Bit''<br /> 7Arrrrrr 0000yyyy | |||
** ''32-Bit''<br /> 7Crrrrrr yyyyyyyy | |||
* '''All until.. (see note)''' | |||
** ''8-Bit''<br /> B8rrrrrr 000000yy | |||
** ''16-Bit''<br /> BArrrrrr 0000yyyy | |||
** ''32-Bit''<br /> BCrrrrrr yyyyyyyy | |||
* '''All Codes''' | |||
** ''8-Bit''<br /> F8rrrrrr 000000yy | |||
** ''16-Bit''<br /> FArrrrrr 0000yyyy | |||
** ''32-Bit''<br /> FCrrrrrr yyyyyyyy | |||
| class="EnHack-desc" | yy: Byte for comparison to the value at address.<br /><br /> yyyy: Halfword for comparison to the value at address.<br /><br /> yyyyyyyy: Word for comparison to the value at address.<br /><br />'''All until..''' note:<br /> The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) | |||
|} | |||
==Button Values== | |||
{| class="EnHack-code" | |||
! class="EnHack-addy" | Value | |||
! class="EnHack-comments" | Button | |||
|- | |||
! class="EnHack-addy" colspan="2" | Big Endian (More Common) | |||
|- | |||
! class="EnHack-addy" colspan="2" | Note: Values can be added together for use as button combos. | |||
|- | |||
| class="EnHack-addy" | 0x0000 | |||
| class="EnHack-comments" | No Buttons | |||
|- | |||
| class="EnHack-addy" | 0x0001 | |||
| class="EnHack-comments" | D-Pad Left | |||
|- | |||
| class="EnHack-addy" | 0x0002 | |||
| class="EnHack-comments" | D-Pad Right | |||
|- | |||
| class="EnHack-addy" | 0x0004 | |||
| class="EnHack-comments" | D-Pad Down | |||
|- | |||
| class="EnHack-addy" | 0x0008 | |||
| class="EnHack-comments" | D-Pad Up | |||
|- | |||
| class="EnHack-addy" | 0x0010 | |||
| class="EnHack-comments" | Z | |||
|- | |||
| class="EnHack-addy" | 0x0020 | |||
| class="EnHack-comments" | R (Digital Click) | |||
|- | |||
| class="EnHack-addy" | 0x0040 | |||
| class="EnHack-comments" | L (Digital Click) | |||
|- | |||
| class="EnHack-addy" | 0x0100 | |||
| class="EnHack-comments" | A | |||
|- | |||
| class="EnHack-addy" | 0x0200 | |||
| class="EnHack-comments" | B | |||
|- | |||
| class="EnHack-addy" | 0x0400 | |||
| class="EnHack-comments" | X | |||
|- | |||
| class="EnHack-addy" | 0x0800 | |||
| class="EnHack-comments" | Y | |||
|- | |||
| class="EnHack-addy" | 0x1000 | |||
| class="EnHack-comments" | Start | |||
|- | |||
! class="EnHack-addy" colspan="2" | Little Endian (Less Common) | |||
|- | |||
! class="EnHack-addy" colspan="2" | Note: Values can be added together for use as button combos. | |||
|- | |||
| class="EnHack-addy" | 0x0000 | |||
| class="EnHack-comments" | No Buttons | |||
|- | |||
| class="EnHack-addy" | 0x0001 | |||
| class="EnHack-comments" | A | |||
|- | |||
| class="EnHack-addy" | 0x0002 | |||
| class="EnHack-comments" | B | |||
|- | |||
| class="EnHack-addy" | 0x0004 | |||
| class="EnHack-comments" | X | |||
|- | |||
| class="EnHack-addy" | 0x0008 | |||
| class="EnHack-comments" | Y | |||
|- | |||
| class="EnHack-addy" | 0x0010 | |||
| class="EnHack-comments" | Start | |||
|- | |||
| class="EnHack-addy" | 0x0100 | |||
| class="EnHack-comments" | D-Pad Left | |||
|- | |||
| class="EnHack-addy" | 0x0200 | |||
| class="EnHack-comments" | D-Pad Right | |||
|- | |||
| class="EnHack-addy" | 0x0400 | |||
| class="EnHack-comments" | D-Pad Down | |||
|- | |||
| class="EnHack-addy" | 0x0800 | |||
| class="EnHack-comments" | D-Pad Up | |||
|- | |||
| class="EnHack-addy" | 0x1000 | |||
| class="EnHack-comments" | Z | |||
|- | |||
| class="EnHack-addy" | 0x2000 | |||
| class="EnHack-comments" | R (Digital Click) | |||
|- | |||
| class="EnHack-addy" | 0x4000 | |||
| class="EnHack-comments" | L (Digital Click) | |||
|- | |||
! class="EnHack-addy" colspan="2" | GBA Face Buttons | |||
|- | |||
! class="EnHack-addy" colspan="2" | Note: This is for games that use the GBA as a controller.<br /> Note: Values can be added together for use as button combos. | |||
|- | |||
| class="EnHack-addy" | 0x00 | |||
| class="EnHack-comments" | No Buttons | |||
|- | |||
| class="EnHack-addy" | 0x01 | |||
| class="EnHack-comments" | A | |||
|- | |||
| class="EnHack-addy" | 0x02 | |||
| class="EnHack-comments" | B | |||
|- | |||
| class="EnHack-addy" | 0x04 | |||
| class="EnHack-comments" | Select | |||
|- | |||
| class="EnHack-addy" | 0x08 | |||
| class="EnHack-comments" | Start | |||
|- | |||
| class="EnHack-addy" | 0x10 | |||
| class="EnHack-comments" | D-Pad Right | |||
|- | |||
| class="EnHack-addy" | 0x20 | |||
| class="EnHack-comments" | D-Pad Left | |||
|- | |||
| class="EnHack-addy" | 0x40 | |||
| class="EnHack-comments" | D-Pad Up | |||
|- | |||
| class="EnHack-addy" | 0x80 | |||
| class="EnHack-comments" | D-Pad Down | |||
|} | |||
==Setting up GCNrd== | |||
==Using GCNrd== | |||
==Creating Master Codes== | |||
==PowerPC Assembly== | |||
==Using GCNrd to Create Assembly Hacks== | |||
{{EnHacklopedia}} | |||
{{Template: EnHacklopedia_Legal}} | {{Template: EnHacklopedia_Legal}} | ||
[[Category: EnHacklopedia]] | [[Category: EnHacklopedia]] | ||
Latest revision as of 16:40, 4 December 2008
| EnHacklopedia >> {{ #ifeq: Hacking GameCube | EnHacklopedia | Index | Hacking GameCube }} |
|---|
Encryption on GCN AR Codes
Encryption is a mask on data which may or may not contain more data itself.
Encrypted codes are formatted for use in the Action Replay. They look like this:
All Evidence Max
G12C-TMX0-WRT5C
G2ND-C1RJ-G4TZ1
Decrypted codes are in raw format and can be edited. They look like this:
All Evidence Max
00690E90 000004FF
Codes for the GCN AR are encrypted for a number of reasons, just the top line of every encrypted code does three things meant to prevent user error:
- Tells what region the code is for.
- USA [often called NTSC or NTSC-U]
- EU [often called PAL]
- Japan [sometimes called JP or NTSC-J]
- Tells if the code has already been entered.
- Each code has a unique ID among the codes for that game.
GCNCrypt gives each code its own random ID and has such a small chance of overlapping at any random point that it wasn't even worth mentioning.
- Each code has a unique ID among the codes for that game.
- Tells what game the code is for via the "Game ID" which can be seen at the bottom of [#encryption_how_to GCNCrypt].
The encryption of the codes also allows the Action Replay to check for accuracy of what was entered beyond where it belongs. When a new code is entered into the AR it decrypts it, if it could not decrypt it then an "Invalid Code" error shows up.
How to Encrypt/Decrypt Codes
Encrypting and Decrypting codes for the GameCube Action Replay requires Parasyte's GCNCrypt program from the GCN Tools.
Note: Once a game's AR code is decrypted in GCNCrypt, if the Auto Identifier box is checked, it will set the Game ID and Region so any code can be changed or added then encrypted for the same game.
To decrypt an encrypted code, paste the encrypted code into the left text box in GCNCrypt then press the "Decrypt" button at the bottom. Output is on the right and can be copy/pasted onto the left for editing.
Many times after decrypting a code, the output won't be used. Hackers often decrypt codes from a game to automatically set the Region and Game ID for their new codes.
However, if a code was decrypted to be edited.. this is important:
Take the encrypted code, say this one:
All Evidence Max
G12C-TMX0-WRT5C
G2ND-C1RJ-G4TZ1
and then decrypt it in GCNCrypt, and this is the output:
All Evidence Max
01E22DC2 08000000
00690E90 000004FF
If the Auto Identifier box is checked (it should be) then copy the output over to the left and delete the top line of the code. This is done because- as said before- each time a code is encrypted, the top line gets added according to the Region and Game ID.
After that what's left is:
All Evidence Max
00690E90 000004FF
Now the code can be edited according to the AR code types below. After editing is done simply press "Encrypt" and copy the output on the right!
AR Code Types
The single-line GameCube ActionReplay code types are the first two hex digits of a decrypted code. GameCube's memory range is from 0x80000000 to 0x817FFFFF so if the code's address is greater or equal to 0x81000000 then the code type gets 0x01 added to it. For the addresses used in the code types below, "rrrrrr" signifies that address. These are of course, decrypted.
| Type | Description |
|---|---|
| RAM Writes | |
|
xxxxxx: Number of bytes to write, zero-based (000000 writes yy to 0x80rrrrrr, 000001 writes yy to 0x80rrrrrr and to rrrrrr+0x01) yy: Byte to write. xxxx: Number of halfwords to write, zero-based (0000 writes yyyy to 0x80rrrrrr, 0001 writes yy to 0x80rrrrrr and to 0x80rrrrrr+0x02) yyyy: Halfword to write. yyyyyyyy: Word to write. |
|
xxxxxx: Byte offset from pointer. yy: Byte to write to address ((pointer at 80rrrrrr)+offset) xxxx: Halfword offset from pointer. yyyy: Halfword to write to address ((pointer at 80rrrrrr)+offset*2) yyyyyyyy: Word to write to pointed address (value at the pointer address of 80rrrrrr) |
|
yy: Byte to write for fill and slide, beginning at address xx: Value increment (signed) vv: Number of bytes to write, zero-based zzzz: Address increment (signed) yyyy: Halfword to write for fill and slide, beginning at address xx: Value increment (signed) vv: Number of halfwords to write, zero-based zzzz: Address increment (signed) yyyyyyyy: Word to write for fill and slide, beginning at address xx: Value increment (signed) vv: Number of words to write, zero-based zzzz: Address increment (signed) TODO: Check and note what happens when vv is 00, 01, etc. |
|
Note: For signed values see "Signed Searches" in Generic Code Hacking. |
| Conditional: If Equal | |
|
yy: Byte for comparison to the value at address. yyyy: Halfword for comparison to the value at address. yyyyyyyy: Word for comparison to the value at address. All until.. note: The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) |
| Conditional: If Not Equal | |
|
yy: Byte for comparison to the value at address. yyyy: Halfword for comparison to the value at address. yyyyyyyy: Word for comparison to the value at address. All until.. note: The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) |
| Conditional: If Less (Signed) | |
|
Note: For signed values see "Signed Searches" in Generic Code Hacking. | |
|
yy: Byte for comparison to the value at address. yyyy: Halfword for comparison to the value at address. yyyyyyyy: Word for comparison to the value at address. All until.. note: The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) |
| Conditional: If Greater (Signed) | |
|
Note: For signed values see "Signed Searches" in Generic Code Hacking. | |
|
yy: Byte for comparison to the value at address. yyyy: Halfword for comparison to the value at address. yyyyyyyy: Word for comparison to the value at address. All until.. note: The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) |
| Conditional: If Less (Unsigned) | |
|
Note: For unsigned values see "Signed Searches" in Generic Code Hacking. | |
|
yy: Byte for comparison to the value at address. yyyy: Halfword for comparison to the value at address. yyyyyyyy: Word for comparison to the value at address. All until.. note: The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) |
| Conditional: If Greater (Unsigned) | |
|
Note: For unsigned values see "Signed Searches" in Generic Code Hacking. | |
|
yy: Byte for comparison to the value at address. yyyy: Halfword for comparison to the value at address. yyyyyyyy: Word for comparison to the value at address. All until.. note: The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) |
| Conditional: If Bitwise AND | |
|
Note: For Bitwise AND see "AND" in Number Formats. | |
|
yy: Byte for comparison to the value at address. yyyy: Halfword for comparison to the value at address. yyyyyyyy: Word for comparison to the value at address. All until.. note: The conditional will activate all of the code's following lines until a "00000000 40000000" line is reached. (just put that line in the code when and where it's needed) |
Button Values
| Value | Button |
|---|---|
| Big Endian (More Common) | |
| Note: Values can be added together for use as button combos. | |
| 0x0000 | No Buttons |
| 0x0001 | D-Pad Left |
| 0x0002 | D-Pad Right |
| 0x0004 | D-Pad Down |
| 0x0008 | D-Pad Up |
| 0x0010 | Z |
| 0x0020 | R (Digital Click) |
| 0x0040 | L (Digital Click) |
| 0x0100 | A |
| 0x0200 | B |
| 0x0400 | X |
| 0x0800 | Y |
| 0x1000 | Start |
| Little Endian (Less Common) | |
| Note: Values can be added together for use as button combos. | |
| 0x0000 | No Buttons |
| 0x0001 | A |
| 0x0002 | B |
| 0x0004 | X |
| 0x0008 | Y |
| 0x0010 | Start |
| 0x0100 | D-Pad Left |
| 0x0200 | D-Pad Right |
| 0x0400 | D-Pad Down |
| 0x0800 | D-Pad Up |
| 0x1000 | Z |
| 0x2000 | R (Digital Click) |
| 0x4000 | L (Digital Click) |
| GBA Face Buttons | |
| Note: This is for games that use the GBA as a controller. Note: Values can be added together for use as button combos. | |
| 0x00 | No Buttons |
| 0x01 | A |
| 0x02 | B |
| 0x04 | Select |
| 0x08 | Start |
| 0x10 | D-Pad Right |
| 0x20 | D-Pad Left |
| 0x40 | D-Pad Up |
| 0x80 | D-Pad Down |
Setting up GCNrd
Using GCNrd
Creating Master Codes
PowerPC Assembly
Using GCNrd to Create Assembly Hacks
| EnHacklopedia |
|---|
| Basics |
| Number and Data Encoding Formats - Generic Code Hacking |
| Individual Systems In Depth |
| Hacking Arcade - Hacking NES - Hacking SMS - Hacking SNES - Hacking Genesis - Hacking Saturn - Hacking PSX - Hacking N64 - Hacking DC - Hacking PS2 - Hacking GCN - Hacking Game Boy - Hacking Game Gear - Hacking Game Boy Advance - Hacking NDS - |
| Documents and References |
| Documents |
| Tools |
| Tools |
| Legal |
|---|
|
|