Skip to content

Latest commit

 

History

History
255 lines (201 loc) · 9.91 KB

File metadata and controls

255 lines (201 loc) · 9.91 KB

11 - Leftovers

The archaeology. Everything here is on the disc and reproducible with the tools in tools/.

The hole where level 4 goes

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.

"Insert Disk X" on a compact disc

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.

A keyboard for a console that has none

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 princess changes her name at the border

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.

noboby

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.

German levels 2 and 5 are in a different code page

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.

Lx_Sfx_M.bin is not Lx_SFX_M.bin

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.

Ending cack knocked up by Del

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: a Commodore object file no one asked for

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.

Small things

  • 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.cru and Lx_TPage.cru carry 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.library is 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 says APPUYEZ SUR FEU POUR SÉLECTIONNER SEXE.
  • The level loader was assembled eleven times. L7_LLoad and L8_LLoad differ 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.