Skip to content

Port Pikmin 2 1.0.0 (0100D680194B2000) - #548

Open
ale-villani wants to merge 1 commit into
seedds:mainfrom
ale-villani:add-pikmin-2
Open

ale-villani wants to merge 1 commit into
seedds:mainfrom
ale-villani:add-pikmin-2

Conversation

@ale-villani

Copy link
Copy Markdown

Summary

Adds the game profile, memory layout, cuts and port notes for Pikmin 2 (0100D680194B2000, 1.0.0), running on Nintendo European Research & Development's (NERD) proprietary GameCube layer (Hagi) over Vulkan on Apple Metal.

Changes

  • Profile (dm/games/0100D680194B2000/game.tsv):
    • Sized mem_alias to 0x150000000 (5.25 GB) and mem_reserve to 0x240000000 (9 GB). During Memory::Initialize (main+0x2a3154), Hagi calls nn::os::AllocateAddressRegion for 0x100200000 bytes (4.002 GB) to map the entire 32-bit GameCube address space; default compact profiles starve this region with 0x1803.
    • Modules: main subsdk0 sdk (subsdk1–subsdk4 bypassed by the host's Vulkan layer). Handheld mode.
  • Main Binary Cut (dm/games/0100D680194B2000/patches.py):
    • For b23a43495191e7ad33d1d0effcbb1d84 at 0x2ba5b4: _ZN5movie destructor unconditionally calls AbortImpl during video teardown; replaced bl #0x2bacd8 (c9010094) with nop (1f2003d5).
  • SDK Cuts (dm/tools/sdk_patches.py):
    • For SDK 14.3.0 (2aef2cffb104ee7c9e212fd2f4c731e9): AddressRegionManager node area compaction from 1 GB to 62 MB, and an early-return null guard on uninitialized heap_base in CentralHeap::Free (0x11de60: bf3903d5 -> 280700b4, cbz x8, #0x11df44).
  • Documentation:
    • Added dm/games/0100D680194B2000/README.md.
    • Indexed Pikmin 2 in dm/games/README.md alphabetically.
    • Regenerated docs/agents/game-patches.md via dm/tools/docs_patches.py.

Validation

  • Unit tests: python3 dm/tools/tests/test_docs.py (11/11 passed), python3 dm/tools/tests/test_patches.py (15/15 passed).
  • Verified on macOS (Apple Silicon): clean boot, save filesystem creation, opening VP9 movie decoding, cutscene skipping, audio streaming with 0 underruns, and stable 60 fps gameplay in Day 1 (Valley of Repose).

@ale-villani ale-villani changed the title Port Pikmin 2 1.0.0 Port Pikmin 2 1.0.0 (0100D680194B2000) Oct 28, 2026
@ale-villani
ale-villani force-pushed the add-pikmin-2 branch 4 times, most recently from 4a65316 to 5e61595 Compare October 29, 2026 15:02
@github-actions github-actions Bot added rewriter The NSO rewriter and per-build patches tools Tools and scripts (dm/tools, scripts) docs Documentation game: 0100D680194B2000 A game profile new game Adds a game profile that main does not have yet labels Nov 3, 2026
@ale-villani
ale-villani force-pushed the add-pikmin-2 branch 2 times, most recently from 7ffa009 to eb29bed Compare November 12, 2026 20:07
Add game profile, memory layout, cuts and port notes for Pikmin 2
(0100D680194B2000, 1.0.0) on NERD's Hagi GameCube layer over Vulkan/Metal.

Hagi maps the 4.002 GB 32-bit GameCube address space (0x100200000 bytes)
via nn::os::AllocateAddressRegion during Memory::Initialize. Sized
mem_alias to 0x150000000 (5.25 GB) and mem_reserve to 0x240000000 (9 GB)
to accommodate both the AddressRegionManager node area and GameCube AS.

Add SDK 14.3.0 cuts (2aef2cffb104ee7c9e212fd2f4c731e9): node area
compaction (1 GB -> 62 MB) and null-guard on uninitialized heap_base in
CentralHeap::Free (cbz x8, #0x11df44). Add main cut (b23a43495191e7ad33d1d0effcbb1d84)
NOPing out the movie player destructor's unconditional AbortImpl call
at main+0x2ba5b4.

Validation: 26/26 Python test_docs and test_patches checks passing,
verified 60 fps gameplay through the prologue cutscene, file save creation,
and Day 1 Valley of Repose.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation game: 0100D680194B2000 A game profile new game Adds a game profile that main does not have yet rewriter The NSO rewriter and per-build patches tools Tools and scripts (dm/tools, scripts)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant