Files
CydandClaude Opus 4.8 e8876e521d Gauges: fix bank-switching (window-granularity mismatch)
The garbled top-strip render was a paging bug, not the video mode. The
pageFcnPtr in L4GAUGE.INI (C000:2616) is a red herring -- the driver's direct-
pointer path is commented out ("THIS DOES NOT WORK"); it pages via portable
VESA int 10h/4F05, which our S3 handles.

Real cause: window granularity. SVGASetPage passes the bank in granularity
units; the blit advances by pageDelta = pageSize/granularity per 64KB window
crossed. The INI's granularityInKB=4 is the Cirrus CL-GD5434's 4KB window
granularity (the pod's actual video card; the "STB Horizon+" board was
Cirrus-based). Our emulated S3 uses 64KB banks, so pageDelta=16 -> every bank
landed 16x too far -> the smear.

Fix (config only): L4GAUGE.INI [640x480x16] granularityInKB=64 (=sizeInKB, so
pageDelta=1, matching the S3's 64KB banks). Full framebuffer now pages
correctly -- 315+ frames, VDB splitter stays ON, display renders as expected
(blank between missions; user confirmed "that is the screen I expect").
ALPHA_1 is git-ignored so the INI edit isn't committed; reproduction + backup
(L4GAUGE.INI.orig) documented in GAUGE-NOTES.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 18:03:29 -05:00

75 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Gauge / secondary-display path (cockpit instruments)
The cockpit's six secondary displays (5 mono + 1 color) show instruments,
driven by the PC's own SVGA video (an STB Horizon+ / S3-class card on the
pod) in **VESA mode 0x111 = 640×480×16**, which the VDB splits across the
monitors (see RIO-NOTES.md / HISTORY.md). Enabled by `L4GAUGE=640x480x16`
(pod `PARAMETR.BAT :POD`) or `setenv.bat … g`. Config layout, instrument
images, and gauge scripts live in `ALPHA_1/REL410/BT/GAUGE/`
(`L4GAUGE.INI`, `L4GAUGE.CFG`, hundreds of `.GIM`/`.PCC`/`.PCX`).
## Fixed: the gauge crash was out-of-memory, not video
Enabling gauges crashed the game (`Exception 0E … illegal address 0x478`,
a null-`this`). Root cause, from the game's own debug log:
```
Requested 2808 bytes from MUNGA Heap
Largest block remaining is 1100 bytes
Heap size was set to 6291432 bytes
d:\tesla_bt\munga\HEAP.CPP(342): No remaining block large enough!
Failing to debugger
```
The MUNGA main heap (`UserHeap MainStorage`, fixed size, no growth) exhausted
loading the gauge images. It reads its size from the **`HEAPSIZE` environment
variable** (BTL4OPT.EXE @VA 0x401076: `getenv("HEAPSIZE")`; else default
`0x600000` = 6 MB). The pod's `PARAMETR.BAT` sets it (`:POD` → 15000000,
`:REVIEW`/`:LOOP` → 32000000); our minimal `setenv.bat` launch never did, so
the game used the 6 MB default and starved. **`memsize` does not affect it —
it is the game's own heap, not DOS memory** (verified: `memsize=127` still
gave 6 MB). The pod machines have **32 MB RAM**, so a 15 MB heap fits.
Fix (no binary patch): `set HEAPSIZE=15000000` before launch (see
`gauge.conf`). The game then runs sustained with gauges on (500+ frames), the
VESA mode switches (DOSBox screen blanks into graphics), and it draws the
instrument panels — the VESA 640×480×16 mode works fine on our emulated S3.
Separately, `patch_btl4opt.py` now also neutralizes the general `Verify_Failed`
debug-assertion crash (this is a `DEBUG_LEVEL 1` build); not required for the
heap fix but makes the debug build behave like release under emulation.
## Fixed: bank-switching (window-granularity mismatch)
Symptom: the gauge framebuffer first rendered **only a top strip, garbled**.
Not the video mode (that works) — a paging error. 640×480×16 is 600 KB
accessed through a 64 KB window, so the game pages video memory as it blits.
`L4GAUGE.INI`'s `pageFcnPtr` (`C000:2616`, the pod card's VESA `WinFuncPtr`)
is a **red herring** — the direct-pointer path is commented out in the driver
(`L4SVGA16.ASM` `SVGASetPage`: *"THIS DOES NOT WORK … must use a DPMI call"*).
The live code pages via **portable VESA int 10h / AX=4F05h**, which our S3
handles fine.
The real bug was **window granularity**. `SVGASetPage` passes the bank in
*granularity units*; the blit advances the bank by
`pageDelta = pageSize / granularity` each time it crosses a 64 KB window
(`L4VB16.CPP` ~3947). The INI carried `granularityInKB=4` — the **Cirrus
CL-GD5434**'s 4 KB window granularity (the pod's video card; the "STB
Horizon+" board was Cirrus-based). Our emulated **S3 uses 64 KB banks** (its
CR6A bank register selects 64 KB pages, and DOSBox-X's default VBE granularity
for S3 is 64 KB). So `pageDelta = 64/4 = 16` and every bank landed 16× too
far → the smear.
**Fix (config, no binary patch):** in `ALPHA_1/REL410/BT/GAUGE/L4GAUGE.INI`,
`[640x480x16]` set `granularityInKB=64` (= `sizeInKB`, so `pageDelta=1`,
matching the S3's 64 KB banks). Backup: `L4GAUGE.INI.orig`. After the change
the full framebuffer pages correctly (315+ frames, VDB splitter stays ON, no
tear-down); the display renders as expected (blank between missions; the
active-mission instruments draw once the sim runs).
(Alternative, untried: `machine=svga_paradise`, whose DOSBox-X default VBE
granularity is 4 KB — would match the stock INI without editing it.)
Next: with the full 640×480 buffer rendering correctly, split it into the six
VDB display regions (the VDB device already models the splitter).