C:setpatch >nil:
LOADERBLACKPAL
C:STACK 8192
C:ASSIGN >NIL: "Legacy of Sorasil DISK 1:" "cd0:"
C:ASSIGN >NIL: "Legacy of Sorasil DISK 2:" "cd0:"
C:ASSIGN >NIL: "Legacy of Sorasil DISK 3:" "cd0:"
QuestII 2
There is no NoOpenWB, no reboot at the end and no publisher stub. What there
is instead is three Assigns, and they are the single most informative line on
the disc.
Legacy of Sorasil DISK 1:, DISK 2: and DISK 3: are AmigaDOS volume
names — the labels on three floppy disks — and the script points all three at
cd0:. This is exactly Speris' idiom (speris-1: … speris-4:) and it means
the CD32 build is the floppy build with the volumes redirected and nothing else
changed.
The executable confirms it in the strongest possible way: it does not merely
mention the volumes, it addresses every one of its 91 data files through
them, as full paths compiled into the loader's own file table. tools/paths.py
extracts all 91 and checks each against the directory:
disk 1: 13 files Pack.Bin, Intro.Rnc, Hq2title.Rnc, ShopG.Rnc, TitleG.Rnc,
Trader.Rnc, OverG.Rnc, English.Bin, Deutsch.Bin,
Francais.Bin, GREMLIN.PAK, HEROLOGO.PAK, PRESENTS.PAK
disk 2: 39 files FASTG.BIN, GAMEG.BIN, and the four nine-file dungeon
families -- SKETCH/, GLUED/, BITS/, CHARTS/ -- plus Level.Map
disk 3: 39 files HQ2GAME.RNC, AUDIOG.BIN, CREDITSG.BIN and all 36 CHAPS/*.RAW
That is a complete three-floppy layout, recovered from a CD with no
disassembly beyond a string search, and it is what the checklist's step 15 is
for. Ninety of the ninety-one exist on the disc. The ninety-first,
Legacy of Sorasil DISK 2:Level.Map, does not (doc 11).
Note the spelling. Disk 1's names are mixed case (Hq2title.Rnc,
English.Bin), disks 2 and 3 are upper case (FASTG.BIN,
CHAPS/BARBRIAN.RAW), and the disc itself is mixed case throughout
(HQ2Title.Rnc, Chaps/Barbrian.Raw). Harmless on an Amiga, fatal on a
case-sensitive host, and a hint that the three tables were written at different
times.
Stack is the AmigaDOS command that sets the shell's stack size, and 8,192
bytes is eight times the default. It is here because the game inherits the
shell's stack, and it is the reason Stack is on the disc at all.
The game executable is launched with an argument, the digit 2. The first
stage does not parse it with ReadArgs, and the only dos.library calls in the
program are Open, Close, Read, Write, Seek, Lock, UnLock and
Examine (doc 05) — so if it reads the argument at all it does so out of the
command line the shell hands it. What 2 selects is unresolved and it is in
doc 12; the obvious candidates are a screen mode, a
language default and a drive-speed setting, and nothing on the disc decides
between them.
The second line of the boot script runs a file in the volume root, not in
C:. That is the Gloom shape — Kickstart's C: assign on a booted CD32 volume
finds commands in the root — and it is the fourth shape of boot script in this
series.
/loaderblackpal is 572 bytes on disc: an AmigaDOS hunk file with one 228-byte
chip code hunk, 11 relocations, and 13 HUNK_SYMBOL entries that
survived. It is the only symbol table anywhere on this disc.
START 0x006 FREEANIMNAME 0x0c0
OPENLIBRARIES 0x042 LOWLEVELNAME 0x092
BLACKCOLOURS 0x07e DOSNAME 0x0a3
BLUEBITS 0x006 GFXNAME 0x0af
GREENBITS 0x006 FABASE 0x0d6
MYGFXBASE 0x0de DOSBASE 0x0da
LOWLEVELBASE 0x0d2
and the whole program, re-read from the bytes:
0x000 jmp START
START:
0x006 movea.l 4.w,a6
0x00a lea FREEANIMNAME,a1 ; 'freeanim.library'
0x010 moveq #0,d0
0x012 jsr -552(a6) ; OpenLibrary -- not OldOpenLibrary
0x016 move.l d0,FABASE
0x01c bsr OPENLIBRARIES ; dos, graphics, lowlevel
0x020 movea.l 4.w,a6
0x024 movea.l FABASE,a1
0x02a jsr -414(a6) ; CloseLibrary
0x02e movea.l MYGFXBASE,a6
0x034 suba.l a1,a1 ; NULL
0x036 jsr -222(a6) ; LoadView(NULL)
0x03a bsr BLACKCOLOURS
0x03e moveq #0,d0
0x040 rts
OPENLIBRARIES: ; three OpenLibrary calls, version 0
0x042 dos.library -> DOSBASE
graphics.library -> MYGFXBASE
lowlevel.library -> LOWLEVELBASE
0x07c rts
BLACKCOLOURS:
0x07e lea $DFF180.l,a0
0x084 move.w #$1f,d7 ; 32 colour registers
0x088 move.w #$0,(a0)+
0x08c dbra d7,0x088
0x090 rts
Four things worth taking away from 228 bytes.
It is the freeanim.library open, and the gap is real. The library is
opened first, before anything else, exactly as the Amiga CD32 Developer
Notes require; three further OpenLibrary calls happen in the interval; then
it is closed. That is another sighting of the documented open/close pair, and
there is still no call to the library on any disc in this series. Against
Microcosm's zero-length gap this one is small but not empty: three library
opens' worth of work happens while the boot animation fades.
It uses OpenLibrary (−552), not OldOpenLibrary (−408) — asking for
version 0, and never testing the result, which is precisely what the notes tell
developers to do so that the program still runs on a plain Amiga with a CD-ROM.
It leaks three libraries. dos, graphics and lowlevel are opened and
never closed, and dos and lowlevel are never used at all — only
MYGFXBASE is, for the single LoadView(NULL). The program exits immediately
afterwards, so three library open counts are left raised for the rest of the
session. Harmless in practice; it is what the file looks like when somebody
copied the "open the libraries" subroutine out of the game.
And BLACKCOLOURS is the disc's own statement of its colour count. It
writes 32 colour registers, COLOR00 through COLOR31, and stops. On a
disc that never calls LoadRGB4 or LoadRGB32 and never writes BPLCON3,
this loop is the most direct evidence available that the display has 32 colours
and not 64 or 256 — see doc 06.
Two symbols do not correspond to anything. BLUEBITS and GREENBITS both
have the value 0x006, which is START — three labels at one address, in a
program whose only palette code writes zeros. There is no blue or green
component anywhere in the 228 bytes. The likeliest reading is that an earlier
version faded the palette down a channel at a time and the code was deleted
without deleting the labels; the disc does not settle it.
c/Assign 3,220 B $VER: assign 37.4 (25.4.91) Commodore, Workbench 2.04
c/Stack 872 B no $VER: string
c/setpatch 12,968 B $VER: setpatch 40.12 (16.9.93) Commodore, Kickstart 3.1
All three are run by the boot script, so unlike Marvin's SpeedyCD or
Liberation's CloseAnim nothing here ships unused.
Hashing them is where this disc pays. The platform checklist says to hash
the binaries and not only the $VER: strings, because Commodore-era developer
files circulated between studios as single copies. Two of these three are
copies already in the series:
SHA-1 5fa6e23089c82e7292073fecebaab8b6ed03ad49 12,968 B c/setpatch 40.12
== Liberation (Byte Engineers / Mindscape, April 1994)
== Prey CD32 (KirkMoreno / Almathera, November 1993)
== HeroQuest II (Gremlin, June 1994) -- three discs
SHA-1 b5b7edb67f578019d46af425a16458ec0cdb1c2e 3,220 B c/Assign 37.4
== Prey CD32, Speris, Legends, Liberation, HeroQuest II -- five discs
SetPatch 40.12 is now the third Commodore-era file shown to travel as a
single copy, after the .TM block (eight discs) and freeanim (two), and the
first to do it in three copies across three unrelated studios and three
publishers. Assign 37.4 goes further: five discs, five studios, five
publishers, 1993 to 1996, and one 3,220-byte file. A command from April 1991
shipping unchanged on a 1996 CD32 disc is not surprising on its own; five
byte-identical copies is a measurement of how Amiga development actually
distributed its tools, and it costs one sha1sum.
c/Stack is the odd one out: 872 bytes, no $VER: string at all, and no
match against any file in the other nine repositories. Its only strings are
three error messages (bad argument for STACK, current stack size is %n bytes, Suggested stack size too small / too large), which are Commodore's
wording, so it is a Commodore Stack — from a release early enough not to carry
a version string, or with it stripped.
setpatch 40.12's own string table names the patches it can install, and on
a CD32 title several of them are the reason it is there at all:
NuDrive Firmware Patch, NuCDPatch Interrupt, nonvolatile.library GetNVList() patched, BestModeIDA() patch, Gfx HashTable patch,
NMI Hardware patch, Conner CP2024 patch. Its ReadArgs template is
QUIET/S,NOCACHE/S,REVERSE/S,NOAGA/S — and the boot script passes none of them.
- No
libs/directory.lowlevel.libraryandnonvolatile.libraryare both opened by the game,lowlevelagain byloaderblackpal, and neither ships on the disc — so this build needs a machine that already has them: a CD32, or an Amiga running Workbench 3.1. Speris, Marvin and Prey all carry their own copies for exactly that reason and this disc does not, which is the shape of a CD32-only build even though the game itself is a floppy port. - No
NoOpenWB. The Workbench screen is dealt with byLoadView(NULL)inloaderblackpalinstead. - No reboot. The boot script ends at
QuestII 2and never gets control back, so the machine is left however the game leaves it. - No
.infofile, so no Workbench entry point (doc 01). - No
.bakbeside the boot script, which Gloom had and which would have been the previous release's script.