1989 · Image Works (Mirrorsoft)

About this page

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

Tiersilver
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 11 wrong, so between 11 and 30 % of the listing’s comments are likely wrong. How listings are checked
Build analysedImage Works disk, 1989 (C64 Preservation Project G64, speedball[mirrorsoft_1989](pal), SHA-256 57c5ad91...)
Copyagent-draft
Toolsemulator: release v3.14.0, v3.14.0-linux-x86_64-gui.zip, disassembler: regenerator2000 0.9.20, host: Linux x86_64 (Ubuntu 24.04.5, cloud container), node: 22.22.0
Modelclaude-opus-5-5
Kit version0.0.268

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-opus-5-5Looked the game up online (its manual, reviews or wiki pages) before reading its code.
Annotationclaude-opus-5-5Wrote the listing’s comments. 100 % of the program is described, in 1,273 comments.
Sample 1claude-opus-5-511 of 60 comments wrong, so between 11 and 30 % of the listing is likely wrong. All 11 were then corrected.
60 of the 1,273 comments, checked by a fresh agent against the code; the eleven wrong and three others that said the same things were corrected
Port checkclaude-opus-5-5Checked a page’s port or widget against the game and corrected 2 comments it showed wrong.
the pages' tests against the game's own routines: the tackle pairs (which pairs are never seen to touch) and the knockout (eight or ten wrong rounds) were miscounted in facts.md and on the Discoveries tab, and corrected

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
Menu: one player knockout, two player game, one player league, save game, load league, load knockout, load two player game, continue gameliveSELECT GAME screen; menu_handler_lo ($2283)
Three teams to choose from, differing in skill and stamina (and power, on screen)livePLAYER 1 SELECT: Verna (captain Kef), Lacata (Conroy), Draco (Verik); figures at $B9D6-$B9DE (side0_attributes_set, $3ECD)
Knockout: ten rounds, each the best of three legs; 2 points a win, 1 a draw, 0 a loss; 3 points go through, and two legs that make 3 skip the thirdtracedknockout_round_end ($8195); two legs with no points also put the team out
Opposing teams get harder as the knockout rounds go ondiffersThe screens name the templates in a shuffled order (knockout_init, $3F05), and match_restart ($31C2) loads another record's figures, which fall one template a round from a random start and wrap once from the weakest to the strongest (simulated, facts.md)
League: 11 teams, 100 points a win, 20 a draw, 5 a goal; length chosen from 10 to 100 weeks; 5 matches a week, your team rests in week 11; your team flashes in the tablediffersPoints, fixtures and the flashing row traced (league_record, $994A; league_week_end, $8519; league_table_screen, $85D6); the length is eleven weeks more than chosen: TEN WEEKS lasts 22 (simulated)
Two player game: green team plays up the pitch, red team down; a league of 10 to 100 weeks with the same pointstracedtwoplayer_week_end ($81E4): runs of ten weeks, as many as chosen; league_record for the points; side 0 green, side 1 red (player_colours, $370F)
Pitch: steel walls, a goal at each end, a warp tunnel in each side wall that sends the ball out of the other sidetracedball_move ($380E), tunnel_check ($3A7D): only a ball on the ground goes through
Ball launcher in the centre rises, rotates and shoots the ball in a random direction at the starttracedlauncher_sequence ($3739): 16-48 turns, strength 1-4; at every kick-off, after a goal too
Bounce domes deflect the ball and not the players, in a different layout for each matchtraceddome_bounce, ten layouts (domes_place, $9241), the next one after every match (match_over)
Fire throws: a short press at waist height, a held press high over the players, which can go too high for a tunnel or the goal mouthtracedplayer_move ($9E45): the throw leaves at the press, and fire held five passes more sends it high; goals and tunnels take only a ball on the ground
Fire without the ball: jump to catch it in the air nearby; otherwise tackle; slide when movingtracedplayer_move; only a jumping player takes a ball in the air (ball_pickup_side0, $3ADF)
Control passes to one player of your team at a timetracedplayers_update ($9B6E): the outfield player nearest the ball, or the holder
Goalkeeper is steered by the stick when on screen; fire with the stick centred jumps and punches; moving sideways dives; he throws the ball out on his own, straight or diagonally by his movementtracedai_keeper_bottom ($A116), ai_keeper_top ($A391): fire with left or right dives, fire with neither jumps, and he moves only while the camera shows him, sideways across the goal mouth and down to line $21A, never up. He throws as soon as he has the ball (keeper_throw_up, $3BCA; keeper_throw_down, $3BE3), across by his facing; the computer's keeper throws straight
Tackling: success depends on skill; the winner takes the loser's stamina by his strength, and the loser rolls, helpless, for a couple of seconds; a tackled keeper cannot save; a player in the air always loses; no foulsdifferstackle_resolve ($8EF5): skill counts only in a slide, and against the side that has it; other tackles go by the two players' facings. The pair table looked up through $F290 leaves 13 of the 45 pairs, 9 of them opponents, never seen to touch (simulated, facts.md)
Stamina: lower stamina means slower players and shorter, weaker throws; full again at the start of each match; meters bottom left and righttracedplayer_dir_step ($9F98, below 12 a step slower), player_move (below 6 a throw a step weaker), stamina_meters ($8C70), players_attributes_set
Save-and-collect tokens (rotating discs), spent after each match on: bribe official 2 (an extra minute of the last match, once), extra stamina 3, bribe timer 3 (longer token effects), bribe trainer 4 (duller computer, not two player), extra skill 4, reduce stamina 4, extra power 6, reduce skill 6, bribe ref 6 (one goal start), reduce power 7tracedtoken_shop ($80A3), prices $2C23; extra time is 13 bars of 40, and the skill items work against the buyer (facts.md)
Immediate-effect tiles by letter: F freeze the opponents but their keeper, R slow them, P you cannot be tackled, S your stamina up, D theirs down, G get the ball, E an electron bolt that tackles, W the ball tackles whoever it hits, M an eight-way electron burst, J reverse the opponent's stick (two player only); each timed by a ten-stage countdown; the computer cannot use themdifferstile_choose ($A994), $BB21: E and M are never chosen, and their effect entries point at W's routine; W comes up three times as often as the others; the computer collects tokens only (tile_check, $99FA)
Changes to the opponent's attributes last for good in a two player game and for the round in a one player gamediffersTwo player: the shop changes the other side's figures at once (shop_reduce_skill_now, $AEA2). One player: the handicaps $1ED3-$1ED6 apply at the next opponent_load and are then cleared (attributes_handicap, $AEF5); every match, each knockout leg and extra time included, loads the opponent again (match_restart, $31C2), so they last one match
Saving: one each of a knockout, a league and a two player game on a blank disk, formatted if it needs itdiffersmenu_save ($3C8A), game_save ($BD50): files 0, 1 and 2 by the KERNAL's own SAVE, replacing the old one; nothing formats a disk
Continue game: carry on with a saved gametracedmenu_continue ($3D2E), after a load (game_kept, $1EE9)
F1 pausesdiffersRUN/STOP pauses until fire (match_loop, $325C); F1 is not read (keys_read, $8891)
Quit during a match (F10 on other machines) ends the league or knockout with no chance to savediffersF3 quits the match to the menu with no shop and no result (match_quit_flag, $7A) and clears game_kept (menu_main, $3C26), so CONTINUE GAME refuses; but SAVE GAME tests only that a game type is set (menu_save, $3C8A), so the game can still be saved, with the week or leg not played and the tokens taken in the quit match, and loaded back
A match clock (TIME bar) and the two scores at the bottom of the screenlivethe panel below the pitch in play; 40 bars, one every 112 passes (clock_step, $3393)

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.