Built DOSBox-X from source with a custom VPX link-adapter logging device (vpx-device/vpxlog.cpp) and captured the game's outbound boot sequence. Findings: - Register map confirmed against LINKIO.C: outputData 0x151, outputStatus 0x153 (polled bit0), resetRoot 0x160, analyseRoot 0x161. - Reset preamble captured exactly (analyse=0, reset 0->1->0 + status inits). - The game streams 85298 bytes to outputData that are BYTE-FOR-BYTE identical to VRENDMON.BTL; first byte 0xF0 = transputer boot-from-link primary-bootstrap length. Protocol stage 1 (reset + monitor download) fully characterized; no hidden bulk/interrupt path. - Production cockpit dump ALPHA_1 added (git-ignored): its BT is v1.1.0.6 with a VRENDMON.BTL byte-identical to the captured stream, so this result reflects the exact cockpit software. ALPHA_1 is the reference image going forward (carries RP + production pod/network boot chain). Adds analyze_capture.py, capture.conf, PHASE1-RESULTS.md. DOSBox-X source tree and capture artifacts are git-ignored. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.1 KiB
Phase 1 — Interface Discovery: Results
Status: complete. A custom DOSBox-X build with a VPX link-adapter logging
device captured the game's outbound boot conversation from the shipped binary.
The register map is confirmed and the first protocol stage is fully
characterized: the game resets the transputer and streams the entire
VRENDMON.BTL monitor over the link, byte for byte.
Instrument
emulator/src/src/hardware/vpxlog.cpp — a DOSBox-X device (built into
libhardware, called from VPXLOG_Init() next to GLIDE_Init() in
sdlmain.cpp) that claims the C012 register range and logs every access.
It answers status reads so the game keeps transmitting:
outputStatus(0x153) → always ready (bit0 = 1)inputStatus(0x152) → no inbound data (bit0 = 0)inputData(0x150) → 0xFF (open-bus), logged if read
Enabled only when the VPXLOG environment variable names a log path, so the
build behaves like stock DOSBox-X otherwise. Built from source with MSYS2
mingw64 (build-mingw-sdl2 --enable-debug=heavy); the device compiles and
links cleanly (VPXLOG_Init present in the final dosbox-x.exe).
Reproduce:
set VPXLOG=C:\VWE\TeslaRel410\emulator\vpxlog.txt
emulator\src\src\dosbox-x.exe -conf emulator\capture.conf
python emulator\analyze_capture.py emulator\vpxlog.txt emulator\image
Confirmed register map (matches sda4/DPL3/LINKIO.C)
Base 0x150 (from the shipped DPLARG /device 0x150):
| Port | Register | Observed use |
|---|---|---|
| 0x151 | outputData | W — every payload byte |
| 0x153 | outputStatus | R — polled (bit0) before every payload byte |
| 0x160 | resetRoot | W — reset pulse (see preamble) |
| 0x161 | analyseRoot | W — asserted low once at reset |
| 0x152 | inputStatus | W — one init write during reset |
| 0x150 | inputData | not yet exercised (monitor never booted to reply) |
inputData/inputStatus reads will appear in Phase 2 once the emulated
monitor answers and the game starts reading responses.
Access summary (one capture, ~30 s, game killed while it waited for the monitor)
R outputStatus 85298 poll-before-send, one per payload byte
W outputData 85298 the monitor image
W resetRoot 3 reset pulse: 0, 1, 0
W analyseRoot 1 0
W outputStatus 1 0 (init)
W inputStatus 1 0 (init)
Reset preamble (exact, from the capture)
seq 0 W analyseRoot 0x00 deassert analyse
seq 1 W resetRoot 0x00 reset low
seq 2 W resetRoot 0x01 assert reset
seq 3 W outputStatus 0x00 init
seq 4 W inputStatus 0x00 init
seq 5 W resetRoot 0x00 deassert reset -> transputer starts, listens on link
seq 6 R outputStatus 0x01 ready -> begin download
The download — exact match
The 85,298 bytes written to outputData are byte-for-byte identical to
VRENDMON.BTL (verified by analyze_capture.py). The first byte is 0xF0
(240) — the transputer boot-from-link primary-bootstrap length — confirming
VRENDMON.BTL is a standard bootable transputer image (.BTL = bootable).
The game's own header (sda4/BTLIVE/SETENV.BAT) names it:
DPLARG=/tranny~.\vrendmon.btl~....
So protocol stage 1 is now precisely known:
- Reset the transputer with the preamble above.
- Stream
VRENDMON.BTL(the/trannyfile) tooutputData, pollingoutputStatusbit0 before each byte. No handshake bytes are interleaved — it is a straight boot-from-link download.
After the last byte the game waits for the freshly-booted monitor to respond.
Our passive logger never answers, so the capture ends there. Driving the game
further (i860 code/data segment download via /i860 vrnostex.mng, then the
version handshake in VR_COMMS.C) is Phase 2, which requires the device to
actually behave as the transputer monitor rather than just log.
Production reference: ALPHA_1
A dump of a working production cockpit (ALPHA_1) was added at
ALPHA_1/ (git-ignored). It contains the real pod boot chain
(AUTOEXEC.BAT → PARAMETR.bat Rel410 BT POD SLOW SVGA → Novell client +
odipkt packet driver + NetNub + VGL_LABS\go.bat) and both games under
ALPHA_1/REL410/BT and .../RP. Its BT resource is version 1.1.0.6 and its
VRENDMON.BTL is byte-identical to the BTRAVINE build used for this
capture — so this Phase 1 result is valid for the exact software that ran in
the cockpit. ALPHA_1 is the authoritative image for subsequent phases (it also
carries the RP side and the production launch/network configuration).
What Phase 1 retires from the risk list
- Register map / framing uncertainty → resolved from the shipped binary, not just the DPL3 sources. Confirmed base 0x150, C012 layout, poll-before-send.
- "Protocol drift" between DPL3 sources and the linked LIBDPL → the observed
behavior matches
LINKIO.Cexactly; stage 1 has no surprises. - Hidden bulk-transfer / interrupt path → none seen; the download is plain
polled single-byte
outpto 0x151. (outsw/ok_to_fifowere not used for the monitor download.)