Commodore 64 · 1987 · Ocean

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/wizball 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.

WhatBytesOf 64 KB
Program60,13491.8 %
Code20,09430.7 %
Graphics18,01427.5 %
Level data6,76610.3 %
Sound8,74113.3 %
Text1,7762.7 %
Tables4,2546.5 %
Variables4890.7 %
Screen, bitmap, colour, stack, I/O5,4028.2 %
Unused00.0 %

Status

Tiersilver
Coverage100 % of the bytes the game uses have a description
Build analysedYeti's one-file crack, WIZBALL /YETI on the c64.com disk WWW.C64HQ.COM (with Impact's and Remember's cracks beside it); the game starts at $6389
Copyagent-draft
Toolsemulator: VICE 3.10 via vice-mcp 3.13.1: own build of github.com/barryw/vice-mcp, release v3.13.1, commit fdc435caee (Linux x86_64 GTK3 build from source, run under Xvfb), disassembler: regenerator2000 0.9.20, python: 3.11.15, host: Linux 6.18 x86_64, Ubuntu 24.04 cloud container with four cores and no display, widget tests: node 22.22.2 (the ports checked against emulator traces, the game's own code in a 6502 simulator, and the game's screen memory); Chromium 141 through Playwright 1.56 for the page check, subagents: nine annotation agents and one music port agent, all claude-opus-5-5
Modelclaude-opus-5-5
Kit version0.0.18

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
Goal (manual, wiki, Zzap): Zark has drained Wizworld of colour; restore the colour of eight landscapes, each drawn in three shades of greytracedeight levels of three colours in $B1D1; $776D puts each finished colour over one grey ($B27D-$B27F)
A level is three target colours, darkest grey first (manual); each target is mixed from red, green and blue droplets in a proportion shown in a fourth cauldron at the far right (manual, Zzap: yellow is equal red and green, orange more red than green)traced$776D: the first colour replaces $D022, dark grey. The fourth cauldron is drawn in the target colour and filled to the mix $B12E = sum of min(units, recipe) ($9E2C); recipes $B2C0: yellow 10/10/0, orange 15/5/0, as Zzap says
The colour recipe of each level (wiki: level 1 is 100 % red, then 50 % red + 50 % blue, then 50 % green + 50 % blue, and so on for all eight)live (level 1's first colour)$B1D1: level 1 red, purple, cyan, as the wiki says; the full list in facts.md. On level 1 the target colour $B51A was 2 (red) and 20 red units completed it
Cauldrons (manual): droplets collected fill the red, green and blue cauldrons at the bottom of the screenlivesprites $B9-$BC in the bottom border ($8B46), filled a row a frame ($9E81); units $B12B-$B12D, at most 20
Colour on three landscapes at a time (manual, hints): only three landscapes have aliens, one with red spheres, one green, one blue; completing a landscape clears its aliens, except on level eighttraced$9F5F makes alien lists for the highest open level $B1CE and the two below it only, sphere colours from $B18B. A level done out of order, or any of the top three once $B1CE reaches 7, keeps its aliens
Level access (manual, Zzap): level four opens when level one is complete, level five when level two is, and so ondiffers$A9C6: $B1CE = 2 + the levels done counted from level 1 with no gap, so level five needs levels one and two; tubes go up only as far as $B1CE ($81D3)
Tubes between levels (manual, wiki, Wiztips three): tubes and craters take the Wizball up or down a level; arrows near each tube say whichtraced$8389-$83A6: a mouth $C2/$C3/$C6/$C7 goes up if the arrow $BE is within three characters to its right; $81C9 moves the level. Level 1's three tubes all go up (its map, offline)
Spin control (manual): stick left puts left-hand spin on the Wizball, right puts right-hand spin; at first it only bounceslive$80F8 (spin ±6 a frame to ±48), $818E (speed from spin, at bounces only until thrust); holding left and right on port 1 rolled the landscape both ways
Thrust and anti-grav (manual, icon 1): thrust lets the Wizball move left and right; anti-grav stops the perpetual bouncing and gives full controllive$7379; with both (a continued game) the stick moved the Wizball from line 73 to 199 and rolled it left
Pearls and the icon bar (manual): certain aliens leave a green pearl; each pearl collected lights the next of the seven icons at the top; wiggling the stick left and right takes the lit icon's featurelive (the pearl)pearl: state 5, frame $78, colour 5 ($A93C); collected at $7E63 for 100 points, lighting the next icon ($72AA); four stick reversals within 10 frames each take it ($723D, $72D2)
What leaves a pearl (Zzap: "a molecule or eight aliens"; c64.com review: "every eighth alien shot")differs (live)the ninth kill since the last pearl ($A9AA = 9; spheres do not count) and every molecule (type 1). A poked hit with the counter at 8 gave a pearl, at 0 an explosion
The seven icons (manual, Wiztips one): 1 thrust or anti-grav; 2 beam or double; 3 catelite; 4 blazers; 5 wiz spray or cat spray; 6 smart bomb; 7 shieldslivethe handlers in that order through $B549; the icon bar in reference/play-level1.png
Beam and double (manual): beam is a "supa-beam" weapon; double gives Wiz and Cat fire in two directionsdiffersbeam: arcs above and below the Wizball, three steps of four frames ($8592, $85F2). Double alternates the Wiz's shot direction at each press ($84B6) and does nothing to the cat's shots
Blazers (manual): stronger fire for Wiz and Cat, "use sparingly"traced$731A sets $B236; Wiz and cat shots use characters + 3 and colour 12 ($84E3, $888D)
Wiz spray and cat spray (manual): multi-directional fire; Wiz and Cat cannot both have a spraytraced$7325: one flag $B238 says who has it; a fan of three shots ($850A)
Smart bomb (manual): destroys every sprite on screentraced$7394 sets every alien slot's hit flag and flashes the background; the grey bonus object (type 7) shrugs it off; the icon is not used up
Shields (manual): Wiz and Cat are protected for a limited timelive$73B0, $7EA5: 40 units, one per 50 frames, 8 per collision (both measured), off below 5
Catelite (manual, Wiztips two): the cat follows Wiz; in one-player games holding fire and moving the stick steers the cat (and leaves the Wizball without control); in the two-player team game the cat has the other joysticktraced$8640 (follows the Wizball's position eight frames late); $697D: fire held 10 frames hands the stick to the cat while the Wiz fires by itself
Only the cat collects droplets (manual, Wikipedia)tracedonly the cat's test handles droplets ($88C2); the Wizball's handles pearls ($7E7C)
The cat has nine lives (Zzap), refilled in the Wiz-lab if it is still alive; it squeals when close to dying (Zzap)tracednine hits ($8657, $B26C); the lab resets the count unless it is negative ($ABD3); on its last life the cat flashes and its shots play sound 4
Droplet types (Wiztips two, wiki, Zzap): red, green and blue chemical; mutant cat (purple); filth raid (light blue); bonus Wizball (white); indestructacat (grey: 128 lives); freaky bits (black)tracedall six by the droplet's colour at $88C2/$8902; which special comes when: $A763 against five random thresholds ($A772-$A776)
Bonus stage after each colour (manual, Zzap): in space, aliens in formation; extra lives by shooting Wiz's lookalike, "if the image makes a noise" (manual); Zzap's OCR reads "shooting 255 of them gains an extra life", uncertainlive (the stage)22 frames after a colour completed, $646F ran and the formation flew under "colour completed" (reference/colour-completed.png); the lookalike (bonus type 19) gives a Wizball when shot ($A7E2); no noise test was found
Ending the bonus stage early (wiki reader's review): a deliberate collision ends it and costs no lifetraced$65DA-$65F5: a hit ends the stage with the tally only
Wiz-lab (manual, Zzap): choose one weapon or control to keep from birth on every later Wizball, or 1,000 points times the Wiz-level number; the Wizball is parked while Wiz stirs his pot and the cat drinks milkdiffers (points)$AB20; the choice is icons 1-5 into $B116 ($B076), replayed every life; with none taken, (9 - level) x 1,000 ($ADBB), not level x 1,000. The lab and its icons were reached live
A finished level is shown in colour while its bonus is counted (Zzap)traced$AE11: the finished landscape scrolls by itself paying 10 points a frame; the colour was not checked live
Scoring (manual): aliens 10-500; pearl 100; droplet 150; completing a colour 2,000; completing a level 7,500; aliens killed in the bonus wave 40 each; Wiz points in hand level × 1,000differsevery landscape alien 50 (all 18 types; one kill measured live), bonus-stage aliens 0-150; pearl 100; a droplet 50 for the sphere plus 50 when caught; colour 2,000 (100 a unit in the lab); level about 7,500 (10 a frame of the scroll); bonus wave 40; clearing a landscape's list 1,000 (not in the manual)
An extra Wizball every 100,000 points (manual)traced$71BB: when the 100,000s digit changes
Keyboard (manual): RUN/STOP pauses and resumes; ↑ raises the firing volume; = lowers it; Q quits the game while pausedlivepause and Q live ($6EB7, $6ED7); the volume keys traced ($BA82: the shot sound's sustain, 0-15)
Game options (manual, screen): one player; two players taking turns; two-player team; three players (a team against one); four players (two teams)live (the menu)reference/title-player-menu.png; records $B2AC
The port is chosen by pressing fire (manual, Zzap's "intelligent joystick sensing")livefire on port 1 or 2 at "get ready!" makes it the Wiz's ($6965, $B240), every turn
Attract sequence (screen, Zzap): the title and high-score table, then the player menu over a starfield, in turn; SPACE shows Wiztipslivetitle 750 frames, menu 650, Wiztips 1,280 ($8F75, $9017, $944D)
Wiztips (screen): three pages, one per press of SPACElivepages $41A5-$4552, table $4199
High-score tables (screen): one for one-player games and one for the others; top entry "sensi soft" at 50,000live$BDB9 and $BE37; "sensi soft" is the best side's ten-character message ($B6AA), not a name
"Get ready!" (screen): rings circle the words until fire is pressedlive$6893, loop $691C-$6963; the rings are sprite $0C
Continue game feature (Wiztips three)livekeys 0-5 on the title or menu ($AF85) up to the first unfinished level of the last game ($AF7D); with $AF7D poked, key 4 started level 5 with levels 1-4 done and four weapons
Hiding beneath the horizon gives immunity to alien bullets (Wiztips three)tracedbullets are freed over any character of $80 or more, which the ground and the scenery are made of ($9AD6); not tested live
BOREWIZ (wiki: type it on the player-selection screen and the Wizball is invulnerable except in the bonus stage; Remember: type WIZBOREWIZ on the title screen to switch collisions off)live$AF85 on the title and menu; $BB07 stops a hit ending the life except while $B874 is set ($7EF4); WIZBOREWIZ works because only the last seven keys count
Colour spheres shoot on later levels (Wikipedia)traced$A027: aimed from level 5, eight ways from level 7
Waves come in groups (Wikipedia): four or five on the landscape at a time, at least one of them colour spherestraced$9F9B: groups of 4, 6 or 12 of one type; six aliens at most at once; nothing enforces a sphere group
Completing all eight levels leads somewhere the reviews do not describe (Zzap: "that's for you to find out")traced$AEF3, $AF20: a finale picture from map columns 92-95 and about ten seconds of flashing colour and random sounds, then the game again from level 1 with every alien firing every 10 frames
Scenery: parallax scrolling (wiki category); a small Mount Rushmore on level three (Zzap)tracedfour star layers ($747E); Mount Rushmore is tiles $BC-$BE three times on level 3's map (row 10)
Music and sound (Zzap, wiki): Martin Galway's title tune, a high-score tune and jingles, and sound effectstracednine tunes ($5525), among them the high-score (name entry) tune, and 26 effects ($3C5F); the driver ported and checked frame by frame against the game's code, playable on the page
Remember's bug 1: "matrix in level 5"livetile $F8 at $092B draws sound data beside level 5's first well (reference/level5-stray-tile.png); Remember's crack stores $00 there
Remember's bug 2: shields still active after quitting and restarting the gamelivenothing clears $7F06 on the way from Q to a new game
Remember's bug 3: with the spray, the icon at the top showed the Catelite's spritediffersnot a bug by the game's own rule: like every icon, the spray's shows what the next take gives, the cat spray (image $0A, the cat's face) after the Wiz takes it. Remember's crack swaps images 8 and $0A in the handler

Beyond the documentation

Found in the code, not in the manual.

Open questions

How the analysed state was reached

How to get from the contributor's own copy to the analysed state. Someone else must be able to follow this exactly.

The image

Wizball.d64 (174,848 bytes, SHA-256 118d12e3f880a6bc013c332571b2cb9663021c4e4c981d2322f9d950f17cbfab), the only file in wizball.zip as served by c64.com's download for game 237 on 24 September 2026. Disk name WWW.C64HQ.COM, ID 00 2A. It holds three cracked one-file versions, separated by empty DEL entries:

FileBlocksLoadsLengthWhat it is
WIZBALL+11&C/REM195$080149,303Remember, release 78, December 1997, cracked by Jack Alien from the tape: intro, typed manual, the tape's loading picture, an 11-option trainer, and three bugs it says it fixed
WIZBALL /YETI183$080146,309Yeti: a cracktro, then the game
WIZBALL/IMPACT188$080147,666Impact: a one-line scroller intro, then the game

The analysed version is Yeti's. Every address in this folder is from it. Impact's crack, taken to the same title screen, differs from Yeti's in 787 bytes from $0200 up. 657 of those bytes also change in Yeti's own memory between its title screen and play, so they are the game's working state. Of the other 130, 111 lie in $FD12-$FFF9, which is still zero in Yeti's memory in play (the game has not written it by then) and holds leftovers in Impact's; the last 19 are title-screen state at $0432, $043B and $4696-$4715, and the operand at $49A7-$49A8 that the code at $499B and $49A1 rewrites. So two crackers working independently left every byte the game does not change identical, which is the evidence that it is the original. Remember's version differs across all of $6000-$BFFF and is not used; its release notes name three bugs in the original that it fixed ("matrix in level 5", shields still active after quitting and restarting, the wrong sprite on the spray icon), which features.md carries as claims to check against Yeti's code.

From power-on to play

  1. Attach Wizball.d64 and autostart WIZBALL /YETI (four spaces). The emulator types LOAD"WIZBALL /YETI",8,1 and RUN, and turns warp on; turn it off (WarpMode 0) once the cracktro shows.
  2. About 30 seconds in warp after the load starts, Yeti's cracktro appears: a big YETI logo, colour bars, "YETI FACTORIES PROUDLY PRESENT WIZBALL" and a scroller. Press SPACE (vice_keyboard_matrix, held half a second). The screen fills with garbage for two or three seconds while the game is unpacked, then the game's title and high-score screen appears ("WIZBALL", "TOP SCORES", "1. 050000 sensi soft").
  3. Press fire on joystick port 2 (held 0.4 s). A "get ready!" screen with circling rings appears and waits. Press fire again (held 0.5 s): play starts on level 1 with the Wizball materialising over a grey landscape.
  4. Snapshots in work/, each saved without ROMs:
  5. play-start.vsf: the first pass of the frame loop after that second fire press. A stopping checkpoint on $640E was armed as the button went up; the machine is stopped there, lives 2, score 0.
  6. play-level1.vsf: the same loop top a life later (lives 1), stopped.
  7. yeti-title.vsf: the title screen, saved while running (step 2).
  8. impact-title.vsf, remember-title.vsf: the other two cracks at their title screens, for the comparison above. Remember's was reached by answering N or RETURN to every trainer question.

The disassembler is started on play-start.vsf.

Steady state

Measured in play on play-start.vsf, one player, level 1.

Emulator: own build of github.com/barryw/vice-mcp, release v3.13.1, commit fdc435caee (Linux x86_64, GTK3, from source, under Xvfb). check-emulator on it, four runs on 24 September 2026: 53, 54, 54 and 56 of 56. The failures were determinism-running-save and determinism-restart (three runs each) and step-instruction (one run); the same release as downloaded (the v3.13.1-linux-x86_64-gui.zip) failed the same three, intermittently. So snapshots here are saved from a stopped machine, and runs are compared by what the game wrote rather than by the machine at a stop.

The loader, in a paragraph

Yeti's file is a BASIC line that lists as an empty line 1001 and hides a SYS 2066 behind an early end-of-line byte; the machine code at $0812 unpacks Yeti's cracktro, which runs under the KERNAL's interrupt until SPACE. Then a depacker running in $0100-$03FF unpacks the game over the whole of memory and jumps to the game's entry at $6389, which switches $01 to $35 and jumps to its own initialisation at $EC00. That initialisation copies a 12-byte routine to $001D (nothing calls it), turns off CIA 1's interrupts and goes on through JMP ($EC91), whose pointer is the operand of an instruction further down, to $EC2C. From there it reaches CIA 2 only through offsets (STA $DC8E,X with X = $7F is $DD0D), so a search for the register addresses finds nothing: timer A gets $4CC7, one PAL frame, and starts at raster line $1E as the NMI; timer B is left running free, and the random-number routine at $7533 reads it. Then it fills pages 1 to 3 with a running exclusive-OR pattern, copies the hardware vectors from $B62D, writes RTS at $EC2C and random bytes over $EC2D-$EC8D (the part of itself that has run), selects VIC bank 3, overwrites the pointer at $EC91 with values read from CIA 2, and jumps to the title sequence at $8F61. The cracktro and depacker are not annotated, by policy; the initialisation is the game's own and is.

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.