The archaeology. Everything here is on the disc and reproducible with the
tools in tools/.
The disc has eleven levels named L1, L2, L3, L5, L6, L7, L8,
L9, La, Lb, Lc. There is no L4, and no file on the disc is named
L4_anything.
The loader has not been told. Inside Lx_ReloD.cru, immediately after the
84-name file table, is an index table dimensioned for twelve levels of
seven files each -- and row four is seven 0xFFFF entries:
row 2: 0015 0016 0017 0018 0019 001A 001B L3
row 3: FFFF FFFF FFFF FFFF FFFF FFFF FFFF <- L4
row 4: 001C 001D 001E 001F 0020 0021 0022 L5
Seven invalid file indices, one for each file a level needs: LLoad, SprDR,
GSBlk, Int_E, Int_F, Int_G, XMemI. The numbering runs straight from
0x1B to 0x1C across the gap, so nothing was renumbered when the level went
-- the row was blanked and left in place.
The build timestamps agree (02-filesystem.md): the gap between the last level-3 file at 00:06:04 and the first level-5 file at 00:06:26 is 22 seconds, no bigger than the gaps between any other pair of levels. Level 4 was not written and deleted; by mastering day it was simply gone.
Lx_ReloD.cru, offset 0x156C, three strings padded to a fixed 41-column
field:
Insert Disk X
Insérez la disquette X
Diskette X einlegen
followed immediately by the ones the CD32 actually uses:
LOADING
CHARGEMENT EN COURS
LADEVORGANG
Dragonstone also shipped on Amiga floppies. The CD32 loader is the floppy loader with the CD driver swapped in, and the disk-swap prompt -- localised, column-aligned, ready -- is still compiled into it.
Lx_ReloD.cru, offset 0x16459:
`1234567890-=\ 0 QWERTYUIOP[] 123ASDFGHJKL;# 456 ZXCVBNM,./ .789
That is an Amiga rawkey-code to ASCII table, in rawkey order, for a UK
keyboard -- the # next to ; and the \ after = are the giveaways --
numeric keypad included. The CD32 ships with a joypad and no keyboard port
that anyone used. The game needs typed input for the player's name and for the
password (06-text.md), and it brought the A1200's keyboard
handler with it.
The ending captions in Lx_CompC.cru:
| Language | Line |
|---|---|
| English | Princess Kirstie flees the Isle.... |
| French | Alors que l'orage éclate, Emma fuit l'île.... |
| German | Als der Sturm einsetzt, flieht Emma von der Insel.... |
Not transliterated, not spelled differently -- replaced. Both translations independently chose the same substitute, which suggests one instruction went out to both translators rather than two people making the same call.
The default "there is nothing here" response, the line an English-speaking player sees more often than any other:
There is noboby here.
It is in all eleven English level files, exactly once each, at or within a few strings of the start of the dialogue block. The French and German are both fine (Il n'y a personne ici., Hier ist niemand.).
The word is spelled correctly exactly once on the disc, in L5_Int_E, in an
unrelated line:
...from the statue with the crowbar, hoping nobody will notice.
Whoever wrote that sentence and whoever wrote the default response were not the same person, or were not looking.
The accented characters in the localised text are IBM CP437, which is already
a small find on an Amiga -- é is 0x82 here and 0xE9 on an Amiga, so the
text came off a PC. But nine of the eleven German files use CP437 and two do
not:
| ü | ä | ö | ß | |
|---|---|---|---|---|
| nine files | 0x81 |
0x84 |
0x94 |
0xE1 |
L2_Int_G, L5_Int_G |
0x8F |
0xA5 |
0x8C |
0xE1 |
ß stays put; the three umlauts move. Decoded as CP437 -- the code page the
other nine files need -- Holztür comes out as HolztÅr and Händler as
HÑndler. Levels 2 and 5 are the two biggest German text files on the disc.
Details and the open question in 06-text.md.
Twenty-nine of the eighty-four filenames in the loader's table are spelled with the wrong case:
| The loader asks for | The disc has |
|---|---|
Lx_Sfx_M.bin, Lx_Sfx_F.bin |
Lx_SFX_M.bin, Lx_SFX_F.bin |
LA_*, LB_*, LC_* (21 files) |
La_*, Lb_*, Lc_* |
It works because Amiga file systems match ISO 9660 names case-insensitively. It also means nothing on the production path ever checked, and it is the first thing that breaks if you extract the disc onto a case-sensitive host and try to run the loader against it.
Lx_CompE.cru, offset 0x2D12C, right after the last picture:
Ending cack knocked up by Del Mon Oct 31 12:56:31 1994(C) 1994 Core Design Ltd.
A C ctime() string formatted at build time, with the copyright notice run
straight onto the end of it without a separator. Monday 31 October 1994,
12:56:31. The only developer signature on the disc, and it is a programmer
calling his own ending sequence rubbish in the file header.
Sector 21 is not part of the file system. No directory record covers it; the only pointer to it anywhere on the disc is in the primary volume descriptor's application-use area (02-filesystem.md).
The first 1,100 bytes are the Commodore trademark block that every CDTV and CD32 disc carries -- the copyright notice and the Commodore logo in ASCII art:
*************************************************
* *
* Copyright (c) 1993 - Commodore Electronics Ltd.*
* All rights reserved. *
* *
* CCCC TM *
* CCCCCC *
* CCCCCCCC *
* CCCCCC ////// *
* CCCCC ///// The Commodore logo is a *
...
Then, at offset 0x44C, an unlinked AmigaDOS object file starts.
tools/tmsector.py parses it:
0x44C HUNK_UNIT
0x454 HUNK_NAME name = 'exec'
0x460 HUNK_CODE 268 bytes
0x574 (2 filler bytes)
0x576 HUNK_EXT
REF32 _intena at 0x2E, 0x74, 0x98, 0xB4, 0xD4
REF16 _LVOWait at 0xF4
REF16 _LVOSignal at 0xA6
REF16 NewList at 0x6
REF16 _LVOCause at 0x68
REF16 FindNode at 0x108
REF16 Permit at 0xAA
REF16 AddNode at 0xE
DEF AddPort = 0x0
DEF GetMsg = 0xAC
DEF PutMsg = 0x22
DEF FindPort = 0x102
DEF ReplyMsg = 0x10
DEF WaitPort = 0xDA
0x696 HUNK_SYMBOL
symbol AddPort, pm_call, pm_exit, pm_signal, REMHEAD.033,
wp_wait, wp_exit, GetMsg, PutMsg, FindPort,
ENABLE.031, ENABLE.032, ENABLE.034, PutMsg1,
ReplyMsg, WaitPort
0x7B2 HUNK_END
A compilation unit named exec, 268 bytes of 68000 code, defining
AddPort, GetMsg, PutMsg, FindPort, ReplyMsg and WaitPort, with its
debug symbols intact. Those are exactly the message-port functions of
Commodore's own Exec, and the local labels -- REMHEAD.033, ENABLE.031,
ENABLE.032, ENABLE.034 -- are macro expansions of Commodore's Exec
assembler macros, numbered by line.
This is a fragment of the Amiga operating system's own source, compiled, pressed onto a game disc in 1994, in a sector nothing reads.
Whether it is Core Design's accident or Commodore's -- that is, whether every CDTV and CD32 disc carries the same 876 bytes because the trademark block Commodore handed to developers was itself built by concatenating the banner with whatever was in the buffer -- cannot be settled from one disc. Hashes for comparison against the next one:
SHA-1 c5ffcef2a5e33d2df606185823cd95d1c174d65f sector 21, all 2048 bytes
SHA-1 8d84115154d70360b3469acc99cdad3db0ed2c92 banner only, 0x000..0x44C
SHA-1 690aae24a96b69659066e691d0b07db301260572 object file, 0x44C..0x7B8
See the shared CD32 platform notes -- this is the first thing the next CD32 pipeline should check.
- The volume descriptor is duplicated. Sectors 16 and 17 are byte-identical primary volume descriptors. A fingerprint of ISOCD 1.04 (01-disc-image.md).
- The disc says CDTV. The system identifier field of a CD32 game reads
CDTV, three years after the CDTV was discontinued (02-filesystem.md). - The build machine's clock was never set. Almost every file is stamped 1 January 1978 -- day zero of the AmigaDOS epoch -- with the time since power-on, which turns the directory into a 26-minute log of the build (02-filesystem.md).
- Three files are from 1992.
Lx_DataL.exe,Lx_ReloD.cruandLx_TPage.crucarry real timestamps two years and four months before the master, and are exactly the three files that contain the CD driver (12-open-questions.md). freeanim.libraryis not on the disc. The startup sequence runs a SAS/C program that opens a library nothing on the disc provides (03-boot-chain.md).- The English is coy.
PRESS FIRE TO SELECT FORM...where the French saysAPPUYEZ SUR FEU POUR SÉLECTIONNER SEXE. - The level loader was assembled eleven times.
L7_LLoadandL8_LLoaddiffer in three bytes out of 56,680 (09-level-data.md). - 338 sectors of zeroes sit past the last file, inside an image that declares a volume size 106 sectors smaller than itself.