;*********************************************************************
;	mario kart << move sprite >>
;					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
;----------------------------------------------------------------------
		GLB	BGcheck_kart,BGcheck_item
		GLB	check_BG
;----------------------------------------------------------------------
		ext	Spin_kabe
		ext	sound_my_enemy,sound_my_dokan
		ext	sound_wood,sound_ice,sound_block,sound_block2
;----------------------------------------------------------------------
		COMN
work		DS	2
BGaddress	DS	2
;----------------------------------------------------------------------
		EXTEND
objprog	SECT	REL
		mem16
		idx16
;*********************************************************************
;	ＢＧチェック/ＯＢＪ衝突によるコントロール不能
;*********************************************************************
BGcheck_kart	LDY	#rank_index
		BRA	kart_entry
kart_loop	LDA	<_BGcheck_status,X
		STA	<bg_data,X
		JSR	BGcheck_entry
		INY
		INY
kart_entry	LDX	<0,Y
		BNE	kart_loop
;----------------------------------------------------------------------
BGcheck_entry
BGcheck_item	LDA	<_BGcheck_flag,X
		ASL	A
		BCS	stop_control
		LDA	<_hit_timer,X
		BNE	skip_control
		LDA	<_unable_control,X
		BEQ	set_control		; CLC
		DEC	A
		STA	<_unable_control,X
		BRA	stop_control
set_control	LDA	<_flag,X		; CONTROL ON
;;			 fedcba9876543210
		AND	#1011111111111111B
		STA	<_flag,X
		RTS
skip_control	DEC	A			;
		STA	<_hit_timer,X
stop_control	LDA	<_flag,X		; CONTROL STOP
		ORA	#4000H
		STA	<_flag,X
		SEC
		RTS
;*********************************************************************
;		ＢＧチェック
;*********************************************************************
check_BG	phx			; >>
		ldx	<register
		bit	<_BGcheck_flag,x
		bvs	BGcheck_special
		jsr	check_entry	; <- (BGcheck)
		bcc	BG_1000
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		lda	<_BGcheck_flag,x
		SEP	#00100000B
		MEM8
		inc	a
		cmp	#08h
		REP	#00100000B
		MEM16
		bcc	skip$
		ora	#04000h
skip$		ora	#08000h
		sta	<_BGcheck_flag,X
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		PLX
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
;ＢＧ衝突してない時
BG_1000		LDA	<_BGcheck_flag,X
		BMI	speed_chenge
		PLX
		INX
		INX
		JMP	(!0,X)
;--------------------------------------------------------------------
;		ＢＧに食い込んだ時の特別処理
;--------------------------------------------------------------------
BGcheck_special	
		jsr	check_entry
		bcc	exit$
