Experimental macOS on Apple Silicon (record merge).
The content of this PR shipped in v0.6.0 via the macos-arm64 integration
line (D585-D613) and is carried by the commit above the merge in this
history; the release line uses maintainer squashes for its own work, so
this merge records the PR against that history. See the PR for the full
diff, and D600/D601-era notes for the port_addr decision made with the
author. Intel (x86_64) status: see issue #154.
- Pages: the two cblock sections render as markdown under GitHub Pages'
kramdown (markdown="1"); the Download block's unparsed `<file>` had swallowed
every heading below it. Gallery alt text says 3840x2160.
- Credit line (README "How it was made" + social preview card): several coding
agents directed by one maintainer, with a handful of contributors; card
findings count 430.
- Release-notes template: drop the stale header-stills comment and the Aztec
re-check-owed note.
- ROADMAP: Windows display-scaling (not DPI-aware) item
D572: CI-tarball verification (glibc floor, X220 + Deck fresh
install, 21/21 pixel gate on both).
Video.CrosshairPersistent, F10 Game page after Show crosshair. Merged with
the 2026-10-01 review conditions: both display-mode presets set it off,
tip added, gunDrawSight change is draw-only (Rule 2 sign-off by the
maintainer, 2026-10-06). Default off is pixel-identical (Dam gate PASS).
Fixes:
- D565: AI awareness no longer follows two player render settings. Fog
distance is floored at 100 (below it the shortened clip hid guards from
AI on-screen checks); the D466 gameplay fog cull is rescaled to the game's
own FOV (identity at defaults).
- D566: Steam Deck Game Mode no longer shows the on-screen keyboard at
launch (SDL text input stopped; screen-keyboard hint off).
- D567: opening PC Options from the front end with a pad no longer drags
the game's crosshair to the top-left corner.
Docs and site:
- README News/Status/Features/controls brought up to date; the unpublished
v0.4.1 work is folded into v0.5.0 everywhere; stats to v0.5.0.
- Release notes reordered: player-facing highlights first, finding labels
and verification at the bottom.
- Site status rewritten; favicon is now the exe icon (make_icon.py writes
docs/favicon.ico).
- ROADMAP: AI review results, update-check follow-up, stale rows closed.
Verified: Windows + Linux builds; Windows pixel gate Surface 1 PASS;
Deck build deployed for the maintainer's Game Mode checks.
Deck/Windows playtest fixes: fog rework (D540) and RSP-style CPU near-plane
clip with per-vertex N64 fog (D543), with fog recomputed on near-plane-clipped vertices as the RSP does,
so the haze around the player stays steady (D553); colour-combiner clamp for banded walls
(D548); rocket and thrown-item stack overflows (D545, D549); menu
double-trigger mitigation (D541); Dam ending first-shot camera swivel
restored by removing an old port look-at workaround (D552); settings standardisation (D546), live
All unlocked (D547), F10 mouse (D544); static window title and the project
mark (the in-game crosshair shape, site gold) as window/taskbar icon and
favicon (D550). Reference frames re-based
on Windows, Linux and Steam Deck (A/B-confirmed); capture_p7.sh runs on
Windows. Opt-in update check, off by default (D551: one HTTPS request to
GitHub per launch when enabled; winhttp.dll loaded only then; the tag CI
job checks the tag against GE007_VERSION). Release notes, ROADMAP,
internals and security docs updated; tree-hygiene pass.
Refs: D540 D541 D543 D544 D545 D546 D547 D548 D549 D550 D551 D552 D553 D554 D555 D556 D557 D558 D559 D560 D561 D562 D563 D564
Public-copy language pass, homepage restructure and Documentation rename,
404 page, dead-anchor and permalink fixes, release-gate sign-off, and the
pre-release review fixes of the 2026-10-05 batch (probe-doc drift,
build-path hygiene, verify.sh and capture safety).
Refs: D533 D534
Linux reference-frame set for all 21 levels and the cross-platform golden
rule (D521); golden tooling made non-destructive (D524); the gate pins a
canonical in-tree save (D529) and the PRNG seed (D532); the capture tool's
per-level re-pin bug fixed and the Linux set re-captured under the
canonical save (D530, D531); no-arg verify.sh exits non-zero. README and
docs visual/consolidation passes; the 15 MB preview gif replaced by stills.
Refs: D521 D523 D524 D525 D526 D527 D528 D529 D530 D531 D532
PD-style F10 menu with six groups, checkbox/slider/dropdown controls (D504),
wording pass and real-unit sliders (D505-D509), overlay/FPS-counter window
scaling (D510, D512), small settings (D511), control scheme Ext/Original
(D513) with the game's own N64 styles (D516-D518), emulator-format save
import on first launch (D514), build arch tag (D515), converter argv quoting
and sidecar size check, one PC options UI (D519) with by-eye follow-ups,
antialiased overlay sliders (D520), README settings paths, ROADMAP trim,
D441 tier-1 all-level sweep (21/21 pass).
Refs: D503-D520 D349 D441
Virtual seats, per-seat camera and input routing, aim modes, hot-plugged
controllers reopening via a coalesced rescan (D450, dolent's PR #122,
merged as the original commit). Rule-2
sign-off for D417.
Refs: #99 D416 D417 D418 D419 D422 D428 D448 D450 #122
Adds a GitHub-hosted macos-15 (Apple Silicon) workflow for pushes and PRs
into the macos branch: build with Homebrew GCC, once with PORT_ADDR_STRICT
off and once on, then run the ROM-free address-model self-test.
- main.c: new --selftest flag, handled right after portAddrInit() and
before crashInit/config/ROM/SDL. Exits 0 if the self-test passed, 1 if
not. Listed in --help.
- port_addr.c/.h: portAddrSelfTest() now returns its result and
portAddrSelfTestPassed() exposes it; no change to normal runs.
- macos.yml: contents: read only, no secrets, no ROM, persist-credentials
off, so it is safe for fork PRs. The strict entry also requires the
GE_ADDRSTRICT_SELFTEST report, proving the validator is live.
- docs: building.md CI note; plan M4 row no longer lists macOS CI as
outstanding (ROM sweeps stay with the self-hosted job in #131).
crouched_rifle_firing_animation_group1 (chr.c) has one entry and no
terminator; on the N64, .data is in source order, so
crouched_rifle_firing_animation_groupA follows it and the single
initResolveAnimGroupTable pass over group1 also resolves groupA (len 2).
GCC places groupA below group1, so groupA[0] kept the raw anim offset
0xB84 (PTR_ANIM_fire_kneel_left_leg). playerTick (bondview2.c:11021) passes
it to modelSetAnimation for a player's crouched rifle fire
(firing_animation_groups[1][5]) -> SIGSEGV in modelConstrainOrWrapAnimFrame
(fault 0xb88). Crouching rifle guards also saw len 1 instead of 2.
#ifdef PORT: one array {right_leg, left_leg, terminator} (the N64 layout),
groupA = &group1[1] (chr.h). ABI/layout exception, porting-notes D5 class
(D164 precedent). Verified: 4-seat repro (M16, Complex, frame 5030) runs
5 min x3 SH-identical, no crash; gdb scan of all firing_animation_groups
entries: 1 bad pointer before, 0 after; P1 corpus (1324 recordings) verdicts
identical; solo/couch frames byte-identical; netplay 2P/4P identical.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 8595a06edd40ca22ac9ba4955b13a9ce61064475)
(cherry picked from commit 8e5d4bcd5a)
- port_addr.h: portAddrIsInWindow() now rejects the low 64 KiB of the
window. With PORT_ADDR_BASE == 0 that range contains NULL; the previous
version let NULL through on Windows/Linux, regressing langGet()'s
cleared-bank guard (the old numeric bound rejected < 0x10000). Matches
the old bounds on every platform. Self-test covers NULL, the low guard,
DRAM and above-window.
- gfx_opengl.cpp: revert to origin/macos. upstream already clamps MSAA to
GL_MAX_SAMPLES (D405 / #106); the branch's second clamp and its comments
were a duplicate. MACOS-MSAA-CLAMP finding removed.
- chr.c: drop the branch's crouched_rifle_firing_animation_group1 {0}
terminator. GCC places groupA below group1, so it never resolved groupA
and did not fix the crouched-rifle crash. Replaced by #120 (next commit).
- boss.c: guard the rspReplyMsg re-base with #ifdef PORT (the file has no
PORT_N64PTR identity fallback for the N64 build).
- findings.md: correct the objDeform vtxslot write-up (host pointers, not
u32 N64 addresses), give accurate numbers for unguarded src/ edits, and
record why the terminator was replaced.
Owner review follow-ups on #95:
- Findings labels: replace the branch's D409-D421 (which clash with
upstream's D-range) with descriptive MACOS-<TOPIC> tags across
findings.md (section F rows + tail entries), findings-index.csv,
porting-notes.md, MACOS-ARM64-PLAN.md, CMakeLists.txt, building.md and
the code comments. Real D-numbers get assigned at merge.
- gen_findings_index.py: accept non-D descriptive tags as labels so the
generated index stays complete while the branch is unmerged (D-rows
unchanged).
- language.c: convert the last hardcoded numeric address bound in the
boot path to portAddrIsInWindow(), per the branch rule (address
plausibility checks must not use numeric bounds).
- Document the src/ edits the owner flagged as unwritten: the two
vtxstore_allocate() callers and objDeform() (both the PORT_N64PTR(0)
-> NULL class, under MACOS-BLOODSTAIN), the crouched-rifle table
terminator (MACOS-CAST-CENSUS), and an honest note on which widened
sites are #ifdef PORT and which follow the existing unguarded house
style.
- Drop the stray .DS_Store from history (it was added in the base commit
and only deleted at the tip).
No behaviour change: PORT_ADDR_BASE == 0 everywhere but macOS, and the
one logic edit (language.c) is an identity there. Build + window +
port_addr self-test ALL PASS on arm64.