Ten CD32 discs, ten discs with leftovers. The platform checklist's question has been inverted for a while — is there a CD32 disc that was cleaned up, and what does one look like? — and this is not it either.
/HeroLogo.Pak is 5,576 bytes on the disc, 40,000 unpacked, a 320 × 200
five-plane screen, and it is the first thing the game shows after the publisher
logo. Rendered:
HEROQUEST (TM)
II
M A S T E R S
Heroquest © 1994 Hasbro International Inc.
All Rights Reserved. Heroquest was developed
in association with Games Workshop
The game is called Legacy of Sorasil. That name is the PVD volume
identifier, the application identifier, the three floppy volume names, all 91
paths in the loader's file table and the boot script's three Assigns. It is
not on the title screen. The subtitle drawn into the retail logo, under
HEROQUEST II, is MASTERS.
This is Liberation's leftover in a different form. That disc carries its previous title in every path; this one carries a previous subtitle in the one place a player actually sees, and the name that shipped everywhere else never made it back into the artwork.
It is also the only place on the disc where the licence appears. There is no
Games Workshop, Hasbro or Milton Bradley string in the executable, in the
three language files or in any other file: the entire legal notice is 8 rows of
pixels in plane 0 of one bitmap.
/CreditsG.Bin block 2 is a single-bitplane 320 × 3,100 scroll (doc 07),
legible end to end:
Programming Kevin Dudley
Graphics Matthew Furniss
Additional Programming Michael Hart
Music Chris Adams
Sound Effects Pat Phelan
Game Design Paul Green
Assistant Producer Simon Short
Producer Tony Casson
Manual Kai Macmahon, Steve McKevitt, Martin Calpin
Quality Assurance Lee Campbell, Tony Howe, Rob Millington
THE END
and then the whole list again, so the scroll wraps without a copy.
Kevin Dudley is the data preparer in the primary volume descriptor
(doc 01). The person who ran ISOCD on the afternoon of 15 June 1994 is the
person the game's own credits call the programmer, and the two halves of the
disc agree without either knowing about the other. That is the third disc in
this series where the trick works — Legends' Richard Teather is in a photograph
on its credits screen, Marvin's Stewart.. is one of its producers — and it is
still the cheapest attribution on the format.
And the credits do not mention Imagitec. The music player linked into the
executable says Imagitec ProTracker Replay Routine....(C)Copyright 1991 Imagitec Design Ltd.... (doc 09), which is a different studio, and no screen
in the game names it. Gloom's credits name its cruncher's author; this disc's
credits name ten people and not the company whose code plays every note.
QuestII.hunk1 + 0x15474 holds the NUL-terminated string
FrogAndParrot
and the routine at 0x15650 loads its address into a6 and then calls the
GetCopyNV wrapper — so it is the name attached to the game's saved position,
and on a successful load a word four bytes past its end is cleared. It is not
referenced anywhere else and it is not in any of the three language files, so
the player never sees it.
The Frog and Parrot is a pub on Division Street in Sheffield, a few minutes' walk from where Gremlin Graphics had its offices. It is where a default save name comes from when nobody expects the string to leave the building. Liberation put both its authors' surnames in a random-name table; Marvin's music modules carry two private postal addresses; this one names the local.
The disc carries the Gremlin Graphics logo screen twice.
/Gremlin.Pak 14,770 B on disc -> 40,000 named by the loader, disk 1
/Sketch/Gremlin.Pak 14,547 B on disc -> 40,000 named by NOTHING
They are the same picture. Unpacked they differ in 220 bytes out of 40,000, and the differences are confined to plane 0, rows 192–199 — the bottom eight scanlines. Rendered, the version the loader uses has
© 1994 Gremlin Graphics Software Limited.
along the bottom, and the copy in Sketch/ does not. The disc ships the
pre-copyright draft of its publisher's logo, in the directory that holds the
nine dungeon illustrations, where it is the only 40,000-byte file among nine
32,000-byte ones, referenced by no string on the disc.
It is one of seven files on the disc that no path string names; the other six
are the executable, the boot script, loaderblackpal and the three C:
commands, all of which the boot chain reaches by name (doc 03).
The loader's file table holds 91 paths and 90 of them exist. The ninety-first is
QuestII.hunk2 + 0xb2be Legacy of Sorasil DISK 2:Level.Map
It sits at the very end of the table, immediately after
CHARTS/VENTHRAX.MAP — the last of the nine dungeon maps — and immediately
before the string input.device. So the table is: nine dungeon maps, then a
tenth map called Level.Map, then the end.
Charts/*.Map are all exactly 32,768 bytes, a 64 × 64 grid of 8-byte cells
(doc 07). A tenth file of that family, named in the loader, absent from the
disc, is a tenth dungeon — or a scratch level the code still opens.
Three containers ship with slots that point nowhere.
OverG.Rnc has eight entries and its table reads
32, 11552, 22010, 31356, 0, 43168, 43168, 43168
Entry 4 is zero — an empty slot between four overworld screens and the
music. Entries 5, 6 and 7 all point at the same block, which is the artifact
module: three regions of the game asking for one tune.
CreditsG.Bin block 1 has 29 entries of which the last three all point at
the end of the file, and entry 7 duplicates entry 8's offset: four empty slots
in one table.
Charts/*.Map byte 7 is zero in all nine files — 4,096 cells each, 36,864
bytes across the disc, a field of the map record that was reserved and never
used.
224 unused colour entries is Gloom's version of this; here it is a byte per map cell and four container slots.
The three language files (doc 08) carry, identically in all three:
entry 0, 1 '00000000'
entry 85, 86 '00'
entry 87, 88 '0000'
entry 91, 92 '76543210'
entry 89, 90 '..'
entry 343 ' '
entry 344, 345 '0'
76543210 is the one that gives it away: a descending run is what somebody
types to check which digit lands in which column. Each of these is the right
length for its field and the wrong content, which is the checklist's
definition of a placeholder, and each shipped three times over.
Beside them, seven entries — 2, 3, 4, 322, 323, 326 and 327 — are the empty string with live pointers into them.
Entries 304–321 of the string table are the complete closing narration of the
game, eighteen consecutive strings, and they are byte-identical in
English.Bin, Deutsch.Bin and Francais.Bin. A German or French player who
defeats Venthrax is told, in English, that "your names shall be in the history
books for aeons to come."
LOAD, SAVE, RESET and EXIT were not translated either, though the eight
save-slot labels beside them were.
Text entry 94, in all three languages:
Please insert Legacy of Sorasil Patch
The boot script assigns DISK 1:, DISK 2: and DISK 3: (doc 03) and the
loader's file table names only those three. Legacy of Sorasil Patch is a
fourth volume that nothing on this disc assigns and no path uses — a patch
floppy from the A1200 release's support life, still prompted for by a CD.
The machinery behind the prompt is on the disc too: a complete Lock /
Examine / UnLock volume-name wait loop at hunk1 + 0x156a0, with the right
mouse button as its cancel, and no bsr, jsr, jmp or longword reference
to it anywhere in the executable (doc 10). It also could not work if it were
called: the name it compares against is 22 characters, Legacy of Sorasil DISK,
and the CD's volume identifier is seventeen.
Five audio tracks, 31 minutes 42 seconds. The only CD_PLAYTRACK call site
passes 2 or 3, and the "track finished" handler toggles strictly between 2 and
3 (doc 09). Tracks 4, 5 and 6 — 7 minutes 15 seconds, 9.8 % of the whole
disc — are unreachable. One of them is ten seconds long, which is a sting or
a jingle; two are three and a half minutes each.
/loaderblackpal is the only file on the disc with a symbol table, and two of
its thirteen symbols are BLUEBITS and GREENBITS, both with the value
0x006 — which is also START. Three labels at one address, in a 228-byte
program whose entire palette code writes zeros to 32 registers. There is no blue
or green anything in it. The likeliest reading is a fade that was written per
colour channel and then deleted, leaving the labels; the disc does not settle
it.
Recorded because they are measurable, not because the game visibly misbehaves.
The interrupt pair does not match. Start-up calls AddTimerInt (lowlevel
−72) and throws away the handle it returns; shutdown calls RemVBlankInt
(−108) with whatever is in a5. There is no AddVBlankInt (−102) and no
RemTimerInt (−78) in the file (doc 05).
The save writes 24 bytes and reads 238. StoreNV is handed
(238 / 10) + 1 where GetCopyNV's result is copied out 238 bytes at a time
(doc 10). Gloom stores two and reads twenty; this is the same defect, larger,
and with the arithmetic that caused it still visible as a divu.w #10.
QuestII.hunk2 + 0x36e3 holds seven records 128 bytes apart, each beginning
with a NUL-padded name and carrying its own index:
Ravenslock Grimbeard Stormbow Celeste Oakheart Haxar Calorflame
Haxar is five characters and vanishes from any strings run with a minimum
length of six — which is exactly how it was nearly missed here. What made it
findable was the gap: six names at a perfectly even 128-byte stride and one
step of 256.