1984 · Software Projects
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,748 | 92.7 % |
| Code | 7,415 | 11.3 % |
| Graphics | 13,438 | 20.5 % |
| Level data | 19,030 | 29.0 % |
| Sound | 2,050 | 3.1 % |
| Text | 85 | 0.1 % |
| Tables | 18,678 | 28.5 % |
| Variables | 52 | 0.1 % |
| Screen, bitmap, colour, stack, I/O | 3,490 | 5.3 % |
| Unused | 1,298 | 2.0 % |
| Tier | bronze |
|---|---|
| Coverage | 100 % of the bytes the game uses have a description |
| Build analysed | CMM disk release; The Bathroom after trainers N, N, N |
| Copy | agent-draft |
| Tools | host: Linux x86_64, disassembler: regenerator2000 0.9.20, publication: Python 3; symbols_export.py and listing.py, browser: Firefox 157.0 (installed); WebDriver BiDi, emulator: VICE MCP 3.13.1 |
| Model | gpt-6.1-sol |
| Kit version | 0.0.46 |
Sources: game documentation and the contributor’s annotated listing, consulted 30 September 2026. The documentation supplies the feature inventory; the annotations supply leads for verification.
| Feature | Status | Evidence or open work |
|---|---|---|
| Explore connected rooms | partly live | $2E55 copies all 60 records exactly; $2EE5 expansion matched all 30,720 cells. Exit-transition behavior remains open |
| Jumping and platform collision | partly live | Input-only bathroom jump and no-input control agree with the vertical curve; remaining collision classes are traced leads |
| Collect objects | live mechanism | All 80 records and nine count/rejection cases checked at $15FB; routes to every item remain open |
| Guardians, arrows and ropes | partly live | Rope staging at $16DE matches all 34 positions. Guardian/arrow collision and rope attachment remain open |
| Return to bed after collection | open | $0400 changes Maria visibility; complete winning input route is not demonstrated |
Imported annotations are leads until traced or exercised in this run. The boot itself is observed live.
| Character and sprite display | live | Complete recorded frame matches all 104,448 emulator pixels |
|---|---|---|
| Title music | live | Native playback ends at decoded stream pointers; the end flag and zero volume match |
| Death and spare lives | live mechanism | Eight checkpoint fields and six counter cases agree at $38EF |
| Maria after collection | partly live | Flag suppresses sprite writes; existing enable bit persists until room setup. Player route for that corner case is open |
| RESTORE and reset | live | Restart stub reaches RAM title on RESTORE, BASIC ROM on CPU reset |
The contributor’s CMM D64 was recovered from repository history into private work/game.d64. Directory: JET SET WILLY+ (126 blocks), JET SET WIL.PIC (15 blocks). Autostart the first file on a hard-reset PAL C64 in VICE MCP 3.13.1, explicitly resuming after reset/autostart if paused.
Wait for the animated CMMO intro. Hold fire on control port 1 until its exit/fade starts, release, and wait for the trainer. Its live read at $2AF7 requires $DC01=$EF; Space and port 2 fire did not dismiss it. Choose N for unlimited lives, N for the second option and N for the third (hold each for 60 frames, release for 30). After decompression the title appears; advance 600 frames and save work/title.vsf without ROMs. Hold Return for 60 frames, release, advance 120 frames. Confirm THE BATHROOM and save work/play.vsf without ROMs.
Take snapshots with pause() in kit/c64/vice.py, not a bare pause call. Frame batches must stay within the emulator tool’s accepted limits; wait for the named screens rather than assuming a timed loading batch completed.
The fresh title and play snapshots each match every one of the imported analysis’s 6,777 code-typed bytes and 514 word-typed bytes. Byte-typed differences from the old title capture: 104 at the newly booted title, 957 in play. No code bytes differ between fresh title and play; sprite slots $4000–$6AFF also agree. Room ranges differ at 16 bytes in $B000–$CDFF and 24 bytes in $E000–$FDFF, so room/session state is not assumed immutable.
The title IRQ vector is $0314=$A801; play installs $0314=$33E1. Thus play preserves the full imported code and authored sprite data while establishing the game’s own initialized handlers and room state. The Source listing uses work/play.vsf, with labels/types/comments seeded from the Ghidra export, inspected in regenerator2000 and exported through symbols_export.py. It is generated by listing.py alone.
This is one resident game load. The earlier crack intro and trainer are boot provenance. The imported models are unknown and are recorded in game.json; the original text export is private. Silver needs normal coverage/verification and a maintainer check.
VICE MCP 3.13.1 health check on 30 September 2026: 55/57 passed; pause-at-instruction and unpaced-calls failed. Use the pause workaround and paced calls. The emulator runs with sound disabled on a virtual X display. No headless VICE build is used because the kit reports broken CPU stopping there.
Rebuild the disassembler project with symbols_import.py <game> work/play.vsf, start it through tools.py r2000, export with symbols_export.py, then listing.py <game> work/play.vsf. Binaries, snapshots and projects remain private.
The final cold hand-over snapshot is work/entry.vsf, stopped at $3C23 after answering all three trainer prompts with N. The RLE decoder jumps there at $0140; port $37, DDR $2F, CIA2 $97 and $D018=$15 were observed. It matches all 7,415 code-typed bytes of the play image. The retained copy routine under I/O can be executed in a controlled test, but its entry did not run on this CMM boot.
VICE MCP v3.13.2 macOS arm64 passed 57/57 emulator checks, then ran through tools.py vice x64sc-review with -console -sounddev dummy. The fresh private work/play-review.vsf supplies the rebuilt Source listing. All 7,415 code bytes and 560 word bytes match the preceding listing; 24 byte-data bytes differ at $79E0 onward. Wait for the trainer, title and Bathroom screens: the loader can take longer than a fixed frame batch. The earlier Linux measurements above describe the original capture.
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.