1986 · Durell Software Ltd

About this page

This minisite was contributed by air, yozlet. It’s agent-generated and needs a human editor. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to curate games/spectrum/fat-worm-blows-a-sparky with me to Gold.

Footprint

Every byte of the Spectrum's 48 KB of RAM, one pixel each, 384 to a row. Lit pixels are what this game is: its code, graphics, level data, sound, text, tables and variables, exactly where they sit in memory. Dim areas are screen and working memory; dark is unused.

Status

Tiersilver
Coverage100 % of the bytes the game uses have a description
Comments checkedNot audited. No audit has checked every comment, and the last sample of 60 comments had 0 wrong, so between 0 and 6 % of the listing’s comments are likely wrong. How listings are checked
Build analysedoriginal Durell Software release, a tape image made with Ramsoft MakeTZX; a BASIC program loads a 190-byte turbo loader to $FAF2, which loads 49,000 bytes to $4000-$FF67 and returns to $EFD8
Copyagent-draft
Toolsemulator: release ZEsarUX-13.0, ZEsarUX_macos-silicon-13.0.dmg; check-emulator 41 of 45 on 3 October 2026 (each of the four failures has a workaround in kit/skills/spectrum/tool-zesarux), disassembler: SkoolKit 10.1 (control file, snapshot tools, and its Z80 simulator through kit/spectrum/simulate.py), host: macOS arm64 (darwin 25.5.0), Apple silicon, python: 3.9.6, node: 24.21.0, for the page's tests
Modelclaude-opus-5-5 (Claude Code: coverage, verify, minisite and retro, with nine annotation subagents on the same model and three checking subagents on claude-fable-5-1); deepseek-flash (Pi: orient, features, text, sweep, and a first coverage and verify that a maintainer's check refuted)
Kit version0.0.69

How the listing was checked

Every step that measured the Source tab’s comments or made them more accurate, in the order it happened, with the models that did it. Accuracy of the Source explains each step and what the row above makes of them.

StepByWhat it foundOf the listing
Researchdeepseek-flashLooked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationdeepseek-flashWrote the listing’s comments.
first pass, seven agents
Maintainer’s check 1airTested 39 of the run’s claims against the game, picked by the maintainer from its facts, its routine names and its memory map: 18 were wrong, so the check failed.
claims from facts.md, names from symbols.json and the orientation facts, traced in listing.json's bytes; code typed as data, names taken from what a routine looked like, tables cut at round addresses
Annotationclaude-opus-5-5Wrote the listing’s comments. 100 % of the program is described, in 937 comments.
second pass redid coverage: nine agents and the lead re-derived every name and description from the bytes
Maintainer’s check 2air, with claude-fable-5-1Tested 39 of the run’s claims against the game, picked by the maintainer from its facts, its routine names and its memory map: none was wrong, so the check passed.
20 claims from facts.md (the nine marked live repeated in the emulator), 10 names from symbols.json and 9 orientation facts
Sample 1air, with claude-fable-5-10 of 60 comments wrong, so between 0 and 6 % of the listing is likely wrong.
60 of 937 descriptions, six from each of ten ranges, fixed seed not recorded; five clauses left unchecked

likely wrong the sample’s range corrected right, or likely right not yet measured

Contributors

Other places to love this game

What the game does, and where we found it

Read this before annotating code. What the game is documented to do, with verification status against the binary. Statuses: open (documented, not found yet), traced (in the code, could not be exercised; say what was tried), confirmed (in the code, consistent with the emulator), live (observed directly), differs (the code does something else). "Absent" is not a status.

"Simulated" in the last column means the routine was run in a Z80 simulator on the game's own memory; facts.md has the detail and the list of live tests.

Sources:

Features

FeatureStatusWhere
Collect 50 spindles, then find the disk drive and clone the worm to finishdiffersThe board has 58 spindles (type $F7 items with y size $0C). Taking one is live. The disk (type $F6, cell $6FD6) ends the game whatever the count ($9E66; live, with none taken). The 50 is tested only at $BED8, where it raises a block that bridges the way to the disk (simulated). The ending shows a hand lifting the disk out ($78C9, $BB06; live); nothing is cloned
Four bugs on the worm is a fatal error (death)live$77A0: one count for each of the worm's four sections, death when all four hold a bug
Blaster sparkies: horizontal shots from the noselive$76FA; the object's handler is $D9A9
Burper sparkies: mines laid with 1, rise to a Sputnik overheadconfirmedLaying is live (the record's wait byte starts at $A0). A Sputnik passing over a waiting burper sets it rising ($DDDC-$DDF1), and it rises anyway after 160 passes ($D9A9) (simulated)
A very high Sputnik passes above a burper and survivesopenNot found. The Sputnik's handler tests only whether the two outlines overlap before it sets a burper rising; the burper rises 7 units a pass and bursts on a collision or at height $FA, and Sputniks are created at $CF to $D9. No test of a Sputnik's height against a burper was found in $D9A9-$DAF0 or $DC69-$DDF7. Not exercised live
Burpers also destroy Crawlies that touch them, and change the worm's directionconfirmedAny sparky kills a Crawly that moves into it ($D845-$D8A1, simulated). Laying a burper reverses the worm's heading ($7771; live)
A misfired burper on the PCB can be eaten and fired againtraced$9BE1-$9BF0 lets the worm take a sparky once its byte 16 has counted down from $37; $9E21 and $A62B add it back (simulated on the game's memory: 19 to 20)
Extra sparkies are awarded for spindles, and picked up on the data buseslive5 for a spindle ($A5BD; live). Trains of sparkies ride the type $E2 items ($D534, $DB0C, simulated); six more objects arrive every 512 passes ($7925; live)
Ramps let the worm climb onto the data busesconfirmed34 ramp items (type classes $80 and $40); the head follows their surface ($9BFF, $9C66, simulated). In work/play-1.sna the worm is on the ramp of cell $7346
De-bugger: a black-and-white striped block; crawl under it to shed all bugsliveFour striped blocks (type $E3, $8833), each over a pad of type $F5 that clears the bug count of each section that touches it ($A5DD; live with a pad written into the worm's path)
Sputniks: creeper bugs that fly low over the boardconfirmedType $E5 ($D494, $DC69, simulated): made high over a neighbouring cell, homes on the worm, comes down on it and becomes a Crawly. One is in the object list within eight passes of every game started in the live tests
Crawlies: erupt from the board surface and chase, or attachtracedType $F3: released by the seven type $F4 pads ($BE07) and by eruption points at the worm ($D442, $DE41); chases within $200 units ($D7E4); counted onto the worm on contact ($9E81, $A5FB) (simulated). The attach rule is live with counts written by hand
Insert map, bottom left: nearby spindles (white dots) and rough positionconfirmed$CE0A-$D045 (simulated); the map shows in every play screenshot. It is the 5 by 5 cells round the worm, with untaken spindles in white
Solid 3D perspective: flat at the centre, sides visible at the edgelive$80EB, $811E, $81DB (simulated); a box is its outline at two heights, each magnified about the middle of the view
Filled, dither-shaded faces drawn in softwareliverectangle $8E13, trapezoid $90F9, quadrilaterals $9590 and $9819 (simulated against a model)
Q faster, A slower, O rotate left, P rotate rightlive$7C13, $76AE on
Redefinable keys; Kempston, Protek, Interface 2 and othersdiffersThe redefiner ($E544) and Kempston ($7C32, live) are there. There is no code for any other joystick: the only joystick port read in the image is $1F. Interfaces that press keys are covered by the redefiner
H halts play and runs a "bouncing ball routine"live$D05E; any key resumes
G ends the gamelivebit 7 of the control byte; the menu returns
Score for killing bugs and collecting spindles; separate hi-scoreliveThe n-th spindle scores n ($A5CC; live); a Crawly 20 ($D84D), a Sputnik 35 ($DD5A) (traced). The hi-score is kept ($788F; live) and drawn wrong above 999
HUD shows sparkies left, spindles still to collect, score, hi-scorediffersSPINDLES is the number taken, counting up from 0 ($7A98; live)
Title-screen tuneconfirmed$E69F: ten scripts, 55.4 seconds a pass (simulated); the menu waits inside the player (live)
"£100 REWARD" anti-piracy forgery warning before the menulive$7C92, text at $7CE0
Opening menu: 1 redefine keys, 2 Kempston joystick, 0 startlive$E508
The whole world is a circuit board seen from aboveconfirmed129 cells of 256 by 256 units linked into a board 16 cells by 22, with two joins between far-apart parts ($6464-$757B)

Beyond the documentation

Found in the code, not in the manual.

Open questions

The symbol map for this game is symbols.json; the listing behind the Source tab is listing.json. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.