What Is This?
I performed a method that's very close(2549f) to the current fastest record(2505f), but using a completely different approach. However, breaking the record requires an additional 45f improvement, which seems beyond my capabilities. So, I've decided to share details, moviefile, and a YouTube video here, hoping to enlist your help.
Crash Using Yoshification
When a naked koopa attempts to jump into a shell, the shell's $1594 is set to that naked koopa's slot number. Combining this with the shell's yoshification allows storing that naked koopa's slot number into Yoshi's $1594 (mouth routine pointer). When this value is 4 or higher, CPU jumps to an unintended address.
In this TAS, I used Yoshi from slot 8 to yoshify the shell in slot 8, setting Yoshi's $1594 to 6. (The aforementioned naked koopa was in slot 6).
Open bus & Payload
- The CPU reads two bytes from $01f0cb + (mouth routine pointer * 2) and jumps to that location in bank 01. This time, the mouth routine pointer is 6, so it jumps to $01221d in the open bus.
- The value of mdr is 01 derived from the bank, so ora($01,x) is executed.
- x == 8 (Yoshi's slot number)
- $09 == 01(high byte of player y position, next frame...$97)
- $0a == 1c(x position of lowest slot, lowbyte + 2)
- Therefore, ora($01,x) = ora $011c01 = ora #$10
- Consequently, the next MDR value becomes 10, and bpl $10 is executed. This likely allows jumping over various registers until the CPU reaches $01421d.
The payload in the last two frames has the following 8 bytes starting at $4218:
8e c6 13 64 10 cb 80 f8
//stx$13c6 stz$10 wai bra $4218
e9 04 8d 00 01 60 80 f8
//sbc#$04 sta$0100 rts bra $4218
The actual code executed are as follows:
$01421d wai
(Interrupts by IRQ)
$01421e bra $4218
$014218 stx $13c6 //x == 8
$01421b stz $10
$01421d wai
(interrrupts by NMI, below is the 2nd frame)
$01421e bra $4218
$014218 sbc #$04 //a == 1d - 04 - carry (==18)
$01421a sta $0100
$01421d rts
Flow Leading Up To The Crash
- First, to spawn Yoshi in slot 8, take the shell in slot 9 and hit the block containing Yoshi while wedging it into the block on the left($13 parity must be considered). This allows Yoshi to spawn before the message box fills slot 8.
- Kick the shell from slot 9 and take damage at the right spot. Adjust carefully to face left while moving right by inertia, step on the shell to spawn the naked koopa in slot 6, and scroll left at the right moment. This causes 3f? freeze, allowing you to place the naked koopa where you want. (Be careful not to break $13 parity)
- Throw the shell in slot 0 to the left, setting the x-coordinate to 0x1a one frame? before the crash. (Adjustment for $0a)
- Yoshification succeeds without needing to pause when both the shell's and naked koopa's slot numbers are even? and $13 is even at the frame the shell spawns.
Is Further Improvement Possible?
I don't think I can make any further improvements on my own. It seems very difficult, but perhaps with your ideas, it might work out. I've listed my ideas so far below.
What To Yoshify
- shell
- naked koopa (would require a pause if you could because of the initialization of the naked koopa)
Where To Do
3 locations with shells and 2 locations with naked koopa
How To Despawn Yoshi
- hole on the left end of the level
- use corner clip
- use message box to get through the floor (didn't work)
- use null sprite overload
Other Possibilities
Methods using corner clipping in green shell locations. I can't think of a good way to adjust the position of the naked koopa.