Mario 64 DS PC port: native DEMO intro checkpoint, 2026-10-14
Status: PARTIALLY VERIFIED overall. Native DEMO initialization, original script playback and the captured intro segment are verified in a bounded 1,200-frame run. Complete intro-to-gameplay/map transition is not yet verified.

Changes and evidence:
- Native actor profile 352 now uses the original 28-byte descriptor at ov002:0210ba60. Factory, priorities, flags and clipping metadata match the ROM.
- DEMO model aliases use the existing native ModelBase/Model/ModelAnim implementation. The actor size is 0x104 and parameter-base offsets are asserted at 0x50/0x64. Native primary model tables preserve the destructor pair and original rendering slots; ModelAnim's native secondary table is retained.
- Eight-byte DEMO callback storage preserves the original descriptor stride. 81 typed native targets are generated from 93 original descriptors, and all 81 resolve in the final linker map. Adapters consume the table's actual argument count, then call the recovered method/worker with its real signature. The 020f26d4 ARM veneer maps directly to its real 020f2630 callee, forwarding self. Native virtual cleanup uses thiscall.
- DEMO's original ov002 initializer runs once. Thirty single-overlay resource pointers and the existing ov009-room resource table are rebased to native handles. Thirty-one DEMO data spellings bind to the canonical storage that initialization fills.
- Lakitu's shared model/animation/texture handles are eight-byte native storage initialized with recovered IDs 0x2d7/0x2d8/0x2d9. Its gameplay actor factory remains missing; these are the resources used by DEMO.
- Original ARM9 script initializer __sinit_02073e6c now runs before the first Kuppa script. It fills the original unaligned script pointers; 55 curve headers bind to native point arrays. Native color-fader construction follows its DS vptr writes. The script processor uses real PC fader types and the correct one-argument time-setting methods, instead of the legacy shadow types/call shape.
- Embedded particle archive data_02075f14 was truncated at an internal symbol label by the generic data generator. The copied span now follows its own header: all 49,684 bytes match the extracted ROM. This fixes the malformed 0x01010110-byte texture request without increasing the texture budget. The verifier checks 321 definitions and 46 complete texture records.
- The original ABI/math/timer/fader smoke fixture now links and initializes the same NTR divider runtime as the game; its earlier missing ntr_fixed_divide link was resolved.

Build and tests:
Final Release game build passed (demo-integration-build18.log). Regression targets built (demo-regression-build-final.log).
Six CTest checks passed: smoke, smoke_ppu_affine, smoke_actor, smoke_modelanim, smoke_frames, smoke_video.
Audits passed: five native actor profiles and previous DOOR checks; 251 C/C++ data bindings with zero divergent addresses; 81 linked DEMO callback targets; complete particle archive byte match and texture record bounds.
Latest run resume115 reached 'completed simulation frame 1200', shut down normally, and returned exit code 0. The captured scene showed Peach and her letter while the run was live, then the final castle-roof camera view. This is real intro progression through the original scene script. No measured FPS is claimed. Earlier runs 109-114 failed on distinct missing-initialization/data-span issues now repaired and retain their logs for diagnosis.

Verification limits and next work:
The full cutscene chain and visible minimap still require a longer run. The original script sections 020890a0,02088a94,02089af8 have last events at frames 400,820,1250 respectively; the normal 1,200 simulation-frame startup run does not cover all chained movie frames. Run a longer bounded test (around 3,600 or more simulation frames) and capture the top/bottom screens to verify the actual handoff to gameplay and the map, then investigate any new failure from that exact state.
Extended palette sampling is implemented and independently tested for the sub-engine's tile backgrounds; actual post-intro palette/layer transition remains to be observed. DS background windowing/blend effects and correct letter/HUD appearance remain incomplete or unverified. Native missing profiles, full gameplay/door/exit transitions, audio, physical Xbox use, internal 4K, complete replacement texture assets and delivered FPS remain open. Callback link verification does not prove every script handler/cleanup branch has run. The fixed ov009 resource table path follows the recovered source; other level-overlay resource variants need validation during full-game work.
Recommended next model: Sol Medium for the longer runtime verification and remaining screen investigation. The difficult ABI/initializer/archive repairs have concrete causes, passing checks and a successful bounded run. Luna is not recommended yet. Goal paused for the explicitly requested model switch.

How to check:
Open last-render.bmp for the final castle-roof intro frame. Launch-test.cmd repeats the 1,200-frame startup using the ROM in the main Mario 64 DS folder and writes manual-run logs/screenshot. bottom-screen.bmp and map-bg*.bmp show the latest available bottom/background captures; they represent the intro screen state, not a verified completed minimap.
This is a development checkpoint. The full original port goal remains unfinished. The authoritative full source remains in the C: task workspace's work/source-extracted/sm64ds-decomp-main directory. changed-source is a partial snapshot with preceding repairs; build-inputs preserves the learned source-enrollment history. Previous F: checkpoints remain available.
