Skip to content

Latest commit

 

History

History
181 lines (137 loc) · 6.98 KB

File metadata and controls

181 lines (137 loc) · 6.98 KB

Leftovers

The archaeology: things on the pressing that nobody meant to publish, and things whose names say more than they should.

The linker's symbol file shipped

cdi_merlin.stb, 19,752 bytes, LBA 129,342. Nothing on the disc names it and the program never opens it. It is the Microware linker's global symbol table for the build — 887 symbols with their source-level names — wrapped as an OS-9 Data module so the debugger could load it beside the program.

The timestamps show it was not a leftover from an earlier build that somebody forgot to clean up. It is one second older than the executable:

1995-01-31 13:57:18   cdi_merlin.stb
1995-01-31 13:57:19   cdi_merlin
1995-01-31 13:57:20   the volume descriptor

One link, one mastering run, three seconds, and the debug output went along for the ride. Everything in 04-symbol-table.md, 05-bolt-library.md and 08-game-architecture.md exists because of it.

This is the single most consequential leftover the CD-i pipelines have turned up. Link's 325 loose function-name strings were an artefact of how its linker laid out the binary; this is the actual symbol table, filed as its own root entry, on a retail disc.

A Traffic Cop

Forty symbols carry the prefix TC_ and it is never expanded — until you read the error strings:

Traffic Cop Could Not Open Animation:%d
Traffic Cop Could Not play Animation:%d
Traffic Cop Could Not Close Animation:%d

The team's internal name for the streaming scheduler was the Traffic Cop, and they left it in the error text. TC_Open_Jukebox, TC_TOC_Get_Anim, TC_MM_Alloc, TC_Display_ClutUpdate and the rest all belong to it.

Note the inconsistent capitalisation across the three messages — Open, play, Close — which is what three lines typed at three different moments look like.

TC_Set_Animation_Paramter

Shipped misspelled, and its partner TC_Get_Animation_Parameter is spelled correctly. Two functions written minutes apart, one typo, and the linker recorded it for thirty years.

KludgeTwoControllers

A global at −32,070, in the input block beside NumControllers, ControllerData, SetControllerFlags and FH_UI_SetControllerMode. Somebody named a variable after the fact that the code around it is a kludge. It is the same species as Link's fix_jump_stick.

A diagnostic that shouts

BOSS_Init:  NumBitsPerVar = %d.  Should be 1,2,4, or 8.            -- using 8.

Column-aligned with fourteen spaces before the fallback clause, so it was meant to be read on a terminal — and it is still linked into a disc whose only output device is a television. dprintf is in the symbol table at 0x1cede, and these are its customers:

BOSS: CurrentState = %d
BOSS: Returned from CurrentState = %d
BOSS_Execute: Software Error occurred in state %d
BOSS_Execute:  Illegal event %d returned from state %d
BOSS: NVRAM is out of date
BOSS: NVRAM is missing or invalid, removing
BOSS: Unable to play help audio correctly
BOSS: Unable to stop jukebox play
BOSS_NVPack: TokenNum value = %d  exceeds the number of game tokens
BOSS_NVUnPack: TokenNum value = %d
pack: number of bits to pack into = %d
pack: number of bits to unpack from = %d
Illegal Animation Definition:%d.  No Menubar should be allowed.
Unexpected signal number $%X - Application Terminating

Fourteen developer diagnostics on a retail pressing. Origami's leftover was a video-plane hex dumper; Merlin's is the entire state machine narrating itself to a serial terminal that is not there.

_dumprof, the OS-9 profiler's dump entry, is also linked in.

The -F option string

The module name field reads cdi_merlin NUL -F NUL — the linker's option string, preserved. Origami's reads origami NUL -F NUL. Two unrelated CD-i titles, two years and one continent apart, invoked l68 with the same flag.

Truncated names, twice over

The symbol table contains three pairs of names at identical addresses, which is the linker recording both the full symbol and a truncated alias:

0x00170   _stkcheck   and   _stkchec
0x20452   intercept   and   intercep   and   _sigint
0x1f98c   memcpy      and   memmove

_stkchec and intercep are eight-character truncations of nine-character names — an artefact of a symbol-length limit somewhere in the toolchain, kept alongside the full form rather than replacing it. memcpy/memmove is a deliberate alias.

The same eight-character limit shows in the game's own data: SnowflakDD and SkeltnDD, two of the 27 puzzle names, cut to fit.

Encryption that was never switched on

Encrypt and XORMask, two adjacent globals in the BOLT block. The container format can obfuscate its members behind an XOR mask; not one member on this disc is masked. See 05-bolt-library.md.

The extra libraries nobody names

boltlib1.blt and boltlib2.blt are byte-identical to boltlib0.blt and the executable contains only the string boltlib0.blt. 16 MB — 7.9 % of the disc — reached by computing a digit. See 05-bolt-library.md.

SCCS keywords in the shipped text

All three root text files open with a @(#) what-string:

@(#)copyright.txt	1.1	2/25/94
@(#)abstract.txt	1.1	2/25/94
@(#)bibliography.txt	1.2	6/7/94

They are meant to be found by the what utility on a delivered binary; they were never stripped from the text. They date the files, give their revision numbers, and tell you the source tree was under SCCS.

A HyperCard credit

bibliography.txt credits Theron Trowbridge as Hypercard Wizard. A HyperCard credit on a 68000 CD-i title puts a Macintosh in the design pipeline — the same class of evidence as Soccer's CP437 font pointing at a PC, or Link's _ISG_CDI_TOOLS_1.6 naming its own authoring system. (Merlin's volume descriptor names that same tool, at that same version, two years later.)

The 1993 recording, on a 1995 disc

The 5.2 MB of speech in front of the file system hashes to a0ed87f2e98b43f91281d16390fb178b — identical to Origami's and Link's, both 1993. Merlin was mastered on 31 January 1995. Nobody put it there on purpose, nobody can hear it, and it is now on three discs across two years and two continents. See 01-disc-image.md.

What is not here

Worth saying, because the absences date the build:

  • No dangling path references. Every name the binary uses resolves.
  • No all-zero files. Sixteen of Soccer's 144 files were empty; none of Merlin's are.
  • No abandoned localisation. English only, one voice, no language menu, no unused audio channels, and no non-ASCII text anywhere. Origami's dump filename under-counted its languages by one; this pressing has exactly the one it claims.
  • No unused sectors between the path table and the tail.
  • No personal data. Origami's message.txt carried a programmer's home address and telephone number. Merlin's three text files carry names and roles and nothing else.
  • No MPEG. Not one sector needs the Digital Video cartridge.