1987 · Thalamus

About this page

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

Footprint

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.

WhatBytesOf 64 KB
Program63,05996.2 %
Code20,37431.1 %
Graphics21,02332.1 %
Level data11,00816.8 %
Sound6,0909.3 %
Text5920.9 %
Tables2,7364.2 %
Variables1,2361.9 %
Screen, bitmap, colour, stack, I/O1,2802.0 %
Unused1,1971.8 %

Status

Tiersilver
Coverage100 % of the bytes the game uses have a description
Build analysedReflex Cracking Squad crack, one file (delta.prg, 47,104 bytes); game entry $1770
Copyagent-draft
Toolshost: 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)
Modelclaude-opus-5-5
Kit version0.0.48

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
Horizontally scrolling shoot 'em up: the ship flies right through space, starfield behindlivereference/wave1-start.png; the stars are three parallax layers of single-pixel characters (stars_update $1DB9)
Enemies come in waves (formations)confirmedwave_spawn_step $8010, wave_records $AB00; reference/wave1-formation.png
Shooting a whole formation usually earns a creditconfirmeda 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 creditslivethe 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 contactlivean 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 shopconfirmeda 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 othersconfirmedseven: 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 rowlive14 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 namelive32 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 levelsconfirmedstage_advance $91EF: after stage 32 the game shows DELTA MISSION COMPLETE and starts again, harder (difficulty_set $9D35)
One or two playersliveF1 on the title; turns pass at each death (swap_players $1650)
Three lives; "Fasten your seatbelt Player 1" before each lifelivegame_start_scores $1600; reference/fasten-seatbelt.png
Game over, then high-score entry by nameliveeight letters with the joystick (hiscore_entry_step $1E52); reference/game-over.png, high-score-entry.png
Title, top-scores table and a demo in turnlivethree title pages ($0FA9); the demo replays recorded joystick input (demo_input $9F40)
Music by Rob Hubbardconfirmeda 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 loadsopennot 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 Artsopennot a feature of this image; nothing in it says Delta Patrol (string sweep in the game's alphabet and PETSCII)
PauseliveRUN/STOP; fire resumes; T quits to game over (pause_check $9A30)

Beyond the documentation

Found in the code, not in the sources read.

Open questions

How the analysed state was reached

How to get from the contributor's own copy to the analysed state. Someone else must be able to follow this exactly.

The image

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.

From power-on to play

  1. Hard reset (power-cycle), then autostart delta.prg. VICE types LOAD"DELTA",8,1 and RUN; the BASIC line is SYS 2065.
  2. The crack's depacker runs and jumps to $C000, the Reflex intro ("Reflex Cracking Squad presents ** DELTA! **", "Press space to kill this intro"). About 14 seconds after the autostart.
  3. Press SPACE (matrix row 7, column 4), held until the intro reacts. The intro restores the memory it borrowed and jumps to $CB00, which copies the character ROM to $0400-$07FF, sets $2D/$2E to $B3F5 and jumps to $0810.
  4. $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.
  5. Snapshot work/entry.vsf: a stopping checkpoint on $1770, saved there. This is the image the disassembler and the listing are built from (see below).
  6. The game shows its title screen. Fire on joystick port 2 starts a one-player game; "Fasten your seatbelt Player 1" shows for about two seconds, then wave 1 begins with 3 lives.
  7. Snapshot 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.

Steady state

Hand-over against play

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:

The hand-over is chosen: it holds the program as loaded, before the game has written over any of it.

The loader, in a paragraph

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.