Extending the demo: Destruction Derby (PlayStation)
Making a non-interactive demo interactive
The PlayStation Picks disc shipped with PlayStation consoles when the system launched in the United States in 1995. It’s got playable demos of Battle Arena Toshinden, ESPN Extreme Games, Jumping Flash!, and Wipeout. It’s also got non-interactive previews of several other games.
One of the non-interactive previews is for Destruction Derby, the racing / vehicle combat game from Reflections and Psygnosis. It shows the “Grim Reaper” vehicle playing in the stage called “The Bowl” for a bit before ending.
What’s shown during the preview isn’t a prerecorded video – the scene is being rendered by the game’s engine.
Usually the trick for controlling an auto demo like this involves finding where the game sets the player character to be controlled by the CPU. See my earlier articles on Burning Rangers, Fighting Force, and Last Bronx for examples of that working.
But sometimes it’s easier than that. The version of Destruction Derby on this disc actually contains two demos: one non-interactive and one interactive. A single value, stored at memory address 800cd604, controls which one gets presented. Flip it from 1 to 0, and…
We get to play the One Level Demo! It uses the same car and same stage as the auto demo, but it’s controllable. You can play until the car is destroyed or the 60 second timer runs out.
Here’s a video of the playable demo in action:
The demo is based on a build of the game from July 23rd, a bit more than three weeks before the final one. It predates the earliest available prototype by about a week.
The stage shown seems to be mostly complete, but there are some noticeable differences. For example, the Go! message looks less polished:
In contrast, the Reflections logo looks better in the demo version:
Gameplay-wise, the main difference is that the demo has a time limit. Destruction Derby mode is more of a “last man standing” affair in the final game.
I’ve made a patch that loads the playable demo instead of the auto demo. It changes the function at 8004030c, which is what checks to see which demo to set up. Ghidra’s decompilation of the logic looks like this:
if (which_demo_01 == 0) {
/* Load the interactive demo */
ps_file_handler_01(s_TITLEPS1._80030124,s_TITLEPS2._80030130,s_TITLEPS3._8003013c,600);
ps_file_handler_01(s_TITLERF1._80030148,s_TITLERF2._80030154,s_TITLERF3._80030160,600);
ps_file_handler_01(s_TITLEDD1._8003016c,s_TITLEDD2._80030178,s_TITLEDD3._80030184,600);
show_screen_01(s_SCREENS_\INSTRUCT._8003019c,0x4b0);
show_screen_01(s_SCREENS_\FRSTSCRN._800301b0,0x4b0);
loading_file_handler_01(loading1_str_01);
pre_game_loop_01();
}
else {
/* Load the non-interactive demo */
ps_file_handler_01(s_TITLEPS1._80030124,s_TITLEPS2._80030130,s_TITLEPS3._8003013c,0x168);
if ((((p1_pressed_01 & 1) != 0) ||
(ps_file_handler_01(s_TITLERF1._80030148,s_TITLERF2._80030154,s_TITLERF3._80030160,0x168),
(p1_pressed_01 & 1) != 0)) ||
(ps_file_handler_01(s_TITLEDD1._8003016c,s_TITLEDD2._80030178,s_TITLEDD3._80030184,0x168),
(p1_pressed_01 & 1) != 0)) goto LAB_800404fc;
loading_file_handler_01(loading1_str_01);
DAT_800cd684 = 1;
DAT_801cd554 = 0x14;
}My patch skips the check on the first line above and forces the playable demo to load.
Get the patch (and instructions for how to apply it) from GitHub.
Outro
If you like this sort of thing, allow me to recommend the Hidden Palace podcast. In episode 2, we have an extended discussion of prerelease builds of games hiding out on demo discs.
Listen to it on your podcast application of choice, or right here on Substack.
And for more articles on extending demo discs, see my archive.








Very good. I love the PlayStation Demo discs. I still play them today. Great memories. I have quite a few of them.