;Original idea by MathOnNapkins, heavily modified and further optimized for Super Metroid by Kejardon
; PJ: editor's note, added a missing comma to OamVClearB

;For other people: 7E0590 is size of OAM used this frame (4 bytes per sprite), 7E07FD is a word of RAM I freed up to use as size of OAM last frame.
;OAM 'mirror' in RAM starts at 7E0370 and goes to 7E058F

;Let's just assume 2 pagebreaks and do no calculations, stick a few redundant bytes at the end.

org $80896E
	PHP
	LDA $0590
	CMP $07FD
	BPL +	;If minus, carry will be cleared. Yay
	LDA #$8001
	STA $4303
	STA $4300
	LDA $07FD
	ADC #$0009	;Assuming 2 page breaks and skipping SEC
	SBC $0590	;Originally 4 bytes per sprite
	LSR	;2 bytes DMAed per sprite
	LSR ;1 word DMAed per sprite
	STA $4305	;Total bytes to DMA
	LDA $0590
	ADC #$0371
	STA $2181
	SBC #$0300
	XBA
	AND #$000F	;Number of page breaks to skip
	ASL		;2 bytes skipped per page break
	STA $12
	LDA $0590
	LSR		;2 bytes skipped per 4 bytes of sprites
	ADC $12
	ADC #OamClearTable	;start of OAM Clearing table
	STA $4302
	SEP #$20
	STZ $2183
	LDA #$01
	STA $420B
	PLP
	LDA $0590
+
	STA $07FD
	STZ $0590
	RTL
;Code length: < $60. It'll fit.


macro OamVClearA(pos)
{
	db $F0, <pos>+$5, $F0, <pos>+$9, $F0, <pos>+$D
}
endmacro

macro OamVClearB(pos)
{
	db $F0, <pos>+$1, $F0, <pos>+$5, $F0, <pos>+$9, $F0, <pos>+$D
}
endmacro

 
OamClearTable:
 
	%OamVClearA($70)
	%OamVClearB($80)
	%OamVClearB($90)
	%OamVClearB($A0)
	%OamVClearB($B0)
	%OamVClearB($C0)
	%OamVClearB($D0)
	%OamVClearB($E0)
	%OamVClearB($F0)
	db $F0, $FF
	%OamVClearB($00)
	%OamVClearB($10)
	%OamVClearB($20)
	%OamVClearB($30)
	%OamVClearB($40)
	%OamVClearB($50)
	%OamVClearB($60)
	%OamVClearB($70)
	%OamVClearB($80)
	%OamVClearB($90)
	%OamVClearB($A0)
	%OamVClearB($B0)
	%OamVClearB($C0)
	%OamVClearB($D0)
	%OamVClearB($E0)
	%OamVClearB($F0)
	db $F0, $FF
	%OamVClearB($00)
	%OamVClearB($10)
	%OamVClearB($20)
	%OamVClearB($30)
	%OamVClearB($40)
	%OamVClearB($50)
	%OamVClearB($60)
	db $F0, $6D, $F0, $6D, $F0, $6D, $F0	;Table size: $10B
