1985 · Elite Systems
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 | silver |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Comments checked | Audited & 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 analysed | REMEMBER'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. |
| Copy | agent-draft |
| Tools | emulator: 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) |
| Model | claude-opus-5-5[1m] |
| Kit version | 0.0.147 |
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 | not recorded, claude-opus-5-5[1m] | Looked the game up online (its manual, reviews or wiki pages) before reading its code. | |
| Annotation | not recorded | Wrote the listing’s comments. first run, 52.8 % of the image; every comment later rewritten | |
| Annotation | claude-opus-5-5[1m] | Wrote the listing’s comments. second run rewrote every comment from the bytes, to 100 % | |
| Sample 1 | claude-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 1 | claude-opus-5-5[1m] | Checked all 897 comments and corrected 137. four agents in disjoint ranges | |
| Sample 2 | claude-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 | |
| Annotation | claude-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
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:
commando_elite_1985_pal, a G64), compared with this copy.lemon64.com/doc/commando/148, lemon64.com/review/commando/30) were read on 2026-10-06; on 2026-10-10 the site answered every fetch with a browser check (HTTP 403).| Feature | Status | Where |
|---|---|---|
| Move Super Joe through a vertically scrolling battlefield | live | $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 fire | live | $0F48 waits for fire alone on port 2. |
| Fire the M60 machine gun with the fire button | live | $39C3: two bullets for each press, the second two or three frames after the first. Four presses made two bullets each. |
| Throw grenades with Space | live | $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 grenades | differs | Five: $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 count | live | $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 waves | confirmed | Areas 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 passes | traced | 41 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 hit | confirmed | $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 points | live | $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 fire | live | The 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 too | live | The 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 99 | live | Two 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 characters | live | $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 screen | traced | The 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 gameplay | confirmed | Tune 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 option | confirmed | REMEMBER'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 one | live | REMEMBER'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. |
$33B2, $310A). Inside the box he neither turns nor fires.$E8 with the player level at x $64 fired every bullet to the right; at x $C8 he fired at the player (work/scripts/aimbug.py).$2A5A, $2495). Live: 9,500 points and five grenades became 11,500 and eleven (work/scripts/boxbug.py).$23E7, $254F).$23E7, $2ABC).$371E).$3DE0).$3EBC).$0939): its map and restart rows are area 1's, its spawn list and terrain area 3's, and its character set is the font ($3EB0, $3ED0, $1485, $14A5, $1427). An unused fourth spawn list ($1D42) and terrain table ($198B) are in memory.$0FAD). Its loop sets up and draws an eighth view from one byte past each of its tables (area counter $53, row 160, $1001, $1008), then jumps straight back to the title, which draws the credits over it. Live: stopped as each view was set up, the eighth read row $A0 and counter $53, and 60 frames later the screen showed the credits.$1D42), so they never appear in play; one of the grenade throwers (10) is in no list at all. The fourth list fits none of the three maps: drawn over each, eight of its nine doors stand in open ground and the ninth (row 157) on the left gate of area 3's first wall. On area 3's map its trench soldier and mortar man (row 9) stand in the fortress's two windows, and its two walking soldiers come in after 80 frames at the height of row 99, with its grenade thrower at row 104, as area 1's do ($1CC1). The mortar man's recoil flag is shared with the trench soldiers ($2579), and with no mortar man and one trench soldier in the lists in use, the sharing never shows.$10, which it can never equal ($26BF).$0C88).$5F6A).$09A5, $0A0D: 7 here, 6 in the 1985 release). In the 1985 release a game that does not beat the seventh score writes its score over the eighth entry, keeping that entry's name, without a name entry, even when the score is lower. Live: in the 1985 release, a game over at 2,500 left DILK 002500 in eighth place and one at 0 left DILK 000000, neither with a name entry; this copy asked for a name at 2,500 and left the table alone at 0 (work/scripts/live1985.py).$8000 ($085C), so a reset restarts the game at $0850, before the KERNAL has set up the chips. The restarted game runs with the screen off, because with the processor port's direction register cleared the gunsight copy ($0A57) writes into the video chip and $D011 gets $20. It cannot be started either: CIA 1's port A is all inputs, so it reads $EF with fire, never the $6F the title waits for ($0FB2). Live: after a reset at the title the first write to $D011 came from $0A6A with $20, and fire never started a game until $DC02 and $DC00 were set as the KERNAL leaves them (work/scripts/reset_d011.py, reset_fire.py). The attract views of area 3 are drawn from the BASIC ROM (attract1985.py). REMEMBER removed the copy, so this copy goes to BASIC on a reset.work/scripts/walk1985.py).facts.md, "The 1985 release").How to get from the contributor's own copy to the analysed state. Someone else must be able to follow this exactly.
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:
| File | Blocks | What it is |
|---|---|---|
COMMANDO+5HI/REM | 120 | REMEMBER's packed release: the 1985 game with the crack's instructions, menu, trainer and high-score saver |
COMMANDO HI /REM | 1 | the 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".
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.COMMANDO HI /REM to $0EED and the game starts at $0850.$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).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.
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 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.