1993 · Apex Computer Productions
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.
This game is in 8 parts, and the map is of one of them: The intro. The Source tab has the listing of each part that has one.
| Tier | silver |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Comments checked | Audited & high error rate. Every comment was audited once, but the last sample of 40 comments had 3 wrong, more than one in 30, so between 3 and 20 % of the listing’s comments are likely wrong. How listings are checked |
| Build analysed | Apex disk release, the contributor's own G64 images of both sides; sha256 of each in orientation.md |
| Copy | agent-draft |
| Tools | host: Linux 6.18 x86_64 (WSL2) on Windows 11, Ubuntu 26.04.1, Intel Core i7-3770, eight threads, display through WSLg, emulator: own build of github.com/barryw/vice-mcp, release v3.13.2, commit 1e83aab134, built with tools.py get-vice build; driven through kit/c64/vice.py; check-emulator 57 of 57; run with sound off (Sound=0 in tools/vice-home/config/vice/vicerc), disassembler: regenerator2000 0.9.20, one session for each part, publication: Python 3; symbols_export.py and listing.py, python: 3.14.4, node: 24.21.0, subagents: annotation, audit, checking and page agents on the Agent tool's opus alias, at most four at once: six annotated (three on disjoint engine ranges in one disassembler, one each on the intro, Jellyland and the ending; the lead applied Jellyland's description script to the other four lands), six audited, three checked the verify samples, three built the music player, the maps and the page, simulator: kit/cpu/cpu6502.js, for the music driver's port (24 tunes, 0 mismatched frames), the map scroller's column order, the page's mechanic ports and the missed extra life, browser: Google Chrome through the Claude in Chrome extension, for the page checks |
| Model | claude-opus-5-5 |
| Kit version | 0.0.116 |
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.
| Step | By | What it found | Of the listing |
|---|---|---|---|
| Research | claude-opus-5-5 | Looked the game up online (its manual, reviews or wiki pages) before reading its code. | |
| Annotation | claude-opus-5-5 | Wrote the listing’s comments. 100 % of the program is described, in 5,503 comments. the lead, then four agents on disjoint ranges | |
| Sample 1 | claude-opus-5-5 | 12 of 80 comments wrong, so between 9 and 24 % of the listing is likely wrong. All 12 were then corrected. all eight parts, 5,500 comments; the land files' script-written comments sampled apart | |
| Audit 1 | claude-opus-5-5 | Checked all 5,540 comments and corrected 1,101. four agents, every comment of the eight parts; 877 of the rewrites in the lands | |
| Sample 2 | claude-opus-5-5 | 10 of 80 comments wrong, so between 7 and 22 % of the listing is likely wrong. All 10 were then corrected. all eight parts, 5,501 comments; 44 from the lands, intro and ending, 36 from the engine | |
| Audit 2 | claude-opus-5-5 | Checked 1,675 of 5,501 comments and corrected 344. two agents, the engine only, for the patterns sample 2 found; engine count from sample 3 | |
| Sample 3 | claude-opus-5-5 | 3 of 40 comments wrong, so between 3 and 20 % of the listing is likely wrong. Whether they were then corrected was not recorded. the engine only, 1,675 comments |
likely wrong the sample’s range corrected right, or likely right not yet measured
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:
reference/box-front.jpg, reference/box-back.jpg): the loading instructions and the protection.reference/.| Feature | Status | Where |
|---|---|---|
| A multiload on two disk sides: side 1 boots and plays the intro, then asks for side 2 ("insert side b and press fire") | live | orientation.md; the prompt is in the protection code, $45A4-$45D7 |
| Code-sheet protection: a grid reference (e.g. "F27") and a five-digit code of colours 1-5 typed on the keys | live | $44A4-$47FF in game; answer bytes at $017B exclusive-ORed with $45 |
| Five lands in order: Jellyland, Pipeland, Spottyland, Cherryland, Rockland | live | the stage card of each; level index $CF89, file L+A-E ($CC00-$CC17) |
| Each land loaded from disk when it starts | live | the loader around $CD00-$CF0F, destination $5A00 |
| An ending after the fifth land | live | file CF, level index 5; reached by setting the index, not by playing (orientation.md) |
| A land starts sad, in grey and drab colours ("status : sad" on the stage card) | live | reference/stage-card-*.png, reference/play-*-sad.png |
| Defeating enemies gives magic dust; the MAGIC counter counts down what is still needed | traced | three decimal digits at $CF83-$CF85, set from the land's $903E-$9040 ($E54F); one off at $370F; at 000 $36F3 is set and the label flashes ($F0D9) |
| With enough dust, go to Theo's cave; the land turns happy: colours, music and monsters change | traced | the cave scene is engine code kept at $D100-$D6FF, swapped to $6000 and entered at $638D ($3BBF-$3BD3); $B785 then swaps the land's two character sets ($A900 with $7800, checked) and the page $A800 with $8900, and the sad and happy versions of each object (bytes 3 and 7 of its record); happy objects use type + 25 ($E8AE), the happy tune is $FDB6. Nothing is loaded from disk |
| In the happy land, collect a number of magic stars, then cross the finish line | traced | the star code is switched off in the sad land by an RTS written over its first byte ($B7C3); the star quota comes from the land's $9041-$9043 ($3BC6); the finish line is tested at $2B4C |
| Faster-spinning stars are worth more | traced | a star's points come from its spin delay through the table at $EDF5: 500, 200, 100, 50 or nothing ($38C4-$39A2) |
| A Super-Star bonus, on the first and last stages only | traced | "SUPER STAR BONUS" when the star count reaches 000 at the tally ($F29D); no test of the stage number was found there |
| Happy-land bonuses: point multipliers, extra lives, extra time and others | traced | items map through the land's $9075 to nine effects ($F994/$F99D): charge, multiplier, ten off the counter, power-up, extra life, one off the counter (the counter at $CF83-$CF85 holds the dust still needed while the land is sad), clock stopped for 20 ticks ($CB4B), an extra continue ($10C1), and $10D5 |
| The finish-line bonus depends on speed, measured by the slide while braking | traced | the skid distance is counted in decimal digits $1BF0/$1BF1 with a rising sound ($1EFD), worth 1000 each in the tally ($BE84) |
| Portals (rainbows): one is active; a lost life restarts there; touching another makes it the active one | traced | objects with behaviour $80-$8F; $E4E3 makes the touched one active ($1D60, bit 7 of its record's byte 0) |
| The first touch of an enemy does not cost a life, the second does; a portal or a bonus gives the protection back | traced | the first touch sets $1BB7 and starts a grace count of $64, counted down only on alternate calls ($EF4A-$EF4E), so about 200 frames by the code (not measured live); the second costs the life ($B4A8-$B5E9). The wiki's invincibility POKE at $B61D turns INC $1BB7 into a load |
| Jump on enemies to defeat them, sometimes several times or from a height | traced | an object's kind below $F7 is its strength; a stomp takes off $1BAB, which grows with the fall |
| Spiked enemies must be rammed from the front, not jumped on | traced | kinds $FB and $F7 cannot be stomped; $FC and $FA always hurt; $F8 hurts only when walked into ($B5B1) |
| The lightning power-up gives the charge: left/right + fire runs fast and rams enemies | traced | item effect 0 sets the charge flag $1BEB ($BC55); without it, right+fire moved exactly as right did (live, below) |
| Some enemies come back and give nothing the second time | traced | defeat sets bit 4 of record byte 10 ($CB02); a respawned object with it is freed without its item ($C962); $E595 clears the marks when a land starts |
| Hidden areas reached by ducking and running; platforms nearly invisible against the background | open | not searched for as such: the maps (Maps / levels tab) show every platform, but which ones are hard to see in play, and where ducking while running leads, were not tested |
| Down + fire drops through a platform | traced | player movement, $2A3A-$2FFF: glyphs below the land's $9020 are platforms he can drop through and jump up through, below $9021 walls |
| A variable jump: letting go of up early cuts the jump short | traced | jump index $1B5D with speeds from $3460 |
| An extra life for every million points | traced | when the score's millions digit $CF7A rises ($3534/$355E → $3636 → $3866), except when a 100,000-point event carries it there: then no life ($3541-$3548; parts/engine/facts.md) |
| Controls: joystick in port 2 | live | port 2 moves the player; port 1 untried |
| Left and right walk; the screen scrolls and the player stays near the middle | live | 40 frames of right move the position bytes $1BD9/$1BDA by +2, left by -2; facing $1B5E is $01 or $FF |
| Up jumps | live | the player's sprites (6 and 7) rise 66 lines and fall back in 40 frames |
| Down ducks | live | sets $1B62/$1B63 and changes $1B4D |
| RUN/STOP pauses; the stick resumes; Q while paused quits | traced | RUN/STOP with the stick centred pauses, read in the raster handler $2222; RUN/STOP up and the stick moved resumes; Q (row 7, column 6) quits from the pause ($1EAB-$1EBC) |
| Time limit: TIME counts down on the panel | live | three decimal digits at $CF86-$CF88, set from the land's table at $9044 ($BD3E) |
| Lives on the panel ("1UP x03") | live | two decimal digits at $CF81-$CF82, decreased at $BDC7-$BDD3 |
| Continues | traced | $CF8A, set to 3 for a new game ($E52D), taken at $3EAF; game over and "CONTINUE : YES/NO" at $3DEC |
| Score, nine digits on the panel; a top score on the title | live | reference/play-jellyland-sad.png, reference/title-jellyland.png |
| Two players taking turns | open | the German wiki only. The engine keeps one score, one lives counter and one set of game variables ($CF78-$CF9A), and no player number or second copy of them was found by the agents who read every routine of the engine; the title starts one game on fire |
| The intro: credits, and each dinosaur shown in two moods | differs | the dinosaur walks in in colour, then the scene flashes white and fades to grey while its name scrolls in ($8064, $8AC2, $8ADE in menu): happy to sad, not sad to happy. Ten dinosaur pages, each followed by a credits page; reference/intro-*.png |
| VSP for fast scrolling | confirmed | $2162 enters the NOP slide at $B182 + column/2 and writes $12 then $1B to $D011 on line $30; live: one recorded frame shows the two writes five cycles apart on line 50 |
| Sprites laid over the player for more detail | traced | Mayhem is sprites 6 and 7 at one position, X fixed at $AC ($E426, $EE9E); live: both rise together in a jump |
| Interlaced mixed colours | open | the German wiki's trivia. In two frames of Jellyland's sad play recorded one after the other, the colour registers got the same 11 writes and no colour-memory cell changed, so colours do not alternate between frames there; the land's graphics use checkered patterns of two colours, which a scaled-down screenshot blends into the pastel shades the wiki shows. Happy lands were not recorded |
| "A longer intro can be loaded separately" | open | the German wiki. The intro's only disk accesses are 2 loading "MENU", an Initialize ($53E2) and the loader's "GAME" ($53DE); no other file name is in menu (its "S0:MENU" at $9FF9 lies in the uninitialised tail nothing reads). Such an intro would be on another disk or release |
Found in the code, not in the manual.
$3F6F-$3F77).game holds the text DOWNLOAD BY JAZ at $49F0, in the leftover code at $4800-$4BFF that the game never runs: a link program that let another computer write and read the C64's memory, start code and set $01 over a cable in the user port (data on $DD01, handshake on $DD00), assembled to run at $1600, and a routine at $4B7B that saved $0200-$A8FF to drive 8 under the name "GAME", the span of the disk file game; BASIC's input line at $0200 still reads SYS 5632 ($1600), which started the link (work/reports/jaz.md).parts/engine/facts.md, parts/jellyland/facts.md).$BE15, lands in the lightning's timer in this build, not in the lives code; its POKE for extra time at $37FD lands on DEC $1BAA, the clock-stop counter. The wiki's POKEs may have been written for another release.Each part of the game has its own symbol map and listing: The intro, symbols.json and listing.json; The engine, symbols.json and listing.json; Jellyland, symbols.json and listing.json; Pipeland, symbols.json and listing.json; Spottyland, symbols.json and listing.json; Cherryland, symbols.json and listing.json; Rockland, symbols.json and listing.json; The ending, symbols.json and listing.json. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.