Net: NIC off IRQ 3 (plasma COM2 owns it) -- pod no longer goes deaf in-game

The plasma serial2 addition put COM2 (IRQ 3) in conflict with nicirq=3:
netnub phase worked, then BTL4OPT opened the plasma port and NIC RX died,
so the pod never checked in to the console. NIC now on IRQ 10 in all net
confs + NET.CFG INT 10 (both sides must agree). Verified live: two full
console missions with plasma running.

Also: launch_pod.ps1 prepends the Npcap dir to PATH itself (a bare shell
gave "NO PACKET DRIVER FOUND"); net_diag.conf = packet-stack-only boot
with the NCSA Telnet suite on E: for DOS-side TCP tests; net_loop.conf
promoted to full production parity (sound + plasma + IRQ 10) -- the
GO.BAT-style instant netnub relaunch is also what lets the console
recover its zombie TCP session between missions (see NET-NOTES).
NET-NOTES: full 7/08-09 forensics writeup (TAP RX counter lie, console
IP .10, SBK re-upload measured, zombie-session mechanics).
LAST.EGG = the operator's missions from tonight's runs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-09 00:13:11 -05:00
co-authored by Claude Fable 5
parent 419c7d5d63
commit 2233441812
7 changed files with 273 additions and 131 deletions
+46
View File
@@ -419,6 +419,52 @@ heads render** -> mission ends on the console timer. Four fixes got here:
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`.
## Post-reboot outage forensics + IRQ 3 conflict (2026-07-08/09)
A host reboot took the console<->pod link down for hours; every layer got
blamed before the real bug fell out. Findings, in the order they mattered:
- **TAP-Windows V9 "Bytes received" is ALWAYS 0** -- the driver never counts
frames its user-mode app (SheepShaver) injects. Do not diagnose from the
adapter-status dialogs: read the bridge-miniport counters (they do count)
or sniff the wire (Npcap + ctypes; see render-bridge/probes/ for the
pattern). Bridge/TAPs/SheepShaver prefs were all healthy the whole time.
- **`NO PACKET DRIVER FOUND` at netnub = wpcap.dll not on PATH** of the shell
that launched DOSBox. launch_pod.ps1 now prepends
`C:\Windows\System32\Npcap` itself so no shell can reproduce this.
- **THE REAL BUG -- IRQ 3 double-booking:** the plasma readout (serial2 =
host COM2, added 2026-07-07) sits on IRQ 3, and the NE2000 was also on
`nicirq=3`. The netnub phase works (COM2 not yet open: ARP answered, egg
flows) -- then BTL4OPT opens the plasma port (`arg4=p`) and NIC RX dies
for good. Looks exactly like a mid-boot wedge. Fix: **NIC on IRQ 10** in
net_full.conf / net_diag.conf / net_loop.conf AND net-boot/NET.CFG
(`INT 10`) -- DOSBox device and ODI driver must agree. Verified: pod
stayed ARP-responsive through two full missions with plasma live.
- **Console's live IP is 200.0.0.10** (not .1 as assumed from the gateway
entry); it ARP-scans the cockpit roster slots (.11, .112-.120)
continuously while looking for pods.
- **Zombie console session between missions:** netnub exits after each
mission without closing TCP (no FIN -- the DOS stack just vanishes).
Console 4.10 keeps waiting on the dead socket; with the pod sitting at a
DOS pause for minutes, classic Mac TCP retransmit backoff grows to
multi-minute intervals and the console looks permanently wedged (silent
on the wire). Operator fix: relaunch the Console app (app only). Real
fix: behave like retail -- GO.BAT relaunched netnub within seconds, so
the console's early retransmissions hit the fresh stack and recover.
net_loop.conf (now FULL production parity: sound + plasma + IRQ 10) is
the conf to use for multi-mission sessions; verify console self-recovery
with it next time.
- **SoundFont upload measured (smldW device counters):** the game blindly
re-uploads the full SBK on EVERY netnub->game launch -- counter goes
3,513,581 -> exactly 7,027,162 per card, no validation read-back, so
pre-loading the cards cannot short-circuit it. BUT the re-upload itself
is only ~20-30s; the slow first boot is dominated by something else
(pacer question still open). Loading a new egg into the already-running
game does NOT re-upload.
- Manual mission-N start in the same DOSBox: `32rtm.exe -x` (saying
"resident" is fine) then `netnub -p -f btl4opt > nn.log`; TSRs and SET
env persist from the autoexec.
## Open questions / notes
- Exact TCP listen port(s) — not in the source grep; get from NETNUB.EXE
or a capture at milestone 3.
+1 -1
View File
@@ -4,6 +4,6 @@ Link Support
Link Driver NE2000
PORT 340
INT 3
INT 10
FRAME Ethernet_II
FRAME Ethernet_802.2
+71
View File
@@ -0,0 +1,71 @@
# Networked pod boot (single mission, then DOS pause).
# Console (SheepShaver) pushes the mission egg over TCP 1501; pod runs it.
# RIO on COM1 + dual AWE32 sound (host env VWE_AWE32=1 + VWE_AWE_ROM=<rom>).
#
# CRITICAL: NE2000 is at nicbase=340, NOT 300 -- the VDB video splitter board
# is hardwired at 0x300-0x31A (palettes 0x300/0x308/0x310). nicbase=300 makes
# the NIC swallow the game's VDB palette writes -> all MFD/radar heads decode
# to black AND corrupts NIC RX (console EndMission lost, mission overruns its
# timer). net-boot/NET.CFG must match (PORT 340). VDB stays at 0x300.
#
# Launch (host env): VPXLOG, VPX_RESPOND=1, VPX_RENDER=1, VPX_DUMPDIR,
# RIO_TAP, VWE_AWE32=1, VWE_AWE_ROM, and C:\Windows\System32\Npcap on PATH.
# pcap realnic must be the bridge miniport (see NET-NOTES.md).
[sdl]
output=opengl
priority=highest,highest
[dosbox]
memsize=32
machine=svga_s3
[cpu]
core=dynamic
cputype=pentium
cycles=max
[ne2000]
ne2000=true
nicbase=340
# IRQ 10, NOT 3: COM2 (plasma) owns IRQ 3 in-game; see net_full.conf.
nicirq=10
backend=pcap
[ethernet, pcap]
realnic=DB5521D
[sblaster]
sbtype=sb16
sbbase=220
irq=5
dma=1
hdma=5
[mixer]
rate=44100
blocksize=1024
prebuffer=60
[serial]
serial1=directserial realport:COM1 rxpollus:100 rxburst:16
serial2=directserial realport:COM2
[autoexec]
mount c "C:\VWE\TeslaRel410\ALPHA_1"
mount d "C:\VWE\TeslaRel410\emulator\net-boot"
mount e "C:\VWE\TeslaRel410\sda4\TEL"
d:
echo === loading NE2000 packet-driver stack (pcap/bridge, port 340) ===
d:\lsl
d:\ne2000
d:\odipkt
c:
cd \rel410\bt
set VIDEOFORMAT=svga
set BLASTER=A220 I5 D1 H5 P330 T6
c:\sb16\diagnose /s
set BLASTER=A240 I7 D3 H6 P300 T6
c:\sb16\diagnose /s
set BLASTER=A220 I5 D1 H5 P330 T6
set TEMP=c:\
set HEAPSIZE=15000000
set L4GAUGE=640x480x16
call setenv.bat r f s p
echo === NETWORK DIAGNOSTIC MODE: stack loaded, NO game/netnub ===
echo NCSA Telnet suite mounted on E: (myip=200.0.0.74 per CONFIG.TEL)
echo e: then TELBIN 200.0.0.1 (TCP connect test to the Mac console)
echo or FINGER @200.0.0.1 / FTPBIN 200.0.0.1
echo When done, start the game manually:
echo C: then CD REL410\BT then 32RTM -X then NETNUB -P -F BTL4OPT
+4 -1
View File
@@ -24,7 +24,10 @@ cycles=max
[ne2000]
ne2000=true
nicbase=340
nicirq=3
# IRQ 10, NOT 3: the plasma readout opens COM2 (IRQ 3) in-game -- with the
# NIC also on 3 the pod goes deaf the moment BTL4OPT starts (netnub phase
# still works, so it looks like a mid-boot failure). NET.CFG INT must match.
nicirq=10
backend=pcap
[ethernet, pcap]
realnic=DB5521D
+25 -5
View File
@@ -2,8 +2,12 @@
# after each mission/idle disconnect so the pod stays connected to the console
# and picks up missions as the operator queues them -- mirrors the real pod's
# GO.BAT). Same 0x340 NIC fix as net_full.conf (see that file's header).
# Sound is OFF here (setenv arg3=n) for fast reconnect cycles; flip to net_full
# for the full sound experience.
# FULL production parity (sound + plasma) as of 2026-07-08: the SBK re-upload
# per mission is only ~30s (measured), and the instant netnub relaunch is what
# lets the console recover its TCP session between missions WITHOUT an app
# restart (netnub exits without FIN; a fast relaunch answers the console's
# early retransmissions -- sitting at a DOS pause instead wedges the console
# into multi-minute Mac TCP backoff; that is why retail looped).
[sdl]
output=opengl
priority=highest,highest
@@ -17,13 +21,24 @@ cycles=max
[ne2000]
ne2000=true
nicbase=340
nicirq=3
# IRQ 10, NOT 3: COM2 (plasma) owns IRQ 3 in-game; see net_full.conf.
nicirq=10
backend=pcap
[ethernet, pcap]
realnic=DB5521D
[sblaster]
sbtype=sb16
sbbase=220
irq=5
dma=1
hdma=5
[mixer]
rate=44100
blocksize=1024
prebuffer=60
[serial]
serial1=directserial realport:COM1 rxpollus:100 rxburst:16
serial2=disabled
serial2=directserial realport:COM2
[autoexec]
mount c "C:\VWE\TeslaRel410\ALPHA_1"
mount d "C:\VWE\TeslaRel410\emulator\net-boot"
@@ -35,9 +50,14 @@ d:\odipkt
c:
cd \rel410\bt
set VIDEOFORMAT=svga
set BLASTER=A220 I5 D1 H5 P330 T6
c:\sb16\diagnose /s
set BLASTER=A240 I7 D3 H6 P300 T6
c:\sb16\diagnose /s
set BLASTER=A220 I5 D1 H5 P330 T6
set TEMP=c:\
set HEAPSIZE=15000000
set L4GAUGE=640x480x16
call setenv.bat r f n g
call setenv.bat r f s p
echo === entering GO.BAT-style netnub loop (waits for console missions) ===
call d:\loop.bat
+4
View File
@@ -22,6 +22,10 @@ param(
$ErrorActionPreference = 'Stop'
New-Item -ItemType Directory -Force $Work | Out-Null
# pcap backend needs wpcap.dll; without it the NE2000 silently comes up dead
# ("NO PACKET DRIVER FOUND" at netnub). Don't trust the invoking shell's PATH.
if ($env:Path -notlike '*\Npcap*') { $env:Path = "C:\Windows\System32\Npcap;$env:Path" }
# a restart means the previous run dies first (COM1 + the fifodump are exclusive)
foreach ($pidfile in "$Work\pod_pid.txt", "$Work\bridge_pid.txt") {
if (Test-Path $pidfile) {