1987 · Firebird
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 | platinum |
|---|---|
| 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 60 comments had 5 wrong, so between 4 and 18 % of the listing’s comments are likely wrong. How listings are checked |
| Build analysed | Remember's crack of the disk version ("cracked in August 2002", +12 trainers, all left off), the one file BUBBLE BOBBLE+ of a T64 archive; the game starts at $4460 |
| Copy | agent-draft |
| Tools | emulator: VICE via vice-mcp: release v3.13.2, v3.13.2-macos-arm64-gui.dmg (x64sc, PAL; host sound device set to dummy), disassembler: regenerator2000 0.9.20, python: 3.14.3, host: macOS 15.6 arm64 (Mac mini), node: 24.18.0 (the port's tests and the page check), Chrome headless over the DevTools protocol for the page |
| Model | claude-fable-5-1 |
| Kit version | 0.0.93 |
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-fable-5-1 | Looked the game up online (its manual, reviews or wiki pages) before reading its code. | |
| Annotation | claude-fable-5-1 | Wrote the listing’s comments. 100 % of the program is described, in 1,194 comments. | |
| Sample 1 | claude-fable-5-1 | 11 of 60 comments wrong, so between 11 and 30 % of the listing is likely wrong. All 11 were then corrected. 30 code and 30 data comments; slips of the same kinds rewritten with them | |
| Sample 2 | claude-fable-5-1 | 10 of 60 comments wrong, so between 9 and 28 % of the listing is likely wrong. All 10 were then corrected. 30 code and 30 data comments | |
| Audit 1 | claude-fable-5-1 | Checked 367 of 1,194 comments and corrected 99. partial: every routine comment outside the first two samples; table and variable comments not audited | |
| Sample 3 | claude-fable-5-1 | 5 of 60 comments wrong, so between 4 and 18 % of the listing is likely wrong. All 5 were then corrected. 30 code and 30 data comments | |
| Play tab | claude-fable-5-1 | Ported the whole game to JavaScript for the Play tab and corrected 16 comments it showed wrong. six agents ported the 271 routines; 47 sessions, 52,000 passes, checked in lockstep against the game's code |
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:
cheats.md).facts.md, "Text").Lemon64 through the Wayback Machine and StrategyWiki refused the fetch (5 October 2026). No scan of the printed manual was found.
| Feature | Status | Where |
|---|---|---|
| One or two players at once; player 1 on port 2, player 2 on port 1 (manual) | live | update_actors $1CBD reads $DC00 for player 1 and $DC01 for player 2; port 2 drove Bub in every test |
| Left and right walk, up jumps, fire blows a bubble (manual) | live | player_ground_input $220C; from the round-start snapshot, fire made a bubble and up a 43-pixel jump |
| "Press 1 or 2 to play" on the score table | live | title_loop $F04A |
| A second player can join at any time with fire, while credits last (manual) | traced | check_rejoin $052A; not exercised with a second stick |
| "You start the game with an extra 9 credits" (manual) | differs | play_game $08E4: eight continues with one player, seven with two; the panel shows one more than are left (9 at the start of a one-player game, seen live). A continue gives three lives and a score of zero |
| Three lives | live | lives $045A set to 3 at $0956; three dots on the panel |
| Blow bubbles, box up bullies, burst them (manual) | live | blow_animation $2301, catch_enemy $105B, draw_burst $3D2D |
| Normal bubble 10 points; fire, thunder and water bubbles 100 (manual) | live | draw_burst $3D2D: bursting a forced bubble of each kind scored exactly these |
| "Boxed-up Bully 500 pts" (manual) | differs | bursting one held enemy scores 1,000 (chain_bonus $AB52, seen live); the 500 is the food a single enemy then leaves |
| Food left by beaten enemies: banana 500, apple 1,000, garlic 2,000, melon 4,000, grape 8,000, pineapple 16,000, diamond 32,000 (manual) | differs | food_scores $A79A: 500, 1,000, 2,000, 3,000, 4,000, 5,000, 8,000 and 9,000 for the first to eighth enemy of one chain; the chain bonus itself is 1, 2, 4, 8, 10, 20 thousand (chain_bonus) |
| "It's best to destroy several enemies at the same time" (manual) | confirmed | draw_burst bursts every bubble within 24 pixels and counts the enemies; first enemy of a chain seen live |
| Water, fire and thunder bubbles; what they release flows the way the player faces (manual) | confirmed | special_bubble_kind $0CC1; water becomes a stream that runs down and along floors and carries enemies off (step_water $1B40), fire a flame that drops and burns along the floor (fire_drop $11B7, run_fires $1319), thunder a bolt that flies level, away from the side the player faces (thunder_shot $10D6). Each release seen live from a forced bubble; only thunder depends on facing |
| "You can even bounce on the bubbles (by keeping the joystick pushed up)" (manual) | traced | player_control $2162, the loop at $217A; not exercised |
| EXTEND letters; all six give an extra life and skip the round (manual, wiki) | live | letters in extend_bits $54; check_extend $32C1: with all six bits set the scene ran, lives went from 3 to 4 and the round from 1 to 2 |
| Letters "appear when destroying several enemies at the same time" (manual) | differs | letter bubbles come out of the vents in rounds the level data allows, at random (spawn_kind_switch $0C9C, item_pos_c bit 0); nothing links them to chains |
| Points items ("timing targets") are better after a quick clear (manual) | confirmed | round_cleared $16F7 sets points_rank from the seconds left; place_items $2B31 |
| Jewels 5,000 to jewelled crown 10,000 (manual) | confirmed | points_item_scores $A936: 47 items from 10 points to 12,000; the names are the manual's, the code has none |
| Magic items: candy "bubble up", shoe "speed up", bomb, potion "chance", cross "lucky", string of pearls "1 up!?" (manual) | confirmed | 35 special items, item_effect_lo/hi $2D65; see facts.md, "Special items". No effect gives a life directly, and no bomb picture was identified |
| Shoe: walk faster (manual, wiki) | live | effect_shoes $7FF1 sets the fast flag; the trainer's "fast movement" sets the same flag |
| Clock (wiki: "the time until the Baron appears is extended") | differs | effect_clock $2F68 freezes the enemies and stops the round timer for $87 passes (seen live) |
| Umbrella skips 3 or 7 rounds (wiki) | live | effect_skip_3 $7FA4, effect_skip_7 $7FA7; the first, forced in round 1, led to round 4 |
| Crosses: yellow gives fireballs, blue turns monsters to jewels, flashing destroys them (wiki) | differs | by the colours in special_item_colours: the red cross gives 19 fireballs (effect_fire_breath $A64D), the yellow one a flash and a falling block that kills what it passes (effect_sky_flash $A653), the cyan one a flood that kills every enemy (effect_flood $2DD7) |
| Baron von Blubba appears if you take too long, and cannot be beaten (manual) | live | round_timers $1578, barons_appear $1621, baron_move $1473: HURRY UP after 30 seconds, a Baron for each player 10 seconds later; nothing in the code can remove one except its player dying or the round ending |
| Enemies turn angry and faster after "hurry up" or on escaping a bubble (Wikipedia) | confirmed | enemies_angry $16E4, age_objects $13BE |
| 100 rounds (manual, wiki) | confirmed | every per-round table has 100 entries; nine rounds rebuilt from the data match the running game (facts.md, "Live tests") |
| A boss on round 100, beaten with thunder bubbles from a potion (wiki) | traced | boss_round_setup $7F86, boss_hit_test $1134, boss_move $1D84. The round and its nine-sprite boss were seen; the fight was not played |
| "About 1,000,000 points" for round 100 (wiki) | live | ending $A5B7 adds 1,000,000; forced live, the score went from 0 to 1,000,000 |
| Secret doors at rounds 20, 30, 40, 80 and 90 if no life is lost; a room worth 432,000 points (wiki) | confirmed | place_items $2B31, effect_secret_room $3621: 36 blocks at 12,000 each (432,000, the wiki's figure). The door rounds follow from next_door_level. The room itself was seen live by forcing the door item in round 1 (reference/secret-room.png); no door was reached by play |
| The door of round 50 leads to round 70 (wiki) | traced | effect_skip_to_70 $7C37 |
| Super mode: hold S, U, P, O, R and the Commodore key on the title until the border flashes red (wiki, trainer menu) | live | super_keys $45A7 in start: with the six keys held the border went red and the enemy lists were rewritten in memory, all 114 of kind 0 to kind 1 and all 72 of kind 6 to kind 5 |
| Space switches between one and two players (wiki) | open | no test of the space key (row 7, column 4) was found: every read of $DC01 in the listing was checked (read_keys $7EB6, title_loop, start). Joining is by fire (check_rejoin) |
| RUN/STOP pauses, Q quits (crack's documentation) | confirmed | check_pause $7E80, check_quit $7EC1 |
| The C64 ending is the arcade's bad ending (wiki) | confirmed | ending $A5B7 prints CONGRATULATIONS / YOU HAVE COMPLETED BUBBLE BOBBLE / ! WHAT HEROES ! whether one or two played |
Found in the code, not in the manual.
start, $4460), its lettering and its tune (title_tune, $8B00) sit in memory the game reuses for level graphics and for its copy of the screen. After the first game only the score table is ever shown.render_object ($E7CF) draws up to eighteen 24-pixel objects into freshly made glyphs every pass, in two screen buffers with a character set each, flipped by the raster interrupt.next_food_round, $59BF), every full-size plain bubble left when the round is cleared turns into falling food worth 700 points.reference/round-85.png).unpack_layout ($E299): 55 of the 100 rounds keep only their left side.skip_target $587F to current_tune $5C3F), and eight actor arrays in the unused right edge of the collision map.facts.md, "Enemies") the eight kinds resemble the eight of the arcade game, but the manual's list has six names and no pictures.$40 and $41 of the loaded character set.voice_frame uses them; no tune was compared against a recording of the SID.$15) is described from the code alone. The two six-sprite shows ($13, $14) were triggered live, but only their result was recorded, not their look.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.