TFX Research archive

START.EXE compatibility and install-time archive stamps

The retained launchers are substantially interchangeable, with two qualifications: the sound-service interrupt must agree with the engine, and the original floppy launcher requires an installation hardware stamp. March and September 1994 already have byte-identical launchers. Other combinations tested below reach the pilot-selection menu after these conditions are satisfied; complete mission and soundcard compatibility has not been established.

Static comparison and original hashes · DOSBox observations · Selected presentation programs and batch commands.

Is DID.DAT generated during installation?

Its resource contents are prebuilt. The floppy installer assembles the file from the eight disk packs and appends a four-byte fingerprint of the installing machine:

The 30,320-byte alternate floppy installer's function at file offset 0xe3b calls the fingerprint routine at 0x2909, opens ?:\TFX\did.dat in ab mode, writes one four-byte item and closes it. Its packed counterpart has the same installer code except the previously identified key-disk branch change; see installer comparison.

The fingerprint folds the eight BIOS date bytes at F000:FFF5, a CPU classification and an FPU classification. Starting at 0xffffffff, it shifts the accumulator left once and XORs each input byte into the low byte. The original floppy START.EXE checks the last four file bytes at 0xa48, using its equivalent fingerprint function at 0xa8b. A mismatch produces “Hardware change please install again” before the game engine starts.

Executing the original fingerprint helper in DOSBox 0.74-3 gives BIOS date 01/01/92, CPU class 8, FPU class 3, and result 43 b3 ff ff: an exact match to our fresh install. The routine is therefore a machine check, rather than an archive checksum or a new resource revision. The archived copy's different stamp alone does not identify which machine originally installed it.

December's CD launcher and both later full-game launcher builds do not enforce this check. An unmodified CD archive's last four bytes belong to its index; they are not a hardware stamp. Our earliest-launcher CD experiments append a stamp to temporary copies, preserving every original archive byte. They do not replace those index bytes.

Sound-service interrupt

IRQBASE here selects a software interrupt used between TFX.DAT and the launcher's resident sound code. It is separate from the Sound Blaster's physical IRQ.

Launcher Default interface Requirement with an early engine
November floppy / December CD Fixed INT 60h (decimal 96) Already agrees
Patched version-2.0 floppy / March–September CD IRQBASE, default INT 87h (decimal 135) Set IRQBASE=96 in TFX.CFG

The November and December engines use INT 60h. The patched floppy and later CD engines support IRQBASE. Consequently an old launcher paired with a newer engine also needs IRQBASE=96. With both newer components, the default 135 works.

A diagnostic child launched by each original START.EXE captured the installed interrupt vectors and environment. With IRQBASE=135, the first two launchers install their handler at 60h; the latter two install it at 87h. All four expose the same 34-entry OSL service dispatch table. The wrapper in the newer builds patches the sound code's interrupt operands to the configured number.

Embedded driver build stamps

Within each launcher, the FM/AdLib, SCC-1 and LAPC-I driver blocks and the shared OSL core carry the same date/time pair:

Launcher Embedded Date (MM/DD/YY) Embedded Time Calendar date
November 1993 floppy 11/12/93 21:22:29 12 November 1993
December 1993 CD 12/06/93 14:50:00 6 December 1993
Patched version-2.0 floppy 02/02/94 08:13:26 2 February 1994
March and September 1994 CDs 03/15/94 10:16:04 15 March 1994
PC Plus playable demo 03/20/94 22:18:57 20 March 1994

The date format is established by 03/15/94; interpreting all stamps as month/day/year also agrees with the retained media chronology. These are strings embedded in the executable, separate from filesystem timestamps and the installer hardware fingerprint. No timezone is recorded. September retains the same March-stamped launcher, byte for byte.

The machine-readable comparison records each block's exact strings, file offsets and hashes. Masking only these date/time strings makes each corresponding synth driver block identical across all four full-game launcher builds; the surrounding OSL core and launcher still have the code differences described below. The subsequently acquired PC Plus demo also has the stamps listed above: its entire launcher is identical to March after masking those strings. Its separate comparison records the original hashes and 28 differing ASCII bytes; see the demo analysis.

Other identified changes

There are four distinct full-game launcher binaries: 33,776 bytes (November floppy), 33,840 (December CD), 36,112 (patched floppy) and 36,288 (both later CDs).

These findings do not imply that every byte of the launcher differences has a known purpose. The engine executable, resource graphs and separate Q2.COM digital-sound helper also vary independently of the embedded synth drivers.

Actual cross-version startup tests

Tests used copies under a temporary directory, a private Xvfb display, dummy audio output, DOSBox 0.74-3, 32 MB RAM, fixed 150,000 cycles and Sound Blaster Pro 2 settings. The appropriate CD image was mounted for each CD installation. The native graph name was retained for each engine/data set: demo, cd_demo or tfx.

With the interrupt settings above, these substitutions reached the same pilot-selection menu as the native controls:

Donor launcher Recipient engine and data Archive adjustment
December CD November floppy None
Patched floppy November floppy; September CD None
Later CD November floppy; patched floppy; March CD None
December CD Patched floppy; March CD None
November floppy December CD; September CD Append matching four-byte hardware stamp
November floppy Patched floppy Replace existing hardware stamp, outside archive index

The November launcher rejects both unmodified CD archives with its hardware-change message. The native November floppy, patched floppy and September CD combinations provide positive controls. The evidence records sixteen startup trials, including the rejection cases; they are not sixteen distinct successful combinations.

Hardware rejection capture · Original floppy launcher running September CD data.

Reproduction

Run python3 tools/compare_launchers.py from the research tree. It uses the bundled did-unpack module and the standard library, reads original files and writes only analysis/launcher-compatibility.json. Assertions check the prebuilt floppy concatenation, CD archive equality, shared synth driver blocks, shared dispatch table and installer append-mode evidence.

The diagnostic child can be assembled with nasm -f bin and placed as TFX.DAT in a temporary launcher directory. It writes its PSP, interrupt vectors and environment to PROBE.BIN and exits; no game code is run by that probe.

The fingerprint wrapper contains no copied game instructions. Assemble it to a temporary COM, then append the original November START.EXE bytes from file offsets 0xa8b through 0xc02 exclusive. Its padding places that helper at its original CS offsets. Run in DOSBox to obtain FPRINT.BIN: four fingerprint bytes, one CPU-class byte, one FPU-class byte and eight BIOS-date bytes. Preserve the original installs when repeating these experiments.