Mario 64 DS native PC port: intro-transition checkpoint, 2026-10-14
Status: PARTIALLY VERIFIED overall. Two 6,000 simulation-frame native runs shut down normally with exit code 0. The intro-to-gameplay handoff is still blocked by a pending level transition. The full port goal remains active and unfinished.

What changed:
- Player's character-specific jump table now dispatches its original four descriptors to three real native workers. Their exact recovered targets are 020e200c, 020e1e70, 020e200c, 020e1c20, with zero this-adjustment. The separate existing Player State adapters remain in use. All three workers are enrolled in the PC source closure.
- Player's 18 scripted-animation list pointers now bind to native list storage. Every list retains its original ROM bytes and extent, including the reserved zero-initialized record. Previously the animation player dereferenced cartridge address 02109ff4 in the Windows process.
- MAP and DEMO call the real native dFader_c::IsAtStart method. Their old manual DS slot-5 calls selected a different native virtual slot; one also used the wrong Windows calling convention. The non-PC paths are preserved.
- DEMO's two four-entry sprite tables at 0210be1c and 0210b998 now bind to native copies of their original OAM records. This fixes the subsequent render fault at cartridge sprite address 0210be2c.
- Optional trace output records presentation count, active script, movie frame, fade state and dialogue state. Normal launches leave tracing off.
- Audits independently compare four jump descriptors, three linked workers, all 18 complete animation lists and eight complete sprite records against the user's extracted ROM. PE checks permit validated zero-filled BSS tails only when explicitly requested.

Build and tests:
Release game builds passed: jump-callback-build2.log, sequence-pointer-build.log, map-fade-build.log, script-progress-build.log, demo-oam-pointer-build.log and dialogue-progress-build.log. The initial jump build failed because its three indirect workers were not yet enrolled; this was resolved in build2.
Regression targets were rebuilt. Six CTest checks passed: smoke, smoke_ppu_affine, smoke_actor, smoke_modelanim, smoke_frames, smoke_video. Final results are in intro-transition-ctest.log.
The final native actor audit passes five actor profiles, DOOR metadata/callbacks, scratch allocation, jump dispatch metadata, animation-sequence pointers and DEMO sprite pointers. Particle and DEMO callback audits also pass: 49,684 particle bytes, 321 definitions, 46 textures, 81 callback targets, 93 descriptors, 30 resource relocations and 55 curve headers.
Run118 completed 3,600 frames before the fade-call repair. Run119 exposed the newly reached unreplaced DEMO sprite pointer. After that repair, run120 completed 6,000 frames with one startup confirmation. Run121 repeated A for five input polls every 180 polls, also completed 6,000 frames, and exited 0. All tested runs have screenshots; the checkpoint contains final and pipe-scene captures. Simulation counts are bounded test coverage, not an FPS benchmark.

Exact remaining block:
Correction from the following source audit: the run121 trace label "dialogue" was incorrect. data_02092110 is the pending level ID, assigned by LoadLevel and reset by stage initialization. Run121 ends with the active script corresponding to original data_02089af8, movie_frame=4262, fade=0, speed=0 and pending_level=1. EndKuppaScript requires data_02092110 < 0, so the pending level transition prevents script completion. Stage Behavior also retained a DS slot-5 shadow call that selects native IsAtEnd instead of IsAtStart, skipping its level-transition branch at fade=0. The next checkpoint verifies that concrete repair. The repeated-A experiment did not establish a dialogue fault. Do not force the pending level negative or claim the intro has finished.
The camera remains on Lakitu at the castle roof. The cloud sprites move away and expose an incomplete map image occupying a corner with a green remainder. A complete minimap image, its icons and post-intro interaction remain unverified. DS background windowing/blending, letter/HUD appearance, missing gameplay actor profiles, audio, physical Xbox use, internal 4K rendering, complete texture replacement assets and delivered FPS remain open. Existing settings do not establish completion of those features.

How to check:
Open last-render.bmp and bottom-screen.bmp, or the pipe-snapshot images. Launch-test.cmd automatically starts the intro, repeats A, stops after 6,000 simulation frames and saves manual-run.bmp/manual-bottom.bmp plus logs. It is expected to remain in the roof sequence pending the stage transition repair. Launch-game.cmd runs without automated input or a frame limit. These launchers assume the user's European ROM is still in the main Mario 64 DS folder. This is a development checkpoint, not a finished game.
The authoritative full source is in the C: workspace under work/source-extracted/sm64ds-decomp-main. changed-source holds this milestone's edited files only. build-inputs preserves the linker-enrollment history. Earlier F: checkpoints remain available.

Recommended model for the next task: Sol High. The remaining scene-transition control-flow and native ABI investigation is still reverse-engineering work. Switching to Luna is not recommended yet. No model switch is requested at this milestone, so the goal remains active.
