Reverse-engineering notes on Dragonstone (Core Design, 1994/1995) for the Amiga CD32 -- a top-down action adventure that arrived on compact disc still asking you to insert the next floppy.
This repository documents the European three-language release: two tracks, 91 files, 84 of them RNC-crunched, and one level that is not there.
Documentation only. No game assets, no extracted art, no audio, no
executable code is committed here. The tools in tools/ reproduce
every figure and table in these pages from your own legally obtained copy.
| Doc | Contents |
|---|---|
| 00-overview.md | The release, the two tracks, the file inventory, and the 26-minute build the timestamps describe |
| 01-disc-image.md | Cue sheet, sector map, the duplicated volume descriptor, and 118 seconds of Red Book audio |
| 02-filesystem.md | ISO 9660 by the field, the CDTV system identifier, the AmigaDOS epoch, and three files from 1992 |
| 03-boot-chain.md | Startup-Sequence, three AmigaDOS commands, and a loader that makes no library calls at all |
| 04-compression.md | RNC ProPack method 1: header, the bit stream that resynchronises around literals, and the ratios per file type |
| 05-loader.md | Lx_ReloD: 84 filenames, a 12 x 7 index table, and the floppy prompts still in it |
| 06-text.md | Three languages in a fixed layout, four control codes, code page 437, and the password alphabet |
| 07-graphics.md | Copper lists, interleaved planar bitmaps, FMODE = 0, and how far the geometry has been pinned down |
| 08-cinematics.md | DNLD modules, the CHFI codec, the ending captions, a ProTracker module, and the only signature on the disc |
| 09-level-data.md | GSBlk, XMemI, SprDR, and eleven copies of one level loader |
| 10-audio.md | The CD track, the male and female sample banks, and what is missing |
| 11-leftovers.md | The archaeology: a cut level, a floppy prompt, a keyboard, a renamed princess, a typo, and an operating system in sector 21 |
| 12-open-questions.md | Everything unresolved, with the measurement behind it |
| notes/file-inventory.md | All 93 directory records with LBA, size, unpacked size and timestamp |
| notes/loader-file-table.md | The loader's 84 filenames and its 12 x 7 index table, level 4 included |
| notes/string-inventory.md | Every legible string outside the dialogue, by file and offset |
| cd32-platformnotes-doc | Platform checklist -- what to look for on any CD32 or CDTV disc. Shared by every Amiga CD pipeline; this repo no longer keeps a copy |
Level 4 is missing, and the loader still has its slot. The disc holds
eleven levels named L1, L2, L3, L5 ... Lc. Inside Lx_ReloD.cru,
right after a table of 84 filenames, is an index table dimensioned for
twelve levels of seven files each -- and row four is seven 0xFFFF
entries, one for each file a level would have needed. The numbering runs
straight across the gap, so nothing was renumbered when it went. Nothing else
on the disc remembers it: no orphaned art, no dead text, no stray filename.
"Insert Disk X", on a compact disc. The loader carries the floppy disk-swap prompt in all three languages, padded to a fixed 41-column field, six bytes before the loading message it actually uses. Beside it sits a full Amiga rawkey-to-ASCII table for a UK keyboard, numeric keypad included, on a console that shipped with a joypad.
Sector 21 contains a piece of the Amiga operating system. The CDTV
trademark block -- the Commodore copyright banner in ASCII art, outside the
file system, pointed at only by a field in the volume descriptor -- is followed
by 876 bytes of unlinked AmigaDOS object file. Compilation unit exec,
268 bytes of 68000 code, defining AddPort, GetMsg, PutMsg, FindPort,
ReplyMsg and WaitPort, with HUNK_SYMBOL intact and local labels
(REMHEAD.033, ENABLE.031/032/034) that are Commodore's own Exec macros
expanded by line number. Commodore's message-port source, compiled, pressed
onto a game disc in 1994, in a sector nothing reads.
The whole game uses about 3 % of the disc. 1,741 data sectors and 118
seconds of audio, on media that holds 333,000 sectors. The engine is so
uninterested in the space that the per-level loader was assembled eleven times
and shipped eleven times -- L7_LLoad and L8_LLoad differ by three bytes
out of 56,680.
The build machine's clock had never been set. Almost every directory record
says 1 January 1978 -- day zero of the AmigaDOS DateStamp -- with a time that
increases monotonically in write order. Sorted by it, the directory is a log:
first level file at 00:01:09, last at 00:15:08, shared data at 00:19:43, boot
sequence at 00:26:35. The disc was assembled in twenty-six minutes. Three files
break the pattern with real 1992 dates, and they are exactly the three that
contain the CD driver.
Lx_DataL.exe never calls a library. Not one jsr d(a6) in 53 KB of code,
not one library or device name string, three relocations in the whole hunk. It
does move #$2700,sr, points a5 at $B80000 -- Akiko, the CD32's custom
chip -- and reads the ISO 9660 directory itself to find the two files it needs.
The end-of-module label CDIOEND is one of its three strings.
The princess is renamed at the border. In the ending she is Princess Kirstie in English and Emma in both French and German. Not transliterated; replaced, and both translations chose the same name.
noboby. The default "nothing here" response -- the line an English player
sees more than any other -- is There is noboby here., in all eleven English
level files, once each. The French and German are fine. The word is spelled
correctly exactly once on the disc, in an unrelated sentence in level 5.
The German text for levels 2 and 5 is in a different code page. All the
localised text is IBM CP437 rather than the Amiga's Latin-1, which already says
it was written on a PC. But nine of the eleven German files put ü, ä, ö
at 0x81, 0x84, 0x94, and L2_Int_G and L5_Int_G put them at 0x8F,
0xA5, 0x8C -- while ß stays at 0xE1 in all eleven. Decoded with the
code page the rest of the disc needs, Holztür becomes HolztÅr. Those two
files are the biggest German text on the disc.
Ending cack knocked up by Del. The only developer signature, at the end of
Lx_CompE.cru, a ctime() string with the copyright notice run onto the end
of it without a separator: Mon Oct 31 12:56:31 1994(C) 1994 Core Design Ltd.
Halloween, eight weeks before the master.
Pure Python 3, no dependencies except Pillow for the two that write images. Point them at your own copy of the disc.
| Tool | What it does |
|---|---|
tools/isofs.py |
ISO 9660 reader; prints the directory tree with LBAs, sizes and dates |
tools/rnc.py |
RNC ProPack method 1 decompressor, CRC-verified |
tools/extract.py |
Extracts every file and unpacks the compressed ones |
tools/hunk.py |
AmigaDOS hunk executable reader |
tools/tmsector.py |
Dumps sector 21 and parses the object file hiding in it |
tools/copper.py |
Copper-list disassembler, AGA register names |
tools/planar.py |
Renders interleaved or separated planar bitmaps to PNG |
tools/text.py |
Pulls the dialogue out of an unpacked Int file, control codes decoded |
python tools/isofs.py "Dragonstone (1995)(Core)(M3)(Track 1 of 2)[!].iso"
python tools/extract.py "Dragonstone (1995)(Core)(M3)(Track 1 of 2)[!].iso" out/
python tools/tmsector.py "Dragonstone (1995)(Core)(M3)(Track 1 of 2)[!].iso"
python tools/copper.py out/Lx_ChipI.cru.bin 0x34 300
python tools/text.py out/L2_Int_E.cru.bin
SHA-1 4275859bb2a7aa9260692dc30550d2e78a955079 Dragonstone (1995)(Core)(M3)(Track 1 of 2)[!].iso
SHA-1 d4943d501e12feac68e3e3a1c0123ebe9f4ce4f7 Dragonstone (1995)(Core)(M3)(Track 2 of 2)[!].wav
Dragonstone and all its content are © 1994 Core Design Ltd. This repository contains no part of the game.