1987 · Firebird

About this page

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

Tierplatinum
Coverage100 % of the bytes the game uses have a description
Comments checkedNot 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 analysedRemember'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
Copyagent-draft
Toolsemulator: 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
Modelclaude-fable-5-1
Kit version0.0.93

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-fable-5-1Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationclaude-fable-5-1Wrote the listing’s comments. 100 % of the program is described, in 1,194 comments.
Sample 1claude-fable-5-111 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 2claude-fable-5-110 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 1claude-fable-5-1Checked 367 of 1,194 comments and corrected 99.
partial: every routine comment outside the first two samples; table and variable comments not audited
Sample 3claude-fable-5-15 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 tabclaude-fable-5-1Ported 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

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:

Lemon64 through the Wayback Machine and StrategyWiki refused the fetch (5 October 2026). No scan of the printed manual was found.

Features

FeatureStatusWhere
One or two players at once; player 1 on port 2, player 2 on port 1 (manual)liveupdate_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)liveplayer_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 tablelivetitle_loop $F04A
A second player can join at any time with fire, while credits last (manual)tracedcheck_rejoin $052A; not exercised with a second stick
"You start the game with an extra 9 credits" (manual)differsplay_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 liveslivelives $045A set to 3 at $0956; three dots on the panel
Blow bubbles, box up bullies, burst them (manual)liveblow_animation $2301, catch_enemy $105B, draw_burst $3D2D
Normal bubble 10 points; fire, thunder and water bubbles 100 (manual)livedraw_burst $3D2D: bursting a forced bubble of each kind scored exactly these
"Boxed-up Bully 500 pts" (manual)differsbursting 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)differsfood_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)confirmeddraw_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)confirmedspecial_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)tracedplayer_control $2162, the loop at $217A; not exercised
EXTEND letters; all six give an extra life and skip the round (manual, wiki)liveletters 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)differsletter 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)confirmedround_cleared $16F7 sets points_rank from the seconds left; place_items $2B31
Jewels 5,000 to jewelled crown 10,000 (manual)confirmedpoints_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)confirmed35 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)liveeffect_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")differseffect_clock $2F68 freezes the enemies and stops the round timer for $87 passes (seen live)
Umbrella skips 3 or 7 rounds (wiki)liveeffect_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)differsby 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)liveround_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)confirmedenemies_angry $16E4, age_objects $13BE
100 rounds (manual, wiki)confirmedevery 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)tracedboss_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)liveending $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)confirmedplace_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)tracedeffect_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)livesuper_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)openno 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)confirmedcheck_pause $7E80, check_quit $7EC1
The C64 ending is the arcade's bad ending (wiki)confirmedending $A5B7 prints CONGRATULATIONS / YOU HAVE COMPLETED BUBBLE BOBBLE / ! WHAT HEROES ! whether one or two played

Beyond the documentation

Found in the code, not in the manual.

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.