;*********************************************************************
;	mario kart << コインＯＢＪデモ >>
;					Programed by H.Yajima
;*********************************************************************
		INCLUDE	../../SFX/RP5C77
		INCLUDE	../../SFX/RP5A22
		INCLUDE	../../DSP/D77C25
		INCLUDE	../../../kimura/join/work.def
		INCLUDE	../../../kimura/join/buffer.def
		INCLUDE	../DEF/object.def
		include	../DEF/jugem.def
;--------------------------------------------------------------------
		ext	sound_coin,c_comeback
		glb	Sprite_coin
;--------------------------------------------------------------------
_obj_forward	equ	00	; coin work
_obj_sX		equ	02
_obj_sY		equ	04
_obj_vX		equ	06
_obj_vY		equ	08
_obj_timer	equ	10
_obj_wait	equ	12
_total_timer	equ	14
;--------------------------------------------------------------------
		comn
work		ds	2
pointer		ds	2
char_data	ds	2
sprite_old	ds	2
X_flip		ds	2
;( max 10h byte )
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



		EXTEND
objprog	SECT	REL
		mem16
		idx16
;*********************************************************************
;	コインフラグチャッチ
;*********************************************************************
Sprite_coin	phx				;>>
		ldy	<screen_register
		lda	!coin_flag,y
		beq	exit$
		jsl	>oamset_coin
exit$		plx				;<<
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		EXTEND
objinit	SECT	REL
		mem16
		idx16
;*********************************************************************
;	コイン専用高速ＯＡＭセット
;*********************************************************************
oamset_coin	PEA	BC_00_7F
		PLB
		asl	a
		tax
		jsr	(!coin_select,x)
		PLB
		rtl  
;--------------------------------------------------------------------
coin_select	dw	0				; 0
;- - キャッチ - - -
		dw	init_catch,catch_data		; 1,2
		dw	main_catch			; 3
;- - ４枚落ち - - -
		dw	init_crash			; 4
		dw	crash_4				; 5
		dw	crash_0,crash_1,crash_2,crash_3	; 6789
		dw	main_crash			; 10
;- - ジュゲムリフト - - -
		dw	init_lift			; 11
		dw	main_lift			; 12
;- - ２枚キャッチ - - -
		dw	init_catch,catch_data2		; 13,14
		dw	main_catch2			; 15
;- - １枚落ち - - -
		dw	init_pon,crash_1X		; 16,17
		dw	main_crash			; 18
;--------------------------------------------------------------------

;#####################################################################
;	コインデモ各種
;#####################################################################
;*********************************************************************
;	コインキャッチデモ
;*********************************************************************
catch_data2	dw	0fa00h,0,8
catch_data	dw	0fa00h,0,0
		dw	0
;--------------------------------------------------------------------
init_catch				; y = screen_register
;- - - - - - - - - - - - - - - - - - - - - 
		stx	<pointer
		tyx
		lda	>coin_flag,x	; SEQ ポインタインク
		inc	a
		inc	a
		sta	>coin_flag,x

		lda	>screen_coin
		tay
		lda	#60h		; トータルタイマ
		sta	!_total_timer,y
;
		ldx	<pointer	; x = process pointer
		jsr	mount_coin
		jmp	set_coinsound
;--------------------------------------------------------------------
main_catch
;- - - - - - - - - - - - - - - - - - - - - - - -
		jsr	coin_pmset
		jsr	move_obj
		jsr	set_G
		jsr	oamset
;- - - - - - - - - - - - - - - - - - - - - - - -
		ldx	<register
		lda	<_situationZH,x
		beq	skip$
		lda	!_obj_vY,y
		bpl	reset$
;- - - - - - - - - - - - - - - - - - - - - - - -
skip$		lda	!_obj_sY,y
		cmp	#4801h
		bcc	exit$
reset$		jsr	demo_reset		; リセット
exit$		jmp	subset
;--------------------------------------------------------------------
main_catch2				; ２枚コインのキャッチ

;- - - - - - - - - - - - - - - - - - - - - - - - - - - 
		jsr	coin_pmset
