Skip to content

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/fonts for 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_las translates 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).