Skip to content

Latest commit

 

History

History
145 lines (116 loc) · 6.17 KB

File metadata and controls

145 lines (116 loc) · 6.17 KB

02 — The file system

Volume descriptor

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.

Path table and root

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.

Fourteen files

   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.

The same 30 MB pressed three times

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.