1990 · Domark

About this page

This minisite awaits a maintainer’s check. A model this site has not proven yet worked on it (one whose name was not recorded), so its claims have not been tested against the game (how the check works).

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
Program56,37086.0 %
Code28,02142.8 %
Graphics9,78014.9 %
Level data8,84813.5 %
Text1,0351.6 %
Tables8,60413.1 %
Variables820.1 %
Screen, bitmap, colour, stack, I/O8,60313.1 %
ROM the game runs under5120.8 %
Unused510.1 %

Status

Tierbronze
Coverage100 % of the bytes the game uses have a description
Build analysedDualis disk release; language menu reached from a hard reset
Copyagent-draft
Toolshost: Linux x86_64, disassembler: regenerator 2000 0.9.20, publication: Python 3; canonical symbols_export.py and listing.py, emulator: VICE MCP 3.13.1, disassembler_check: regenerator 2000 0.9.20, browser: Firefox 157.0 (installed); WebDriver BiDi
Modelgpt-6.1-sol
Kit version0.0.55

Contributors

Other places to love this game

What the game does, and where we found it

Sources: [game documentation](https://mocagh.org/miscgame/castlemaster-alt 3-manual.pdf) and the contributor’s annotated listing, consulted 30 September 2026. The documentation supplies the feature inventory; the imported annotations supply verification leads.

FeatureStatusEvidence or open work
First-person movement and stone throwingopen$47C5 main loop; gameplay reached live, individual action paths not replayed
Area and object databaseconfirmedAll 34 headers and 546 objects independently parsed; native area-loader calls match every header
3D transforms and rendereropenFourteen projected vertices checked natively; complete transforms, clipping and painter output remain open
Script record structure and event selectorsconfirmedAll 193 streams/809 tokens parse; six controlled event-selector fixtures pass
Ordinary object and room interactionsopenScript consumers traced; ordinary interaction routes remain to be exercised
Language and character selectionliveHard-reset disk boot through to WILDERNESS
Disk saving and loadingliveNative device 8 SAVE/LOAD restores the entire 652-byte payload
Tape saving and loadingopenTape transfer has not been exercised
Strength, keys and spiritsopenInitial strength 16 from $9D05; runtime keys $245A, spirits $2454, target 21 at $9D49; progression needs emulator input tests
Riddle panels, messages and font expansionconfirmedNine panels independently parsed; 61 fixed 16-byte messages; six native font expansions match
Run/walk/crawl and view controlsopenRaw distances 30/60/240 at $9D46-$9D48; input and signed movement routines traced, complete input replay remains open
Instrument decoding and music requestsconfirmedEight instrument windows checked natively; 17 request groups run for 25 ticks each
Sustained music and effectsopenExact sustained audio/waveforms and ordinary effect routes remain open
Information display and sound selectionopen$77FE menu and $123A/$123B sound flags traced; individual controls need ordinary input replay
Lightning and hazardsopen$483E scheduler and $4FA3 collision paths traced; boundary/ordinary-route tests remain open
Full rescue routeopenDatabase and scripts are preserved; no end-to-end input replay

Imported annotations seed the listing; the checked contracts are recorded in facts.md. Scope and the disk boot are described in orientation.md.

Packed text and loaded HUD graphics are traced and checked independently. Six native glyph fixtures and all eight default instrument windows pass; the initialized HUD frame reconstruction matches every emulator pixel.

How the analysed state was reached

Disk and boot recipe

The supplied RAM dump was captured at the language menu. The matching Dualis D 64 was recovered from the contributor’s repository history and kept privately as work/castle-master-dualis.d 64. Its first directory entry is CASTLEMASTER/[D], 179 blocks. No game binaries or snapshots are published.

With VICE MCP 3.13.1 (PAL):

  1. Hard-reset the machine, resume execution, and autostart the D 64’s first entry. Wait for the animated Dualis intro. Fire on port 2 did not dismiss it in this run.
  2. Hold Space for 60 frames, release it, and advance 1,200 frames. The game unpacks and draws the language menu. Wait until the language choices are visible. Save work/disk-menu.vsf without ROMs using pause() from kit/c64/vice.py before saving.
  3. Hold 1 for 60 frames, release for 30; hold Return for 60, release for 30. Repeat 1, Return for the character menu with the same holds and gaps.
  4. Advance 300 more frames. Confirm the castle exterior and WILDERNESS label, then save work/disk-play.vsf without ROMs.

The emulator check on 30 September 2026 passed 55/57 checks. Failures: pause-at-instruction and unpaced-calls. This run uses pause() (which finishes the instruction by advancing a frame) and paced calls. The game was booted from disk for this recipe; no restored private snapshot is needed.

Comparison and listing image

The menu reached from disk matches all 27,968 code bytes and all 778 word-typed bytes in the original analysis. Of 36,790 byte-typed bytes, 57 differ, at processor-port backing RAM, stack/keyboard state, engine state and SID player state. The original text export seeds labels and comments; the Source bytes come from the newly booted snapshot.

Comparing menu with settled play, $87CC–$95DB changes in 3,552 bytes as menu storage becomes the linear viewport; $E000–$FF3F changes in 3,218 bytes as the bitmap is drawn. The world database $9D00–$BF8F and interpreter tables $13AE–$13ED agree byte for byte. There are 65 differing code-typed bytes across nine blocks. All are operand bytes and all have traced direct producer instructions; the private producer report identifies them. A cold hand-over capture at $476F is available as work/entry.vsf; Space must be held after the Dualis intro has reached its steady waiting loop. The menu retains the authored menu occupant that rendering replaces, so the listing uses disk-menu.vsf; verification uses the running game and disk-play.vsf. Generated viewport pixels and palette cells stay out of the denominator; the loaded surrounding HUD and its initial colour planes are authored data and remain in it.

Machine state and rebuilding

The menu snapshot has processor port $35, DDR $2F. RAM vectors: $0314=$737F, $0318=$7579, $FFFA=$7579, $FFFC=$476F, $FFFE=$FF48; these agree with play. VIC bank $C000, screen $C400, bitmap $E000.

Import the committed symbol map onto your own menu snapshot with symbols_import.py, start regenerator 2000 on the resulting project, then export with symbols_export.py. Build with python 3 kit/scripts/listing.py games/c64/castle-master games/c64/castle-master/work/disk-menu.vsf --entry games/c64/castle-master/work/entry.vsf. Compare with the play snapshot separately; --entry supplies the live capture at the loader’s hand-over.

Original export SHA-256: 79505396ccd9542c55e67fb381b42210284ceba0dc51aa3d7dd1d39df277753d. Its maker’s model is unknown.

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.