1985 · Ocean Software

About this page

This minisite awaits a maintainer’s check. Models this site has not proven yet worked on it (gpt-6 and one whose name was not recorded), so its claims have not been tested against the game (how the check works). It is not complete either: 1 of its 4 parts is analysed, and 100 % of that is explained. Clone https://github.com/gamesexplained/gamesexplained and follow kit/START.md to continue games/c64/neverending-story to Silver.

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
Program49,31175.2 %
Code4,7287.2 %
Graphics23,87836.4 %
Level data5,2898.1 %
Sound1,6062.5 %
Text1,6872.6 %
Tables12,04118.4 %
Variables820.1 %
Screen, bitmap, colour, stack, I/O15,83524.2 %
Unused3900.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.

Status

Tierbronze
CoverageIn the 1 of 4 parts analysed, 100 % of the bytes the game uses have a description
Build analysedOcean disk release; Part 1 at the command prompt
Copyagent-draft
Toolshost: 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
Modelgpt-6.1-sol
Kit version0.0.46

Contributors

Other places to love this game

What the game does, and where we found it

Inventory: game documentation, consulted 30 September 2026. Imported annotations guide searches.

FeatureStatusEvidence or open work
Boot and first command promptliveFresh Ocean disk boot; reference capture
Picture/text displayliveEight cycle-positioned register writes; full reconstructed frame matches all 104,448 emulator pixels
Commands and rulespartly liveLOOK, INVENTORY, rejected directions, NE/SW movement and unknown-word response observed; dispatch patching traced
Illustrated locationsliveAll 21 captured records: native $05BF output matches decoded bitmap, screen and colour bytes; browser pixels independently compared
Objects and inventorypartly 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 progressionopen$03A0 exchange and $9700 loader traced; later parts need captures
Save/loadliveSAVE stops at RTS $0491; LOAD stops at RTS $045F; serialized state unchanged after each command

How the analysed state was reached

Route and captures

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.

Machine and scope

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.

Rebuild

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.

Review capture, 3 October 2026

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.