docs: adopt cheap GEVR-triage items (crash heuristic, frame-rate notes, process lesson, widescreen pre-flight)

Folds in the zero-code-risk ADOPT items from scratchpad/GEVR-TRIAGE.md
(a prior survey of the sibling GEVR VR port, same n64decomp/007
lineage, reference-only): a crash-triage heuristic for non-canonical
x86-64 pointer faults, two frame-rate-assumption notes that pre-empt a
future uncapped/high-refresh rabbit hole, a process lesson about
grep-built site lists standing in for a real read, and the
portal-scissor site map as pre-flight for whenever widescreen work
resumes.

Claude-Session: https://claude.ai/code/session_01KwZViAFaXua3PKgHHjNgvi
This commit is contained in:
James Dansereau committed 2026-09-15 19:18:07 -04:00
1 parent eb0928889e
commit 8df8ad3c35
3 files changed
+76

No files matched your search

+27
View File
@@ -1225,3 +1225,30 @@ and turns every such overrun into a fatal `*** stack smashing detected ***`
path (`cd C:\Users\...`) is unreliable in this same shell and can silently
mis-parse to a mangled path on a later command in the same tool call —
prefer `cd /c/Users/...` (forward slashes) for the build working directory.
- **A crash fault address of `0xffffffffffffffff` on x86-64 usually means a
non-canonical #GP from a garbage-high-bits pointer (bits 63:48 not a sign
extension of bit 47), not a computed `-1` sentinel** (cross-validated
against the sibling GEVR VR port, same decomp lineage — see
`scratchpad/GEVR-TRIAGE.md` item C; we independently hit the same register
shape in D191). Two companion habits worth keeping: re-read map anchors
from the freshly rebuilt map after every rebuild (a stale map silently
resolves the wrong symbol), and confirm the fault PC actually disassembles
on an instruction boundary before trusting a resolved symbol.
- **Frame-rate assumptions — read before proposing any non-60 Hz mode**
(cross-validated against GEVR, `scratchpad/GEVR-TRIAGE.md` item B). GE's
logic is delta-scaled through `g_GlobalTimerDelta` (~216 call sites); the
PAL build (×1.2) is a shipping proof that delta-scaled code tolerates
other rates. But: **Bond's walk is frame-rate dependent by construction**
— `MoveBond` (`bondview2.c`) is an exponential approach toward a target,
advanced once per frame with no timestep, so convergence is measured in
frames, not seconds (GEVR measured ~1.487× walk speed at 90 Hz vs 60 Hz,
≈90/60 exactly). Turn/aim *is* delta-scaled; walk is not. High-refresh or
uncapped presentation modes are therefore out of scope without a
game-logic change, which is forbidden — we tick at fixed 60 Hz (D52
pacing) by design, not as a limitation to fix. Also: `g_ClockTimer` must
stay integer (24 iteration sites depend on it); of 44
`/g_GlobalTimerDelta` divide sites, 40 are guarded (three different
spellings) and 4 are not (front-end cast camera `front.c:8271-8273`,
`propobj.c:~2393`) — those 4 rely on div-by-zero yielding NaN/inf without
trapping on both MIPS and x86-64 SSE, matching retail behavior; do not
"fix" them.