Five results here, and every one came from comparing rather than from analysing — two new identities and three corrections to what the earlier pipelines wrote down. The shared checklist that makes them cheap is cdi-platformnotes-doc.
/CMDS/philips.rtf on The Apprentice (The Vision Factory, Netherlands, 1994)
and the bumper stream on Link: The Faces of Evil (Animation Magic / Philips
Interactive Media of America, USA, 1993) are the same file.
Not similar. The same bytes.
| stream | channel | coding | sectors | payload | MD5 | identical |
|---|---|---|---|---|---|---|
| RL7 video | 15 | 0x04 |
121 | 278,784 B | 383be6befb8e… |
yes |
| Level B stereo audio | 15 | 0x01 |
149 | 343,296 B | c8547a7e4886… |
yes |
| DYUV picture | 16 | 0x05 |
40 | 92,160 B | 4f19073bf9f6… |
yes |
| descriptor | 16 | data | 1 | 2,304 B | — | no, 37 bytes differ |
714,240 bytes of video and audio, identical across two studios, two continents and eighteen months. The channel numbers are the same, the codings are the same, the sector counts are the same, and the one data sector that differs is the container's own descriptor — its first 2,048 bytes match exactly and only the 37 bytes after them differ, which are the per-disc fields.
The DYUV picture is 40 sectors × 2,304 bytes = 92,160 = 384 × 240 exactly: CD-i normal resolution at NTSC height. That geometry is proved by the arithmetic rather than guessed at.
The descriptor sector opens with a four-byte magic and a tagged field dictionary:
ba be fa ce 00 00 00 05 00 00 00 00 01 00 00 00 ...
... "cluts\0count\0filenum\0frame_size..."
0xBABEFACE, and the field names cluts, count, filenum, frame_sizes.
That is the publisher's stream container, and grepping a new CD-i disc for
babeface is now a one-second test worth running.
What this means in practice: the Philips bumper was distributed to
licensees as a finished asset and pressed verbatim. Hashing the DYUV payload of
a new disc against 4f19073bf9f625c6e620a065ad43cb5f will identify it
immediately, exactly the way hashing the head-region filler does.
Merlin's Apprentice, published by the same company two years later, has no bumper stream at all.
The strongest result the earlier pipelines produced is that the 2,250 sectors of filler in front of the file system descramble to the same 5,229,000 bytes of recorded speech on three unrelated discs:
Link 1993 sectors 19-2268 md5 a0ed87f2e98b43f91281d16390fb178b
Origami 1993 sectors 18-2267 md5 a0ed87f2e98b43f91281d16390fb178b
Merlin 1995 sectors 19-2268 md5 a0ed87f2e98b43f91281d16390fb178b
Ultra CD-i Soccer, in 1997, carries a different recording in the same place.
The Apprentice, in October 1994 — between Merlin and the 1993 pair in date, and inside the window the trio brackets — carries a third:
Apprentice 1994 sectors 18-2267 md5 4e61f608e1f1455d9ad5b2a0615dbbd3
It is not the 1993–95 recording, and it is not Soccer's either. The comparison was done properly rather than by hashing alone, because both clips contain long runs of digital silence that produce false matches: sampling non-trivial 512-byte windows every 4,096 bytes out of each of Soccer's two clips and searching for them in each of this disc's two clips gives zero matches in all four directions, and the same test run the other way gives zero as well.
So the filler is not a single artefact of a single tool. Its structure is common and its content is not:
| disc | year | studio | clips | L == R | peak | recording |
|---|---|---|---|---|---|---|
| Origami | 1993 | EagleVision, NL | one, 2,250 sectors | 1.4 % of frames | 23,345 | A |
| Link | 1993 | Animation Magic, US | one, 2,250 sectors | 1.4 % | 23,345 | A |
| Merlin | 1995 | PIMA, US | one, 2,250 sectors | 1.4 % | 23,345 | A |
| Apprentice | 1994 | Vision Factory, NL | two, in 2,250 sectors | 100 % | 16,383 | B |
| Soccer | 1997 | Krisalis, UK | two, mixed with zeroes | 100 % | — | C |
On the structural tests this disc sits with Soccer: two separate clips rather than one continuous take, and left bit-identical to right rather than merely correlated. On content it sits with neither.
Peak 16,383 is 2^14 − 1, which no other disc's filler shows. Either the source was 14-bit or it was attenuated exactly 6 dB.
Everything structural matches the other four discs to the byte:
2,250 sectors, ending immediately before the path table
subheader 00 00 20 00 on all of them
EDC field 00 00 00 00 on all of them
28 bytes destroyed per sector
And this disc proves the last of those from the other side. On the four data-mode dumps the region reads as audio-XOR-scrambler and has to be descrambled; on this audio-mode dump it reads as audio directly, and XORing it gives noise. Same object, opposite views, and the boundary-discontinuity test gives the same 28 bytes either way. See 01-disc-image.md.
This is the first disc to write the filler twice:
head 18-2267 5,229,000 B md5 4e61f608e1f1455d9ad5b2a0615dbbd3
tail 57868-60117 5,229,000 B md5 4e61f608e1f1455d9ad5b2a0615dbbd3
Link, Origami, Merlin and Soccer all pad the tail with plain zeroes. Here the same block brackets the volume.
Recorded here because it corrects a note the previous pipelines carried.
Origami's and Merlin's main modules were read as ending
<module name> NUL -F NUL, with -F taken to be a linker option string of
unknown meaning. It is neither a string nor an option:
2D46 8010 MOVE.L D6,-$7FF0(A6) "-F"
2D46 8014 MOVE.L D6,-$7FEC(A6) "-F"
3D43 8018 MOVE.W D3,-$7FE8(A6) "=C"
082B 0005 BTST #5,$0005(A3)
M$Exec on Merlin's cdi_merlin is 0x54, and the bytes at 0x54 are
2d 46 80 10 2d 46 80 14 3d 43 80 18 08 2b 00 05 — the first four instructions
of _cstart. The same sixteen bytes open cdi_philips, cdi_factory and
cdi_invaders on this disc.
It is a better fingerprint than the thing it was mistaken for: a shared Microware C entry sequence across two studios and two years, greppable as a fixed sixteen-byte run.
The directory attribute table in circulation puts the CD-DA flag at bit 12. The
twenty-two /CDDA/trackN.cda entries here are unambiguously CD-DA — their
extents are the Red Book tracks — and every one of them sets bit 14, while
nothing else on the volume does. No previously documented disc exposed its audio
tracks as files, so nothing had exercised the bit. Corrected in
tools/cdilib.py.
Link volume descriptor, publisher field
"Philips Intractive Media of America, Inc." no 'e'
Apprentice bibliographic file
"Philips Interacive Media inc." no 't'
Two of five discs, different fields, different studios, different countries. Typos live in the fields that were typed; the DYUV logo three sectors away spells it correctly on both.
All five are folded back into
cdi-platformnotes-doc
rather than kept here: the bumper is its new section 5b, the third filler
recording and the head/tail duplication extend section 2, the attribute bit
corrects section 3, and the -F correction rewrites part of section 5.
python tools/cdihead.py hash
python tools/cdirtf.py census
The cross-disc comparisons need the other disc's image and are four lines of
Python: pull the sectors matching (channel, submode & 0x0e, coding) from
each, take 2,304 bytes from each sector, and compare.