1985 · Nintendo

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/nes/balloon-fight with me to Gold.

Footprint

Every byte of the NES's 64 KB address space: 2 KB of RAM, the chips' registers and the cartridge, 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 13 wrong, so between 13 and 34 % of the listing’s comments are likely wrong. How listings are checked
Build analysedBalloon Fight (USA).nes, the original cartridge program on an NROM-128 board (mapper 0): 16 KB of PRG at $C000 (mirrored at $8000) and 8 KB of CHR, with an NES 2.0 header; CRC32 of the PRG and CHR 401349A8
Copyagent-draft
Toolsemulator: jsnes 2.1.0 (npm), in the kit's server (kit/nes/jsnes_server.mjs), an NTSC NES; check-emulator 36 passed, 0 failed, on 18 October 2026, disassembler: regenerator2000 0.9.20 in its NES mode, on the project kit/nes/project.py builds from the snapshot, host: macOS 27.0.1 on Apple silicon (a Mac mini), python: 3.9.6, node: 24.18.0, browser: Google Chrome 141 (the Mac's own), headless with a profile under tools/chrome-profile, for the page screenshots, and driven through its DevTools protocol for the Play tab
Modelclaude-fable-5-1
Kit version0.0.199

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 713 comments.
Sample 1claude-fable-5-113 of 60 comments wrong, so between 13 and 34 % of the listing is likely wrong. All 13 were then corrected.
30 code and 30 data comments; a fresh agent; every comment that repeated a wrong detail corrected with it
Port checkclaude-fable-5-1Checked a page’s port or widget against the game and corrected 0 comments it showed wrong.
the sound driver, the phase renderer and the flight port, each held to the game's code or the emulator; the sound effect names corrected from the recordings are counted in the annotation
Play tabclaude-fable-5-1Ported the whole game to JavaScript for the Play tab and corrected 7 comments it showed wrong.
one agent ported the 168 routines of the game to JavaScript (reference/bf-port.js) and held them to the game's own code in lockstep from the reset vector, 100,000 frames on each of three seeds through every mode; the sound driver runs as the game's bytes on the kit's 6502

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
Title screen with three options, A 1-player game, B 2-player game, C Balloon Trip, a balloon as the cursor; Select moves it, Start begins; both work on controller 1 onlylivereference/title.png, reference/title-balloon-trip.png; Select and Start checked from work/title.json.gz
The title screen starts a demonstration game by itself after a while; Select or Start during it recalls the menulivereference/demo.png (the demo after the title, with both scores and TOP); the code's timer is open (Data Crystal says $19 wrapping)
Control pad left and right move the balloonist: he runs on the ground, accelerates in the air; up and down do nothingconfirmedactor_controls reads bits 0 and 1 of buttons only; up and down are never read (read_joypads, actor_move_control)
A flaps once; B flaps continuously; the flap is the only liftconfirmedactor_controls ($EC38): A once per press through flap_latch, B on every control pass, at most one flap every 9 frames; flap_strength by type; flaps counted live (facts.md)
The player has two balloons; an enemy hit pops one and the second makes rising harder; with both gone the player falls into the water and loses a lifelivereference/one-balloon.png (one balloon left, phase 1)
Flying off one side of the screen brings the player back on the otherconfirmedactor_move_x lets X wrap; only Balloon Trip clamps it (actor_physics)
Enemies on the ground blow up a balloon, take off and fly around; hit from above, the balloon pops and the enemy parachutes down; hit again on the way down he drops into the waterconfirmedactor_think ($EBC4) pumps and launches; resolve_hit pops and hit_next_type puts the bird on its parachute, then falling
A parachuting enemy that reaches land blows up another balloon and comes back "even stronger": three colours, pink, green, white, from slowest to fastest (StrategyWiki); a white one does not improve furtherconfirmedactor_ground_state lands it; actor_think relaunches one colour faster from relaunch_types; the three speeds are the physics tables by type
Kicking an enemy on the ground while he inflates boots him into the waterconfirmedresolve_hit with the bird's action 2 up: hit_scores
A bubble floats up from the water when an enemy sinks; popping it scoresconfirmedactor_physics turns a sunk bird into a bubble (actor_balloons $80); actor_bubble_update scores 500
The fish in the water eats a player, or an enemy, who flies too close to itconfirmedfish_update and its routines ($C5C3-$C716); the fish fanfare
When a round goes on too long a thunder cloud throws lightning: a spark that bounces diagonally until it meets the water; at most two sparks at once (StrategyWiki)livereference/lightning.png at 30 s in phase 1; lightning_countdown, two slots in spark_state
Propellers (the booklet's name; "Flipper" in other sources) appear from later rounds: a spinning bar that throws whoever touches it; up to four in a stage (StrategyWiki)livenone before phase 7 (phase_layout_7), four in phase 10; propeller_touch, propeller_push; up to 10 slots
A round is cleared when every enemy is gone; rounds add enemies and platformsconfirmedphase_loop ($F327); the phase table in facts.md
After every three rounds a bonus round: balloons rise from chimneys at the bottom, twenty of them; popping all twenty gives the perfect bonus; a popped player balloon comes back for the bonus round; falling there costs no life (two players)livereference/bonus-round.png; bonus_layout at every fourth index; bonus_round_play; the second balloon comes back through actor_physics ($EB62)
Phase number shown at the start of a round (PHASE-01)livereference/play-phase1.png, taken as the words fade
2-player game: both players on screen, cooperation or competition; a player can pop the other's balloonlivereference/two-player.png; the popping is open
Balloon Trip: one life, the scene drifts from left to right, balloons to pop and sparks to avoid; the rank out of 50 is shown at the top right; twenty balloons in succession give a "super high score", which StrategyWiki describes as the balloons' value rising a rank, up to three rankslivereference/balloon-trip.png (RANK-47); the ranking and the streak are open
Lives: three in games A and B, one in C; lost by sinking, the fish, lightning, or both balloons poppedconfirmedstart_game gives 2 spare (lives), the third is the one in play; Balloon Trip sets 0; phase_loop respawns and game_over ends
Start pauses with a tone; the sprites are hidden while pausedlivereference/pause.png
Top score resets to 10,000 (games A and B) or 25,000 (game C) at power-onliveTOP-010000 on reference/play-phase1.png, TOP-025000 on reference/balloon-trip.png
Scoring, games A and B: enemy balloon 500, 750 or 1,000 by colour; parachute 1,000, 1,500 or 2,000; kick 750, 1,000 or 1,500 (the colours' order from StrategyWiki, the ranges from the booklet); the other player's balloon 1,000; a bubble 500; a bonus-round balloon 300 to 700; the perfect bonus 10,000 to 30,000confirmedhit_scores, hit_scores_kicked, bonus_values, perfect_tens_table: the table in facts.md; the colours match StrategyWiki's
Scoring, Balloon Trip: a balloon 300 to 700, a bubble 500, twenty in succession "? points" (the booklet's own text)confirmedset_balloon_value (300, 500, 700 by bonus_round), 500 a bubble (actor_bubble_update), 10,000 for 20 in succession (trip_loop, $C348)
Extra lives: the booklet says nothing; a search found no documented thresholdconfirmedthere is none: nothing reads the score but add_score's top-score compare and the ranking; lives is only ever decremented after start_game
Game over textlivereference/game-over.png; show_game_over

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.