I completed the investigation about DelayObjectFFGlitch :)
1:I go to the place where object FF appears.
(The normal appearing place is IceManStage,GutsManStage,Wily3)
(An abnormal appearance place is BombManStage,Wily1(using DelayObjectGlitch))
2:SpawnObject_TypeIsFF is called from PC:$D9B5.
2:AutoSpawnObjectFFcounter=0x10
3:SpawnObject_TypeIsFF is called from $D8AD two or more times at intervals of the number of frames.
4:SwitchBankTile is called from SpawnObject_TypeIsFF.
5:The bank number is preserved in $42 during SwitchBankTile.
$42=0x02 is preserved usually.
$42=0x00 or other value is preserved when I use DelayObjectGlitch and ObjectFF is called.
6:If NMI is generated by $C6AC-$D999 , the value of CurrentRoomPointer($0006,$0007) is read by an abnormal bank.
If NMI is generated by $D99A-$D9A3 , the value of CurrentRoomPointer(only $0007) is read by an abnormal bank.
7:A wrong enemy is read from worng CurrentRoomPointer.
Result of investigation.
BombManStage:
DelayObjectFF(ObjectFF from DelayObjectGlitch)->DelayFFStageClear(DelayObjectFFGlitch)
Actually, DelayStageClear was caused in this mechanism(BombManStage).
IceManStage:
ObjectFF from IceManStage->DelayFFStageClear is possible!
OtherStage:
There is no useful place.
Because the investigation ended , we can finally challenge new TAS.
TraceLog is here :)
--------LoadEnemies--------
|$D89B:A9 06 LDA #$06 A:00 X:1F Y:09
|$D8AD:20 66 C6 JSR $C666 A:0E X:1F Y:09
| --------SpawnObject_TypeIsFF--------
| |$C666:A5 42 LDA $0042 = #$06 A:0E X:1F Y:09 SpawnObject_TypeIsFF
| |...
| |$C67D:A6 93 LDX $0093 = #$FF A:83 X:1F Y:09
| |...
| |$C685:BD B1 C6 LDA $C6B1,X @ $C7B0 = #$FC A:29 X:FF Y:09 A=#$FC
| |$C688:20 AE C7 JSR $C7AE A:FC X:FF Y:09
| | --------SwitchBankTile--------
| | |$C7AE:48 PHA A:FC X:FF Y:09 PUSH A=#$FC
| | |...
| | |$C7BB:68 PLA A:00 X:FF Y:09 POP A=#$FC
| | |$C7BC:29 03 AND #$03 A:FC X:FF Y:09 A= #$FC AND #$03 = #$00
| | |$C7BE:A8 TAY A:00 X:FF Y:09 Y=A=$00
| | |$C7BF:85 42 STA $0042 = #$06 A:00 X:FF Y:00 $42=#$00 The bank number is decided.
| | |$C7C1:99 00 C0 STA $C000,Y @ $C000 = #$00 A:00 X:FF Y:00 ChangeBank0
| | |$C7C4:60 RTS A:00 X:FF Y:00
| | --------SwitchBankTile--------
| |...
| |$C6AA:68 PLA A:C0 X:FF Y:FF PLA
| |$C6AB:AA TAX A:06 X:FF Y:FF X=A(06)
| |$C6AC:9D 00 C0 STA $C000,X @ $C006 = #$06 A:06 X:06 Y:FF ChangeBankX=ChangeBank6
| | --------NMI--------
| | |...
| | |$D56E:A5 42 LDA $0042 = #$00 A:00 X:00 Y:1C A=$42=0x00
| | |$D570:AA TAX A:00 X:00 Y:1C X=A=0x00
| | |$D571:9D 00 C0 STA $C000,X @ $C000 = #$00 A:00 X:00 Y:1C ChangeBankX = ChangeBank0
| | |$D582:40 RTI A:06 X:06 Y:FF
| | --------NMI--------
| |$C6AF:60 RTS A:06 X:06 Y:FF
| --------SpawnObject_TypeIsFF--------
|…
|$D92F:20 89 D9 JSR $D989(LoadEnemyNumber) A:01 X:06 Y:FF
| --------LoadEnemyNumber--------
| |...
| |$D999:18 CLC A:04 X:04 Y:FF
| |$D99A:BD 52 A4 LDA $A452,X @ $A456 = #$51 A:04 X:04 Y:FF
| |$D99D:65 06 ADC $0006 = #$04 A:51 X:04 Y:FF
| |$D99F:85 06 STA $0006 = #$04 A:55 X:04 Y:FF $0006(CurrenRoomPointer)=#$55(from MadBank)
| |$D9A1:A5 07 LDA $0007 = #$18 A:55 X:04 Y:FF
| |$D9A3:29 03 AND #$03 A:18 X:04 Y:FF
| |$D9A5:7D 53 A4 ADC $A453,X @ $A457 = #$D1 A:00 X:04 Y:FF
| |$D9A8:85 07 STA $0007 = #$18 A:D1 X:04 Y:FF $0007(CurrenRoomPointer+1)=#$D1(from MadBank)
| |$D9AA:A0 00 LDY #$00 A:D1 X:04 Y:FF
| |$D9AC:60 RTS A:D1 X:04 Y:00
| --------LoadEnemyNumber--------
|...
|$D94D:B1 06 LDA ($06),Y @ $D158 = #$F5 A:D0 X:04 Y:03 Enemy=#$F5!(from mad CurrentRoomPointer)
|...
|$D952:20 AD D9 JSR $D9AD A:F5 X:01 Y:04 SpawnObject(DelayStageClear)