A measured description of one directory: 2 files, 226,141 bytes, holding
THE DEMON'S FORGE (Mastertronic, MS-DOS, 1987; designed by F. Brian
Fargo, written by Randy Walsh and Troy Worrell — all of it read off the
object's own title screen) in the copy that names its packager in its first
49 bytes: Demon's Forge by Mastertronic. Dos Driver by Mok. The object is
not published. What is published is what could be counted, decoded, rendered
and checked — and this time 72.7 % of it was a file nobody had opened past its
directory, and the directory had been read one record off.
| what it is | a room-by-room CGA adventure with a parser: a gladiator thrown into the demon Anarakull's dungeon to find its exit — and 72.7 % of it is a 160 KB self-booting diskette image, opened this session down to its 75 room pictures |
| studio | Mastertronic — (c) 1987 MASTERTRONICS ltd. on the title screen; designed by F. Brian Fargo, written by Randy Walsh and Troy Worrell, per the same screen; Mok wrote the DOS patch |
| year | 1987 — the copyright the title screen prints, at GAME.DAT +0x125B and +0xB7D8 and FORGE.EXE +0xA3D8; the file-system date, 1999-08-23 on both files, is Mok's copy |
| platform | IBM PC, CGA 320 × 200 four-colour (with a PCjr path in the code); originally a self-booting 160 KB diskette, here as a DOS program plus its image |
| files | 2, one flat directory |
| bytes | 226,141 — FORGE.EXE 61,789 (27.3232 %), GAME.DAT 164,352 (72.6768 %) |
| distinct sha1 | 2 |
| the clock | one, 1999-08-23, the copy's; the game's date is a printed 1987 |
| coverage | specified 27.3232 %, derived 72.6768 %, opaque 0, residue 0 |
| the archive | 120 named entries: two MZ programs, one empty CGA frame, the intro, 75 rooms and 28 objects as vector drawings, all rendered, ten save slots — eight of them a player's, named PAUL |
| crossings | 0 of 2 hashes over 113 repositories — the sixth zero in a row |
| tools | 589 Python files: 587 inherited (1 changed), 2 written |
The work this time was a reader for a file that turned out to be a
diskette. GAME.DAT is 512 + 40 × 8 × 512 bytes: a signature sector, then
a single-sided diskette whose boot sector loads MZ programs off a 121-record
directory without DOS. Record 2 of that directory is FORGE.EXE, byte for
byte except 151 bytes in which Mok replaced int 13h with int 21h, a busy
loop with the BIOS clock, and halts with exits — which is why the
pre-briefing found the prose "in both files". The rooms would not render from
their bytes: the fifth byte of each record was not a colour and 256 was not
the width. Their grammar was read out of the engine's drawing interpreter
with dosdis.py — a ninth x bit in the op byte, a span fill against white
with 36 dither patterns, a mode-register write as the first record — and
forgedat.py draws all 75 rooms and 28 objects the way the engine does,
2,647 of 2,849 fill seeds landing on white, none leaking. Out came the game:
two horned guards at a cave mouth, a well, a crypt, a throne, a forge with an
anvil, a maze whose wall reads First Left and Then Right Until Stop, a
rabbit looking out of a doorway in room 28 where the state table puts it,
and Anarakull, horns up, in room 75.
The pre-briefing's directory reading was wrong in four independent ways — the name comes after the coordinates, the "type" is a length, the page is 512 bytes, the second coordinate is an offset — and every name in its table was one record late. Its five predictions score two right, one half, two wrong; the wrong two were the two built on that reading.
There is a witness. The ten save slots are named, and the one called
Not Saved is the only one whose bytes equal the initial state. Someone
called Paul saved eight times.
Six, and the count is the object's. Two carry the 72.7 %: one for the diskette and its directory, one for the pictures, because a format whose grammar lives inside an executable takes the directory and the disassembly to open. One carries the program, its parser tables and Mok's 151 bytes.
| 01 — THE DEMON'S FORGE: two files, and the one that was a diskette | what it is, the denominators, the two dates and which is the game's |
| 02 — The technical sheet | every figure with the command that makes it again |
| 03 — GAME.DAT: a self-booting diskette in a file, and the 120 things on it | the boot sector read to the end, the directory read the engine's way, the boot chain closed, the saves and their names |
| 04 — The pictures: a vector grammar read out of the engine, and 75 rooms rendered | the interpreter, the line, the fill, the closures, what the rooms show, one room in text |
| 05 — FORGE.EXE: an unpacked program that is the diskette's engine, plus 151 bytes of Mok | six segments, the verb and noun tables, the fifteen patches that make a DOS program of a diskette's engine |
| 06 — Corrections, five predictions scored, and the calibration term | seven corrections, two right / one half / two wrong, +8.00, rule 0 as a log |
Every figure is reproducible from the repository root with the object beside
it in demons-forge/; the commands are in docs/02
and the tool runs they came from are in notes/. Nothing was executed,
installed or emulated: the boot sector, the pre-loader and the engine were
read as data with a disassembler, and the pictures were rendered by a Python
transcription of the routines that listing shows. The object, _pre/,
_work/, prompt.txt, .claude/ and tools/__pycache__ are not
published; README, docs/, notes/, tools/ and .gitignore are.