(Parts of this FAQ requires a basic knowledge of Assembly Language.)
In the following, T
is the default status, not really used by the cheat code. It must
be 8 or 0. If it is 8, and you select the whole game, that
particular cheat is not activated. For example, in a game we may
have the following:
A Fighting game
One hit death
As you can see, we clearly would never want both of these cheats on at the same time because the second one will take priority. If we make our codes look like this:
A Fighting game
One hit death
Then whenever you select the whole fighting game only the first code is automatically switched on. The user must manually select the others. Note that only the first code in a group of codes needs the 8, all others in the group are also switched off. This bit is then masked out and becomes identical to a normal code.
Normal Code Types
NOTE: The Xplorer and GameShark / Action Replay "80", "30", and "D0" code types are interchangeable!! You can also replace the GS / AR "D0" and "D1" prefixes with the Xplorer "70" and "90" prefixes respectively.
00xxxxxx - yyyy - 32 bit code. Writes the 32 bit code in yyyy to address xxxxxx i.e. the upper half word is zeroed out and is the equivalent of:
The one (1) code at the beginning of the address only needs to be present if there is a skip if true or a skip if false code immediately above the slide code. This is because a skip code only knows to skip two words (32 bits * 2) which is what a normal code ends up as. Mega codes and super codes simply have a pointer to flash as the second word. The one code is not understood by the X-terminator cheat engine and is therefore ignored. This is the simplest way at the moment to solve the problem.
10xxxxxx - yyyy - Does nothing. Used by slide code and skip if true and false.
4T000000 - XXXX - A 4 code is a slow motion code. Its success rate is not brilliant at the moment. It is simply a loop executed (XXXX << 12) times.
7TXXXXXX - YYYY - Skip if false code, Opposite of a 9 code. Only does the following code if xxxxxx = yyyy.
9TXXXXXX - YYYY - Skip if true code will not do the following cheat (including mega/supa) if the half word contained in XXXXXX = YYYY. One use is so that we can insert a dead/Super code only once, saves a lot of time if the codes are big!
CTXXXXXX - YYYY - This is the same as a D code again only used for Action Replay compatability.
DTXXXXXX - YYYY - Only for compatability with Datel. Use F or 7 codes instead. (The GS / AR "D0" code IS compatible with the Xplorer.)
FTXXXXXX YYYY - Same as a 7 code but affects ALL cheats. This is our equivalent of a Datel D master code but better defined (Datel combines our F codes and 7 codes into one D code only entered in two separate places which is stupid). If the Xplorer finds any code in a game that starts with an F then it will switch it on any time you select another code and switch it off if it is the last code.
Special Code Types
AA= Break address
YY= Count in bytes to insert at location 40
CC= Coprocessor break type (upper half)
FF= Breakpoint mask (usually FFFFFFFF)
00= bytes of code in address order
XXXXXX = Address to place the code
YYY = Count in bytes of code
11 etc. = Actual code. Note, only Byte codes will be placed so you can place in single byte multiples. For example:
rrr : repeat count
aaaa : increase address
dddd : increase data
xxxxxx : start address
yyyy : start date
codes are so useful. They can turn a massive great long code into
only two lines. A good example is something like.
Have all Licences in gran turismo (Euro cheat used as example)
7005a4e60100 <<<<<<<<<< Do if True code.
B00400020000 <<<<<<<<<< Actual "B0" code.
1009e3c40303 <<<<<<<<<< Beginning address to modify.
A. International License
Pretty cool huh....there are lots of other examples too!
SLIDE CODE CONVERSION: GS/AR <> XP
all values are in Hex and addition/subtraction is in Hex!)
GameShark Slide Code:
GameShark "50" code has the following parameters:
RR is the number of code addresses to activate / modify.
JJ is the distance between addresses (codes).
ABCD is a Hex value that gets added to EFGH (Optional).
Z is equal to 8 if the value of JJ is even and 3 if odd (EF = 00 in this case).
Suppose that you had a set of codes that looked like this:
The corresponding GameShark "50" code would look like this:
(RR = 05, JJ = B0 or 176 Dec, ABCD = 0002, and Z = 8)
Xplorer Slide Code:
XPlorer "B0" code has the following parameters:
So our example above would convert to an XPlorer "B0" code that looks like this:
(RRR = 005, JJJJ = 00B0 or 176 Dec, ABCD = 0002)
CAUTIONS: There are a few differences that are not apparent from this example. I have never been able to use only odd addresses ("30" codes, JJJJ = 1 or is odd). The smallest value of JJJJ that has worked for me is 0002 and JJJJ must be even. Also, when using the 3.20 ROM, the largest value of RRR that has worked for me is F (15 Dec). Anything higher locks the game on the intro. Also, the limit with the 4.52 ROM is 7F (127 Dec). However, this is not a problem with the V1, V2, and V3 ROMs (Note: I have only personally tested the V2, 3.20, and 4.52 ROMs. I think the problem is with the 3.20 and 4.52 ROMs.)
Now, lets convert the following XPlorer "B0" code to a GameShark "50" code:
(RR = A6, JJ = 02, ABCD = 1, Z = 8)
Not too hard if you don't have to deal with "30" codes. However, If you would prefer to not have to convert these by yourself, you can download the B-Code Converter Program: HERE
Here's the code for Rayman (Rayman flies by pressing the X button). Note how it exactly fits into 64 bytes (Can't be any more, if it is it will crash the Playstation)
(From the disassembler)
lui k0,0x8020 ;Get pad value!
srl a0,a0,14 ;Get X button
andi a1,a0,1 ;Just button value]
bne a1,zero,nopress ;If not depressed
This is the code itself, I think I did a breakpoint when the Joypad was being read.
Note the bytes is the exact length in bytes of the machine code.
Heres a Super code. This replaces the Text Game Paused (or whatever it was) with FCD. This could of course be done with 8 codes but it would be much larger.
Here's the ultimate. The Super Code for Resident Evil 2.
we found a good spot to break out and put our code where several
registers were already
Note we had to write down what code was being replaced so we would not be causing any problems. Here is the main code. Its lost some of its readability in compressing it down from well over 100 lines of cheat code. It allows you to select any quantity of any weapon in any slot, Try doing THAT with a Game Shark!
NOTE: Download the RE 2 Super Code Text File for the US, UK, JAP, and Deutsch versions which includes codes for both Leon and Claire: >HERE<
;===================================== ;Resident Evil 2 (Leon A) - Super Code ;By P Herbert and Wayne Beckett, ;(C)1998 Future Console Design ;===================================== (Edited by Nachbrenner)
7690 AFB20018 : sw s2,$18(sp) ;from $80065E78 7694 3C12800C : lui s2,$800c ;from $80065E7C 7698 AFBF001C : sw ra,$1c(sp) ;from $80065E84 769C AC030004 : sw v1,4(zero) ;backup the old register contents 76A0 AC080008 : sw t0,8(zero) sw t1,12(zero) 76A4 AC040010 : sw a0,16(zero) 76A8 AC0A0018 : sw t2,24(zero) lui t0,$800d ;This looks redundant!! 76AC 9204000C : lbu a0,$c(s0) 76B0 3643C638 : ori v1,s2,0xc638 ;$800CC638 = address of slot 1 pointer
Next Bit.. tests for L1 or L2 and inc/decs the (v1)
76B4 90080000 : lbu t0,0(zero) ;Use memory location zero as counter 76B8 00041080 : sll v0,a0,2 ;inventory address modifier offset 76BC 11000003 : beq t0,zero,ok_delay 76C0 2508FFFF : subiu t0,t0,1 ;= addiu t0,t0,0xffffffff 76C4 A0080000 : sb t0,0(zero) 76C8 1000000F : beq zero,zero,finished ;beware of slot after this
76CC 86485F3C : lh t0,$5f3c(s2) ;$800C5F3C = Pad status (Joker) ;8 = R1, 2 = R2 ;4 = L1, 1 = L2 76D0 00621820 : add v1,v1,v0 ;Address of current slot to modify 76D4 3108000F : andi t0,t0,$f ;use pad as a lookup value lui v0,table16>>16 ;no need as already zero 76D8 34027728 : ori v0,zero,table16&65535 ;this command is non-relocatable 76DC 00481021 : addu v0,v0,t0 76E0 340A0104 : ori t2,zero,$0104 ;the lookup table in bitwise form 76E4 010A5006 : srl t2,t2,t0 ;put the appropriate bit at zero'th 76E8 314A0001 : andi t2,t2,1 ;OK got address increment 76EC 80440000 : lb a0,0(v0) ;lookup increase/decrease 76F0 006A1821 : addu v1,v1,t2 ;add address increment 76F4 80620000 : lb v0,0(v1) 76F8 340A000A : ori t2,zero,10 ;delay until next check 76FC 00442020 : add a0,v0,a0 ;add either 0 1 or ff 7700 A0640000 : sb a0,0(v1) ;store it 7704 A00A0000 : sb t2,0(zero) ;start count again
7708 8C030004 : lw v1,4(zero) ;restore the old register contents 770C 8C080008 : lw t0,8(zero) lw t1,12(zero) 7710 8C040010 : lw a0,16(zero) 7714 26523E28 : addiu s2,s2,$3e28 ;from $80065E80, moved as used upper half 7718 3C028006 : lui v0,$8006 771C 34425E88 : ori v0,v0,$5e88 7720 00400008 : jr v0 ;go back to $80065E88 7724 8C0A0018 : lw t2,24(zero) ;although it looks weird, it's executed before the JR V0
7728 00FF0000 : db 00,ff,ff,00, 772C 00000001 : 01,00,00,00, 7730 00000001 : 01 ;rest already zero ! - ,0,0,0,0,0,0,0
This gives us the code
F0065E72 3C10 The master code allows us to activate the cheat only when the weapons selector code is in memory 70065E78 0018 Only do this when the old code is here i.e. once 50065E78 0010 Put the patch part of the code 0080023C 9076 42340800 4000 00000000 DEAD Note some of this line is not used (DEAD) 90007690 0018 9 code as we only want to insert the code once or the game may slow 50007690 00A1 a1 number of bytes 1800B2AF 0C80 The assembly code 123C1C00 BFAF 040003AC 0800 08AC1000 04AC 18000AAC 0C00 049238C6 4336 Slot 1 pointer, least significant word 00000890 8010 04000300 0011 FFFF0825 0000 08A00F00 0010 3C5F4886 2018 Joker, least significant word 62000F00 0831 28770234 2110 48000401 0A34 06500A01 0100 4A310000 4480 21186A00 0000 62800A00 0A34 20204400 0000 64A00000 0AA0 0400038C 0800 088C1000 048C 283E5226 0680 old code from $80065E80 023C885E 4234 JR $80065E88 08004000 1800 0A8C00FF FF00 01000000 0100
At the moment there are no patches for the French and Italian version. If you want to patch these versions, check the green colored code above. Finding joker and slot 1 pointer should be no problem. To find the breakpoint, use a disassembler and search between $80065000 and $80067000 for a sequence like this:
sw s2, 0x0018(sp) lui s2, 0x800c addiu s2, s2, 0x???? sw ra, 0x001c(sp) sltiu v0, v1, 0x0005
or if you are using "N64PSX 0.4" look for:
sw $s2,0x0018($sp) move $s2,0x800c???? sw $ra,0x001c($sp) sltiu $v0,$v1,0x0005
Thats it!. Obviously I don't expect Many people to come up with these type of codes but If anyone is after a challenge then it does not get any more challenging than doing a good Super Code.
Last Modified: May 5, 2000