Sector 16, 2,048 bytes. ISO 9660's skeleton with big-endian numbers only.
| Offset | Field | Value |
|---|---|---|
| 0 | standard identifier | CD-I |
| 8 | system identifier | CD-RTOS |
| 40 | volume identifier | LINK - The Faces of Evil |
| 84 | volume space size | 253,520 blocks |
| 130 | logical block size | 2,048 |
| 136 | path table size | 10 |
| 148 | path table LBA | 2,269 |
| 190 | volume set identifier | LINK - The Faces of Evil |
| 318 | publisher | Philips Intractive Media of America, Inc. |
| 446 | data preparer | _ISG_CDI_TOOLS_1.6 |
| 574 | application identifier | cdi_link |
| 702 | copyright file | COPYRIGHT |
| 739 | abstract file | ABSTRACT |
| 776 | bibliographic file | BIBLIOGRAPHY |
| 813 | creation date | 1993062317483500 |
Two things stand out.
The publisher's name is misspelled on the glass master. Philips Intractive Media of America, Inc. — no e in Interactive. The COPYRIGHT
file three sectors away spells it correctly, and so does the DYUV logo in
bumper.rtf. The typo is in the one field that a CD-i player reads and can
display.
The disc names its own authoring tool. The data preparer field, which on
most discs is blank, reads _ISG_CDI_TOOLS_1.6.
Unlike the soccer disc, everything here agrees for once: the volume identifier,
the volume set identifier, the application identifier and the OS-9 module name
inside that application are LINK - The Faces of Evil, the same again,
cdi_link and cdi_link. The box, the disc and the binary tell the same story.
The path table is ten bytes at LBA 2,269, and it describes exactly one directory:
01 00 00 00 08 de 00 01 00 00
Name length 1, zero extended attribute sectors, extent at LBA 0x08de = 2,270,
parent 1, name \0, one pad byte. There are no subdirectories. Every file
on this 600 MB disc sits in the root.
There is no root directory record in the volume descriptor — CD-i reaches the
root through the path table only, and the root extent's own . record carries
the true directory length. The path table is also exposed as a readable file
called path_tbl, which is where the 10 in the file inventory comes from.
LBA sectors size attr # date path
2269 1 10 0x0555 0 1993-06-24 11:02:57 /path_tbl
2271 1 335 0x0555 0 1993-03-04 16:27:02 /COPYRIGHT
2272 1 238 0x0555 0 1993-03-04 16:26:22 /ABSTRACT
2273 1 325 0x0555 0 1993-03-04 16:21:50 /BIBLIOGRAPHY
2274 66 135168 0x0555 0 1993-06-24 11:02:55 /cdi_link
2348 1 70 0x0555 0 1993-02-24 14:17:19 /ersatz_1
2349 1 70 0x0555 0 1993-02-24 14:17:19 /ersatz_2
2350 625 1280000 0x0555 1 1993-04-29 11:33:43 /bumper.rtf
2985 6 12288 0x0555 0 1993-02-17 14:02:41 /cdi_bumper
2992 14707 30119936 0x0555 1 1993-06-23 17:48:32 /ldata.rtr
20571 95005 194570240 0x0555 1 1993-06-23 17:41:15 /lmusic.rtr
115786 14707 30119936 0x0555 1 1993-06-23 17:48:32 /ldata1.rtr
133365 102575 210073600 0x0555 1 1993-06-23 17:41:56 /lanim.rtr
235940 14707 30119936 0x0555 1 1993-06-23 17:48:32 /ldata2.rtr
Directory records are ISO 9660 up to the name, padded to even, then ten bytes of system use: owner group (2), owner user (2), attributes (2), reserved (2), file number (1), reserved (1).
Every file carries attribute word 0x0555 — owner, group and world may read
and execute. Every one is world-executable, including the three text files.
Nothing on this disc is marked as a directory, because nothing is one.
The file number in the system-use area is 1 for the five real-time files and
0 for everything else. That byte is how the driver knows to hand a file to the
real-time reader instead of reading it block by block, and it is the only
mechanical difference between ldata.rtr and cdi_link at the file-system
level. The sizes in the directory records for those five files are Form 1
fictions: 14707 × 2048 = 30,119,936 exactly. Most of the sectors are Form 2
and carry 2,324 bytes, so the real payload is larger than the directory claims
in every case:
| File | Form 1 | Form 2 | True payload | Directory says |
|---|---|---|---|---|
bumper.rtf |
1 | 624 | 1,452,224 | 1,280,000 |
ldata.rtr |
3,541 | 11,166 | 33,201,752 | 30,119,936 |
lmusic.rtr |
0 | 95,005 | 220,791,620 | 194,570,240 |
lanim.rtr |
40,391 | 62,184 | 227,236,384 | 210,073,600 |
Read one of these through the directory record and you get the right sectors and the wrong length. They have to be read by sector.
ldata.rtr, ldata1.rtr and ldata2.rtr are byte-identical, and identical
in their subheaders too — the same channel numbers, the same submodes, the same
coding bytes, sector for sector:
ldata.rtr data 3d18815ce197621158fbdfb420062e3b subhdr 292abde4e6480050d46b5755787cfdb5
ldata1.rtr data 3d18815ce197621158fbdfb420062e3b subhdr 292abde4e6480050d46b5755787cfdb5
ldata2.rtr data 3d18815ce197621158fbdfb420062e3b subhdr 292abde4e6480050d46b5755787cfdb5
They are placed at LBA 2,992, 115,786 and 235,940 — the very start of the file area, 45 % of the way along, and 92 % of the way along.
ldata.rtr is what the game reads constantly: 71 backgrounds, the sprite banks
and every sound effect. lmusic.rtr and lanim.rtr are what it streams. Put
one copy of the working set at the start and the laser must return to the inside
of the disc from wherever a cutscene left it; put three, and the head is never
more than about a quarter of the spiral away from the copy it needs.
The cost is 69,181,728 bytes — 11.5 % of the disc — spent on a single-speed drive's seek time. The executable knows about all three and names them in sequence:
0x01d903 ldata.rtr
0x01d90f ldata1.rtr
0x01d91c ldata2.rtr
and again, earlier, in the load table beside lanim.rtr:
0x01d67c Lldata.rtr
0x01d688 Vlanim.rtr
Whether the game picks a copy by current head position or simply by which world it is loading is not yet resolved.