1985 · Ocean Software
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 | 49,311 | 75.2 % |
| Code | 4,728 | 7.2 % |
| Graphics | 23,878 | 36.4 % |
| Level data | 5,289 | 8.1 % |
| Sound | 1,606 | 2.5 % |
| Text | 1,687 | 2.6 % |
| Tables | 12,041 | 18.4 % |
| Variables | 82 | 0.1 % |
| Screen, bitmap, colour, stack, I/O | 15,835 | 24.2 % |
| Unused | 390 | 0.6 % |
This game is in 4 parts, and the map is of one of them: Part 1. The Source tab has the listing of each part that has one.
| Tier | bronze |
|---|---|
| Coverage | In the 1 of 4 parts analysed, 100 % of the bytes the game uses have a description |
| Build analysed | Ocean disk release; Part 1 at the command prompt |
| 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 |
Inventory: game documentation, consulted 30 September 2026. Imported annotations guide searches.
| Feature | Status | Evidence or open work |
|---|---|---|
| Boot and first command prompt | live | Fresh Ocean disk boot; reference capture |
| Picture/text display | live | Eight cycle-positioned register writes; full reconstructed frame matches all 104,448 emulator pixels |
| Commands and rules | partly live | LOOK, INVENTORY, rejected directions, NE/SW movement and unknown-word response observed; dispatch patching traced |
| Illustrated locations | live | All 21 captured records: native $05BF output matches decoded bitmap, screen and colour bytes; browser pixels independently compared |
| Objects and inventory | partly traced | $15E3 subtracts $32 from the noun token and searches $22A4 for the icon slot; state lookup uses the relative noun id. Empty inventory observed; controlled TAKE/DROP test verifies location, carried count and icon overlay |
| Multipart progression | open | $03A0 exchange and $9700 loader traced; later parts need captures |
| Save/load | live | SAVE stops at RTS $0491; LOAD stops at RTS $045F; serialized state unchanged after each command |
Ocean disk release. Hard reset and autostart the first entry, NEVERENDING. Space leaves the title and starts loading Part 1. Allow the load to finish, then disable warp. Space dismisses the opening narrative and reaches the command prompt in the Great Forest.
work/part1.vsf is the opening narrative: all 4,277 imported code bytes and 142 word bytes match the supplied RAM image; 29 byte-data bytes differ as state. work/part1-command.vsf is the Source snapshot after dismissing the narrative. C64MEM RAM starts at offset 209. reference/part1-command.png records that state.
Processor port $36, direction $2F; IRQ $0314 points to $A7E0, NMI $0318 to $FE47. $DD00=$C4 selects VIC bank $C000. Picture phase $A7E3 uses screen $CC00 and bitmap $E000 with $D018=$38. Text phase $A80A uses $D018=$3E and authored charset $F800-$FFFF, which matches neither character-ROM half.
The wrapper $03A0-$03E0 exchanges $CC00-$CFFF with hidden RAM $DC00-$DFFF, calls the loader at $CC00, then exchanges back. Non-fill page $D000-$D0FF is unresolved. The game is in four parts (kit/scripts/parts.py): the title, then Part 1, Part 2 and Part 3, each loaded from disk. One is analysed, parts/part-1; the title, Part 2 and Part 3 have a folder and nothing in it but their name. The route above passes through the title to Part 1. Part 2 and Part 3 are separate loads outside the capture, and this file gives no route to them.
Part 1's snapshots go in parts/part-1/work/. Use symbols_import.py games/c64/neverending-story/parts/part-1 <snapshot> on the Part-1 command-prompt snapshot, start its private project through tools.py, export with symbols_export.py games/c64/neverending-story/parts/part-1, and generate Source with listing.py games/c64/neverending-story/parts/part-1 <snapshot> on the same snapshot. The Ghidra export supplies annotations; it does not generate Source directly. No binary or snapshot is published.
VICE MCP v3.13.2 macOS arm64 passed 57/57 emulator checks, then ran with -console -sounddev dummy through tools.py vice x64sc-review. The fresh private work/part1-review.vsf supplies the rebuilt Source listing. The three reviewed code spans and ICON_17 match the preceding listing. The preceding code differs only at the already documented self-modified capitalization byte $0AFF and action-handler operands $169A/$169B. Seven data bytes differ; facts.md identifies them. Wait for each named screen rather than relying on fixed loading batches. The earlier Linux captures and their measurements above remain the original run's record.
Each part of the game has its own symbol map and listing: Part 1, symbols.json and listing.json. Write-ups, facts and symbol maps are CC BY-SA 4.0. The game itself is not hosted here.