1986 · Imagine Software (Ocean)

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/green-beret 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.

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 80 comments had 14 wrong, so between 11 and 27 % of the listing’s comments are likely wrong. How listings are checked
Build analysedOcean disk, 1986 (C64 Preservation Project G64, green_beret[ocean_1986](!).zip, SHA-1 eb688ed6cb3f23072c6e09671c82dd3e92da5558)
Copyagent-draft
Toolsemulator: 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
Modelclaude-opus-5-5[1m]
Kit version0.0.256

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. 100 % of the program is described, in 850 comments.
Sample 1claude-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 checkclaude-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 tabclaude-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

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
Loading picture with music, waiting for a key or the stick before the game unpackslivethe loader at $CE8C (not annotated)
Title page, "PRESS FIRE TO START", fire on port 2 starts a gamelivetitle_wait, text_credits
Opening scene "RESCUE THE CAPTIVES": four captives tied to posts, guards walkinglivenew_game, captives_place, guards_send, captives_struggle
Four stages: Missile, Harbour, Bridge, Prison Camplivestage, 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 rightconfirmedread_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 knifeliveplayer_stab, knife_hit_test: standing or crouching, once per press
Space fires the extra weapon (flame thrower 3 shots, bazooka 4, hand grenades 3)confirmedweapon_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 gamediffersthis 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 themconfirmedenemy_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)confirmedbehaviour_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 sideslivestage_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 longlivejet_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 playerconfirmedmine_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 passedconfirmedlose_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 pointsdiffers2 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 hitconfirmedenemy_points: 200 to 850, and 2,500 for a white soldier
Between stages, the hero climbs over a fence into the next stagelivehero_walk_map on the intermission's map
End: "CONGRATULATIONS", "MISSION ACCOMPLISHED", "NOW PROCEED TO NEXT CAMP", and the game starts againliverescue_walk, text 3 at $FD90; stage_complete starts the Missile Base again, with enemies firing twice as often
"GAME OVER"confirmeddraw_game_over, game_over_text
"WELL DONE", "TARGET OVERCOME" between stageslivetext 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 Galwayconfirmedthe 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")confirmedhi_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 releasedliveirq_player skips player_move while key 1 is held

Beyond the documentation

Found in the code, not in the manual.

FeatureStatusWhere
The second time round, every enemy that shoots fires twice as often; a third rise was planned but never happensconfirmedfire_frame_b, fire_frame_c, loop_count
The difficulty creeps up every 256 frames, faster on later stages, and drops to 0 at each deathconfirmedirq_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 sessionliveplayer_killed, helis_launch
A copy-protection check runs every frame: CIA 2's serial port must keep shifting, or the machine stopsconfirmedstartup, cia2_serial_check
The hi score on a fresh load is 3,560, left in the saved imagelivehi_score
Twelve sprite shapes nobody uses: kneeling and leaping soldiersconfirmedshapes_unused
The stage number was once drawn on the playfield's top rowconfirmedstage_digits, unreached
Voice 3 sets the music's tempo by writing past its own settingsconfirmeddurations, tempo_3

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.