Under the microscope: Jet Moto 3 (PlayStation)
Using Ghidra and Python to extract unknown cheat codes from a 1999 PlayStation game
As of this writing, IGN has a couple of cheat codes listed for Jet Moto 3:
To activate a cheat, enter its code during the game.
Race at high speed: L1+Right, R1+Down, Square, L1+Triangle, R1+Down, L1+Left, Select
TV camera: Circle, L1+Triangle, L1+X, Triangle, R1+Up
The first of these does work. If you put it in while playing, the pace of the game picks up. The second one doesn’t, however.
GameFAQs has another cheat code, but it doesn’t say where to enter it:
Unlock everything: L1+Left, R1+Up, L1+Left, Right, L2+Triangle, Triangle, R1+Right, L1+Right, R1+Down, R1+Triangle.
What’s going on? I decided to investigate…
Cracking the codes
Let’s start with the “Unlock everything” code. It turns out that you need to enter it on the title screen – see the screenshot above. If you do, everything does indeed become available: the two bonus characters, the two bonus tracks, the bonus Stunt mode, and more.
How does this work? The function at 80026a94 (NTSC-U version) gets called with a pointer to this string as one of its arguments:
8008943c "EVERYTHING"That function translates the letters of EVERYTHING into binary patterns using the table at 8008bd90. It starts out like this:
8008bd90 0x0014 # A
8008bd92 0x0088 # B
8008bd94 0x0020 # C
8008bd96 0x4000 # D
8008bd98 0x8004 # EIt then continues on to the end of the alphabet. These binary patterns represent buttons on the PlayStation controller. The mapping that this game uses is the one used by most games:
The letters are made up of combinations of these patterns. For example, E is represented by the pattern 0x8004, which is the logical OR of Left (0x8000) and L1 (0x0004). So you push Left+L1 for E.
Ghidra finds 23 different calls to the function we’re examining. The string arguments are:
| EVERYTHING | CAMLOCK | FLAP. | CAMTV. |
| ALLTRAC | CAMROLL | FLOAT. | CAMLOCK. |
| RACE | ALLCAM | ROCKET. | CAMROLL. |
| STUNT | COP | HEAL. | ALLCAM. |
| SEASONS | GRANNY | INFINIT. | AUTO. |
| CAMTV | INSANE. | TURBO. | |The ones without periods are entered at the title screen. The ones with periods are entered during normal gameplay.
I copied the table of letters to button patterns into a Python script, then used struct.unpack to turn it into a tuple of Python int values. The format string uses < because the PlayStation CPU is little endian and H because the values are two bytes each:
from struct import unpack
unpacked_data = unpack(f"<{len(button_data) // 2}H", button_data)Then I mapped the alphabet button pattern int values:
pattern_map = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ", unpacked_data))
pattern_map['.'] = 0x0100 # Select buttonAfter that, I made a function to decompose each of the letters in a code phrase into combinations of button presses:
def get_code_buttons(code_letters):
code_combos = []
for letter in code_letters:
letter_pattern = pattern_map[letter]
letter_combo = []
for button_pattern, button_name in button_map.items():
if letter_pattern & button_pattern:
letter_combo.append(button_name)
code_combos.append('+'.join(letter_combo))
return ', '.join(code_combos)Running that code on all of the phrases reveals all of the buttons. The full script is here, and the complete table of codes is below in the Appendix.
Various code effects
Some of the codes unlock a subset of what the EVERYTHING code does. For example, ALLTRAC gives you the two bonus tracks, Krapyks and Planet X:
L1+Triangle, Left, Left, Triangle, Right, L1+Triangle, CircleThe SEASONS code unlocks all of the levels in Season mode:
Square, L1+Left, L1+Triangle, Square, L1+Circle, R1+Down, SquareGRANNY unlocks Granny, as you might expect:
R1+Triangle, Right, L1+Triangle, R1+Down, R1+Down, L2+TriangleCOP unlocks Capt. Ballard, but you have to unlock Granny first:
Circle, L1+Circle, L1+UpThere are a few codes for extra camera angles, but not all of them work (see below). ALLCAM. does work, however. Enter it at the title screen or during gameplay, then press Select to switch angles:
L1+Triangle, Left, Left, Circle, L1+Triangle, L1+X, SelectTURBO. enables Turbo, even if it’s disabled on the Options > Race screen:
Triangle, Up, Right, R1+Square, L1+Circle, SelectROCKET. allows you to use Turbo while hopping:
Right, L1+Circle, Circle, R1+X, L1+Left, Triangle, SelectINFINIT. gives you unlimited Turbo:
L1+Right, R1+Down, R1+Left, L1+Right, R1+Down, L1+Right, Triangle, SelectHEAL. fills your Turbo gauge as you race:
R1+Right, L1+Left, L1+Triangle, Left, SelectAUTO. makes the CPU take control of your character:
L1+Triangle, Up, Triangle, L1+Circle, SelectFLAP. allows you to hop while in midair:
R1+Left, Left, L1+Triangle, L1+Up, SelectFLOAT. extends your hops:
R1+Left, Left, L1+Circle, L1+Triangle, Triangle, SelectThese codes don’t actually work:
You would think that STUNT would unlock Stunt mode, but it doesn’t. It’s also unclear what RACE does. Both of these set bits on the flag field at
80010cf0, but the game doesn’t seem to care about them.CAMLOCK and CAMROLL can’t be entered at the title screen; when you press X, you are taken to the main menu.
CAMTV., CAMLOCK., and CAMROLL. can be entered during gameplay, but they don’t seem to do anything.
If you can improve my understanding of these, leave a comment!
Outro
Many thanks to Whoeverhitme, OskyCMK, and the crew at JetMotoCentral.com for helping nail down some of the in-game cheat effects. I wouldn’t have come up with all of them on my own!
For more on the Jet Moto series, see my earlier article on Jet Moto 2.
More retro game reverse engineering articles are in the works! Subscribe here on Substack to get the next one as soon as it’s out:

Appendix
Here are all the codes, their effects, and buttons. As above the codes without a period at the end are entered at the title screen:











The third game in the series is not as good as 1 and 2. It's crazy how codes were still hidden after all these years. Nice finds!