TFX Research archive

PC Plus demo versus retail engine

The playable demo is a separate build of the retail simulation-engine family, with restrictions in its menus, presentation graph and supplied missions. It retains the retail aircraft setup, sampled-effect definitions, synthesised music drivers and music resources. Its executable also has genuine format and file-handling differences, despite the shared 2.01 configuration label.

Native comparison evidence · Eight-build study · Demo content and restrictions.

Aircraft and sound setup

The three aircraft preset routines were located from the demo's native dispatcher and executed in a relocated, isolated image. Their ordered values and write sizes match both March retail and September 2.05:

Aircraft Native write events compared
F-22 304
Eurofighter 291
F-117 296

All 891 writes match, with a consistent one-to-one mapping of the 308 destination locations between demo and March. Addresses differ between builds and are retained in the full evidence. This establishes matching initialisation under the isolated test conditions, rather than identical complete flight-update behaviour.

The demo also has the same 103 sampled-effect names, rates and cooldowns, and the same default high-score roster, as all seven previously studied engines. The numeric voice candidates 25, 29 and 30 acquire no descriptors in this build either. That does not exclude an unidentified dynamic loading path.

Its 81 synthesised music resources match existing March content. START.EXE, including the FM/SCC-1/LAPC-I drivers, differs from March only in date/time strings. There is no separate demo musical arrangement to extract.

Presentation record format really differs

The demo's native loader reads 17 bytes for a text-settings record and then obtains the string length from offset 11. March retail reads 16 bytes, with the length at offset 10. The separate root-level executable on the later CDs also uses the 16-byte layout.

The first animation-text loading path shows this directly:

Build File offset Record size Length-word access
PC Plus 0x74784 17 movzx eax, word ptr [ecx + 0xb] at 0x7479f
March retail 0x74bc4 16 movzx eax, word ptr [ecx + 0xa] at 0x74bdf
Shared root-CD executable 0xaf802 16 movzx eax, word ptr [ecx + 0xa] at 0xaf81d

The record-size allocation and read arguments, plus their raw instruction bytes, are retained in the JSON. This corroborates the extractor's explicit demo layout; it is not just an adjustment chosen to make the files parse. With the shifted drawing fields decoded correctly, all six companion presentation graphs reproduce March's visual sequence, wording, layout and timing. Opaque settings and saved pointers remain preserved.

Thus the shared version label does not establish engine/resource interchangeability. The sound wrapper START.EXE and the resource-reading engine TFX.DAT have different compatibility considerations.

The demo obtains getenv("DID") and incorporates it into several save-related paths, including %s\tfxsav.%i and %s\waytxt\a. For example, the save-slot enumeration at 0x63692 looks up DID at 0x636bc and formats the prefixed save filename at 0x636cb. March retail uses relative filenames for these paths.

The same prefixed format strings occur in the November floppy, patched floppy, Inferno preview and shared root-CD engines. They do not occur as referenced format strings in the December, March or September installed CD engines. The JSON records the formats per build.

This is useful evidence of differing packaging/file-handling choices across engine families. It does not identify an exact source-code ancestry or date every engine revision from the later sound driver's stamp.

The configuration program omits CD setup

Every referenced string in the demo configuration program also occurs in March's. Retail alone includes the SB/CD option and its MSCDEX/CONFIG.SYS installation strings: LASTDRIVE=Z, DEVICE=%s, CD-driver discovery and the associated failure messages.

Together with the different configuration executable, this identifies a reduced CD-audio installation/configuration path appropriate to the supplied magazine package. It does not mean the entire engine's MSCDEX playback code has been proved absent. No audio tracks or cover-CD image accompanied the acquisition.

Why the Gravis helper is larger

The demo's GUS.COM is 768 bytes larger. Some of that difference is plainly code generation: the demo performs 32-bit work through pairs of 16-bit registers and helper calls, where retail uses operand-size-prefixed 386 instructions.

One original arithmetic sequence was executed in each driver. Retail uses MOVSX EAX,AX, a 32-bit shift and add. The demo uses 16-bit sign extension, the original long-shift helper, and ADD/ADC on the two halves. Both write:

All eight tested inputs, including both signed-16-bit extremes, give identical results: 16 native calls in total. No DOS calls, sound ports or full driver startup run during this test. The tested state calculation is not assigned a pitch/volume meaning without tracing its callers.

After aligning their data segments, both drivers have 3,904 stored data bytes. Only 54 bytes differ, spanning 31 words; every changed word's old/new values lie within the corresponding code-segment extents, consistent with moved callback addresses. The field types have not all been proved.

These results explain concrete binary differences without establishing complete device or playback equivalence. The demo helper's size alone is not evidence of added instruments or new sound effects, and the observed code generation does not establish the minimum CPU requirement of the complete driver/game.

Validation and reproduction

The expanded engine study now covers eight executables, 24 native aircraft preset calls and 175,476 native relocation sites across six early-loader builds. The demo contributes 28,724 checked relocations; the original loader's results match the decoded section image byte for byte.

Of 137 qualifying annotated 2.05 routine signatures, 119 match uniquely in the demo, compared with 133 in March. These are address-masked routine prefixes, not complete function equivalence or a percentage of engine functionality. Unmatched signatures do not prove missing features.

python3 tools/compare_engine_builds.py
python3 tools/compare_pcplus_engine.py

Use the usual analysis environment with Capstone and Unicorn. The source executables remain unchanged. Complete mission playback, undocumented differences outside the mapped routines and real-card Gravis audio remain separate comparisons.