infocompendium

Tooling and notes for imaging and extracting 1990s hybrid CD-ROMs, with a focus on the Activision Infocom compilations.

The repo serves two purposes:

No disc content is stored here - only identification records, catalog listings, notes, and tooling.

These discs carry two filesystems over one set of data blocks: ISO 9660 for the PC side and HFS for the Mac side. macOS dropped HFS support in Ventura, so modern Macs can identify these discs but refuse to mount them. The scripts here work around that: image the disc at sector level, read the HFS volume with hfsutils, and rebuild the contents as an HFS+ disk image that current macOS mounts by double-click.

Status

Disc Imaged Extracted Notes
Classic Text Adventure Masterpieces of Infocom (1996) yes yes Full raw dump hash-matches the Redump database entry; extraction verified, 766 files with all resource forks
The Lost Treasures of Infocom (CD, 1992) yes yes First dump: no Redump entry exists; one 8 MB ISO carrying both Mac and PC trees
The Lost Treasures of Infocom II (CD, 1992) yes yes Redump-verified; fourteen titles including Shogun, both platforms on one small ISO
The Zork Anthology (1994) yes no Redump-verified; games live inside the ZORKANTH.RED installer archive, their builds identified from the container’s own records
Return to Zork CD-ROM v1.1 (1994) yes n/a Redump-verified on all 26 tracks; the original pressing of the disc later revised for the Legacy Collection
Return to Zork / The Zork Anthology (Zork Legacy Collection, 1997) yes no Redump-verified on all 26 tracks (data plus 25 audio); anthology games as loose files
GET LAMP (2010), disc 2 yes (from existing rip) n/a Bonus DVD: Infocom catalog/ad scans, curated IF games; both discs of the set verified byte-identical to the Internet Archive’s published ISOs
Zork Zero, MS-DOS (1989) yes (all five diskettes) yes The catalog’s first floppies: the dual-media retail box whose MG1 settles the IF Archive file’s provenance, with media-targeted graphics confirmed on both sides
8-bit and 16-bit retail diskettes (Apple II, Atari XL/XE, Commodore 64, Atari ST, Amiga, Macintosh) yes (twenty diskettes, twenty-one titles) partly Original 1983-88 media carrying builds no compilation does, several of them earlier than any cataloged release; see the de-facto builds and flux capture. The three Apple II V5 titles are complete: their stories continue onto the reverse side of the same diskette in an 18-sector format with no address fields, now fully decoded and checksum-verified, including Beyond Zork r49.870917 which no other medium carries

Findings

What each disc actually contains, checked against the published references:

The disc-agnostic method lives in docs/: what these discs are and how to identify them, the imaging traps and what works, flux capture and the 8-bit diskette formats, and extracting HFS volumes into modern images, plus the external references.

Layout

docs/
  identifying-discs.md           Hybrid discs, why macOS refuses them, identification. Start here.
  imaging.md                     The imaging traps and the working raw-dump method.
  floppy-imaging.md              Flux capture: 5.25" formats, flippy second sides, merging reads.
  hfs-extraction.md              hfsutils, forks, timestamps, building mountable images.
  references.md                  External references: Doherty, Plotkin, ztools, Redump.
  media-assets.md                Cross-collection table of the graphics and sound assets.
  de-facto-builds.md             The de-facto standard build of each game, per collection.
  box-releases.md                What the original boxes shipped, per title - the builds read
                                 first hand from retail diskettes, eight of them carried by no compilation or repository.
scripts/
  hfscopy.py                     Walks an HFS volume and copies it out preserving forks and metadata.
  verify.py                      Checks a checksums.txt against the files it describes, hashing
                                 .zst captures both as stored and decompressed; search roots are
                                 given on the command line, never recorded.
  raw2user.py                    Converts a raw 2352-byte/sector dump to 2048-byte user data,
                                 verifying sector structure and printing Redump-style hashes.
  picdir.py                      Lists the image directory of an Infocom V6 picture library
                                 (PC .CG1/.EG1/.MG1, Mac PIC.DATA), either byte order.
  get-ztools.sh                  Fetches and builds ztools (txd, infodump, pix2gif, check)
                                 from the IF Archive into tools/ztools/ (gitignored).
  a2gcr.py                       Decodes an Apple II 16-sector disk from flux, including
                                 copy-protected disks a stock decoder reports as empty.
  adf.py                         Lists or extracts an AmigaDOS floppy image (.adf), walking the
                                 OFS/FFS block chains - Amiga files are not contiguous on disc.
  fat12.py                       Lists or extracts a FAT12 floppy image (Atari ST, PC), descending
                                 into subdirectories, naming
                                 Infocom stories from their Z-machine header and matching save
                                 files to the story they belong to.
  macscreen.py                   Converts a raw 512x342 1-bit Mac screen dump (a StartupScreen
                                 file) to PNG.
  mfs.py                         Lists or extracts a Macintosh MFS (400K, pre-HFS) image, both
                                 forks - hfsutils cannot read MFS.
  xzip18.py                      Recovers the 18-sector second surface of an Apple II XZIP
                                 (v5) diskette from Greaseweazle flux, and assembles the
                                 complete story file. Reads .zst captures directly.
  splittracks.py                 Splits a raw dump of a mixed-mode disc into per-track files
                                 at Redump's boundaries, hashing each track.
  isz.py                         Lists and extracts InstallShield 3 .Z archives (PKWARE DCL
                                 decoder included), as found on 1990s Windows installer discs.
  appleiso.py                    Extracts an Apple-extended ISO 9660 image natively, restoring
                                 resource forks, Finder metadata and dates.
  adcopy.py                      Copies a tree, folding AppleDouble ._ companions into real
                                 resource forks and Finder metadata.
discs/
  masterpieces-1996/             One folder per disc: identification capture, catalog
    README.md                    listing, findings, and disc-specific build scripts.
    disc-info.txt                No disc content, just the material needed to archive
    masterpieces-1996.hls.txt    and verify a copy.
    notes.md
    build-masterpieces.sh
collections/
  historicalsource/              Non-disc compilations cataloged the same way; here,
    README.md                    the 2019 GitHub publication of Infocom's source code,
    versions.md                  its 70 compiled story files enumerated and hashed.
    checksums.txt

Quick start

Prerequisites:

brew install hfsutils

Given an HFS slice image already dumped from the disc:

./discs/masterpieces-1996/build-masterpieces.sh ~/Desktop/mp-hfs.img

That produces ~/Desktop/masterpieces.dmg, a compressed read-only HFS+ image with resource forks, type/creator codes, and modification dates intact.

If you are starting from a physical disc, read docs/imaging.md first - the imaging step has several traps that will silently produce a file full of zeros - then follow the per-disc steps in that disc’s README, e.g. Masterpieces.

Principles

Keep the raw sector image as the archival artifact and never modify it. Everything else in this repo produces derivatives - convenience copies for browsing and emulation. A derivative that has been re-cataloged will not hash against Redump, and that is fine, as long as the original is still around to verify against.