# 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](launcher-compatibility.json) · [DOSBox observations](launcher-tests.json) · [Selected presentation programs and batch commands](versions.md#launch-scripts-and-selected-programs).

## 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:

- `DISKA.DAT`, starting at byte **759,961**, followed by all of `DISKB.DAT` through `DISKH.DAT`, produces **10,493,345 bytes**.
- Those bytes exactly match the installed floppy `DID.DAT` before its final four bytes. Their SHA-256 is `9e16e55d0eed47b343712fc1b78f768db638e706814b1c062705339956ffc18b`.
- The fresh installation's appended stamp is `43 b3 ff ff`; the archived installation's is `03 b1 ff ff`. All preceding bytes are identical.
- All three retail CD installations instead have archives **byte-identical to their disc files**, with no extra hardware trailer.

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](floppy-installer-comparison.json).

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](launcher-compatibility.json) 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](pcplus-demo/comparison.json) records the original hashes and 28 differing ASCII bytes; see [the demo analysis](acquisitions-2026-10-15.md).

## 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).

- **Synth drivers:** each build embeds FM/AdLib, SCC-1 and LAPC-I drivers. The corresponding driver blocks are byte-identical once their ASCII build date and time are masked. These launcher revisions do not introduce different instrument synthesis code in those blocks. The exact embedded dates and times are listed above.
- **Mute helper fix:** at OSL-relative `0x1dfa`, the older builds execute `mov ah,9; mov al,0; int 60h`. The patched/later builds use `mov cl,0; mov ah,9; int 60h`. Service 9 takes the slot volume from `CL`, making the latter the meaningful zero-volume request. This is a static identification; the startup tests do not exercise every use of that helper.
- **FM failure-cue spelling:** the three older builds request `tunes\1unsucc.adl`; the later CD build requests `tunes\1unsuc.adl`. All five retained archives have a matching entry for the shorter name and none for the longer name, and no loose override exists in the retained installs. This identifies an apparent earlier filename error; audible behaviour at that cue has not been tested here.
- **Resource path:** the earliest floppy launcher sets `DID` from the working directory. The later launchers support respecting a supplied resource path, including the leading `DID=...` assignment discussed in the launch-script notes.
- **DOS startup plumbing:** the older launchers pass `DOS4G=NULLP` and `DOS16M=^0x20` to the child in the tested configuration; the later ones omit them. The swap configuration's virtual-memory figure changes from `4296` to `5000`, and the later launchers capture/replay child output through `TFXOUT.$$$`.

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](launcher-tests.json) records sixteen startup trials, including the rejection cases; they are not sixteen distinct successful combinations.

[Hardware rejection capture](launcher-tests/hardware-check.png) · [Original floppy launcher running September CD data](launcher-tests/swapped-launcher-menu.png).

## 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](launcher-tests/probe.asm) 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](launcher-tests/fingerprint.asm) 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.
