1987 · Thalamus
Every byte of the C64's 64 KB, one pixel each, 512 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.
| What | Bytes | Of 64 KB |
|---|---|---|
| Program | 63,059 | 96.2 % |
| Code | 20,374 | 31.1 % |
| Graphics | 21,023 | 32.1 % |
| Level data | 11,008 | 16.8 % |
| Sound | 6,090 | 9.3 % |
| Text | 592 | 0.9 % |
| Tables | 2,736 | 4.2 % |
| Variables | 1,236 | 1.9 % |
| Screen, bitmap, colour, stack, I/O | 1,280 | 2.0 % |
| Unused | 1,197 | 1.8 % |
| Tier | silver |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Build analysed | Reflex Cracking Squad crack, one file (delta.prg, 47,104 bytes); game entry $1770 |
| Copy | agent-draft |
| Tools | host: Linux x86_64 (Ubuntu 24.04), cloud container, no display, emulator: VICE x64sc, release v3.13.1 (v3.13.1-linux-x86_64-gui.zip), disassembler: regenerator2000 0.9.20, browser: Chromium via Playwright 1.56.1 (page check) |
| Model | claude-opus-5-5 |
| Kit version | 0.0.48 |
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:
reference/). No manual was read.| Feature | Status | Where |
|---|---|---|
| Horizontally scrolling shoot 'em up: the ship flies right through space, starfield behind | live | reference/wave1-start.png; the stars are three parallax layers of single-pixel characters (stars_update $1DB9) |
| Enemies come in waves (formations) | confirmed | wave_spawn_step $8010, wave_records $AB00; reference/wave1-formation.png |
| Shooting a whole formation usually earns a credit | confirmed | a group that carried a credit adds one when none of its enemies escaped ($80B5); most records carry one. Seen indirectly: the shop's icons turned light blue only with credits poked; no formation was cleared by hand |
| A group of icons appears ("a corner shop in space"); blue icons are bought by flying over them, spending credits | live | the shop is a group whose sprites are the icons ($1288, record $45, the second group of stage 1); price = icon number; shop_try_buy $2261. Bought icon 4 with the ship placed on it: facts.md, The shop |
| Grey icons kill the ship on contact | live | an icon costing more than the credits counts as a hit (shop_try_buy); touching icon 5 with 2 credits set the hit flag. Grey = unaffordable (icons_update $0808); reference/grey-blocks.png is the shop with no credits |
| Only one extra can be chosen per shop | confirmed | a second touch in the same shop counts as a hit ($12F7 stays set while the shop is up) |
| Power-ups: higher speed, faster rate of fire, among others | confirmed | seven: speed, fire rate, extra weapon (three-way), double laser, orbiter, slow-down, shield (facts.md, Weapons); all seven poked on and seen firing (reference/weapons-poked.png) |
| The icon of the skill being improved animates for a while in the bottom row | live | 14 blinks of 8 frames between its two frames (icons_update), seen on icon 4 |
| Named sections of the region, with hazards at the top and bottom matching the name | live | 32 stages named by three words each (ENTERING ROCKS OF DEATH ...), stage_banner_table $F880; the ENTERING stages bring rows of rocks, bubbles or machinery along the top and bottom (stage_hazard_table $F900); reference/stage2-banner.png, stage2-rock-rows.png |
| 32 levels | confirmed | stage_advance $91EF: after stage 32 the game shows DELTA MISSION COMPLETE and starts again, harder (difficulty_set $9D35) |
| One or two players | live | F1 on the title; turns pass at each death (swap_players $1650) |
| Three lives; "Fasten your seatbelt Player 1" before each life | live | game_start_scores $1600; reference/fasten-seatbelt.png |
| Game over, then high-score entry by name | live | eight letters with the joystick (hiscore_entry_step $1E52); reference/game-over.png, high-score-entry.png |
| Title, top-scores table and a demo in turn | live | three title pages ($0FA9); the demo replays recorded joystick input (demo_input $9F40) |
| Music by Rob Hubbard | confirmed | a Hubbard-style driver with 13 tunes (music_play $BDE4); the title music plays at start-up; in play the music replaces the effects when F5 is pressed on the title |
| Mix-E-Load: remixing the loading music while the game loads | open | not in this image, which was loaded by the crack's own depacker; the SID register census finds only two players, the effects ($0406) and the music ($BDE4), neither with remix controls. It belonged to the original loader, which this copy does not have |
| Published in the US as "Delta Patrol" by Electronic Arts | open | not a feature of this image; nothing in it says Delta Patrol (string sweep in the game's alphabet and PETSCII) |
| Pause | live | RUN/STOP; fire resumes; T quits to game over (pause_check $9A30) |
Found in the code, not in the sources read.
read_keys $0C40). Live toggle.read_joysticks $3375).shop_spend_step $2298). Live.extra_life_check $9CD6). Live.enemies_wave_timers $9024).enemy_move_1 $82CC).enemy_fire_decide $9208, enemy_fire_setup $9100).enemies_hit_by_weapons $2B0A, ship_hit_by_fire $2BBC).unreached_cheat $BA00).$3000 (enemy_ai_step $99AC).How to get from the contributor's own copy to the analysed state. Someone else must be able to follow this exactly.
One program file, delta.prg, 47,104 bytes, loading at $0801 and ending at $BFFF. It is not the original release: it is a crack by the Reflex Cracking Squad, which put a packer and an intro of its own in front of the game. The game itself is Thalamus's 1987 release (the title screen reads "MCMLXXXVII", "Delta by Stavros Fasoulas", "©1987 Thalamus"). No trainer menu appears.
delta.prg. VICE types LOAD"DELTA",8,1 and RUN; the BASIC line is SYS 2065.$C000, the Reflex intro ("Reflex Cracking Squad presents ** DELTA! **", "Press space to kill this intro"). About 14 seconds after the autostart.$CB00, which copies the character ROM to $0400-$07FF, sets $2D/$2E to $B3F5 and jumps to $0810.$0810 is the game's own packing: two more layers, each copying a small unpacker into low memory ($0334, then $0100) and running it. The last ends LDA #$37 / STA $01 / CLI / JMP $1770 (the instruction at $0129 once relocated). $1770 is the game's entry.work/entry.vsf: a stopping checkpoint on $1770, saved there. This is the image the disassembler and the listing are built from (see below).work/play-wave1.vsf: about seven seconds after fire, ship on screen, no input held, stopped with pause() (machine at $17CC in the main loop).Also in work/: crack-intro.vsf (stopped on $C000) and crack-exit.vsf (stopped on $CB00), kept only to show the crack's layers.
v3.13.1-linux-x86_64-gui.zip), PAL. check-emulator passed 56 of 57; failed: pause-at-instruction (so every stop for a snapshot uses pause()).$01 = $35 (RAM at $A000 and $E000, I/O at $D000). The game sets it in its first subroutine ($17E0).$FFFE/$FFFF = $1800 (RAM). The handler at $1800 saves the registers, acknowledges the raster interrupt and jumps through the pointer at $1000/$1001, which each raster band rewrites for the next one (a chain of raster splits). NMI $FFFA = $FFF8. The KERNAL vector at $0314 is still the default $EA31 and is not used.$17C9-$17DA waits for raster line $E4, calls $9D60 once a frame, waits for the line to pass, repeats.$DD00 = $96, VIC bank 1 ($4000-$7FFF); $D018 = $13 during play, screen at $4400, character set at $4800. Sprites enabled and multicolour from start-up ($D015 = $D01C = $FF).Compared byte for byte, entry.vsf and play-wave1.vsf differ in zero page, the stack, the screen ($4400-$47FF), the variables around $1000-$12FF, a few bytes of code that is self-modified, and in three graphics areas:
$4C00-$50FF and $F0E0-$F5DF swap places: each image holds the other's block. The game exchanges a title set of graphics and a play set, so neither image loses anything.$4000-$43FF and $4A00-$4BFF (sprite shapes in VIC bank 1) hold, in play, shapes found nowhere in the hand-over image, and the hand-over's shapes there are mostly found nowhere in play. The play shapes are built or unpacked by the game per wave; how is for the sweep and coverage steps to establish.The hand-over is chosen: it holds the program as loaded, before the game has written over any of it.
Three layers, none of them the game. The crack's BASIC stub at $0801 copies a depacker to $0400, which runs an RLE-style unpack and jumps to the Reflex intro at $C000. The intro swaps a few blocks of memory out of its way ($3E80-$3FFF with $CE80-$CFFF, $3000-$33FF to $C600), plays, and on SPACE swaps them back and jumps to $CB00 → $0810. From there two unpacking stages, which appear to be the game's own or the cracker's repacking (not determined), copy themselves to $0334 and $0100, decompress the game into $0800 upward, and jump to $1770. The crack's intro code at $C000-$C3FF and $CB00 is overwritten by the game in the process; what remains of the crack in the hand-over is the character ROM copy at $0400-$07FF, if the game does not use that area itself (to be checked in the sweep).
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.