Redefine keys to "SHOCKED<ENTER>" to activate test/cheat mode.
A disguised instruction hiding inside "unused" data
The eight bytes at 8008 are labelled unused, but three of them
($C3,$D6,$A0) decode as JP $A0D6 (the keyscan routine) starting
at $800E, six bytes into the block. CALL $800E is therefore equivalent to
CALL $A0D6 — the disassembly has to spot this by decoding the
data as code, since nothing points at $800E directly. Two call sites use
it this way, at $C647 (in C59E) and $C1D7 (in C16A).
A block of code that can never be reached
The three instructions at rps_dead_code (labelled rps_dead_code) can't
be reached: every jump into the block above it either loops back to
run_pregame_screen_loop or falls straight through to RET a few bytes earlier.
Kept in the disassembly as found, not trimmed.
A carry check that can never fire
In the drum-noise burst routine (FA3A, at $FA67), AND A
unconditionally clears the carry flag immediately before RET C,
so that RET can never actually trigger early. The frame-flag
byte it loads is never used for anything. Preserved as an apparent dead
check in the original code, not a translation artefact.
A title-screen object that can freeze mid-script
Object scripts on the title screen use opcode $D1 for an initial
constant-velocity burst, but $D1 is never tested by either of the two
dispatch chains that drive object movement ($C70E onwards, in C59E).
Every one of the five title scenes hits this: once $D1 is latched as the
active opcode, the object can never reach the countdown that would let it
fetch a new instruction, and it freezes in place for the rest of the scene.
A genuine quirk of the original interpreter, not a disassembly error — see
$CCF2 (in CCB7) for object 0's case.
How trees and buildings fake perspective
There is no hardware scaling on the Spectrum, so roadside objects like trees,
lamp posts and buildings can't just be one bitmap stretched to size. Instead
draw_stretchy_object_common (draw_stretchy_object_common, reached via draw_stretchy_object_left or draw_stretchy_object_right) builds
each object from a stack of small bitmap "bands": some bands are drawn at a
fixed height regardless of distance, anchoring the object's basic shape;
others are scaled to a percentage (25% to 200%) of a base height looked up in
the shared persp_y_scale table, and it's these bands that
actually shrink and grow as the object approaches or recedes. Each band picks
its own bitmap variant for the current depth from a small per-band table, so
a fixed foot or a stretched trunk can look subtly different up close without
needing a whole extra full-size sprite. Five ~32-byte bands per object is far
cheaper than one full bitmap per depth level.
A road sign graphic that's drawn but never shown
bitmap_turnsign_6 defines a 16x10 "turn right" sign, complete with a pre-shifted
copy at bitmap_turnsign_6s, but nothing in the disassembly references either bitmap.
Whatever used it (perhaps an earlier version of the fork-in-the-road
warning) was cut before release.
A repeated bit test in the cornering check
The cornering-direction check at $B2C7, in move_hero_car, tests bit 7 of H twice
on the same branch of the decision tree ($B2CD and $B2D5) — the second
test can never come out differently from the first, since nothing changes
H in between. Marked "bug?" in the disassembly; behaviourally harmless, but
almost certainly an accidental duplication rather than an intentional
recheck.
Sinclair User demo version of the game
Sinclair User issue 94 (January 1990) included a covertape, Megatape 23, with
an exclusive demo version of the game on Side B. On Side A was Nightmare Rally
(1986) - another game featuring Wakelin artwork with a prominent Lamborghini
Countach (the actual game had a more modest Ford Escort pootling around).
(Demo version) A single stage, borrowed graphics, no retry
The demo is not a cut-down full game: $4000 sets up a single stage that reuses
stage 1's vehicle graphics with stage 4's map data and there is no retry after
crashing or running out of time. The map itself is shorter still — $6016
onwards is only the closing "loop" section of stage 4's road, cut and rejoined
into a short self-contained lap rather than the whole stage (see the
curvature/height/hazards/right-object blocks starting at $6016, each ending in
its own loop-back pointer rather than continuing into the rest of stage 4's
data). No tunnel, no forking road and no helicopter pursuit appear anywhere in
the demo's map or object streams.
(Demo version) The demo's one perp
The demo's single stage uses the name "$5D5F(JASON THE UGLY PIRATE)" for its
perp, reusing stage 1's perp-description slot rather than defining a
demo-specific one.
(Demo version) A deliberately unforgiving time limit
The demo's stage timer is set noticeably tighter than the equivalent retail
stage. Combined with only ever seeing the closing "loop" section of stage 4
(see the "loop only" fact above), the demo plays as a short, hard sprint rather
than a full stage.