;- - - - - - - - - - - - - - - - - - - - - - - - - - - 
		lda	!_total_timer,y	; タイマーチェック
		dec	a
		sta	!_total_timer,y
		beq	reset$
;- - - - - - - - - - - - - - - - - - - - - - - - - - - 
loop$		jsr	set_wait	; メインループ
		beq	entry$
		dec	a
		bne	skip$
		jsr	set_coinsound
		bra	skip$
;
entry$		lda	!_obj_sY,y
		cmp	#4801h
		bcs	skip$
		jsr	move_obj
		jsr	set_G
		jsr	oamset
skip$		lda	!_obj_forward,y
		tay
		bne	loop$
;- - - - - - - - - - - - - - - - - - - - - - - - - - - 
		jmp	subset
reset$		jmp	demo_reset
;*********************************************************************
;	コインロストデモ
;*********************************************************************
crash_4		dw	0fa40h,00100h,08+10
crash_3		dw	0fb00h,0fde0h,10+10
crash_2		dw	0fa00h,0fe80h,18+10
crash_1		dw	0fbc0h,00200h,04+10
crash_0		dw	0
crash_1X	dw	0fbc0h,00200h,04,0
;--------------------------------------------------------------------
init_pon	stx	<pointer
		tyx
;- - - - - - - - - - - - - - - - - - - - - 
		lda	>player_coin,x	; コインの数を減らす
		beq	exit$
		dec	a
		sta	>player_coin,x
;- - - - - - - - - - - - - - - - - - - - - 
		lda	>coin_flag,x	; SEQ ポインタインク
		inc	a
		inc	a
		sta	>coin_flag,x
;- - - - - - - - - - - - - - - - - - - - - 
		lda	>screen_coin
		tay
		lda	#30h		; トータルタイマ
		sta	!_total_timer,y
;- - - - - - - - - - - - - - - - - - - - - 
		ldx	<pointer	; x = process pointer
		jmp	mount_coin
;
exit$		jmp	demo_reset	; デモ終了
;--------------------------------------------------------------------
init_crash				; y = screen_register
;- - - - - - - - - - - - - - - - - - - - - 
		lda	<game_status
		cmp	#6
		bne	entry$
		rts
;- - - - - - - - - - - - - - - - - - - - - 
entry$		stx	<pointer
		tyx
		lda	>player_coin,x	; コインの数を減らす
		sec
		sbc	#4
		bpl	skip$		; clc
		adc	#4+1
		asl	a		; clc
		adc	<pointer
		sta	<pointer
		lda	#0
skip$		sta	>player_coin,x
;- - - - - - - - - - - - - - - - - - - - - 
		lda	>coin_flag,x	; SEQ ポインタインク
		clc
		adc	#06 
		sta	>coin_flag,x
		lda	>screen_coin
		tay
		lda	#80h
		sta	!_total_timer,y
		ldx	<pointer	; x = process pointer
		jmp	mount_coin
;--------------------------------------------------------------------
main_crash
;- - - - - - - - - - - - - - - - - - - - - - - -
		jsr	coin_pmset	; パラメータセット
;- - - - - - - - - - - - - - - - - - - - - - - -
		lda	!_total_timer,y	; タイマーチェック
		dec	a
		sta	!_total_timer,y
		beq	exit$
;- - - - - - - - - - - - - - - - - - - - - - - -
loop$		jsr	set_wait	; メインループ
		beq	entry$
		dec	a
		bne	skip$
		jsr	set_coinsound
		bra	skip$
;- - - - - - - -
entry$		jsr	move_obj
		jsr	set_G
		jsr	oamset
		lda	!_obj_sY,y
		bmi	skip$
		cmp	#7000h
		bcc	skip$
		jsr	bound
skip$		lda	!_obj_forward,y
		tay
		bne	loop$
;- - - - - - - - - - - - - - - - - - - - - - - -
		jmp	subset		; サブセット
exit$		jmp	demo_reset
;
;
;
;*********************************************************************
;	コインリフトデモ
;*********************************************************************
		;	--X-- --Y--
lift_data3	dw	0078h,0048h
lift_data2	dw	0078h,0048h
lift_data1 	dw	0078h,0048h
		dw	0
