1989 · Activision

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/power-drift 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 7 wrong, so between 6 and 22 % of the listing’s comments are likely wrong. How listings are checked
Build analysedActivision original disk, PAL, Securispeed loader (C64 Preservation Project: power_drift[activision_1989](pal).g64)
Copyagent-draft
Toolsemulator: VICE 3.10, the vice-mcp release v3.14.0, v3.14.0-linux-x86_64-gui.zip, disassembler: regenerator2000 0.9.20 (cargo install --locked from crates.io), host: Linux x86_64, Ubuntu 24.04, no display (cloud container), node: 22
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 573 comments.
Sample 1claude-opus-5-57 of 60 comments wrong, so between 6 and 22 % of the listing is likely wrong. All 7 were then corrected.
40 hand-written comments and 20 a script wrote from the game's tables
Port checkclaude-opus-5-5Checked a page’s port or widget against the game and corrected 1 comment it showed wrong.
the music player and the time bonus widget, each run against the game's own code in a test beside its page (test_music.js, test_bonus.js); count_bonus's comment still counted the bonus in decimal

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
Joystick in port 2livethe select screen and the race answer port 2
Left and right steerlivemove_player slides the road ±3 a race frame and turns the kart's picture; bends photographed while steering (work/bendcheck.py)
Up accelerateslivethe speed read-out climbs with up held (work/play-a1.vsf)
Down brakestracedmove_player: with down held the kart slows twice a race frame
Fire changes gear, low and high (LO/HI on the panel)tracedgear_change: low gear tops out at 126 km/h, high at 224
Space pausestracedpause_on_space: hold, let go, press and let go again
Twelve drivers to choose from; fire picks the one under a cursor that runs along the row of facestraceddriver_cursor_loop: the cursor moves by itself every 21 frames
Five courses, A to E, chosen with the stick on the select screenliveleft and right move the highlight between the five pictures
Each course has five stages: 25 races in alltracedcourse_table, stage_won, course_complete
A place in the first three moves the player on to the next stagetracedplace_finisher: when three karts have finished before the player, game_over
Each stage of a course changes the scenery: road markings, obstacles, nighttracedeach stage's record gives its own scenery list, character blocks, colours and horizon (course_a-course_e)
The track rises and falls like a roller coaster, and the kart can fall off it, losing timetracedpiece_climb, piece_crest, piece_descent, piece_jump; drop_kart_back
Collisions with the other kartstracedplace_rivals: a slower rival at distance 1 in front makes the kart spin (kart_spin)
Race panel: the eleven rivals' faces, time, score, gear, stage, lap, speed in km/h, high score, the player's placelivework/shots/play-04.png
The player's driver turns to look back at a kart just overtaken (64'er review)tracedhead_looking_back, from show_place when the place improves
Podium with three karts stacked after a race (wiki screenshot "Auf dem 3. Platz gelandet")tracedplace_finisher puts each finisher in a sprite band with its face from the front and a 1st, 2nd or 3rd label
Title screen "POWER DRIFT / PRESS ANY KEY", credits Chris Butler and Dave Lowe (wiki screenshot)differsnot in the game's code after the hand-over: the loader calls code at $C800 and $6800 while it loads, later overwritten (facts.md, Build)
High-score table on the select screen: seven names of three letters and seven scoreslivework/shots/cm-select.png; the names and scores are stored at $0BEA
Name entry for a new high score ("NAME ENTRY" and an alphabet at $0B8D)tracedhigh_score_check, name_entry
"GAME OVER" ($0A56)tracedgame_over, show_game_over
"CONGRATULATIONS" ($10A3)tracedcongratulations, after the fifth stage of a course
Music by Dave Lowe on the SIDtracedthe driver at $B800, two tunes (tune_table): the race's and the name entry's

Beyond the documentation

Found in the code, not in the manual.

FeatureStatusWhere
The time bonus is counted down in binary after being worked out in decimal, so it pays more than it shows, and shows letters A to F while it countslivecount_bonus, draw_score's CLD; work/bonus_live.py, reference/bonus-hex.png
The bonus ignores the minutes: seconds 46 to 59 wrap to a bonus of 99 to 86, and exactly 45 pays 256,000tracedshow_bonus; the kit's simulator (work/bonus_test.js)
The race clock counts race frames, so it runs about 1.4 times as fast as real timeliverace_clock; work/clock_live.py
Effects 1 and 4 (an engine hum) are in the driver but never startedtracedreferences to sound_effect; sound_engine_off called by nothing
The select screen is silent: its interrupts never call the sound drivertracedselect_irq_top, select_irq_mid; sound_play's two callers
The chequered marker sprite shares eight bytes with the panel's text, hidden under the top borderlivesprite_83; $D017 read in a race
A rival is solid only at one distance, and only when slower than the playertracedplace_rivals

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.