1987 · Incentive Software

About this page

This minisite was contributed by air. It’s agent-generated and needs a human editor. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to curate games/spectrum/driller 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

Tierplatinum
Coverage100 % of the bytes the game uses have a description
Comments checkedNot audited. No audit has checked every comment, and the last sample of 75 comments had 14 wrong, so between 11 and 29 % of the listing’s comments are likely wrong. How listings are checked
Build analysedIncentive Software's original 48K tape (TOSEC: Driller (1987)(Incentive).tzx), a BASIC loader, a 448-byte loader code block and three turbo blocks: the loading screen, 37,590 bytes of game at $6B12-$FDE7 and the game's own screen
Copyagent-draft
Toolsemulator: release ZEsarUX-13.0, ZEsarUX_linux-13.0-ubuntu24_x86_64.tar.gz, run as a Spectrum 48K; check-emulator 47 of 50 on 2 November 2026 (count-while-running, load-keeps-frame-phase and warp, each with a workaround in kit/skills/spectrum/tool-zesarux), disassembler: SkoolKit 10.1 (control file, sna2skool), checker: a second session of the same model, briefed cold, for the listing sample, host: Linux x86_64 (Ubuntu 24.04, no display), a hosted cloud session, python: 3.13.18, node: 22.23.4
Modelclaude-opus-5-5
Kit version0.0.292

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
Researchclaude-opus-5-5Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationclaude-opus-5-5Wrote the listing’s comments. 100 % of the program is described, in 262 comments.
Play tabclaude-opus-5-5Ported the whole game to JavaScript for the Play tab and corrected 0 comments it showed wrong.
the port was written first, routine by routine in lockstep with the game, and the listing's comments on code were written from it, so it found none of them wrong
Sample 1claude-opus-5-514 of 75 comments wrong, so between 11 and 29 % of the listing is likely wrong. All 14 were then corrected.
75 of the 262 comments; each of the 14 was wrong in a detail, and all 14 were corrected

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.

Sources:

Features

