NET: full networked mission runs end-to-end; fix blank VDB heads (NIC/VDB port clash)

Console queues a mission -> egg over the wire -> pod loads + runs it -> all
cockpit heads render -> mission ends on the console timer. Four fixes:

1. ne2000.cpp: don't BX_PANIC on the TCR inhibit-CRC / auto-tx-disable bits.
   A full production boot runs the packet driver's internal loopback
   self-test, which sets those bits; Bochs' NE2000 aborted the whole
   emulator. Record them in TCR state instead (harmless for an emulated NIC;
   pcap/host does framing+CRC). Also fixes a latent coll_prio bit-4 vs bit-3
   round-trip bug. Committed copy in vpx-device/.

2. Confirmed the mission-load page fault (00FF:219D) was RIO-OFF; booting
   with the RIO live (net_full.conf) loads and runs the mission cleanly.

3. net_loop.conf + net-boot/loop.bat: GO.BAT-style loop so the pod stays
   connected to the console and picks up missions as they're queued (the
   real pod relaunches netnub after each mission/idle disconnect).

4. HEADLINE: blank MFD/radar heads were an I/O port collision. The VDB
   video splitter is hardwired at 0x300-0x31A (palettes 0x300/0x308/0x310);
   the NE2000 at nicbase=300 swallowed the game's VDB palette writes ->
   vdb_pal stayed zero -> pal_draw decoded every head to black. Same VDB
   spam corrupted NIC RX, dropping the console EndMission (mission overran
   its timer). Fix: move the NIC to 0x340 (DOSBox nicbase=340 + DOS NET.CFG
   PORT 340; must agree). VDB keeps 0x300. Config-only, no rebuild.

Adds: net_full.conf, net_loop.conf, net-boot/ (ODI drivers, NET.CFG@340,
loop.bat, README), vpx-device/{ne2000,ethernet_pcap}.cpp; updates NET-NOTES.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-05 21:18:42 -05:00
co-authored by Claude Fable 5
parent e12bfe1d3a
commit 9536d4cbc0
11 changed files with 2224 additions and 0 deletions
+47
View File
@@ -372,6 +372,53 @@ so this may not reproduce there. NEXT: retry with RIO enabled + DOSBox
ACK deadline during load); if it still faults, disassemble around game
code 00FF:219D. This joins the Division-renderer/crash workstream.
## FULL NETWORKED MISSION WORKS END TO END (2026-07-05, later) — all fixed
A complete networked mission now runs start to finish: console queues a
mission -> egg over the wire -> pod loads it -> RIO live -> **all cockpit
heads render** -> mission ends on the console timer. Four fixes got here:
1. **Mission-load crash was RIO-OFF** (confirmed). Booting with the RIO
enabled (`net_full.conf`: serial1 COM1 rxpollus:100 rxburst:16, full
RIO+sound production boot) — the page fault at 00FF:219D is gone and the
mission loads + runs. Real pods run RIO-on, so this was the whole thing.
2. **NE2000 `BX_PANIC` fixed in the emulator.** A full production boot runs
the packet driver's internal loopback self-test, which sets the NIC's TCR
inhibit-CRC bit; Bochs' `ne2000.cpp` `BX_PANIC`'d and aborted the whole
emulator. Patched the TCR write handler to record crc_disable/ext_stoptx
instead of panicking (harmless for an emulated NIC; pcap/host frames+CRCs).
Committed copy: `vpx-device/ne2000.cpp`.
3. **Pod persistence via GO.BAT loop.** When the console has no mission
queued, the pod connects, sees nothing, and cleanly exits (not a crash) —
the real pod's GO.BAT immediately relaunches netnub. `net_loop.conf` +
`net-boot/loop.bat` replicate that so the pod stays connected and ready.
4. **HEADLINE FIX — blank cockpit heads = NE2000/VDB I/O port collision.**
All 5 MFD + radar heads decoded to pure black during a live mission even
though the DOSBox SVGA gauge framebuffer was FULL (captured mid-mission:
SENSOR CLUSTER/MYOMERS/SRM 4/mech wireframes/pilot name). Root cause: the
VDB video splitter board is hardwired at **0x300-0x31A** (palettes
0x300/0x308/0x310; `VDB_BASE` in vpxlog.cpp) and we'd put the NE2000 at
`nicbase=300` — the NIC swallowed the game's VDB palette writes, so
`vdb_pal` stayed zero and `pal_draw` mapped every index to black. The VDB
spam into 0x300-0x31A also corrupted NIC registers, dropping the console's
EndMission -> **the mission overran its timer** (second symptom, same
cause). FIX (config-only): move the NIC to **0x340** in the DOSBox conf
(`nicbase=340`) AND the DOS `NET.CFG` (`PORT 340`) — both must agree; the
game uses odipkt so it's base-agnostic. VDB keeps 0x300 (game hardwires
it; real pod's NIC lived elsewhere for this reason). Non-networked gauge
runs never hit this (no NIC). Verified: heads render perfectly (radar with
contact blips + SPEED/HEADING/ARMOR + mission clock; MFDs full) AND the
mission ends cleanly on the timer (`Sending EndMission`, score 1000).
Diagnostic recipe: `New-Item <VPX_DUMPDIR>\DUMP` mid-mission dumps
win0/3/4.bmp; PrintWindow (flag 2, GL) the DOSBox SVGA window to prove the
framebuffer has content; framebuffer-full + heads-black => palette/port.
Committed: `net_full.conf`, `net_loop.conf`, `net-boot/` (drivers, NET.CFG
@340, loop.bat, README), `vpx-device/ne2000.cpp`, `vpx-device/ethernet_pcap.cpp`.
## Open questions / notes
- Exact TCP listen port(s) — not in the source grep; get from NETNUB.EXE
or a capture at milestone 3.