Structural documentation of the Amiga CD32 release of Universe, a point-and-click graphic adventure published by Core Design in 1994.
Documentation only. No game code, artwork, audio or other asset is committed
here — the tools in tools/ reproduce every figure, table and image
in these documents from a disc image you supply.
This is the fourteenth disc in a running Amiga CD32 / CDTV series and the first point-and-click in it. The shared checklist those discs feed is cd32-platformnotes-doc.
CATALOG 5020717200529
TRACK 01 MODE1/2048 2,429 sectors declared, 2,509 in the image
TRACK 02..24 AUDIO 182,814 sectors, 40:37, 23 distinct tracks
52 files, three directories, 4.19 MB on disc and 8.79 MB resident once every packed stream at all three nesting levels is unpacked. 98.65 % of the sectors this disc uses are Red Book audio; the whole game is 0.73 % of a CD.
Publisher Core Design, preparer D J Pocock, volume created
1994-09-13 11:48:04. Programmed by Gary Antcliffe; graphics by Rolf Mohr,
Stuart Atkinson and Jim Bottomley-Mason; music by Martin Iveson — all of that
read off the disc, none of it taken on trust.
A bytecode interpreter with sixteen opcodes. code.prg dispatches on the
complement of an opcode byte, so the commands are $F0–$FF and every byte
below $F0 is inline data. Each handler advances an explicit program counter
in $62e(a5) by its own instruction length. Two more dispatch forms sit beside
it: a 41-entry table (40 distinct handlers) indexed by a signed word taken
straight out of a data record, and a list of longwords in which a positive
value is a code address and a negative one is a command index. No earlier disc
in this series has had a script VM.
Three levels of RNC ProPack inside one another. The census finds 47 packed files; a magic scan validated at every byte offset by running the decompressor finds 342 streams across depths 0, 1 and 2 — a file that is one RNC stream whose output is a concatenation of RNC streams, some of which are themselves concatenations. Every CRC-16 matches. All the prose is at the bottom layer: a pipeline that unpacks one level and greps sees the menus and none of the script.
602,344 bytes of prose, in four complete languages. English 21.7 %, French 25.2 %, German 24.7 %, Italian 22.4 % — 6.53 % of the resident image. The string tables have no stored length, entries that point backwards to reuse a line, and two record shapes distinguished only by whether the first byte is printable. Encoding is 7-bit ASCII plus CP437, 23 distinct high bytes, every one of them a character these four languages need and nothing else. On the 87 records where the four language blocks align position for position, zero strings are untranslated.
The Akiko prediction was wrong, and the tooling was the reason. Three
lea $B80000,a5 — a hand-written CD-ROM driver — and two lea $B80030,a2
with $BFE001, which is a bit-banged I²C driver for the CD32's serial
EEPROM. Every other disc in the series that saves anything calls
nonvolatile.library; this one cannot, because the loader switched Exec off,
so the save system is a device driver. The scan carried from earlier discs
missed all five sites because it matched two of the eight address registers.
The C2P port really is zero, for the fourteenth time.
Six bitplanes with KILLEHB clear — an ECS display on a CD32.
BPLCON0 $6200, BPLCON2 $001B, 32 colour registers all ≤ $0FFF, no
BPLCON3, no BPLCON4, no DIWHIGH. The only AGA register touched anywhere
is FMODE, written once, with zero — the one write that makes AGA behave like
ECS. copper.prg is 96.5 % reserved space: two regions of exactly 3,200 empty
copper slots, which is 16 instructions per scanline for 200 lines, double
buffered.
The fourth D J Pocock master leaves 232 unclaimed sectors, against ten
discs at 32, exactly as predicted before the sector map was built. Four
studios, four publishers, one name, a 34:1 range of volume sizes. The
mechanism is still open, and this disc adds one lead: its C/FreeAnim and
C/noopenwb are byte-identical to Liberation's — the other Pocock master with
a c/ directory — timestamps to the second included.
Eighteen files the shipped executable names and the disc does not have:
block1_1.np through block5_4.np and capt.np, 32 % of the loader table,
with block5 listed before block4.
Four slots empty in both copies of the same table. Two part files carry
the ship's star-map gazetteer, identical entry for entry except the three
destinations that chapter offers — and slots 12, 13, 15 and 40 are empty in
both, at the ends of two runs, in a table that otherwise describes thirty
places in two or three sentences each.
A complete floppy save-disk system in a CD32 executable — Please insert a save game disk., a format prompt, a filename entry prompt — and 40 bytes
further into code.prg a full UK Amiga keyboard map to service it, on a
console with neither a floppy drive nor a keyboard.
A 40,820-byte loader with 757 bytes of code in it. The other 40,003 bytes
are a read buffer declared inside HUNK_CODE rather than as BSS, so they were
pressed onto the disc as zeros. The buffer is 40,002 bytes and the Read()
that fills it asks for 131,072.
Iniverse CD32 — the PVD's application identifier, the title with one
adjacent key wrong, on a retail pressing.
| 00-overview.md | what the disc is and what it says about itself |
| 01-disc-image.md | tracks, the PVD field by field, the .TM block, the sector map, the 232 |
| 02-filesystem.md | 52 files, the timestamp log, directory order, the two shared utilities |
| 03-boot-chain.md | boot script, SetPatch, the loader, the memory map, where the OS dies |
| 04-compression.md | RNC ProPack 1, three nesting levels, the container shapes, the census |
| 05-script-engine.md | the bytecode VM, its opcode table, the other two dispatch forms, hotspots |
| 06-text.md | string tables, four languages, CP437, the verb table, the credits |
| 07-graphics.md | the copper list, Extra-Half-Brite, the picture format, the Blitter |
| 08-audio.md | 23 Red Book tracks, the Akiko CD driver, and what Paula is not doing |
| 09-hardware.md | Akiko, the EEPROM over I²C, the pad, the keyboard |
| 10-leftovers.md | cut content, dead code, and what the disc says about the people |
| 11-executables.md | code.prg's private relocatable format, the export table, the three figures |
| 12-open-questions.md | what is unresolved, with the measurement beside it |
Generated output, committed so the documents can be checked without running
anything: notes/ holds the ISO volume dump, the file inventory,
the timestamp log, the container walk, the packed-stream scan, the string-table
dump, the language census, the copper list, the register scan, the dispatch
tables, the Akiko scan, the audio track census and the three-figure table.
Python 3, no dependencies beyond Pillow (for the renderers) and capstone
(for dis68k.py).
| tool | what it does |
|---|---|
isodump.py |
PVD field by field, the .TM pointer, the directory tree, the sector map |
census.py |
per-file container identification, entropy, unpacked and used sizes |
packscan.py |
validated magic scan at every byte offset, recursing into what it unpacks |
containers.py |
the full container tree with the raw gaps between streams |
unpackall.py |
unpacks every stream at every level into a mirrored tree |
rnc.py, rnc2.py, pp20.py |
the decompressors the scans validate with |
band.py |
the three figures — on disc, resident, used — per file |
textscan.py |
finds and dumps the string tables, both record shapes, empty slots kept |
langsplit.py, slots.py |
language blocks, slot occupancy, translation completeness |
dispatch.py |
finds the bytecode dispatch tables and counts their opcodes |
relocs.py, dis68k.py |
hunk structure and relocations; M68K disassembly with branch targets recomputed |
copperfind.py, copperpal.py |
copper lists, with BPU3 handled; 24-bit palettes from LOCT pairs |
picture.py |
renders the two picture formats, with Extra-Half-Brite |
planar.py, geomguess.py |
general planar rendering and stride recovery |
regscan.py, dffscan.py |
custom-chip register scans, base-tracked and absolute |
akiko2.py |
Akiko scan over all eight address registers |
audiotracks.py |
Red Book census |
isodump.py, census.py, rnc.py, rnc2.py, pp20.py, relocs.py,
dis68k.py, copperfind.py, copperpal.py, planar.py, geomguess.py,
regscan.py, dffscan.py, akiko.py and audiotracks.py are carried from
the sibling repositories in this series. packscan.py, containers.py,
unpackall.py, textscan.py, langsplit.py, slots.py, dispatch.py,
picture.py, band.py and akiko2.py are new here — akiko2.py because the
inherited akiko.py returns a false negative on this disc, which is itself a
finding (09-hardware.md).
mkdir -p _work
python3 tools/isodump.py "Universe (1994)(Core)(M4)(Track 01 of 24)[!].iso" \
--extract _work/iso --json notes/iso-volume.json
python3 tools/unpackall.py _work/iso _work/unpacked
python3 tools/band.py _work/iso _work/unpacked
python3 tools/textscan.py _work/unpacked --dump notes/text-dump.txt
python3 tools/picture.py _work/unpacked/king.pak/king.pak.000000.bin king.png
_work/ is git-ignored, as is every image and audio format.