Illegal ancillae are those with IDs greater
The following section headers will name each entry as IAx##, where IA abbreviates Illegal Ancilla; x indicates a hexadecimal value; ## is the hexadecimal ID of the ancilla.
The results are fully unpredictable.
This entry points to a location in WRAM. The address is seemingly unused, so it will most likely have
This entry points to a location in WRAM. The low byte of the address is unused, so it will contain the value
This entry points to a location in WRAM. The high byte of the address is technically used, but always has a value of
This entry points to a location in WRAM. The results are fully unpredictable.
This entry points to a location in WRAM. The low byte (which will determine the first opcode used) is technically predictable, as it is determined by Link's coordinates; however, with 7 consecutive
This entry points to a location in WRAM. The results are fully unpredictable.
This entry points to a location in WRAM, specifically the OAM buffer. The results are fully unpredictable.
This entry points to a location in ROM. Specifically, it is executing data that is part of the quake draw routine's tables. Depending on the slot, different code from another table will be executed. Regardless, the game will crash.
This entry points to a location in WRAM. The address
This entry points to a location in WRAM. The results are fully unpredictable.
This entry points to a location in WRAM. The results are fully unpredictable.
This entry points to a location in WRAM. The addresses containing the opcode is unused, resulting in a
This entry points to a location in WRAM. The high byte of the address will be the opcode (
This entry points to a location in WRAM, specifically the OAM buffer. The results are fully unpredictable.
This entry points to a location in WRAM, specifically the last slot in the torch timer array. This array has 16 slots, but in practice, this slot is never used. A
This entry points to a location in WRAM, specifically the high byte of the quadrant visits flag for the current underworld tile. This byte is unused, so it will result in a
IAx54 and IAx55 share the same entry point.
This entry points to a location in ROM. Funnily enough, it is pointing straight to another pointer from the jump table we just used, specifically the pointer for the unused ancilla with an ID of
IAx56 and IAx57 share the same entry point.
This entry points to a location in ROM, specifically the routine
However,
The game crashes because the stack is unbalanced after this
For all other indices, the results are fully unpredictable.
IAx58, IAx59, IAx5A, and IAx5B all share the same entry point.
This entry points to a location in ROM, specifically one of the exit points of
This entry points to a location in open bus. The results are fully unpredictable.
This entry points to a location in ROM, specifically part of the flute ancilla's consumption code. The entry point aligns perfectly with the code. The branch is always taken, as the
This creates a glitchy object (often the item get sprite) on screen, but beyond that, it does not appear to have any interesting consequences in and of itself. If the object ends up being off screen, it will just delete itself from the array.
This entry points to a location in ROM, specifically part of the bomb draw routine's data table. The first instruction is a
This entry points to a location in WRAM, specifically the start of the ancilla ID array. This array is easily manipulable; it can, and has, been used for arbitrary code execution.
This entry points to a location in WRAM, specifically a general purpose DMA buffer. The results are fully unpredictable.
This entry points to a location in WRAM, specifically an array of shutter door location values. Results will vary based on the position and order of doors, but most of the results are fully unpredictable..
This entry points to a location in ROM, specifically the
This entry points to a location in open bus. The results are fully unpredictable. And then some.
This entry points to a location in ROM, specifically the
This entry points to a location in open bus. In general, the results are fully unpredictable.
In many cases, the same instructions are used ad nauseum, but eventually, execution lands on the controller ports, allowing for full control arbitrary code execution in a TAS. This can make this illegal ancilla predictable and usable; however, other CPU operations will clobber the value in open bus.
This entry points to a location in ROM, specifically part of the door debris draw routine's data table. It just so happens to land on the value
This entry points to a location in ROM, specifically the end of the jump splash draw routine. The entry point does not align perfectly with the code, but it recovers quickly. This code takes the value of the accumulator, which currently holds the high byte of the pointer (
Effectively, this means we can write
| Controller input | Address | Effect | ||
|---|---|---|---|---|
|
Scratch space | Useless | ||
R |
Game module | Crash | ||
L |
Link's Y-coordinate low byte | Funny teleport | ||
LR |
Link's Y velocity | Nothing; overwritten before use | ||
X |
Temp variable for coordinates | Nothing; overwritten before use | ||
X R |
Change direction flag | Link cannot turn anymore | ||
XL |
Attract mode sequence counter | Nothing; zeroed every frame as collateral damage | ||
XLR |
Free RAM | Nothing | ||
A |
Free RAM | Nothing | ||
A R |
OAM buffer location pointer | Nothing; overwritten before use | ||
A L |
Room ID | Repointed to EP big chest room or a nonexistent room ID |
||
A LR |
Subsubmodule | Game will crash during transitions | ||
AX |
Tilemap buffer pointer | Nothing; overwritten before use | ||
AX R |
Room load pointers | Nothing; overwritten before use | ||
AXL |
BG1 horizontal scroll low byte | Nothing; corrected every frame | ||
AXLR |
Joypad 1 inputs | Changes input for joypad 1 to B+Select+Up+Right | ||
This entry points to a location in ROM, specifically the end of a routine that transmutes ancilla
After the coordinates are set each frame, this illegal ancilla will behave like a normal spin spark. The ID rewrite of the routine is not performed, so this ancilla will remain with the illegal ID.
This illegal ancilla shares the same pointer and effect as IAx5F.
This entry points to a location in location in WRAM, specifically the flute cooldown timer. This results in fully unpredictable results or a
This entry points to a location in WRAM, specifically the arbitrary DMA buffer. The results are fully unpredictable.
This entry points to a location in ROM, specifically part of the magic powder draw routine's table. After doing a bunch of subtraction, a
This entry points to a location in WRAM, specifically an array of ancillae OAM priority values. Results are, you guessed it, fully unpredictable.
This entry points to a location in WRAM, specifically the torch timer array. Unlike IAx52, this points to the beginning of the array, which is actually used in practice. Unfortunately, this still results in unpredictable code or a
This entry points to a location in open bus. It will constantly not branch on negatives until it reaches CPU registers. Afterwards, the results are fully unpredictable.
This entry points to a location in WRAM, specifically the last byte in an array that counts the number spiral staircases. The results are fully unpredictable.
This entry points to a location in WRAM, specifically part of the arbitrary DMA buffer. The results are fully unpredictable.
This entry points to a location in ROM, specifically part of the bombos spell draw routine. The entry point does not align perfectly with the code, but it recovers after one instruction. Unfortunately, the entry is after where a stack push was meant to occur, so at the end of this routine, the stack will become unbalanced, resulting in a crash. I mean... The results are fully unpredictable.
This entry points to a location in ROM, specifically part of the Skull Woods flame routine. The entry point does not align with the code and ends up executing a
The location branched to does not align perfectly with the code. It recovers after 1 instruction; however, the routine entered expects both the accumulator and index registers to be in 16-bit mode. Having entered with both in 8-bit mode, the CPU fails to stay aligned with the intended code. This is irrelevant, as the code eventually enters a
This entry points to a location in ROM, specifically the end of the dash tremor code. The break vector hit leads to a data table, where endless direct page instructions are executed. They're not worth documenting, and I hope the game eventually crashes.
This entry points to a location in WRAM, specifically the ancilla layer array. Without using other misslots to write different values here, only
This illegal ancilla shares the same pointer and effect as IAx61.
This entry points to a location in ROM, specifically part of an ancilla hitbox routine. The entry point aligns perfectly with the code; however, it skips over several stack pushes that were meant to occur. This leaves the stack unbalanced, causing the game to eventually crash.
This entry points to a location in WRAM, specifically a general purpose property of sprites. Predictably, the results are fully unpredictable.
This entry points to a location in WRAM, specifically part of the OAM buffer. The results are fully unpredictable.
This entry points to a location in ROM, specifically the tink spark draw routine. The entry point does not align perfectly with the code, but it recovers after 1 instruction. Eventually the routine returns cleanly.
Of particular interest is the instruction at
This also comes with the potential to hardlock the game in an infinite loop. For example, if IAx7A is in slot 0 and
Less interestingly, this illegal ancilla should also result in some broken objects on screen.
This illegal ancilla shares the same pointer and effect as IAx78.
This entry points to a location in WRAM, specifically the an array that counts the number spiral staircases. The results are fully unpredictable.
This entry points to a location in ROM, specifically an ancilla sound effects routine. The entry point does not align with code, causing it to branch to open bus. It will keep branching backwards until it reaches CPU registers or the A bus is clobbered. These results are fully unpredictable.
Under most circumstances, HDMA will indeed clobber the A register, and the CPU should eventually reach
This illegal ancilla shares the same pointer and effect as IAx78.
This entry points to a location in WRAM, specifically the current underworld room ID. The top byte located in
This entry points to a location in WRAM, specifically a general purpose property of F-slot ancillae. The results are fully unpredictable.
Due to the left shift when calculating the index into the pointer table, illegal ancillae with an ID of
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.
The results are fully unpredictable.