;--------------------------------------------------------------------
init_lift	tyx
;- - - - - - - - - - - - - - - - - - - - -
		lda	>coin_flag,x	; SEQ +1
		inc	a
		sta	>coin_flag,x
;- - - - - - - - - - - - - - - - - - - - -
		lda	>player_coin,x	; コインを減らす
		beq	exit$
		ldy	#lift_data1	; １ 枚取られる
		dec	a
		beq	skip$
		ldy	#lift_data2	; ２ 枚取られる
		dec	a
	;;	beq	skip$
	;;	ldy	#lift_data3	; ３ 枚取られる
	;;	dec	a
skip$		sta	>player_coin,x	
;- - - - - - - - - - - - - - - - - - - - -
		tyx
		jmp	init_XYpos	;(rts)
;- - - - - - - - - - - - - - - - - - - - -
exit$		jmp	demo_reset

;--------------------------------------------------------------------
main_lift
		jsr	coin_pmset	; パラメータセット


		lda	!_total_timer,y
		beq	exit$
		dec	a
		sta	!_total_timer,y		; トータルタイマ！
		lda	>screen_jugem
		tax
;
		lda	<_CN_start,x
		cmp	#c_comeback
		bne	exit$
;
		lda	<_dispX,x
		clc
		adc	#0700h
		sta	!_obj_sX+0,y
		lda	<_dispY,x
		bpl	set$
		cmp	#0f400h
		bcc	exit$
set$		sec
		sbc	#0200h
		sta	!_obj_sY+0,y
		jsr	oamset

loop$		tyx
		lda	!_obj_forward,y
		beq	skip$
		tay
		lda	!_obj_sX+0,x
		sta	!_obj_sX+0,y
		lda	!_obj_sY+0,x
		clc
		adc	#0d00h
		sta	!_obj_sY+0,y
		cmp	#5000h
		bcs	loop$
		jsr	oamset
		bra	loop$

skip$		jmp	subset

exit$		jmp	demo_reset
;--------------------------------------------------------------------
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;#####################################################################
;	共通ルーチン
;#####################################################################
;*********************************************************************
;	X,Y velocity , timer 初期設定
;*********************************************************************
;
;	x = data(process) pointer
;	
;--------------------------------------------------------------------
mount_coin	
		lda	>coin_select+2,x ; データ先頭アドレス
		tax				;>>
		lda	>screen_coin	; ポインタ先頭アドレス
		tay
;- - - - - - - - - - - - - - - - - - - -
		lda	>frame_part	; ランダム反転
		beq	skip$
		lda	#0ffffh
skip$		sta	<X_flip
;- - - - - - - - - - - - - - - - - - - -
		lda	>dbank_850000,x	; データはあるか？
		bne	loop$

		lda	#0		; なければ exit
		ldx	<screen_register
		sta	>coin_flag,x
		rts

loop$		lda	>dbank_850000+0,x	; 可変データ
		beq	init_exit
		sta	!_obj_vY,y
		lda	>dbank_850000+2,x
		eor	<X_flip
		sta	!_obj_vX,y
		lda	>dbank_850000+4,x
		sta	!_obj_wait,y
;- - - - - - - - - - - - - - - - - - - -
					; 固定データ
		lda	#07800h	
		sta	!_obj_sX,y
		lda	#04800h
		sta	!_obj_sY,y
;- - - - - - - - - - - - - - - - - - - -
		tya			; work pointer
		clc
		adc	#10h
		sta	!_obj_forward,y	; 次ヘのポインタ
		tay
		txa			; data pointer
		adc	#6
		tax
		bra	loop$

;*********************************************************************
;	X,Y position のみ 初期設定
;*********************************************************************
;
;	x = data register
;
;--------------------------------------------------------------------

init_XYpos	lda	>screen_coin
		tay
		lda	#80h		; はまった時のためのタイマ
		sta	!_total_timer,y
