1986 · Imagine Software (Ocean)
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.
| Tier | platinum |
|---|---|
| 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 80 comments had 14 wrong, so between 11 and 27 % of the listing’s comments are likely wrong. How listings are checked |
| Build analysed | Ocean disk, 1986 (C64 Preservation Project G64, green_beret[ocean_1986](!).zip, SHA-1 eb688ed6cb3f23072c6e09671c82dd3e92da5558) |
| Copy | agent-draft |
| Tools | emulator: release v3.13.2, v3.13.2-linux-x86_64-gui.zip, disassembler: regenerator2000 0.9.20, host: Linux x86_64 (Ubuntu 24.04, cloud container), node: 22.22.0 (the port, its lockstep tests and test_play.js), Chromium headless through Playwright for the page |
| Model | claude-opus-5-5[1m] |
| Kit version | 0.0.256 |
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 | claude-opus-5-5[1m] | Looked the game up online (its manual, reviews or wiki pages) before reading its code. | |
| Annotation | claude-opus-5-5[1m] | Wrote the listing’s comments. 100 % of the program is described, in 850 comments. | |
| Sample 1 | claude-opus-5-5[1m] | 14 of 80 comments wrong, so between 11 and 27 % of the listing is likely wrong. All 14 were then corrected. 60 of the 732 hand-written comments and 20 of the 118 a decoder wrote, checked by a fresh agent against the code; 14 others that shared the wrong ones' beliefs were corrected with them | |
| Port check | claude-opus-5-5[1m] | Checked a page’s port or widget against the game and corrected 4 comments it showed wrong. the jump arc, the Prison Camp's and the Harbour's fights, corrected while the How it works and Maps pages were checked against the game | |
| Play tab | claude-opus-5-5[1m] | Ported the whole game to JavaScript for the Play tab and corrected 5 comments it showed wrong. the whole game ported routine by routine and run in lockstep with the game's code; the corrected comments are enemies_offscreen, guards_send, status_draw, helis_launch and hero_walk_map |
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.
Sources:
reference/ as ext-c64wiki-*.| Feature | Status | Where |
|---|---|---|
| Loading picture with music, waiting for a key or the stick before the game unpacks | live | the loader at $CE8C (not annotated) |
| Title page, "PRESS FIRE TO START", fire on port 2 starts a game | live | title_wait, text_credits |
| Opening scene "RESCUE THE CAPTIVES": four captives tied to posts, guards walking | live | new_game, captives_place, guards_send, captives_struggle |
| Four stages: Missile, Harbour, Bridge, Prison Camp | live | stage, map, stage_end_lo; the intermission's map names the first three (picture_map) |
| Joystick in port 2: left and right walk, up jumps or climbs a ladder, down lies down or climbs down, diagonals jump left and right | confirmed | read_joystick, player_move, player_action, player_ladder; a jump keeps the stick's direction (jump_joy) and needs up pressed again (jump_used) |
| Fire stabs with the knife | live | player_stab, knife_hit_test: standing or crouching, once per press |
| Space fires the extra weapon (flame thrower 3 shots, bazooka 4, hand grenades 3) | confirmed | weapon_trigger, weapon_fire, pickup_ammo (4, 3, 3). Port 1's fire button is on the same line and fires it too |
| Run/Stop pauses, fire continues; Q in pause ends the game | differs | this version has no pause: the code reads CIA 1 port B only for key 1 (irq_player) and SPACE (weapon_trigger) |
| Weapons dropped by the white enemies, picked up by walking over them | confirmed | enemy_deaths, spawn_pickups, pickup_update: only the white soldiers the scripted spawn table names carry one: flame throwers on the Missile Base, bazookas on the Harbour, grenades and bazookas on the Bridge and the Prison Camp |
| Enemy types told apart by colour: white (stands, drops a weapon, climbs ladders), blue (shoots, climbs), brown (runs; later crawls or carries a bazooka), green (jumps at you; skydivers on the Harbour), green-black (mortar), dogs (Harbour boss), grey-blue (grenades, Prison Camp boss) | confirmed | behaviour_table, type_top_colours: ten types. Brown soldiers and kickers never climb (enemies_ladders); paratroopers come on the Harbour, the Bridge and the Prison Camp (spawn_types); the grenade thrower is light green; the grey and blue officer throws grenades and is one of the Prison Camp fight's four types (prison_wave_types) |
| End boss announced by a siren after reaching the end of a stage; Missile: a truck letting out waves; Harbour: green soldiers with dogs; Bridge: helicopters; Prison Camp: waves from both sides | live | stage_end_reached plays the alarm (tune 11); missile_fight (the lorry crosses, then 18 soldiers and kickers), harbour_fight (a green handler and 18 dogs), bridge_fight (three helicopters), prison_fight (18 from both sides) |
| A jet bombs the player who stays in one place too long | live | jet_update: when idle_time reaches 7, 1,792 frames standing still; its bomb follows the hero (eshot_jet_bomb) |
| Mines on the ground hurt only the player | confirmed | mine_check tests only the hero's character; his projectiles destroy mines (shots_vs_mines) |
| Checkpoints within a stage: a life lost restarts from the last one passed | confirmed | lose_life, checkpoints: six a stage, play restarts 40 columns before the last one reached |
| 2 lives at the start ("LIVES 2"); an extra life every 25,000 points | differs | 2 lives (new_game); the extra lives come at 30,000, 100,000, 170,000 and every 70,000 after (next_life_check), live; none above 9 lives |
| Points for each enemy hit | confirmed | enemy_points: 200 to 850, and 2,500 for a white soldier |
| Between stages, the hero climbs over a fence into the next stage | live | hero_walk_map on the intermission's map |
| End: "CONGRATULATIONS", "MISSION ACCOMPLISHED", "NOW PROCEED TO NEXT CAMP", and the game starts again | live | rescue_walk, text 3 at $FD90; stage_complete starts the Missile Base again, with enemies firing twice as often |
| "GAME OVER" | confirmed | draw_game_over, game_over_text |
| "WELL DONE", "TARGET OVERCOME" between stages | live | text 2 (text_rescue), drawn by stage_complete |
| Siren at the start of a stage, drum roll during play, loading tune and end tune by Martin Galway | confirmed | the siren is the alarm at a stage's end (tune 11); the drums under play are voice 3 of the tunes that start play and resume it after a death (tunes 1 and 10), which goes round for ever with the driver's three-voice crash (v3_crash) once voices 1 and 2 have played their opening note; 13 tunes in tune_table |
| High score kept between games ("HI SCORE") | confirmed | hi_score_check is its only writer; new_game leaves it; as loaded it is 3,560 (live) |
| Cheat: hold 1 during a jump and the player hangs in the air until it is released | live | irq_player skips player_move while key 1 is held |
Found in the code, not in the manual.
| Feature | Status | Where |
|---|---|---|
| The second time round, every enemy that shoots fires twice as often; a third rise was planned but never happens | confirmed | fire_frame_b, fire_frame_c, loop_count |
| The difficulty creeps up every 256 frames, faster on later stages, and drops to 0 at each death | confirmed | irq_status, difficulty_rates, difficulty_caps |
| A death during an end-of-stage fight, or winning the Bridge, leaves two bytes on the stack, for the rest of the session | live | player_killed, helis_launch |
| A copy-protection check runs every frame: CIA 2's serial port must keep shifting, or the machine stops | confirmed | startup, cia2_serial_check |
| The hi score on a fresh load is 3,560, left in the saved image | live | hi_score |
| Twelve sprite shapes nobody uses: kneeling and leaping soldiers | confirmed | shapes_unused |
| The stage number was once drawn on the playfield's top row | confirmed | stage_digits, unreached |
| Voice 3 sets the music's tempo by writing past its own settings | confirmed | durations, tempo_3 |
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.