1985 · Elite Systems

About this page

This minisite was contributed by air, RealSnoddas. It’s agent-generated and needs a human editor. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to curate games/c64/commando 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

Tiersilver
Coverage100 % of the bytes the game uses have a description
Comments checkedAudited & low error rate. Every comment was audited once, then the last sample of 70 comments had 1 wrong, so between 0 and 8 % of the listing’s comments are likely wrong. How listings are checked
Build analysedREMEMBER's crack "Commando +5HD" (CSDb release 40672, June 1997): a D64 headed "once upon a time", ID "-rem-", with the packed game and a saved high-score file. Compared with the 1985 Elite PAL release from the C64 Preservation Project at the hand-over to the game ($0850): 29 of the game's 19,450 bytes differ.
Copyagent-draft
Toolsemulator: release v3.13.2, v3.13.2-linux-x86_64-gui.zip (VICE x64sc, PAL), disassembler: regenerator2000 0.9.20, host: Linux x86_64, Ubuntu 24.04.5 cloud container, four cores, no display, python: 3.13.16, node: 22.22.0, browser: Chromium 1194 via Playwright 1.56.1 (preinstalled in the container)
Modelclaude-opus-5-5[1m]
Kit version0.0.147

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
Researchnot recorded, claude-opus-5-5[1m]Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationnot recordedWrote the listing’s comments.
first run, 52.8 % of the image; every comment later rewritten
Annotationclaude-opus-5-5[1m]Wrote the listing’s comments.
second run rewrote every comment from the bytes, to 100 %
Sample 1claude-opus-5-5[1m]12 of 70 comments wrong, so between 10 and 28 % of the listing is likely wrong. All 12 were then corrected.
60 hand-written and 10 map comments
Audit 1claude-opus-5-5[1m]Checked all 897 comments and corrected 137.
four agents in disjoint ranges
Sample 2claude-opus-5-5[1m]1 of 70 comments wrong, so between 0 and 8 % of the listing is likely wrong. It was then corrected.
60 hand-written and 10 map comments; fifteen more with the same claim corrected with it
Annotationclaude-opus-5-5[1m]Wrote the listing’s comments. 100 % of the program is described, in 862 comments.
22 October 2026: a comment on the one byte of typed data no label reached, $1000

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
Move Super Joe through a vertically scrolling battlefieldlive$3A8C: eight directions; up scrolls the map once he is near the top of his zone. In 500 frames walking up, the screen moved 60 map rows.
Start the game with joystick firelive$0F48 waits for fire alone on port 2.
Fire the M60 machine gun with the fire buttonlive$39C3: two bullets for each press, the second two or three frames after the first. Four presses made two bullets each.
Throw grenades with Spacelive$38A5, reading the keyboard row at $DC01 through REMEMBER's hook $5F6A. The count fell by one and the grenade appeared.
Start with six hand grenadesdiffersFive: $0883 sets $04FF to 5, read live at the start of play, and every life tops it up to five ($3DE0).
Collect flashing boxes to replenish the grenade countlive$2A5A: three grenades and 1,000 points; the box flashes between two colours every 8 frames. A box put under the player in slot 5 added them.
Fight through three areas, each ending at a fortress where enemies storm out in wavesconfirmedAreas 0, 1 and 3 are played ($0939); the first two end at a gate in a wall, the third at the fortress. Twenty soldiers come out at the top, one chance in 128 a frame ($2CBB), and the area is won when all have come and none is left ($3A8C). The area order and the messages between them were seen live.
Enemies include soldiers, bazooka users, vehicles, and soldiers behind walls who leave cover as the player passestraced41 behaviours ($24D4): rifle soldiers, jumpers, grenade throwers, bomb throwers, mortar men in trenches, snipers, foxholes, doors that let soldiers out, bunker guns, a motorcycle and sidecar, a lorry that drops soldiers, a jeep, guards with a prisoner. Soldiers lying in wait get up when the map has carried them down to y $82 ($2FA4). Doors, the mortar man and one grenade thrower are only in the unused fourth spawn list ($1D42) and never appear.
A lost life restarts the player shortly before the place he was hitconfirmed$3DE0 restarts at the first checkpoint at or below the row reached: rows 19, 61, 97, 131 and the area's start ($3EBC). Every area began at its last checkpoint, live.
An extra life every 10,000 pointslive$134F: each carry out of the score's low byte. 9,900 plus 1,400 gave a life.
After the third area the game starts again, alternating between normal and slightly faster enemy fireliveThe area counter goes on to 4 and area 0 again; the fire mask ($3EB4) lets a soldier fire every 64, 32 and 16 frames in the first loop and every 16 in the second, then repeats. The masks $3F, $1F, $0F, $0F were read live.
The score wraps from 999,999 to 000,000, in the high-score list tooliveThe score counts hundreds in four BCD digits ($134F), so it wraps after 999,900: 999,900 plus 1,400 showed 001,300, and gave a life. The high-score table keeps the same two bytes ($0F36).
The grenade count wraps after 99liveTwo BCD digits, and the box's add drops the carry ($2A90): 98 plus a box made 01.
Lives count to 256 in binary but show as decimal digits, so a large count shows graphics characterslive$13F1 prints the binary count's two hex digits as glyphs: ten lives showed 0 and glyph $2B.
Sprites flicker and the game slows down when many enemies are on screentracedThe main loop waits for the next frame tick ($400C), so a pass longer than a frame waits for the one after. The multiplexer reuses hardware sprites at lines worked out from the sorted slots ($41A7, $4266, $436B), whatever the slots' positions. A quiet stretch ran 497 passes in 500 frames; a crowded one was not measured.
Play the title score during gameplayconfirmedTune 0, started at the title and again at each area ($0883, $08B8). All three voices changed during play.
Save the high-score list to disk, with a reset optionconfirmedREMEMBER's addition, not Elite's (C64-Wiki lists it among the crack's features). $44E0 saves $0EED-$0F47 to @S:COMMANDO HI /REM after a name is entered; the menu's L loads the file, and R saves the table in memory over it ($4621, $44FF). The saver ran in a recorded session; the drive's write was not checked.
Up to five trainer options, chosen one by oneliveREMEMBER's addition ($4531): unlimited lives, unlimited grenades, no falling, no collisions, and a C= key that ends the area. The lives and collision patches kept the player alive through the area tests.

Beyond the documentation

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

work/Commando.d64, a 35-track D64 of 174,848 bytes, the contributor's own copy. Its header reads once upon a time with the ID -rem-, and it holds two files:

FileBlocksWhat it is
COMMANDO+5HI/REM120REMEMBER's packed release: the 1985 game with the crack's instructions, menu, trainer and high-score saver
COMMANDO HI /REM1the saved high-score table: a load address and 91 bytes for $0EED-$0F47

This is not the original release. It is REMEMBER's "Commando +5HD" (CSDb release 40672, June 1997). What the crack added or changed is in facts.md, "REMEMBER's changes".

From power-on to play

  1. Start VICE with python3 kit/scripts/tools.py vice, hard-reset, and autostart file 1 of the disk (autostart in kit/c64/vice.py with the file number 1). File 2 is data: autostarted, it stops at READY.
  2. After about 30 seconds REMEMBER's screens are up. Press Space, wait a few seconds, then press RUN/STOP, which leaves the crack's instructions for its menu: T for the trainer, H for the high scores. Press H.
  3. The menu asks L (load the saved table) or R (keep the table in memory and save it over the file). Press L. The drive loads COMMANDO HI /REM to $0EED and the game starts at $0850.
  4. An execution checkpoint at $0850, armed before L, stops the machine at the game's entry. Saved without ROMs, that is work/entry.vsf, the snapshot the listing is built from (work/scripts/to_entry.py).
  5. The COMMANDO title follows; fire on joystick port 2 starts a game. From entry.vsf, 300 frames and a press of fire reach the first area (work/scripts/live.py). work/title.vsf and work/play.vsf were saved on that route, at the title and in the first area.

Choosing T at step 2 asks five yes-or-no questions before step 3 and patches the game (facts.md); no listing snapshot was taken that way.

Steady state

In play the processor port reads $36 (BASIC banked out, KERNAL and I/O in). The IRQ vector at $0314 points at $4116, which jumps through the handler pointer at $0406; each raster handler sets the next ($4119, $416A, $41A7, $4266, $436B). CIA 1's timer is stopped, so the KERNAL's interrupt does not run. The NMI vector points at an RTI at $0A4D. The VIC-II reads bank 3 ($C000-$FFFF), the screen is at $E000, and the character set changes with the area ($D018).

The whole game is in memory at $0850: code, three maps, four character sets, the sprites and the music. Nothing is loaded during play; the disk is used only by REMEMBER's code, to load and save the high scores.

Three recorded runs of the code map (kit/c64/codemap.py, kept as codemap.json) cover the title, play through every area with the trainer's area skip, game overs, the name entry and the save.

The loader, in a paragraph

The program on disk is REMEMBER's packed file. It depacks itself, shows the crack's instructions and menu, and hands over to the game at $0850 from the menu or, after a name has been entered and the table saved, from the saver at $44E0. The depacker was not traced.

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.