Twilight for Mindscape, 1993. Structural documentation of the code and file layout of the Amiga CD32 release, read from an original pressed disc.
This is the eighteenth disc documented against the shared platform checklist at cd32-platformnotes-doc, and the first one read from physical media rather than from an image file. That changes what could be measured, and three things on this disc could not have been established from a file at all.
The thirteen zeros are real. The MCN was read from subchannel Q with MCVAL
set: 0000000000000, thirteen ASCII zeros, on the disc. Four discs in the set
carry the same thirteen zeros in a third party's .cue, and the worry was that a
dumper had lost a real catalogue number. It had not. Four checklist rows stand.
The overrun is the mastering, and its mechanism is now known. Fifteen of the seventeen previous images overrun their declared volume by 32..232 sectors, and from a file it is impossible to tell the disc from the dumper. Here the declared volume is 691 sectors and the disc physically carries 918 — every one a valid MODE1 sector with a correct sync pattern, a matching header address and a passing EDC. The 227 extra sectors are all zero, they are genuinely cut into the glass master, and they stop exactly where track 2's pregap begins. The data run is padded up to the next track. That explains the whole 32..232 range across the set without invoking a dumper artefact anywhere.
MODE1/2048 is verified, not assumed. Every .cue in this set says MODE1
and no disc had ever been checked. Reading raw 2,352-byte sectors and
descrambling them (ECMA-130 annex B) exposes the header: mode byte 1 on all
902 sectors checked, not sampled.
Two more the physical disc gave for free: no ISRC on any of the ten tracks (TCVAL=0, a field the set has never had), and the nine audio tracks are perfectly contiguous — one 150-sector pregap on the whole disc, none between audio tracks, and no track begins with silence.
| tracks | 10 — 1 data (MODE1/2048), 9 audio |
| data track | LBA 0–1067: 918 sectors of data + 150 of silent pregap |
| lead-out | LBA 93,513 = 20:48:63 |
| declared volume | 691 sectors — 227 fewer than the disc carries |
| audio | 92,445 sectors, 20 min 32 s — 99.02 % of the physical disc |
| MCN | 0000000000000 (MCVAL=1) · ISRC: none · CD-TEXT: none |
| PVD | system id CDTV, volume Alfred, publisher Mindscape |
| data preparer | Abersoft - ISOCD 1.04 by Pantaray, Inc. USA - |
| master cut | 1993-12-06 17:54:10 |
| files / directories | 30 / 4, zero empty directories |
| bytes on disc / resident / used | 1,261,776 / 1,636,635 / 1,610,416 |
| expansion / slack | 1.297× / 1.602 % |
| compression | RNC ProPack method 1, 11 streams, CRC-validated 11 of 11, nesting depth 0 |
| C2P / Akiko | none / all four figures absent |
| matrix ring | CDD2971 · /CS090011 · MASTERED BY NIMBUS · no IFPI |
Guardian's floor falls. Bytes-on-disc had stood at 2,249,822 through seventeen discs; this is 1,261,776 — 43.9 % below it — and the expansion factor, 1.297×, is the lowest of eleven measured. Both for a stated reason: this disc puts its content in Red Book audio, not in its data track.
Neither obvious way of reading the disc could read all of it.
ReadFileon\\.\E:stops at the end of the logical volume — 691 sectors — and is the only path on this drive that can read LBA 0–15.- Raw
CDDAtransfers, descrambled here, reach every sector including the 227 past the volume, but cannot read LBA 0–15 on this drive.
Both were used. Where they overlap — LBA 16–690, 675 sectors — they were
compared: they agree byte for byte. That is a guarantee none of the
seventeen previous images has ever had, and tools/buildimage.py refuses to
write an image if the overlap disagrees.
Along the way the drive was caught returning wrong data on the first transfer
after a seek — two dumps of the same 918 sectors gave two different wrong
answers. Because a MODE1 header contains the sector's own address, and the
sectors have to be descrambled anyway, every sector can prove its own identity
for free. tools/rawsectors.py checks sync, header address and EDC on every
sector and retries. After that: 0 retries needed, 0 unreadable, 0 EDC
failures. A dumper writing 2,048 bytes per sector cannot see this at all.
image/alfredchicken.cue is derived from the TOC read off this disc and
says so in its own REM lines. For the seventeen previous discs it was the
other way round: the cue was a source, and its CATALOG, track modes and
pregaps were inherited claims.
Local branch pushed: master.
This is the first disc in the set where all four manufacturing steps have a distinct, observable owner and all four slots are filled:
| step | owner | read from |
|---|---|---|
| game build | Twilight | RCS keywords, SAS/C debug records, alf.c, the label's copyright |
| label | Mindscape | PVD publisher field, silkscreen |
| premastering | Abersoft | PVD data preparer field |
| glass master, pressing | Nimbus | matrix ring, absence of any SID |
Abersoft is the second company to appear in a preparer field, after Rob
Northen Computing on Myth — and the pair settles a question the set has been
circling. Myth's preparer was Rob Northen Computing and its packer was
Bytekiller; this disc's preparer is Abersoft and its packer is Rob Northen's
RNC ProPack. Two discs, the roles swapped, and in neither case does the
mastering house's tool appear in the master it cut. The mastering step and the
packing step do not touch.
And D J Pocock still leaves a 232-sector final run while nobody else does —
5 of 5 against 13 of 13. This disc's final run is 32.
Liberation: Captive II (Byte Engineers / Mindscape, 1994) is already in the
set, so this is a same-publisher pair. Across preparer, final run, codec, boot
architecture, save system, scale, executable format and dating method, the two
discs share one thing that fifteen other discs do not also share: the
premastering tool. Full column-by-column comparison in
docs/11-label-comparison.md; the short version is
that the publisher's name predicts nothing about how the disc was made.
11 levels built from 6 tile sets, read straight out of alfred as two
parallel fixed-stride tables — and a twelfth entry, cloud, that exists only in
the tile-bank table, which is why cloud.map and cloud.unpack have no
CLOUD.PAK beside them.
The tile geometry was derived, not guessed, and two independent measurements
agree: every one of the eighteen unpacked graphics pieces is an exact multiple of
128 bytes (16 × 16 pixels × 4 planes), and for all seven <name>.unpack /
<name>.map pairs the largest index in the 1,024-byte map is exactly
(length / 128) − 1. Seven of seven. Rendering settled the internal layout as
row-interleaved, and also refuted part of the arithmetic: seventeen of the
eighteen pieces are tile banks and the eighteenth, frontend.pak, is the
320 × 184 title screen — the game's own name, drawn.
The engine stores no copper list, no palette, no blitter control word and no
BLTSIZE — it computes them at run time. But it is not uniformly dynamic: it
writes BPLCON0, BPLCON2 and BPLCON3 as immediates, and alfred's two
BPLCON0 writes give BPU = 4 — a third independent confirmation of the tile
geometry, from the hardware register. intro runs five planes and calls both
LoadRGB4 and LoadRGB32, making this the third disc in the set to call both.
introships a working Amiga hardware debugger: 47 register description strings lifted verbatim from Commodore'shardware/custom.i, andcopdis, a copper list disassembler with a null guard and an unknown-opcode path.alfredhas none of it — the two executables are builds of one code base fourteen months apart (RCS check-outs 1992-09-29 and 1993-11-19), and the older one is the one that still has the scaffolding in it.alfis 46.9 % debug information — the whole SAS/C 6.00 symbol table,alf.c, and a line-number table. What it does is runintroand thenalfred.alfred.info's DefaultTool is the stringJUNK.End Of All Vars!sits inalfredbetween the globals and the code — a fencepost somebody left for reading memory dumps.JJSis stamped into both executables by RCS at check-out, and the shipped boot script tests for a volume calledJJSDISK:— the same initials, in two independent places, one written by a machine.- 57 tiles of artwork are drawn, packed, pressed and never placed by any map (12.8 % across all seven banks).
- The only place this disc writes its own title in a form a human reads is in pixels. There is no string table, because there is essentially no text.
| 00-predictions.md | written after the TOC and before the PVD, committed unchanged |
| 01-physical-carrier.md | matrix ring, silkscreen, and what the plastic says |
| 02-toc-and-subchannel.md | TOC, MCN, ISRC, sector mode, pregaps |
| 03-image-and-method.md | the two read paths and the cross-check |
| 04-volume-and-filesystem.md | PVD, .TM, sector map, file census |
| 05-timestamps.md | the build log, step 39, the RCS keywords |
| 06-compression.md | RNC, the three band figures, duplication |
| 07-graphics.md | C2P, Akiko, blitter, and the derived geometry |
| 08-audio.md | nine tracks measured from the drive |
| 09-text-and-strings.md | a fifth string model: there isn't one |
| 10-code-and-engine.md | three executables, two build epochs |
| 11-label-comparison.md | Alfred Chicken against Liberation |
| 12-open-questions.md | what this disc could not settle |
| 13-prediction-scoring.md | 19 right, 7 wrong, 1 vacuous — and what the wrong ones bought |
| 14-tools.md | new, inherited, and the ones that lied |
| 15-leftovers.md | the archaeology |
New here: rawcd.py, rawsectors.py, buildimage.py, audioscan.py,
makecue.py, band2.py, idstrings.py, tilesheet.py, dupscan.py.
Inherited and reused unmodified: isodump.py, rnc.py, packscan2.py,
akiko2.py, c2pscan.py, copperscan.py, blitscan.py, hunkinfo.py,
lvoscan.py, libscan.py, strs.py, textcensus.py, dispatch.py,
iffle.py, timeline.py, planar.py, relocs.py and others.
Inherited tools that lied on this disc, checked before the answer was
written down: band.py reports zero streams because it knows only IMP! and
ATN! — run unmodified on the Superfrog tree it reports 158, so the zero is its
magic list, not a measurement. devpaths.py reports two false positives and
misses all three real device paths. Full accounting, including the three faults
in tools written this session, in docs/14-tools.md.
Analysis and documentation only. No game code or asset data is redistributed
here: the repository contains the tools, the measurements and the notes, and no
image files, extracted assets or disc image — the same convention as the other
seventeen repositories in this set. Every render described in the documentation
is reproducible from the disc with tools/tilesheet.py and tools/planar.py.
The 217 MB of Red Book audio is not published either; per-track SHA-1s are, so
the read is reproducible from the disc.
Every figure comes from a read performed in this session. Where a claim rests on something outside the disc — the physical transcription, or a photograph of a second copy used to confirm that the matrix identifiers are properties of the pressing run rather than of one copy — it is labelled as such in docs/01-physical-carrier.md. Background about who Nimbus, Mindscape and Twilight were is context, not measurement, and is not asserted here.
Alfred Chicken is a trademark of Twilight; the disc's own copyright line reads
Copyright (C) 1993 Twilight.