1984 · Brøderbund Software
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.
This game is in 6 parts. The map is of The engine, which stays in memory; the band marked as varying holds whichever of the 5 parts loaded over it is there. The Source tab has the listing of each part that has one.
| Tier | silver |
|---|---|
| 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 8 wrong, so between 5 and 19 % of the listing’s comments are likely wrong. How listings are checked |
| Build analysed | Brøderbund's original 1984 disk, side A: Karateka.woz (SHA-1 426b1049...aa259d1f608) from archive.org's A Woz A Day collection, item wozaday_Karateka, run on the kit's enhanced IIe; the engine analysed at its hand-over to $0200 and each stage at its hand-over to $BFFA (orientation.md) |
| Copy | agent-draft |
| Tools | emulator: Apple2TS 3.7.0 (git c900979), bundled by the kit into its server (kit/apple2), as the enhanced Apple IIe, 128K; check-emulator 49 passed, 0 failed, on 24 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.17, node: 22.22.0 |
| Model | claude-opus-5-5[1m] |
| Kit version | 0.0.226 |
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 2,142 comments. | |
| Sample 1 | claude-opus-5-5[1m] | 8 of 80 comments wrong, so between 5 and 19 % of the listing is likely wrong. All 8 were then corrected. 60 of the 1,676 comments written by hand and 20 of the 466 a script wrote on the shapes; the 8 wrong were all by hand, corrected with the 23 comments that said the same, and one more the checker found outside the sample | |
| Port check | claude-opus-5-5[1m] | Checked a page’s port or widget against the game; how many comments it corrected was not recorded. the title and demo, the sixteen tunes, the ten sounds and 17 places of the four stages held to Apple2TS; the guards' brain held to the listing's code on the kit's 6502 in 673,440 cases |
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:
| Feature | Status | Where |
|---|---|---|
| Title, prologue, Akuma's chamber and a self-running demo after boot | live | stage 0; reference/title.png, prologue.png, akuma-chamber.png |
| Any key or the joystick button starts the game | live (SPACE) | the title's key test near $B7DE; other keys and the button not tried |
| The castle picture before the cliff | live | tracks 4-6, reference/castle.png |
| The hero climbs onto the cliff while the opening tune plays | live | stage 1, the tune at $0D00; reference/cliff-climb.png |
| Keys pressed during a tune are ignored (the tune's loop reads them) | live | $0D10 |
| K selects keyboard control | live | $770F-$771D sets $C4 to 1 |
| J selects joystick control | live | $76FD-$770D clears $C4, and pressing J cleared it. The manual's OCR reads "I"; the printed page says J |
| Joystick: up to stand, release for stance, buttons punch and kick, up and down aim, left and right move, up-right to run, button 1 to bow | traced | $6E00-$6E68: held up keeps the hero standing, up with a new press of button 1 bows ($6E57), letting go takes the stance; the stick is read at $6D09 and the buttons at $6D6A. The kit's emulator client has no joystick, so it was not driven |
| From stance: Q / A / Z punch high, middle, low | confirmed | $6EB9-$6ED8; each shows the punch poses $14-$16 on the hero ($20), attack types 3, 4, 5 ($6B) |
| From stance: kick high, middle, low | differs | the manual prints W / S / Z; the code reads W / S / X ($6EE0-$6EFF), and Z is the low punch. X kicks live (attack type 2) |
| From stance: RIGHT advances, LEFT retreats | live | the hero's position, $62, steps up and down |
| From stance: SPACE stands up | live | $6E78-$6E88; $6F reads $FF standing, 0 in stance |
| From standing: RIGHT runs forward | live | reference/cliff-killed-running.png |
| From standing: LEFT stops | live | RIGHT sets $29, which stays set while standing; LEFT clears it ($6E69), and the run wound down to standing still (legs pose 7) within 60 frames |
| From standing: SPACE takes a fighting stance | live | |
| From standing: B bows | live | $6F04 asks for the bow ($C2), carried out only when standing still ($66FE); the poses run 7, $0B, $0C, $0D and back. A guard standing at column $27 or less bows back ($6B00), reference/cliff-bow.png |
| ESC freezes the game until a key is pressed | live | $76AB → $778E; nothing moved for 130 frames after ESC, and play went on after a key |
| CONTROL-R returns to the demo | live | $7722-$772F loads stage 0 through $0206 unless $D2 is negative; pressed on the cliff, the title stage came back ($D0 = 0) with its prologue |
| CONTROL-S cycles music off, then sound off, then both on | live | $76B2-$76CB; from both on, three presses gave music off ($4F = 0), then the sound off too ($86 = 0), then both on |
| CONTROL-X, -Y flip the joystick's axes; CONTROL-E swaps them; CONTROL-B swaps the buttons; CONTROL-N resets all four | confirmed | $76CD-$76FB toggle $C3 (B), $C0 (E), $C2 (Y), $C1 (X); $7732-$773E clears all four. Pressed in turn, each set its flag and CONTROL-N cleared them; their effect on a joystick was not seen |
| Orange arrows bottom left: the hero's hits left; blue arrows bottom right: the opponent's | live | $B6 the hero's, $B7 the opponent's |
| One arrow lost per hit; the last one lost kills | confirmed | $0BC1-$0BD1 takes one of the hero's ($B6) and clears $5D, his alive flag, when the last goes; $0BD2 does the same for the opponent ($B7, $5E). The blows are applied at $7207 |
| Arrows come back while the fighter is not hit | confirmed | $0C06-$0C0C raises $B6 one at a time up to $B0; seen live while running |
| Standing or running, one well-aimed blow kills | live | $712A: a blow on the hero standing, running or bowing kills him, while an opponent caught so only reels. A guard in the stance kicks a standing hero within 8 columns ($6B00), so running at him is fatal. reference/cliff-killed-running.png; a script standing in stage 3 died the same way |
| Every guard has his own headgear and fighting style; they get tougher further in | confirmed | each guard wears the next headgear ($3E): 0-5 on the cliff, 1-5 in the palace, 3-6 in the dungeon. Each headgear sets the guard's chances, out of 256, of a kick, a punch and a step forward ($D7-$D9; cliff $BB75, palace $BC45, dungeon $B499): the brain ($6B00) picks a move by the distance from the stage's tables, then the move goes ahead only if a random byte is below its chance. Each guard also has more arrows than the last ("Beyond the documentation") |
| The hawk, sent by Akuma, deflected by well-timed punches or kicks | live | stages 2 and 3, reference/palace-hawk.png, palace-hawk-struck.png, dungeon-hawk.png. It comes from the right edge at one of three heights, two columns a frame ($B653 palace, $A8F9 dungeon). Three to five columns from the hero, a kick or a full-stretch punch at its height strikes it and it flies off; closer, it pecks him, each peck counted as a punch on him ($40 = 2) ($B589, $A806). In the palace each hawk comes sooner than the last |
| The falling portcullis | live | stage 2, reference/palace-portcullis-fallen.png; how to pass it under "Beyond the documentation" |
| Falling off the open cliffside | live | on the first screen a hero who steps back past the edge sets $A2 ($BA91); the next frame starts the fall ($B8BD), four pictures ($AC3F), and at $A1 = $30 he is dead. Retreating in the stance from the start of the cliff, reference/cliff-fall.png |
| Cutscenes: Akuma ordering attacks, Mariko waiting | live | reference/palace-akuma-and-hawk.png, mariko-cell.png |
| Fighting Akuma | live | stage 4, reference/akuma-duel.png, akuma-fight-mariko-watching.png. His chances of a kick, a punch and a step are all $FF ($B700), and he moves and strikes on every frame ($B895, $B8C7), where the dungeon's guards do so on alternate pages |
| Approaching Mariko in a fighting stance: she kicks the hero dead | live | stage 4, reference/mariko-kicks-hero.png. $BB05: she holds out an arm (pose $20, the picture at $1F00) while he comes standing, and takes pose $24 while he is in the stance; reaching column $13 when her arm is not out, he is kicked ($9A = $FE, pose $21), a killing blow ($B91D) |
| Approaching her standing: she is rescued, and the closing text | live | reference/ending-embrace.png, ending-text.png. With her arm out, at column $16 the embrace begins ($BB44): twenty steps of her poses ($BB72), then the eight lines of closing text ($A321) |
| "The end" after the hero dies | live | reference/the-end.png |
| Side B: the whole game upside down | open | work/karateka-side-b.woz kept, not analysed |
Found in the code, not in the manual.
orientation.md, step 7.orientation.md, "Steady state").Each part of the game has its own symbol map and listing: The engine, symbols.json and listing.json; Title, story and demo, symbols.json and listing.json; The cliff and the gates, symbols.json and listing.json; The palace, symbols.json and listing.json; The lower palace, symbols.json and listing.json; Akuma's chamber and the ending, symbols.json and listing.json. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.