FeatureStatusWhere
Security input station: a page, line and word of the Federation Briefing to type before playliveanswered with IMPROVE for page 17, line 4, word 1; the table of 128 words is at $ABC1, checked against the manual; security, $CB7A
Three wrong answers end the gameconfirmedthe counter at $CAA6; on 3 it clears memory and jumps to $0000; the Play tab's port wipes its machine the same way (test_play.js)
Control options: keyboard, Sinclair, Kempston or Cursor joysticklivemenu text at $C932; control_options, $C9C6, puts each joystick's keys in the table at $8FC8
Move forward, back (O, K), turn left, right (Q, W)livecommands 3-6 in the key table at $8FC8 (also 7, 6, 5, 8 and the stick); move_command, $A279; driven in the recorded sessions and by test_play.js
Fire laser at the cursor (0); in movement mode only to the centre, with the cursor onconfirmed0 and the stick's fire give command $16 ($8FEC); aim_command, $A95C, fires only while the crosshair is shown ($88A2): four lines from the view's edges to it, then pick_object
Space toggles movement and attack mode; in attack mode the keys move the cursorliveSPACE gives $1E, which flips $88AC; the direction keys then give $17-$1A ($8FC8, third byte); test_play.js
Look up, down (P, L)livecommands 7 and 8; test_play.js
Angle of turn, 5 to 90 degrees (A, Z)confirmedcommands $0B, $0C step through 1, 2, 3, 6, 9 and 18 seventy-seconds of a turn ($88C9)
Step size, 1 to 250 units (S, X)confirmedcommands $11, $12 step through 1, 2, 5, 10, 25, 50, 100 and 250 ($88BE), times the area's scale
Rise, fall (R, F): the probe's body up to a fixed height; the jet fliesconfirmedcommands 1 and 2: walking, the probe stands up or crouches by the area's scale, up to $8771; flying, it moves by its step (move_command)
U-turn (U)confirmedcommand $0D
Tilt left, right (N, M)confirmedcommands 9 and $0A, the roll ($876E)
Cursor on and off (+)differsthe key is B, command $15 ($8FEC); + is in no key table. It acts only while the keys move the probe
Drill (D): a rig is teleported in front of the probe; costs energyconfirmeddrill, $BEFA: 5 of energy, in front of the probe by its heading, on the floor or a block, clear of every object
Collect the rig (C)confirmedcommand $2A in drill: 5 of energy; the score the rig earned is taken back
Information screen (I): area, rig status, gas found, % tapped, gas tapped, total and safe sectors; L load, S save, 1 abortliveinfo_screen, $C3DC; opened, closed and abandoned (1) in the scenarios and in test_play.js; S and L traced
Load and save a position to tape (or disc)tracedthe save is 333 bytes from $8762 and the area flags, in two blocks under a name; the question "TAPE OR DISC ?" at $C838 is never printed, so this version saves to tape only
18 sectors to make safe; a sector is safe when its rig taps 50 % or more of the gasconfirmeddrill: 50 or more makes the sector safe ($877B = 3); the 18th safe sector ends the game won ($8BF2 = 5)
The closer the rig to the gas centre, the more gas tappedconfirmed100 less the rig's distance from the field's centre times 100 over the field's size ($87A0-$87A2, from the area's record)
A flame at the apex of a rig that drilled successfullyconfirmedplace_rig, $CD3B, shows the last two of the rig's five objects only when it struck gas
Rigs cannot be placed from the jet ("NOT IN PROBE")confirmeddrill refuses with the message at $8C66 while $877A is set
One rig per sectorconfirmeddrill refuses with "ALREADY PLACED" ($8C9E) when the sector's state is not 0
Countdown to the meteor strike; the game ends at zerolivethe clock starts at 4:00:00 ($CFF2) and the interrupt takes a second every 50 frames; run out in the scenario time ($8BF2 = 2)
Success rating (score)confirmed24 bits at $8872: a rig's strike adds the sector's gas times its percentage times 10; scripts add the rest (opcode 1)
Energy and shield bars; the game ends when either runs outlivebar, $BA1E; run out in the scenarios energy and shield ($8BF2 = 3 and 1)
Energy and shield crystals: shoot one to absorb itconfirmeda shot runs the object's script: opcode 2 adds energy, $13 shield (run_script, $B320). In the Stores (area 19) the energy crystals are objects of type 7 and the shield ones of type 6
Laser beacons fire at the player in range and never missconfirmedsensors (type 2): draw_sensor, process_sensors and the interrupt; each shot that comes round takes a unit of shield, with no chance of missing
Skanners orbit Mitral and are likely armeddiffersno object moves. Eight minutes after the probe enters any area a shape with a sensor in it appears high over the area's middle, and a minute later it goes (the shared scripts at $D04C, objects 248-250 at $87FE)
A Ketar reconnaissance jet: dock by driving under it; land on the probe to go backconfirmedwalking into object 15 of the Ketar hangar (area 27) swaps to the jet (opcode $15), object 34 back
The jet is lightly armoured and flies; it cannot drillconfirmedit starts with 29 of energy and 34 of shield against the probe's 48 and 50 ($CF44-$CF47); drill refuses in it
A fall from too high ends the gameconfirmedstep_to, $9DCF: a fall of more than $8777 cells ends the game ($8BF2 = 4), "NASTY FALL"
Teleports to the opposite side of the moonconfirmedobjects whose script goes to another area (opcode $12), some hidden until a switch shows them; an area's edge takes the probe into its neighbour at the opposite edge (entrance 0, set_start)
Switches that open doors and make buildings disappearconfirmedobjects whose script shows, hides or toggles others, in its area or another (opcodes 3-8), often with a flag so it pays once
Mines and danger zonesconfirmedflat rectangles that take 3 of energy each time the probe walks on them (Graphite, area 17)
Plan view and side view indicators on the consoleconfirmedthe heading's and the pitch's dials, redrawn by update_panel, $B72B (the heading's not in areas 13 and 18)
X, Y and height co-ordinates on the consoleconfirmedupdate_panel, each coordinate over the area's scale
Message display: defaults to the sector's stateconfirmedupdate_panel's message line: the area cannot be drilled, a rig is in place, or the area is safe
Area namesconfirmed29 records from $CF3E (maps/areas.js): the 18 sectors, the two Stores, the K1 to K4 complexes, the Linker, the Ketar hangar, Mitral, an area named UNKNOWN AREA and the game over's view
Freescape: solid 3D, any position, look any waylivethe play view; draw_view, $6B12

Beyond the documentation

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.