1982 · Broderbund Software

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/apple2/choplifter with me to Gold.

Footprint

Every byte of the Apple II's main 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

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 13 wrong, so between 10 and 26 % of the listing’s comments are likely wrong. How listings are checked
Build analysedBroderbund's original 1982 disk: Choplifter.woz (SHA-1 1c498365...41efc94) from archive.org's A Woz A Day collection, item wozaday_Choplifter, run on an Apple II Plus; analysed at the loader's hand-over to $0800 (orientation.md)
Copyagent-draft
Toolsemulator: Apple2TS 3.7.0 (git c900979), bundled by the kit into its server (kit/apple2), as an Apple II Plus (--model iiplus); check-emulator 49 passed, 0 failed, on 20 October 2026, disassembler: regenerator2000 0.9.20 in its Apple II mode, driven through kit/apple2/r2000.py, host: Linux 6.18 x86_64, Ubuntu 24.04, a hosted cloud session with no display, python: 3.13.16, node: 22.22.0
Modelclaude-opus-5-5[1m]
Kit version0.0.210

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 1,175 comments.
Sample 1claude-opus-5-5[1m]13 of 80 comments wrong, so between 10 and 26 % of the listing is likely wrong. All 13 were then corrected.
60 of the 835 comments written by hand and 20 of the 202 a script wrote on the shapes; the 13 wrong were all by hand, corrected with the 37 comments that said the same
Port checkclaude-opus-5-5[1m]Checked a page’s port or widget against the game and corrected 4 comments it showed wrong.
the sound effects and the attract mode, run from the listing and held to Apple2TS click for click and frame for frame, and the tank slip, run from the listing against the page's model; building the sound player found the noise routine's two comments calling it an explosion's, when a tank or a jet firing is all that calls it; drawing the helicopter at each tilt from the listing, held to Apple2TS byte for byte, found the comments on land_height_table ($7895) and heli_height ($0006) saying a tilted helicopter lands higher, when the heights only keep a skid on the ground

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
Any key starts playliveSPACE from the attract mode started the first sortie (orientation.md, step 5); read_keys ($0D92) returns carry set for any key but the game's own
The helicopter answers the joystick: up, down and sidewayslivepaddle 1 through read_stick_y ($7663), paddle 0 through read_stick_x ($769C), both by the Monitor's PREAD; pushing the stick up lifted the helicopter off the pad (play-sortie1.json)
A sustained push of button 1 reverses the helicopter's directionconfirmedturn_button ($0E3B): held until the pose passes the front, it carries on round to the other side
A short push of button 1 turns it to face the player ("tank attack" posture)confirmedturn_button: released before the pose passes the front, the helicopter stops facing the viewer ($72F9 = 0)
Button 0 fireslivefire ($0E0F): one shot a press, none on the ground or after a hit, at most five in flight ($7310); five was the most seen in flight (facts.md, "Live tests")
The helicopter can fly one way while facing another (Wikipedia)confirmedthe pose ($08) and the speed ($00/$01) are separate; scroll_view ($9CD1) treats flying backwards as its own case
Hostages are locked in barracks, 16 to a barracksconfirmedrefill ($9A47) puts 16 in each of the four and 64 in all; live, play-sortie1.json
One barracks has been blown open at the startliveopen_fourth ($9EA9) opens the fourth and lets 8 of its 16 out; at the start of play the states were 0, 0, 0, 1 and 8 were out
The other barracks must be freed (by shooting them, Wikipedia) without killing the hostagesconfirmeda blast at a closed barracks opens it (barracks_blasted, $8B4B); the same blast kills hostages within about 10 dots (blast, $881D)
All 16 of a barracks must be rescued or killed before the nextdiffersrelease ($62F2) lets hostages out of the barracks the helicopter is over, or else any open one with some left: nothing waits for a barracks to be emptied
Land near the hostages and they climb inconfirmedboarding ($6139): 8 or 9 dots right of the helicopter or 10 or 11 dots left, with the helicopter level on the ground
The helicopter seats 16confirmedboarding turns a hostage away when $730E holds 16
Landing on hostages kills themconfirmedcrush ($62D7): a hostage from 7 dots right to 9 dots left of a helicopter sitting level is crushed
Landing tilted crushes boarding hostages (Wikipedia, of the Apple II and Atari 7800 versions)differsthe crush and the boarding both need the door open ($0D), which needs the helicopter level (ground_check, $770D): tilted, it neither boards nor crushes.
Land on the pad by the post office and they scramble outlivelet_out ($6359), 13 to 63 dots right of the base; an unloading counted a hostage home (facts.md, "Live tests")
Three counters at the top: killed (red), aboard (blue), returned (green)confirmedprint_counter ($7AB4) draws the digits at X 63, 141 and 219; draw_counter_icons ($9951) draws the third little hostage in the other colour group
The most that can be saved is 64livesortie_loop ($0C13) ends the game with the crowns at 64 home; live, facts.md
Three helicopters a gameconfirmednext_sortie ($0B9B) ends the game after the third ($731C = 3)
The game ends with the third helicopter lost, or every hostage dead or rescuedlivesortie_loop: home and killed making 64 ends it; live, 63 home and 1 killed showed "THE END"
Sorties are announced: FIRST SORTIE, SECOND SORTIEliveseen at the start of play and after a crash (reference/); next_sortie picks the message from $A0FA
The last message is "The End", not "Game Over" (Wikipedia, from Gorlin)livegame_over ($0C92) draws "THE END" ($A0F6); all 64 home draws three crowns instead ($A0F8)
Jet fighters come out of the background and fire air-to-air missiles; they can be shot downconfirmedjet ($8006) and its manoeuvres at $6C00; jet_missiles ($8B5F); shot_hits ($868A) destroys a jet that has come forward
Jets bomb a helicopter on the ground (Wikipedia)confirmedjet_swoop ($8201) starts manoeuvre 4, the bombing run, at a helicopter on the ground; jet_bomb_impl ($8BF2)
Tanks amble along, kill hostages and destroy a helicopter on the groundconfirmedtank_impl ($65C3); a shell's blast (blast) hits a helicopter on the ground within 11 dots and kills hostages; a tank seen on the first sortie
Only a helicopter facing forward can shoot back at tanksconfirmedblast hits tanks only in front of the ground's depth, and only shots fired facing the viewer or turning come forward (shot_depth_table, $7FBC)
Drone air mines home in on the helicopter, the only enemy on the post office's side of the barrierconfirmeddrone ($8C42) homes on the helicopter and has no test of the fence: tanks stop short of it (tank_right, $6785) and jets leave once the helicopter is over its block (jet_cruise, $8115). Drones only appear while the helicopter is two blocks short of the fence (spawn_drone, $653A), so one gets there by following it
ESC pausesconfirmedread_keys: ESC waits for a second ESC
CTRL-S toggles the soundconfirmedread_keys flips $72F6, which every sound routine tests
The sound goes to the cassette port too, for an external speakerconfirmedevery click of $C030 is followed by a read of $C020 (click_impl, $78AB; tone_impl, $78C2; noise_impl, $76CD)
CTRL-V and CTRL-A reverse the joystick's up and down, left and rightconfirmedread_keys flips $72F5 on CTRL-V and $72F4 on CTRL-A, which read_stick_y and read_stick_x test
"Francis Scott Key plays piano at the post office", "Boris Spasskey plays chess at the post office" (the card's jokes)differsthe card's jokes only: the game draws the post office ($A0B2) and the hostages walk in at its door ($700A), and nothing more happens there
An attract mode: "your mission: RESCUE HOSTAGES" and a demonstration sortieliveafter the title, with nothing pressed; demo_loop ($0A04) flies a 32-step script ($0ADF), then the same flight mirrored

Beyond the documentation

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.