Extending the demo: Psybadek (PlayStation)
At last, a dek manual with a wobbly mind and a right cheeky grin.
Let’s talk about Psybadek, the hoverboard racing game for PlayStation from Psygnosis.
The retail version of the game was built some time in early September, 1998. There were previews of it before that, however: the Psygnosis ’98 Interactive Demo has files from late August. And the dedicated Psybadek demo is from the first week of August.
The demo versions limit you to a couple of levels. But if you look at the file system, you’ll see that data exists for all of the worlds:
I was able to patch the standalone demo’s disc image to make everything playable. See below for:
Details on how the patch works.
Differences between this build and the final game.
An examination of the game’s password / cheat code system.
Technical details: playing every level
The final game starts you in the “skate park” hub area. But the demo drops you straight into level 0x201. If you complete it successfully, you get to play level 0x301. Once you finish that level, you get kicked back to the menu screen.
The code that makes this happen is in the function at 8003fab8. With labels added to Ghidra’s decompilation, it looks like this:
/* Play level 0x201 */
init_level_data_800309f4();
execute_level_8003c5e4(0x201,0);
/* If the level was completed successfully, play level 0x301 */
if ((quit_signal_800a4316 == 0) && (level_status_800ad6bc == 3)) {
init_level_data_800309f4();
execute_level_8003c5e4(0x301,0);
/* ... */The corresponding function in the final game is quite a bit more complex. But the key differences are:
It starts in level
0x0(the hub area) instead of level0x201.When you leave a level, it calls the “execute level” function with a “next level” value from memory.
I patched the function to change its logic to (1) Skip the “level status” check, and (2) Use the “next level” value instead of a static 0x301:
/* Play level 0x0 */
init_level_data_800309f4();
execute_level_8003c5e4(0,0);
/* If the level was completed successfully, play level 0x301 */
if (quit_signal_800a4316 == 0) {
init_level_data_800309f4();
execute_level_8003c5e4(next_level_800ad6c4,0);
/* ... */Now we can go to any level from the hub area!
Prototype differences
The hub area is quite a bit different in this prerelease version. Rather than having bridges to each of the worlds, there are warp portals in the “skate park” training area:
The areas in each world that let you pick a level differ from the final game, too. In the demo, the ice world is a simple corridor with a line of level portals. In the final game, it’s a mini-snowboarding course:
The Desert world got a similar upgrade in between the demo build and the final one:
All of the levels are available by default in the demo version – you have to unlock them one by one in the final game. So everything can be explored from the hub area.
Many of the demo levels differ from their final counterparts. And some game mechanics are unfinished. For example, there only seems to be one type of projectile weapon in the demo. The final has three different ones:
The boss levels are noticeably incomplete. They have a text-based banner showing lap progress at the bottom of the screen – this was replaced with character icons in the final version:
Technical details: accessing the Continue screen
In the final game, the Continue screen lets you put in passwords. These are used to resume your session if you don’t have a memory card, and also to activate cheat effects.
Er, maybe – here’s the manual’s warning about using passwords to cheat:
It’s often the case that games such as Psybadek use recognizable words in order to access special cheat modes. However, please don’t think for one moment that any recognizable words are used as cheats in this game. It would therefore be a real waste of time to try and discover words that activate cheats wouldn’t it? Because ABSOLUTELY NO real words are used. No sir. What a crazy notion. You kids, you just kill me.
They’re just kidding; the game has dozens of cheat passwords. Most of them are documented on cheat sites like GameFAQs.
The demo prevents you from accessing the Continue screen. It does this by altering the table that determines how the cursor moves, which is stored at 800b5028:
We can fix this by replacing the table data with the values from the final version:
Does the demo version use the same cheat passwords as the final game? It takes some effort to find out; the game uses an obfuscation function to prevent you from reading them easily. This Python function de-obfuscates them:
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
def decode_passcode(low_word, high_word):
combined = (high_word << 32) | low_word
chars = []
for i in range(10):
shift = (9 - i) * 5
char_index = (combined >> shift) & 0x1F
chars.append(ALPHABET[char_index])
return "".join(chars)The demo and the final both have the same set of cheat effects, but several of the passwords that activate them don’t match. Here’s a comparison:

Outro
You can get a disc patch that makes the modifications above from GitHub. Leave a comment if you find something else notable!
There will be more Rings of Saturn soon. You can subscribe here on Substack to get the next edition as soon as it’s published:
Check out the archive for more on demo disc data mining in the meantime.











How did you figure out how to de-obfuscate the cheat function?