Arbitrary Code Execution (or ACE for short) is what happens when a glitch allows directly modifying the games code to anything we would like. This is sort of the "ultimate" glitch, as it allows almost anything to become possible : creating new actors or stages, modifying existing actor behaviour and so much more. Due to how degenerate this is, this glitch is generally banned in every speedrun category except any%.
The current entry point for ACE in The Wind Waker is through a glitch called Text Stacking. That glitch essentially allows one to have two textboxes on screen (and in memory) loaded at once, which is normally impossible. This leads to a pointer becoming stale and with the right manipulation of the games memory, this can be heavily abused.
When a textbox is created normally, the NPC is assigned a pointer called d_msg::sScreen. sScreen is used to tell the NPC where the screen data for a textbox is loaded into memory. The game never expects more than one textbox to ever be loaded at a time, and never anticipated a need to use more than one sScreen pointer. After performing text stacking, both NPCs will share the same value for sScreen and now believe that their screen data are in the EXACT same place in memory. This can be exploited to trigger Arbitrary Code Execution.
On the US version, by performing the text stacking glitch on Outset or Windfall, the d_msg::sScreen pointer will be dangling and will consistently point to address 81579F34, which is in the FopMsg heap (where hub elements such as textboxes and pictographs load). When pulling out the pictobox, this address corresponds to pixel data from the third saved picture. By having the 4 bytes of pixel data at 81579F34 write a valid address and then performing the text stacking glitch and triggering the crash while the pictobox is out, we can instead jump to the address written with that pixel data +8.
These are the exact steps for the text stacking setup and what happens internally:
By taking a picture of a bush on Windfall with the exact right position and angle, it is possible to write 80ABBDFF in the pixel data of the third picture. This will make the code jump to that address +8, which corresponds in the early game to the address of the 4th bytes of Link's X position in Link's actor instance in the Zelda heap.
![]()
We can then use the 4th byte of Link's X position and the first 3 bytes of Link's Y position to write another address and jump to it. This time, we write down the address of the inputs from controllers 2 to 4 : 803F0F3C, and jump to it. In order to write this address, we need the last byte of Link's X position to be equal to 0x80, and then stand on the shore with a Y position in the [0.5595093 ; 0.5595245] range in order to write 0x3F0F3C.
Now that we've jumped to the address of controllers 2-4, we have full control over enough consecutive bytes to write meaningful code to break the game. By having these controllers performing the exact inputs we want, we can write data we can make the game read as code. The current payload that allows warping to the credits is the following:

This payload replaces a comparison check to see if it should or shouldn't play the credits upon stage transition with a nop, then branches to a safe location that avoids freeing all of dMsg (and not just the obviously invalid stuff that crashes) to avoid messing up the heaps and prevent a crash. This particular payload uses controller 3 to jump to a gadget (an area of existing code that happens to perform useful instructions without needing to write them via the payload itself) at 80040FA0 that ORs r0 with r3 to make r0=0x81579F36, and then the next line of the gadget writes the last byte 0x36 to an address given by r5, which we manipulate with controllers 2 and 4 to point to the first byte of the "branch to avoid credits" instruction at 80234C7C, overwriting it and turning it into a harmless addition instruction

To summarize, this is how to perform a Credits Warp in The Wind Waker using Arbitrary Code Execution:
Notes:
The payloads in the table below use the usual controller setup, described above, to write the payload.
| Any% Credits Warp (ShadowQCD) | ||
| Controllers (0x803F0F3C) | Instructions | Hex Code |
| 2 | lwz r5, 0x0010(r12) | 0x80AC0010 |
| 3 | b -> 0x80040FA0 | 0x4BC5005C |
| 4 | N/A | 0x80234B78 |
| Credits Warp No Post-Credits Crash (ShadowQCD) | ||
| Controllers (0x803F0F3C) | Instructions | Hex Code |
| 2 | lis r3,0x8023 | 0x3C608023 |
| 3 | stw r5,0x4C7C(r3) | 0x90A34C7C |
| 4 | b -> 0x80215664 | 0x4BE24718 |
| Map Select on Soft Reset (LegendofLinkk) | ||
| Controllers (0x803F0F3C) | Instructions | Hex Code |
| 2 (analog) | lwz r29, -0x50B4(r31) | 0x83BFAF4C |
| 3 (buttons) | mulli r4, r0, 3 | 0x1C800003 |
| 3 (analog) | stb r4, -0x3C3D(r29) | 0x989DC3C3 |
| 4 (analog) | b -> 0x8021566C | 0x4BE24720 |
| Map Select on Stage Load (LegendofLinkk) | ||
| Controllers (0x803F0F3C) | Instructions | Hex Code |
| 2 | li r3, 6 | 0x38600006 |
| 3 | stb r3, 0x5D1B(r28) | 0x987C5D1B |
| 4 | b -> 0x80215664 | 0x4BE24718 |
There are alternate ways to write a payload that do not involve precise controller inputs. By standing in a different position, we can make code jump to other addresses, one of them being figurine data. A payload can then be written by collecting very specific figurines. Writing a specific payload with this method is much harder because figurines can have dependencies.
| Figurines Credits Warp (ShadowQCD) | ||
| Figurines (0x803C52B8) | Instructions | Hex Code |
| Baito Figurines & co | addis r16,r28,0x1F | 0x3E1C001F |
| Mako Figurine & co | stw r5,0x7AA0(r16) | 0x90B07AA0 |
| Mila Figurine & co + Koroks | b -> 0x80215664 | 0x4BE503A4 |
This payload corresponds to the collection of the following figurines highlighted in blue, and you get to pick between the green/yellow/orange pairs.

After beating FF1, the pixel data of 80ABBDFF will no longer line up with Link's position data. In this instance it is needed to get a different picture. Another pixel that can be saved for that case is 80AAD5AF, which will line up on Windfall.
With every setup discussed up until now, we were limited to only a couple instructions for our payload. Being able to write as many instructions as we would like would allow much more degenerate applications of ACE. This is called Total Control ACE, and there are a few ways to do it.
After performing the ACE setup, if you have the controller 4 instruction be a branch to the following 4-instruction pattern (which is found over 700 times in the game's code, here at 0x80215688), then the game will loop through controllers 2 to 4 indefinitely, as long as Link doesn't move (otherwise the game would crash). This allows writing as many instructions as we would like, at the rate of 2 instructions per frame.

Another, more efficient, method of Total Control ACE is to have controller 4 branch to controller 2 directly. This creates an infinite loop which freezes the game. This prevents the game from refreshing the controller data's instruction cache however, so we need controller 3 to do that, and this only leaves controller 2 for useful writes. We can run a payload this way (which requires being able to perform several hundreds inputs per second, so it is extremely unrealistic to do humanly). Once the payload is over, controller 4 can change inputs to branch back to gameplay, past the point where Text Stacking would normally crash.