1986 · Durell Software Ltd
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.
| Tier | silver |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Comments checked | Not 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 analysed | original 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 |
| Copy | agent-draft |
| Tools | emulator: 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 |
| Model | claude-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 version | 0.0.69 |
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.
| Step | By | What it found | Of the listing |
|---|---|---|---|
| Research | deepseek-flash | Looked the game up online (its manual, reviews or wiki pages) before reading its code. | |
| Annotation | deepseek-flash | Wrote the listing’s comments. first pass, seven agents | |
| Maintainer’s check 1 | air | Tested 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 | |
| Annotation | claude-opus-5-5 | Wrote 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 2 | air, with claude-fable-5-1 | Tested 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 1 | air, with claude-fable-5-1 | 0 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
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:
| Feature | Status | Where |
|---|---|---|
| Collect 50 spindles, then find the disk drive and clone the worm to finish | differs | The 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 nose | live | $76FA; the object's handler is $D9A9 |
Burper sparkies: mines laid with 1, rise to a Sputnik overhead | confirmed | Laying 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 survives | open | Not 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 direction | confirmed | Any 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 again | traced | $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 buses | live | 5 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 buses | confirmed | 34 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 bugs | live | Four 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 board | confirmed | Type $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 attach | traced | Type $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 position | confirmed | $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 edge | live | $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 software | live | rectangle $8E13, trapezoid $90F9, quadrilaterals $9590 and $9819 (simulated against a model) |
Q faster, A slower, O rotate left, P rotate right | live | $7C13, $76AE on |
| Redefinable keys; Kempston, Protek, Interface 2 and others | differs | The 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 game | live | bit 7 of the control byte; the menu returns |
| Score for killing bugs and collecting spindles; separate hi-score | live | The 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-score | differs | SPINDLES is the number taken, counting up from 0 ($7A98; live) |
| Title-screen tune | confirmed | $E69F: ten scripts, 55.4 seconds a pass (simulated); the menu waits inside the player (live) |
| "£100 REWARD" anti-piracy forgery warning before the menu | live | $7C92, text at $7CE0 |
Opening menu: 1 redefine keys, 2 Kempston joystick, 0 start | live | $E508 |
| The whole world is a circuit board seen from above | confirmed | 129 cells of 256 by 256 units linked into a board 16 cells by 22, with two joins between far-apart parts ($6464-$757B) |
Found in the code, not in the manual.
$ED items).$BD6F, $BD90, $BDD1).$BED1).$BE6C, $D857). No table of difficulty was found: the object handlers' constants are fixed.$9A89-$A8C0 was listed).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.