Target: US GameCube GFTE01 in Dolphin.
While A is held during confirmed ball flight (object + 0x4C == 2 and object + 0x98 > 2), the wrapper runs up to three extra stock ball updates. This gives roughly 4x flight simulation speed without directly scaling velocity.
GFTE01-airborne-speedup-hold-a.gecko- standalone Gecko codeGFTE01-airborne-speedup-hold-a.ini- minimal Dolphin configurationsrc/ball-update-wrapper-x4.s- PowerPC sourcesrc/build-gecko.py- assembler and Gecko generator
The permanent hook is at the stable ball_update entry 0x80417B00. It branches to a wrapper in the verified zero-filled code cave at 0x80157BD8.
The wrapper:
- Calls the original function body at
0x80417B04, including the displacedstwu r1,-0x2B8(r1)instruction. - Preserves the caller-visible register state produced by that stock update.
- Checks A at
0x8026BB60, flight state at+0x4C, and the existing+0x98 > 2gate. - Calls the original function body up to three more times, rechecking flight state between calls.
- Restores the first update's register state and returns to the original caller.
Gecko 06 block writes install the hook and wrapper synchronously. The wrapper does not use the Gecko handler/codelist allocation below 0x80003000.
The previous implementation permanently hooked 0x80421494 and stored code and globals at 0x80002A60-0x80002D20. Ring Attack reproducibly failed at DTM frame 861 with execution escaping through 0x812FFFC8 into invalid instructions.
Isolation established:
- Stock replay completed all 1,081 frames.
- The old flag-setter hook alone completed the narrowed replay.
- The old dispatcher hook failed even when extra updates were forcibly disabled.
- An exact pass-through branch at
0x80421494also failed.
0x80421494 is therefore not a safe permanent branch-hook site for Ring Attack. The old low-memory stubs also overlapped Gecko's reserved 0x80001800-0x80003000 handler/codelist area.
Moving the behavior to the ball_update entry wrapper removed both hazards. The fixed code completed the full 1,081-frame Ring Attack replay with dolphinCode = 0, no signal, and all requested frames observed.
A synthesized Ring Attack shot replay also verified the behavior. At frame 1,150 the patched ball had landed while the baseline ball was still airborne; both runs finished at 160.2 yards. The patched and baseline runs both completed all 1,500 frames without a crash.
Test artifacts:
/tmp/dolphin-testing/2026-07-27T18-37-07-481Z-ring-launch-2-final-config/summary.json
/tmp/dolphin-testing/2026-07-27T18-46-28-155Z-ring-airborne-hold-a-baseline/summary.json
/tmp/dolphin-testing/2026-07-27T18-47-34-459Z-ring-airborne-hold-a-patched/summary.jsoncd src
./build-gecko.shThe generated Gecko code is canonical in GFTE01-airborne-speedup-hold-a.gecko.