	include	macro.inc
	include	mdc5.inc
	include	multiversion.inc
irqflag	equ	$0722

	enum	SOFT_ANN=0,SOFT_SMB

;MMC5 の場合、 IRQ は scanline counter なので各種レジスタを設定しても
;$2000:w bit7 が 0 だと IRQ が発生しない
;2C33 では timer なので発生する

;$0778 -> $2000:w の shadow
;$077b -> IRQ 発生 flag (0:まだ, 1:済み)
;NMI interrupt routine

;configure IRQ scanline
	ors	$60af,$60ac
	lda	irqflag ;722 と 772 が紛らわしいので注意
	beq	irq_wait_skip
	lda	#30
	jsr	mdc5_function_scanline_irq_enable
	inc	$077b
	bpl	irq_wait_skip ;bra
 if version == SOFT_SMB ;空いている場所がここしかない!
world9_enableirq:
	inc	irqflag
	jmp	$63d7
 endif
	fils	$60c6,$60c3
irq_wait_skip:

;IRQ interrupt routine
	ors	$61ac,$61a9
;dipable IRQ
	jsr	mdc5_function_scanline_irq_disable
	lda	$0778
	and	#$F7
	ora	$077A
	sta	$0778
	sta	$2000
	lda	#$00
	lda	$073F
	sta	$2005
	lda	$0740
	sta	$2005
	lda	#$00
	sta	$077B
	pla
	tay
	pla
	tax
	pla
	plp
	cli
	rti

new_c099:
	lda	$07a1
	beq	submode_increment_stopirq
	rts
mainmode_set_stopirq:
	sta	$0770
	bpl	tt_stopirq ;bra
submode_increment_stopirq:
	inc	$0772
;	lda	#0
;	sta	irqflag
tt_stopirq:
	dec	irqflag
	rts
	fils	$61ec,$61e9

 if 0
627C : lda	$0770
627F : jsr	$6D0F
	adr	$bfbf,$7aa7,$629b
;$0770==0
	adr	$c017,$c550,$c08e,$654c
	adr	$c596,$c42b,$bfd3
;$0771==1
	adr	$c05e,$6ec9,$6311,$654c
	adr	$6f48,$7ab9
;$0772==2
;  $075f != 7
	adr	$9c25,$6373,$63c7,$6400,$6242,$6465
;  $075f == 7
	adr	$9c25,$6373,$63c7,$c092,$c099,$c09f,$c5d0
 endif

;mode 0.5 -> 0.6
	ors	$c4ab,$c4f1
	jsr	submode_increment_stopirq

;world 1-7
;mode 2.5 -> 1.0
	ors	$647e,$63f7
	lda	#1
	jsr	mainmode_set_stopirq

;world 8
;mode 2.4 -> 2.5
	ors	$62e6,$62e3
	adr	new_c099

;NSMDATA3,SM2DATA3
;irq flag に #$1b を書き込んでるんだけど...
	ors	$c5eb,$c617
	nops	$c5ee,$c61a

;world 8->9 branch
 if version == SOFT_SMB
;無条件にworld 9にいける
 if 0
	org	$c781
	jmp	$c793
 endif
;world 9 に入るときに共通ルーチンで IRQ を開始するので仕方なしに IRQ を inc して共通ルーチンで dec してもらう
	org	$c79e
	jmp	world9_enableirq
 endif
