Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Universe (Core Design, 1994) — Amiga CD32

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.

The disc

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.

Highlights

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 executablePlease 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.

Documents

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

Notes

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.

Tools

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).

Reproducing

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.

About

Structural documentation of the Amiga CD32 release of Universe (Core Design, 1994): a 16-opcode bytecode interpreter, RNC ProPack nested three levels deep, 602 KB of four-language script, Akiko's CD-ROM and I2C EEPROM ports driven by hand, and an ECS display on AGA silicon.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages