The archaeology: things on the pressing that nobody meant to publish, and things whose names say more than they should.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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 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.
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.txtcarried 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.