1990 · Thalamus

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/c64/creatures 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.

This game is in 15 parts, and the map is of one of them: Title and loader. The Source tab has the listing of each part that has one.

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 80 comments had 11 wrong, so between 8 and 23 % of the listing’s comments are likely wrong. How listings are checked
Build analysedThalamus's two-sided disk release, G64 images of side A (SHA-256 4544cf5d…) and side B (b30bb735…) from the C64 Preservation Project's collection; the title says 1990, the collection 1991 (orientation.md)
Copyagent-draft
Toolsemulator: release v3.13.2, v3.13.2-linux-x86_64-gui.zip, disassembler: regenerator2000 0.9.20 (cargo install from crates.io), host: Linux x86_64, Ubuntu 24.04, no display (cloud container), node: 22, browser: Chromium from Playwright (headless), for the page check
Modelclaude-opus-5-5[1m]
Kit version0.0.158

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-5[1m]Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationclaude-opus-5-5[1m]Wrote the listing’s comments.
Sample 1claude-opus-5-511 of 80 comments wrong, so between 8 and 23 % of the listing is likely wrong. All 11 were then corrected.
60 hand-written and 20 generated comments; the 123 comments that shared their beliefs corrected with them
Port checkclaude-opus-5-5[1m]Checked a page’s port or widget against the game and corrected 15 comments it showed wrong.
the stage maps, run against the game in the emulator: the band colour comments at $12BE-$12CE
Annotationclaude-opus-5-5[1m]Wrote the listing’s comments. 100 % of the program is described, in 5,379 comments.
the engine's bytes no label reached described: the KERNAL's work area at $027C-$02FF, and the first byte of world1_ranges' tables at $CFBC; the comments on those tables corrected, which had each named the table one byte later

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
Disk version loads from side A with LOAD"*",8,1; a multi-load that asks for side Blivereference/loading-insert-side-b.png
Title with credits and a scroller; fire to startlivereference/title.png
High-score table ("Todays top heros") and attract sequence on side Blivereference/attract-high-scores.png
Three levels of two stages each, a torture chamber after every second stage, then the endinglivestage table, files LA LB TC LD LE TF LG LH TI CJ
Get Ready screen names the stage and shows the Magic Potion Creatures to collectlivereference/get-ready-1-1.png
Get Ready: joystick left or right turns the music on or offliveright set the music option $12B4 to 1 and drew the on icon (characters $EE/$EF at $47E4), left set it back to 0 and the off icon ($EC/$ED); engine raster_ready_icons
RUN/STOP pauses; moving the joystick resumesliveRUN/STOP set $123D, and the scroll position and timer stood still for 100 frames; a push to the right cleared it; engine raster_bottom. The pause needs the joystick centred
Q while paused quits the gamelivequitting returned to the attract sequence
Up makes Clyde jumpliveClyde's y went from 93 up to 72 and back in 17 frames on level 1.1; engine player_control
Fire fires the current weaponlivea short press left one shot in the air ($123F = 1); engine player_fire
Fire held for a second and released breathes a large flamelivethe charge ($1236) stops at 36 frames, about three quarters of a second; released then, both shot sprites became the flame for 24 frames ($1238); engine player_fire, flame_draw
Down then fire shows the weapons tablet; left and right with fire held pick a weapon, releasing fire selects itlivereference/weapons-tablet.png
A weapon's grade is its colour on the tablet: red 1, green 2, blue 3tracedeach grade's icon flashes through a six-colour cycle: grade 1 black, red, light red, yellow, light red, red; grade 2 the greens; grade 3 the blues (engine grade_colour_lo/hi, cycles at $B42D, tablet_icon_colour)
Only weapons bought in the shop appear on the tablettracedthe tablet turns through owned_weapons ($2592): a new game leaves Droopy alone in it (player_reset), and only the shop adds to it (shop shop_buy, shop_leave)
After each stage Clyde enters the witch's hut (the shop)livereference/witch-shop.png
Shop: left and right view the weapons, fire buys at the shown grade if there are enough Magic Potion Creatures and the weapon is below its top grade (grey)tracedshop shop_buy: each of the three potion counts must reach the item's cost, a weapon at grade C is refused and its costs are blanked (shop_show_item); in the shop the tablet turns without fire held
Shop: the I icon buys up to three clues for the next torture chambertracedINFORMATION costs 6/6/6; the counter $CFED goes from 2 to 5, one clue each, and is set back to 2 at each chamber (shop shop_buy, engine a_CFED)
Shop: the E icon (EXIT) leaves the shopliveused to reach each stage
Weapon prices in the three kinds of Magic Potion Creature: Droopy 0/1/1, Super Droopy 2/0/1, Fireball 2/1/2, Fall Up 3/1/2, Wiggler 2/1/2, Curly Wurly 3/2/1, Flamer 6/3/4, Scatter Ball 3/5/5 (C64-Wiki)tracedthe same in the shop's cost tables (shop item_cost_1-3), which add INFORMATION at 6/6/6
Magic Potion Creatures are collected during each stagetracedengine player_hit_object: touching a creature showing frames $B6-$BB adds 1 to its kind's count (5 when its sprite is double height) and to the total; each level's spawn records place them (potion_add)
An enemy dies only if it flashes white when hittracedengine object_flash_one: a hit that does damage turns the object white for three frames; an object with hit points $FF flashes without turning white and cannot be killed (shot_hit_object)
Some enemies are linked: hitting one hits the otherstracedspawn record byte 8 bits 4-6 name a linked group, and a kill takes the whole group with it (engine object_kill_linked); the levels' end creatures and hidden prizes use it
A torture chamber holds a captured Fuzzy who must be saved to go on, a puzzle against a time limitlivechamber 1: with the boulder falling and the fuse lit the cannon fired, the demon was carried off and the WELL DONE screen followed; climbing the jack brought the chainsaw demon, who sawed the Fuzzy and cost a life (part torture-1); reference/torture-1.png. A time limit as such was not looked for
Underwater sections with an oxygen supply (C64-Wiki)livelevel 2.1's ponds: Clyde swims and an OXYGEN bar under the score empties; rising bubbles fill it (part level-2-1); reference/play-2-1-swimming.png
End-of-level demons (C64-Wiki)tracedeach level's last spawn record in its end slot ($8F0C) is a creature asleep until the scroll reaches the end; killing it within three columns of the end starts the stage-complete countdown (engine object_kill): the green dragon (1.1), a double frog (1.2), a crescent that splatters (2.1), a flipping stone (2.2), a patterned block (3.1), a waving ghost (3.2)
Hidden extras (C64-Wiki)tracedobjects of type 55 show a blank sprite, cannot be touched or shot, and die only with their linked group, turning into potion creatures or an extra life: 21 spawn records in levels 1.1, 1.2, 2.2, 3.1 and 3.2 hide ten potion creatures and nine extra lives; of the other two, level 1.1's dies as a puff of smoke and level 3.1's is in no group, so nothing kills it
Parallax scrolling (C64-Wiki)traceddone with characters: while the landscape scrolls, the background's characters have their bit patterns rotated at their own rates, so grass, woods and graves move past more slowly (levels 2.1 and 3.1's frame routines)
Stage timer and lives in the status panellivereference/play-1-1.png
Cheat: once the title music stops and the high-score table shows, holding CTRL and 2 gives infinite lives (C64-Wiki, marked not tested). Live: the high-score fuzzies turn grey (the wiki says Clyde) and the instruction that takes a life becomes three NOPs (title_cheat_step)livereference/cheat-grey-fuzzies.png
Poke 15596,60: invulnerability (C64-Wiki, not tested)traced$3CEC holds LDA $24F0 in player_hurt; 60 ($3C) makes it a three-byte NOP, so the BEQ after it always returns, except on the path the time-out takes ($1215 set): Clyde still dies when the timer runs out
Poke 44183,173: unlimited shields (C64-Wiki, not tested)traced$AC97 holds the DEC $12A0 that uses up Clyde's spare hit (player_dying_wait); 173 ($AD) makes it LDA, so the spare hit is never used up
Poke 7328,208: unlimited lives in the main game (C64-Wiki, not tested)differslive: $1CA0 holds DEC $B7BF, and 208 ($D0) turns it into a branch that is not taken, after which the bytes run as other instructions with interrupts off; at the first lost life the game hung on a blank panel. 7328,173 (LDA) kept the lives at 4 and went on to the Get Ready screen
Pokes 33734, 33952 and 33505 to 173: unlimited lives in torture chambers 1, 2 and 3 (C64-Wiki, not tested)tracedeach address holds the chamber's own DEC $B7BF ($83C6, $84A0, $82E1 in files TC, TF and TI); 173 makes it LDA
The high-score table is not saved to disk (C64-Wiki review)tracedthe only disk traffic is loading: every file is opened with secondary address 0 (engine kernal_open_file), and the drive commands sent are the fast loader's M-W and M-E (fast_loader); no part's code calls SAVE or sends a write command
An ending sequencelivefile CJ (part ending): a text screen, then three animated scenes; reference/ending-text.png, reference/ending-village.png, reference/ending-rave.png, reference/ending-hearts.png

Beyond the documentation

Found in the code, not in the manual.

Open questions

Each part of the game has its own symbol map and listing, parts/<id>/symbols.json and parts/<id>/listing.json; the ids are the ones in its Source pages’ addresses. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.