Commodore 64 · 1987 · Ocean
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.
| What | Bytes | Of 64 KB |
|---|---|---|
| Program | 60,134 | 91.8 % |
| Code | 20,094 | 30.7 % |
| Graphics | 18,014 | 27.5 % |
| Level data | 6,766 | 10.3 % |
| Sound | 8,741 | 13.3 % |
| Text | 1,776 | 2.7 % |
| Tables | 4,254 | 6.5 % |
| Variables | 489 | 0.7 % |
| Screen, bitmap, colour, stack, I/O | 5,402 | 8.2 % |
| Unused | 0 | 0.0 % |
| Tier | silver |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Build analysed | Yeti'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 |
| Copy | agent-draft |
| Tools | emulator: 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 |
| Model | claude-opus-5-5 |
| Kit version | 0.0.18 |
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:
| Feature | Status | Where |
|---|---|---|
| Goal (manual, wiki, Zzap): Zark has drained Wizworld of colour; restore the colour of eight landscapes, each drawn in three shades of grey | traced | eight 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 screen | live | sprites $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 eight | traced | $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 on | differs | $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 which | traced | $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 bounces | live | $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 control | live | $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 feature | live (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 shields | live | the 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 directions | differs | beam: 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 spray | traced | $7325: one flag $B238 says who has it; a fan of three shots ($850A) |
| Smart bomb (manual): destroys every sprite on screen | traced | $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 time | live | $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 joystick | traced | $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) | traced | only 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) | traced | nine 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) | traced | all 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", uncertain | live (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 life | traced | $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 milk | differs (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,000 | differs | every 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 paused | live | pause 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") | live | fire 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 Wiztips | live | title 750 frames, menu 650, Wiztips 1,280 ($8F75, $9017, $944D) |
| Wiztips (screen): three pages, one per press of SPACE | live | pages $41A5-$4552, table $4199 |
| High-score tables (screen): one for one-player games and one for the others; top entry "sensi soft" at 50,000 | live | $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 pressed | live | $6893, loop $691C-$6963; the rings are sprite $0C |
| Continue game feature (Wiztips three) | live | keys 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) | traced | bullets 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 spheres | traced | $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) | traced | four 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 effects | traced | nine 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" | live | tile $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 game | live | nothing 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 sprite | differs | not 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 |
Found in the code, not in the manual.
$85 every frame, and checks written in undocumented opcodes crash the game if it has not (live); one of them relies on the 6510's LXA constant being $EE. The menu and get-ready screens check the hardware vectors.$ECB4), an earlier draft of Wiztips page three ($BB0D), a level-complete routine no key reaches ($6EE4), disconnected key tests, a frame list of the Wizball spinning forwards that nothing uses ($3C1C), and a sound effect that the table skips ($3D4F).$001D are for: no traced code calls them.$0B32-$0B41 and the frame list at $3C47 are for: nothing refers to them.$831D) in the tube sequence, and whether the finished level scrolls past in colour.How to get from the contributor's own copy to the analysed state. Someone else must be able to follow this exactly.
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:
| File | Blocks | Loads | Length | What it is |
|---|---|---|---|---|
WIZBALL+11&C/REM | 195 | $0801 | 49,303 | Remember, 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 /YETI | 183 | $0801 | 46,309 | Yeti: a cracktro, then the game |
WIZBALL/IMPACT | 188 | $0801 | 47,666 | Impact: 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.
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.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").work/, each saved without ROMs: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.play-level1.vsf: the same loop top a life later (lives 1), stopped.yeti-title.vsf: the title screen, saved while running (step 2).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.
Measured in play on play-start.vsf, one player, level 1.
$01 = $35: RAM at $A000 and $E000, I/O at $D000. The KERNAL and BASIC are never called; the game owns the hardware vectors in the RAM at $FFFA-$FFFF: NMI $7C61, reset $0000, IRQ $7C73. $0314-$0319 hold zeros.$7C73) is a raster interrupt, about 12 a frame (1,195 in 100 frames). Each one takes the next entry of a display list through ($68),Y with the index at $B1CD: two bytes are written into the operand of the JSR at $7C9D (that is why $7C9E differs between cracks), the third sets the next raster line. So each band of the screen runs its own routine.$7C61) is CIA 2's timer, once a frame (99 in 100 frames): it acknowledges CIA 2 and writes 0 to $85.$640E-$6465, inside the routine at $63E0: one pass per frame (99 passes in 100 frames, PAL). It waits in $681D for the raster to be between lines $46 and $C6. It ends when $B1CF is non-zero and $B1D0 is 1.$639B-$63C7, JMP $639B at its end: the "get ready!" screen of each turn ($6893), the play routine ($63E0), and what follows it. The title and high-score screens come from the initialisation's continuation at $8F61.$94 in play: VIC bank 3, $C000-$FFFF. $D018 is rewritten by the raster bands, so a single read of it means nothing (c64-reference).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.
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.