loop$		lda	>dbank_850000+0,x
		beq	init_exit
		sta	!_obj_sX,y
		lda	>dbank_850000+2,x
		sta	!_obj_sY,y
		tya			; work pointer
		clc
		adc	#10h
		sta	!_obj_forward,y	; 次ヘのポインタ
		tay
		txa			; data pointer
		adc	#4
		tax
		bra	loop$
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
init_exit	tya
		sec
		sbc	#10h
		tay
		lda	#0
		sta	!_obj_forward,y	; 終了
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -












;*********************************************************************
;		コントロール
;*********************************************************************

;--------------------------------------------------------------------
set_coinsound	PEA	BC_7F_00	; bank chenge
		plb
		jsl	>sound_coin
		plb
		rts
;--------------------------------------------------------------------
coin_char_data	dw	2c60h,2c86h,2ca2h
;- - - - - - - - - - - - - - - - - - - - - - - -
coin_pmset	lda	>frame_3_repeat	; コインキャラ
		lsr	a		
		lsr	a
		and	#0110b
		tax
		lda	>coin_char_data,x
		sta	<char_data
		lda	<sprite_count	; ＯＡＭpointer の 保存
		sta	<sprite_old
		lda	>screen_coin
		tay			; Y = coinwork index
		rts
;--------------------------------------------------------------------
demo_reset	ldx	<screen_register ; コインデモ終了
		lda	#0
		sta	>coin_flag,x
		rts
;--------------------------------------------------------------------
set_wait	lda	!_obj_wait,y	; 時間待ち
		beq	exit$
		dec	a
		sta	!_obj_wait,y
exit$		rts
;--------------------------------------------------------------------
		glb	DM_move_obj,DM_set_G,DM_bound
;- - - - - - - - - -
DM_move_obj
move_obj	lda	!_obj_sX,y	; 座標の移動
		clc
		adc	!_obj_vX,y
		sta	!_obj_sX,y
		lda	!_obj_sY,y
		clc
		adc	!_obj_vY,y
		sta	!_obj_sY,y
		rts
;--------------------------------------------------------------------
DM_set_G
set_G		lda	#0060h		; 重力計算
		clc
		adc	!_obj_vY,y
		sta	!_obj_vY,y
		rts
;--------------------------------------------------------------------
DM_bound
bound		SEP	#00100000B
		MEM8			; 反射計算
		lda	#dsp_multiply
		sta	>DSP_data
		REP	#00100000B
		MEM16
		lda	!_obj_vY,y
		sta	>DSP_data
		lda	#3fffh+8000h
		sta	>DSP_data

		lda	>DSP_data
		sta	!_obj_vY,y
		rts
;--------------------------------------------------------------------
oamset					; ＯＡＭセット
		ldx	<sprite_count
		SEP	#00100000B
		MEM8
		lda	!_obj_sY+1,y
		xba
		lda	!_obj_sX+1,y
		REP	#00100001B
		MEM16
		adc	<screen_obj_V
		sta	<sprite_H,x
		lda	<char_data
		sta	<sprite_C,x
;- - - - - - - - - - - - - - - - - - - - 
		cmp	#2c60h		; コインキャラをまわす！
		beq	skip0$	
		cmp	#2c86h
		beq	skip1$
		lda	#2c60h
		bra	skip2$
skip0$		lda	#2c86h
		bra	skip2$
skip1$		lda	#2ca2h
skip2$		sta	<char_data
;- - - - - - - - - - - - - - - - - - - - 
		inx
		inx
		inx
		inx
		stx	<sprite_count
		rts
;--------------------------------------------------------------------
subset		ldx	<sprite_count	; ＯＡＭ補正とサブセット
		cpx	<sprite_old
		beq	exit$
		ldy	#0e080h		; ( OBJ 0 - 4 )
		bra	entry$
loop$		sty	<sprite_H,x
		inx
		inx
		inx
		inx
entry$		txa
		bit	#0fh
		bne	loop$
skip$		sta	<sprite_count	; sprite count set
;- - - - - - - - - - - - - - - - - - - - -
		LSR	A
		LSR	A
		LSR	A
		LSR	A
		dec	a
		adc	<screen_sub
		tax
		lda	#0aah
		sta	<0,x
exit$		rts
;--------------------------------------------------------------------
