Files
CydandClaude Fable 5 e3c090695d Phase 1 complete: captured VPX boot conversation from shipped binary
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>
2026-07-02 22:46:20 -05:00

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:

  1. Reset the transputer with the preamble above.
  2. Stream VRENDMON.BTL (the /tranny file) to outputData, polling outputStatus bit0 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.BATPARAMETR.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.C exactly; stage 1 has no surprises.
  • Hidden bulk-transfer / interrupt path → none seen; the download is plain polled single-byte outp to 0x151. (outsw/ok_to_fifo were not used for the monitor download.)