Curiosities — the hidden gems of Subterranean Stryker
Forty years after release, reverse-engineering this 1985 cassette turned up things nobody knew were in there: an easter egg, the developers' signatures, eight sounds that were composed but never played, a level that corrupts memory, and some genuinely clever engineering. This file collects them all in one place; each entry links to the full trace in docs/disasm/ and RE-LOG.md. Where a discovery is implemented in the native port, that's noted inline. (The method that surfaced all of this — running the binary and reading its RAM rather than reading prior write-ups — is in PLAYBOOK.md, which is also why we found things earlier notes missed.)
The idle title screen draws a HALL OF FAME ($FCDB) whose default
high-score table at $FE0F reads:
| Rank | Name | Score |
|---|---|---|
| 1 | somebody | 2900 |
| 2 | Wedge | 2820 |
| 3 | Biggs | 2422 |
| 4 | John D. | 1402 |
| 5 | Luke | 488 |
| 6 | Porkins | 487 |
| 7 | Timothy | 442 |
| 8 | Gof | 240 |
Wedge Antilles, Biggs Darklighter, Luke, Porkins — Star Wars Red Squadron, hiding in the data since 1985. And the last two entries are almost certainly the developers signing their work: Timothy = Tim Follin (music) and Gof = Peter Gough (code). "John D." remains unidentified — if you know who he is, open an issue. (title-menu.md, RE-LOG §59)
The native port ships this exact table as its default
(HallOfFame.cs) — beat 240 points and you knock Gof off his own
scoreboard.
The ROM contains a complete family of sound-effect messages —
boss alert, pickup chime, a warning, fuel-low and shield-low
alerts, a kill jingle, a 32-byte game-over tune, and five
per-level fanfares. The game dutifully QUEUES them at the right
moments ($FA0A copies them into a buffer at $FF51)… and then
no code anywhere ever plays that buffer. The $FA32 player
resets the buffer pointer on entry and only ever plays the title
tune; one of the eight ($F93A) isn't even queued by anything —
it has no callers at all. The whole system is a development
leftover: either the player lost its message mode late in
development, or the dispatch was never finished.
(sound.md, RE-LOG §63)
We reconstructed them. The message bytes aren't in the title
player's (duration, pitch) format — they're groups of pitch bytes
separated by $03 (clearest in the game-over data:
1B 58 03 | 58 58 03 | 18 18 03 …), with values in exactly the
title player's pitch range. LostSoundReconstructor.cs renders
each message through $FA32's pulse-cycle engine (same DJNZ
timing, same Follin duty-slide) with documented assumptions for
the parts that never shipped (note length, rest length). The
results live in assets/extracted/sfx/lost-*.wav.
Hear them in the game: press N in the native port to cycle through three SFX modes:
- OFF (default) — cassette-faithful: those events are silent, exactly as on the original cassette.
- DESIGNED — purpose-built beeper SFX that are distinct and recognisable;
regenerable with
subterra sfx-render(sfx-*.wavinassets/extracted/sfx/). - HISTORICAL — the 1985 reconstructed messages, finally audible forty
years late (
lost-*.wav). Same underlying data, different assumptions about note length; the two sets sound noticeably different.
The per-level entity-record pointer table has six entries, but
level 0's pointer sits 3 bytes before level 1's records —
its six "records" are level 1's bytes read out of phase, giving
sprite addresses in ROM and stray RAM writes ($A0xx). Its
scenery pointer is just as broken: it points at the tile bank
itself. Level 0 is unreachable in normal play (the level counter
increments before the first page); only finishing level 5 — 25
entities, the hardest page — exposes it, which is presumably why
it shipped untested. The original would draw garbage and corrupt
memory; the port wraps 5 → 1 instead.
(entities.md §Level 0, RE-LOG §57)
Nothing in this game ever compares coordinates for damage:
- The player takes damage when his XOR-draw lands on non-zero
pixels (
$DCF5's shadow-carry trick — and the spawn routine$F891blanks the player's spawn cell precisely so frame one can't false-trigger it). - Enemy ships and the boss die when their own draw finds the
laser beam pattern
$EFin the bytes they're about to cover ($E9F0). The laser never checks anything; the targets do. - We got this wrong once ("the laser hits nothing") before finding the check hiding in the targets' blitter — the correction story and the lesson (absence of one opcode pattern is not absence of a behaviour) are in RE-LOG §58/§62.
The boss's sprite-source pointer aims at $EE8E — its own
state block. What you see on screen is the boss's current
speed byte (written twice per tick) plus neighbouring state
values, rendered as horizontal bands that shift as its speed
phase cycles. A procedural glitch-creature, zero bytes of
artwork. (boss.md §Visual)
- All cave entities are stationary. Every "falling rock" and "flying drone" is a 16-frame animation inside a fixed 16×16 box; the only byte the engine ever writes back to an entity record is its frame counter. (RE-LOG §61)
- The score-parity twinkle. Entity types ≥
$13swap their sprite pointer to$4800— the middle of screen memory — whenever bit 0 of the score is clear, sampling whatever pixels happen to be there: a pseudo-random shimmer with zero bytes of state. (entities.md §$F239) - Title music stops when you touch the keyboard — by design: the player is a synchronous, interrupts-off loop, and its any-key poll is the only way the menu stays responsive. M or N starts it; any key exits it. (sound.md)
- The Follin timbre is two instructions. The famous PWM
slide is literally
INC E / DEC Donce per pulse cycle — duty sweeps while the period holds. (sound.md) - The 8th ship slot. Each level's init data contains eight
ship records; every loop in the game walks seven. Level 1's
unused 8th ship (
X=$50 Y=$58, alive flag set) has been waiting to spawn since 1985. (RE-LOG §59)