;- - - - - - - - - - - - - - - - - - - - - - 
		lda	<_poseQ,x
		rol	a
		rol	a
		rol	a
		and	#03h
		asl	a
		tay	
		lda	!kuikomi_x,y
		sta	<_velocityX,x
		lda	!kuikomi_y,y
		sta	<_velocityY,x
		stz	<_crash_timer,x
		stz	<_crash_side,x
		plx		
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - 
exit$		stz	<_BGcheck_flag,x
		plx
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - 
kuikomi_x	dw	100h,100h,-100h,-100h
kuikomi_y	dw	-100h,100h,100h,-100h
;--------------------------------------------------------------------
;			fedcba9876543210
speed_move	EQU	0001000000000000B
speed_min	EQU	0C0H
;--------------------------------------------------------------------
;衝突後の減速処理
;--------------------------------------------------------------------

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
speed_chenge	

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		STZ	<_BGcheck_flag,X	; 減速したら
						; フラグをクリア
		LDA	#speed_move
		ORA	<_flag,X
		STA	<_flag,X
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		lda	<_status,x		;カメ当たり？
		bmi	kame_down
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		LDA	<_velocityX,X		;減速のチェック
		BPL	$+6
		EOR	#1111111111111111B
		INC	A
		CMP	#speed_min
		BCS	speed_down
		LDA	<_velocityY,X
		BPL	$+6
		EOR	#1111111111111111B
		INC	A
		CMP	#speed_min
		BCS	speed_down
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;かべ当たり加速(カートのスピードが小のとき）

		lda	#0100h
		ldy	<_velocityX,x
		bpl	setx$
		lda	#-0100h
setx$		sta	<_velocityX,x
		lda	#0100h
			ldy	<_velocityY,x
		bpl	sety$
		lda	#-0100h
sety$		sta	<_velocityY,x

		plx
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
speed_down
;反射減速（通常の反射）

		lda	<_vF,x
  		cmp	#0500h
		bcs	dash_down

		ldy	<_crash_side,x
		lda	speeddown_x,y
		tay
;- - - - 
		LDA	<_velocityX,X	
		JSR	ML_u08s16
		STA	<_velocityX,X
;- - - - 
		ldy	<_crash_side,x
		lda	speeddown_y,y
		tay
;- - - - 
		LDA	<_velocityY,X
		JSR	ML_u08s16
		STA	<_velocityY,X
		PLX
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;かべ当たり減速（カメの時）
kame_down	
		ldy	#00e0h		; カメ減速率
		lda	<_velocityX,x	
		BPL	$+6
		EOR	#1111111111111111B
		INC	A
		cmp	#200h
		bcc	skip0$
		lda	<_velocityX,x	
		jsr	ML_u08s16
		sta	<_velocityX,x
skip0$		lda	<_velocityY,x	
		BPL	$+6
		EOR	#1111111111111111B
		INC	A
		cmp	#200h
		bcc	down_skip
		lda	<_velocityY,x
		jsr	ML_u08s16
		sta	<_velocityY,x
		bra	down_skip
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;かべ当たり減速（カートのスピードが大のとき）
dash_down	ldy	#0040h		; カート減速率
		LDA	<_velocityX,X	
		JSR	ML_u08s16
		STA	<_velocityX,X
		LDA	<_velocityY,X	
		JSR	ML_u08s16
		STA	<_velocityY,X
down_skip	plx
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 



;--------------------------------------------------------------------
;			Xcrash      Ycrash
speeddown_x	dw	0080h,0080h,00f0h,00f0h
speeddown_y	dw	00f0h,00f0h,0080h,0080h

;*********************************************************************
;		無敵を解除する
;*********************************************************************
;*********************************************************************
;		BGcheck
;*********************************************************************
;ＢＧチェック	|
;- - - - - - - -+
check_entry	
;- - - - - - - - - - - - - - - - - - - - - - - ; Z = 0 ?
		lda	<_situationZH,x
		cmp	#4
		bcs	over$
;- - - - - - - - - - - - - - - - - - - - - - - 
		TXY				;>
		LDA	<_situationYH,X
		DEC	A
		CMP	#400H
		BCS	BG_over			; -> 範囲外
		ASL	A
		ASL	A
		ASL	A
		ASL	A
		AND	#0011111110000000B
		STA	<work
		LDA	<_situationXH,X
		CMP	#400H
		BCS	BG_over			; -> 範囲外
		LSR	A
		LSR	A
		LSR	A
		ORA	<work
		TAX
		STX	<BGaddress		; 現在の座標
;- - - - - - - - - - - - - - - - - - - - - - - 
		LDA	>BGcheck_buffer,X
		AND	#00FFH
		TAX
		SEP	#00100001B
		MEM8				; SEC
		LDA	!BGstatus_buffer,X
		BMI	BG_mirror
		TYX				;<
	;;	ldy	<_situationZL+1,x
	;;	bne	over2$	
;- - - - - - - - - - - - - - - - - - - - - - - 
set$		sta	<_BGcheck_status,x
		lda	#(area_out^0ffffh)	; エリア内セット
		and	<_flag+0,X
		sta	<_flag+0,X
		REP	#00100001B
		MEM16				; CLC (反射なしセット)
		lda	<BGaddress		;
		sta	<_BGcheck_back,X	;
		rts
;- - - - - - - - - - - - - - - - - - - - - - - 
over2$		REP	#00100000B
		MEM16
		lda	<BGaddress		;
		sta	<_BGcheck_back,x	;
over$		lda	#40h
		sta	<_BGcheck_status,x	; ジャンプ中は ０
		clc				; CLC (反射なしセット)
		rts
;----------------------------------------------------------------------
;４ｘ４画面範囲外のとき  |
;- - - - - - - - - - - - +
BG_over	
;- - - - - - - - - - - - - - - - - - - - - - - 
		lda	#area_out
		ora	<_flag,x		; 場外フラグセット
		sta	<_flag,x		
;- - - - - - - - - - - - - - - - - - - - - - - 
		lda	!BGstatus_buffer	; ＢＧチェック
		and	#00ffh
		bit	#0020h			; おっこち？
		bne	exit$
		lda	#26h			; 場外ＢＧ
exit$		sta	<_BGcheck_status,x
		clc				; CLC (反射なしセット）
		rts
;----------------------------------------------------------------------
;反射エントリー		|
;- - - - - - - - - - - -+
BG_mirror	TYX
		REP	#00100000B
		MEM16
;- - - - - - - - - - - - ＢＧコードセット - - - - - - -
		STA	<_BGcheck_status,X	;

		pha				;>>
		cpx	#player_r0
		bne	ssss$
		lda	!goal_kabe
		sta	>keycode_camera
ssss$
		pla			;<<

;- - - - - - - - - - - - ＢＧコードセット - - - - - - -
		STX	<register

;- - - - - - - - - - - - ＢＧ壊しセット - - - - - - - -
		jsr	Crash_block


;- - - - - - - - - - - - - - - - - - - - - - - -  xx ＮＥＳバグ修正 - - - 
		bit	<_flag,x					; xx
		bpl	entry$						; xx
		lda	<drift_index,x					; xx
		cmp	#0ch			; スピン中特殊処理！	; xx
		bne	entry$						; xx
									; xx
		lda	<_velocityX,x					; xx
		ora	<_velocityY,x					; xx
		beq	spinexit$					; xx
									; xx
		lda	<_velocityX,x		; 座標の緊急待避	; xx
		EOR	#1111111111111111B
		INC	A						; xx
		sta	<_velocityX,x					; xx
		lda	<_velocityY,x					; xx
		EOR	#1111111111111111B
		INC	A						; xx
		sta	<_velocityY,x					; xx
		jsl	>Spin_kabe					; xx
									; xx
		lda	#0ffffh			; 衝突スピン		; xx
		sta	<_spin_special,x				; xx
spinexit$	stz	<_BGcheck_flag,x	; 衝突スキップ		; xx
		clc							; xx
		rts							; xx
									; xx
entry$									; xx
;- - - - - - - - - - - - - - - - - - - - - - - -  xx ＮＥＳバグ修正 - - ; xx


;- - - - - - - - - - - - コントロール不能セット	- - - -
		LDA	#0008H	
		STA	<_unable_control,X

;- - - - - - - - - - - - 反射処理メイン - - - - - - - -
		LDA	<BGaddress
		TAY
		SEC
		SBC	<_BGcheck_back,X
		STY	<_BGcheck_back,X	;(BACKUP)
		BPL	sp_100
		EOR	#0FFFFH		; +1-7A = -(7A-1)
		SEC
		SBC	#07AH-1		; 1,7F,80,81
		BPL	sp_200
		LDA	#4
		BRA	sp_200				
sp_100		DEC	A		; 1,7F,80,81
		BEQ	sp_200			
		SEC
		SBC	#07DH
sp_200		CMP	#8		; *** error check ***
		BCS	mirror_error	; *** error check ***
		ASL	A		;(CLC)  0,1,2,3,4,5,6,7
		TAX
		JMP	(!select_1,X)	; Y= BGaddress
mirror_error	LDX	<register
		SEC			;ジャンプ後にかべあたり!!
		RTS
;--------------------------------------------------------------------
select_1	DW	chenge_X	;0
		DW	chenge_P	;1
		DW	chenge_Y	;2
		DW	chenge_P	;3
		DW	chenge_X	;4
		DW	chenge_P	;5
		DW	chenge_Y	;6
		DW	chenge_P	;7
;--------------------------------------------------------------------
select_2	DW	chenge_XY	;0
		DW	chenge_X	;2
		DW	chenge_Y	;4
		DW	chenge_XY	;6
;--------------------------------------------------------------------
offset_data1	DW	0,1	;P1
		DW	0,-1	;P3
		DW	0,-1	;P5
		DW	0,1	;P7
offset_data2	DW	0,-80H	;P1
		DW	0,-80H	;P3
		DW	0,80H	;P5
		DW	0,80H	;P7
;--------------------------------------------------------------------
chenge_P	TYA				; Y->A = NOW BG address
		PHX				;>> pointer
		ADC	!offset_data1,X		;(CLC OK!)
		TAX
		LDY	#0			; Y= jump vector
		LDA	>BGcheck_buffer,X	; character check
		AND	#00FFH			;
		TAX				;
		BIT	!BGstatus_buffer-1,X	; safe BGstatus?
		BPL	P_100			; yes -> skip
		LDY	#4			;
P_100		PLX				;<< pointer
		CLC
		LDA	<BGaddress
		ADC	!offset_data2,X
		TAX
		LDA	>BGcheck_buffer,X	; character check
		AND	#00FFH			;
		TAX				;
		BIT	!BGstatus_buffer-1,X	; safe BGstatus?
		BPL	P_200			; yes -> skip
		INY
		INY
P_200		TYX				; 0,2,4,6
		JMP	(!select_2,X)
;--------------------------------------------------------------------
chenge_X	LDX	<register
		LDY	#0
		LDA	<_velocityX,X
		EOR	#1111111111111111B
		INC	A
		STA	<_velocityX,X
		BPL	chenge_exit
		INY
		INY				
		BRA	chenge_exit
chenge_XY	LDX	<register
		LDA	<_velocityX,X
		EOR	#1111111111111111B
		INC	A
		STA	<_velocityX,X
chenge_Y	LDX	<register
		LDY	#4
		LDA	<_velocityY,X
		EOR	#1111111111111111B
		INC	A
		STA	<_velocityY,X
		BPL	chenge_exit
		INY
		INY				
chenge_exit	STY	<_crash_side,X
		LDA	#0C007H
		STA	<_crash_timer,X
		SEC
		RTS
;--------------------------------------------------------------------
;#####################################################################
;		UTILITY						
;#####################################################################
;*********************************************************************
;	衝突したら消えるカベ
;*********************************************************************
Init_erase_kabe	
		lda	#0
		sta	>kabe_SP
		rts
;- - - - - - - - - - - - - - - - - - - - 
Crash_block	cmp	#82h
		bcs	entry$
		bit	<_status,x
		bpl	skip$
		jsl	>sound_block	; カメと壁
		rts
skip$		jsl	>sound_block2	; 敵車と壁
		rts
;- - - - - - - - - - - - - - - - - - - - 
entry$		cmp	#84h		; ice ?
		beq	ice_block
;- - - - - - - - - - - - - - - - - - - - 
wood_block	jsr	Set_block
		bit	<_status,x
		bpl	exit$
		jsl	>sound_wood
exit$		rts
;- - - - - - - - - - - - - - - - - - - - 
ice_block	jsr	Set_block
		bit	<_status,x
		bpl	skip$
		jsl	>sound_ice
		rts
;- - - - - - - - - - - - - - - - - - - - 
skip$		lda	<_muteki_timer,x ; 無敵ならばぶち壊し
		beq	exit$
		pla			; << del return value
		sec			; 衝突判定なし！
exit$		rts
;- - - - - - - - - - - - - - - - - - - - 




;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	かべこわれバッファセット
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Set_block	bit	<_status,x
		bpl	kart$
		ldy	#0
		bra	start$
;- - - - - - - - - - - - - - - - - - - - - - - - 
kart$		
	;;;;	cpx	#player_r0
	;;;;	bne	entry$
	;;;;	lda	#1			; ゴーストエラー
	;;;;	lda	!goal_kabe		; こわれカベに
	;;;;	sta	>keycode_camera		; あたったら OUT

entry$		ldy	<_muteki_timer,x
start$		lda	>kabe_SP
		tax
		lda	>kabe_buffer+2,x
		bne	exit$
		tya
		beq	skip$
		lda	#-3
skip$		clc
		adc	#4			; カウンタセット
		sta	>kabe_buffer+2,x	
		lda	<BGaddress		; アドレスセット
		sta	>kabe_buffer+0,x
		txa				; 次のポインタへ
		clc
		adc	#0000100B
		and	#0011100B
		sta	>kabe_SP
exit$		ldx	<register
		rts
;- - - - - - - - - - - - - - - - - - - - 
		glb	DMA_block
;- - - - - - - - - - - - - - - - - - - - 
DMA_block	lda	>kabe_counter
		tax
		clc
		adc	#0000100B
		and	#0011100B
		sta	>kabe_counter
		lda	>kabe_buffer+2,x	; カウンタチェック
		beq	exit$
;- - - - - - - - - - - - - - - - - - - - 
		stz	!Screen_step
		dec	a
		sta	>kabe_buffer+2,x
		tay
		lda	>kabe_buffer+0,x	; アドレスチェック
		tax
		sta	!Screen_address+0	; VRAM ADDRESS
		SEP	#00100000B
		MEM8
		lda	!map_type
		beq	skip1$
		lda	!char_ice,y		; アイス !
		bra	skip2$
skip1$		lda	!char_obake,y		; おばけ !
skip2$		sta	!Screen_write+0		; VRAM WRITE
		sta	>BGcheck_buffer,x	; バッファセット
		REP	#00100000B
		MEM16
;- - - - - - - - - - - - - - - - - - - - 
exit$		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
char_ice	db	08h,7dh,7ch,7bh		; おばけ用パタン
char_obake	db	00h,28h,27h,26h		; アイス用パタン
;
;#####################################################################
;		UTILITY						
;#####################################################################
;************************************************************************
;*	Multiply unsigned 8bits and signed 16bits	Library.lib	*
;************************************************************************
temporary	EQU	0
;-----------------------------------------------------------------------
ML_u08s16	PHY			;>>
		PHX			;>>
		SEP	#00110000B
		MEM8
		IDX8
		SEP	#00100000B	;sBAY=sBA*uY
		STY	!Multiplicand
		STA	!Multiplier
		STY	<temporary
		NOP
		LDY	!Product+0
		LDA	!Product+1
		XBA
		STA	!Multiplier
		ASL	A
		LDA	#0
		BCC	u08s16_skip
		SBC	<temporary
u08s16_skip	XBA
		REP	#00110001B
		MEM16
		IDX16
		ADC	!Product	;(m:16)
		PLX			;<<
		PLY			;<<
		RTS
;-----------------------------------------------------------------------

;#####################################################################
;		UTILITY						
;#####################################################################

		END
