Link's Awakening (01006BB00C6F0000)¶
State: plays on macOS (the most mature title); reaches its title screen on the iOS Simulator.
What it needs¶
- Fonts in
<save-root>/system/fontsfor text (without them the placeholder font is served and no text renders; see symptoms). - libvpx for its movie path (video decode through the guest's own movie library would hit an unimplemented NVN call without it).
- A write of its lower guest address gap: it needs more than the 3.25 GiB iOS device heap cap (it aborts in the movie library); the Simulator uses 4 GiB.
- Lower-left NVN origin; 85 of its shaders read SR_Y_DIRECTION (value -1). The shader corpus guard
t_lastranslates and compiles 679 of 679.
What is open¶
- First-use pipeline/shader build stutter (170-1300 ms when entering a new area); the second visit is smooth. Fix direction: persisted keys and seeds (done), async build with fallback (needs a design decision).
- A sustained ~30 fps state reported once did not reproduce in 5 live runs.
- iOS device: the memory cap above (decision: trim the low gap or require the increased-memory entitlement). Not run on a device.
Build and test¶
Build the data as in README (about 250 MB). Headless 45 s: exit 0, 0 CRASH (2290-2723 frames, 58 fps headless; one scripted run reported 2647 frames with in-place RomFS).
iOS Simulator: SDK=iphonesimulator VPX=1 tools/build_ios_deps.sh && SDK=iphonesimulator tools/build_ios.sh, then napple build --target ios-sim; the title screen appears by about 60 s (ios). NAPPLE_INPUT_SCRIPT reaches the file select; Simulator touch delivery from the tool did not work.
Numbers¶
- 60 fps live windowed in a 3-6 minute play (perf-las-live), GPU 6-12 ms; headless 58 fps.
- Memory: guest ~1.2 GB, IOAccelerator ~320 MB; peak RSS 1.96 GB (fixed graveyard) to 3.4 GB (before), 3.7 GB worst seen.
- Audio latency drifted 21 to 44 ms over 4 minutes, no underruns (not investigated).
Timing (fps-unlock-timing, 2026-10-27)¶
Guest cadence 60 Hz (swap interval 1): headless trace at fps modes game/60/120/30/uncapped (20 s each): guest vsync 60.00 Hz, game clock 1.000, presents 55-60/s (GPU/CPU bound, see above). Logic is vsync-stepped (the intro movie and the game advance one step per vsync/present), so the present rate cannot add real game frames: higher display rates repeat/interpolate images only. A timestep patch is needed for real extra frames (later per-title package). Windowed 60 s soak: vsync drift 0.13-0.16 frame; p99 present interval is 2.1-2.2x the median because the presenter itself delivers 52-56 fps (the known gfx throughput limit), not because of pacing. (How each title ties its logic to vsync is inferred from its cadence and engine class, not verified by patching; the per-title timestep package confirms it.)
Tie-up status (end-to-end, 2026-10-27)¶
From tools/e2e/run.sh (testing guide): built through Studio, launched through the launcher, 45 s headless.
- Mii: the title never opens mii:u in the 45 s route; the shared database is still served to any title that does (see MK8D). Mii Maker (firmware applet) built into the app and verified with scripted input.
- amiibo: nfp is never opened (no abort with the reader installed lazily: NAPPLE_AMIIBO run, exit 0). Known flaky: an intermittent early abort SetTerminateResult 0x35f202 (fs 2-6905) 0.4-0.8 s after start (about 1 start in 5, not reproduced with tracing on); it is a title-side abort after fs probing, not an nfp problem.
- Overlay: all four tabs render (Audio/Video, FPS/Speed, Controls, Game/System with the amiibo source/key fields).
- Camera/IR: usage strings and entitlements are in the app; the title does not use the IR camera. Online: NullProvider (offline).