ALL_SET		equ	04H	; ゴールインデバッグモード
				; がＯＮの時
;*********************************************************************
;	mario kart << sprite item >>
;					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	Camera_Q,Limit_camera2
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		ext	debug_FLAG
		ext	sound_star
		ext	sound_missile,sound_banana,sound_kame
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		ext	mapmode_check
		EXT	Connect_A,Connect_B,Remove_object
		EXT	Connect_item,Remove_item
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		GLB	item0,item0X
		GLB	Mount_fire,Mount_gunfire
		GLB	fire,fireX,OBJmove
		EXT	pole_char,pole_char_B
		EXT	attre,subst,setobj
		EXT	project_Z,screen,screen_A,screen_B,ret
		EXT	move_object,Z_stop,Z_bound,ret
		EXT	disp_B_check,magna
		EXT	monon16,monon8,monon16_item,monon8_item
		EXT	zoom_size
		GLB	Init_item,Main_item,DMA_item
;----------------------------------------------------------------------
		ext	Random
		EXT	Erase_sprite
		EXT	check_BG,BGcheck_item,Move_situation
		EXT	Copy_situation
		GLB	Count_item,Allclear_item
;----------------------------------------------------------------------
		COMN
work		DS	2
rock_dist
temporary	DS	2
rock_index
pointer		DS	2
angle		DS	2
position_addr	ds	4	; initial
position_data	ds	2	; initial
;----------------------------------------------------------------------
;		ORG	OBJtrans_value
;item_count	DS	8
;item_buff	DS	8
;item_vram	DS	8
;item_power	DS	2
;item_index	DS	2
;item_control	DS	2  
;item_enemywait	DS	2
;----------------------------------------------------------------------
item_count	equ	OBJtrans_value+0
item_buff	equ	OBJtrans_value+8h
item_vram	equ	OBJtrans_value+10h
item_power	equ	OBJtrans_value+18h
item_index	equ	OBJtrans_value+1ah
item_control	equ	OBJtrans_value+1ch
item_enemywait	equ	OBJtrans_value+1eh
;----------------------------------------------------------------------
;		- - - - fedcba9876543210 - - - -
ON_item		EQU	1000000000000000B
;----------------------------------------------------------------------
		EXTEND
objprog	SECT	REL
		mem16
		idx16
;*********************************************************************
;		FIRE ITEM TABLE
;*********************************************************************
;===FIRE ANIME=== ( アニメのテーブル　)
select_fire	DW	anime_banana	; 0 バナナ
		DW	anime_kame	; 2 緑カメ
		DW	anime_kame	; 4 赤カメ
		DW	anime_killer	; 6 キラー ( 緑カメ ）
		DW	anime_every	; 8 バナナタイプ攻撃 (敵専用)
		DW	anime_every	; A ミサイルタイプ攻撃 (敵専用）
		DW	anime_banana	; C 投げバナナ
		DW	anime_koura	; E 置きガメ
;--------------------------------------------------------------------
;===FIRE REGISTER=== ( 動きのテーブル ）
move_register	DW	move_mybanana	; 0 バナナ
		DW	move_kame	; 2 緑カメ
		DW	move_missile	; 4 赤カメ　
		DW	move_kame	; 6 キラー ( 緑カメ )
		DW	move_enemybana	; 8 バナナタイプ攻撃 (敵専用)
		DW	move_bananabomb	; A ミサイルタイプ攻撃 (敵専用)
		DW	move_bananabomb	; C 投げバナナ
		DW	move_mybanana	; E 置きガメ
;--------------------------------------------------------------------
;===FIRE INITIAL POSITION & VECTOR=== ( 初期設定テーブル ）
fire_initial	DW	fire_banana	; 0 バナナ
		DW	fire_kame	; 2 緑カメ
		DW	fire_red_kame	; 4 赤カメ
		DW	fire_kame	; 6 キラー ( 緑カメ )
		DW	fire_banana	; 8 バナナタイプ攻撃
		DW	fire_bananabomb	; A ミサイルタイプ攻撃
		DW	fire_newbanana	; C 投げバナナ
		DW	fire_banana	; E 置きガメ
;#####################################################################
;#####	BATTLE	カメ、バナナ、発射ルーチン			######
;#####################################################################
fire
fireX
Mount_gunfire	RTS
;#####################################################################
;#####	敵車	カメ、バナナ、発射ルーチン			######
;#####################################################################
;*********************************************************************
;		敵がカメをセットする
;*********************************************************************
;*********************************************************************
;		敵がバナナをセットする
;*********************************************************************
;*********************************************************************
;		敵車がアイテムを使うチェック
;*********************************************************************
		GLB	Enemy_fire_A,Enemy_fire_B
		GLB	Enemy_fire_GP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Enemy_fire_GP
		lda	!rank_number+player_r0
		cmp	!rank_number+player_r1
		bcc	Enemy_fire_A
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Enemy_fire_B	
		LDX	#player_r1
		LDA	#_posH_B
		BRA	Enemy_fire

Enemy_fire_A
		LDX	#player_r0
		LDA	#_posH_A
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Enemy_fire	stx	<register
		sta	<work

		lda	<_flag,x	; ゴールインしたか？	
		and	#ON_goal
		bne	exit$

;- - - - - - - - - - - - - - - - - - - - - - -	; １周目はセットせず

	if	debug_mode
		lda	!debug_FLAG	
		and	#ALL_SET	
		bne	db_skip$
	endif
		lda	<_lap,x
		cmp	#8100h
		bcc	exit$
db_skip$
;- - - - - - - - - - - - - - - - - - - - - - -	; セット後３秒間は
						; セットせず
		lda	!fire_long
		beq	start$
		dec	a
		sta	!fire_long
		rts
;- - - - - - - - - - - - - - - - - - - - - - -  ; スピードが０ならば
						; リセット
start$		lda	<_vF,x
		beq	reset$
;- - - - - - - - - - - - - - - - - - - - - - -	; 自分の順位をチェック
		lda	<rank_number,x
		bne	challenger$
;--------------------------------------------------------------------
;	マイカーが１位の時	( 敵車後方攻撃 )
;--------------------------------------------------------------------
		ldy	<_backward_kart,x	; 後方カート
		bra	common$
;--------------------------------------------------------------------
;	マイカーが２位以下の時	( 敵車前方攻撃 )
;--------------------------------------------------------------------
;- - - - - - - - - - - - - - - - - - - - - - -  ; 前方カートがなければ
						; リセット
challenger$	ldy	<_forward_kart,x
common$		beq	reset$
		ldx	<_status,y		; ドライバー number
		cpx	!fire_process
		beq	entry$
		stx	!fire_process		; 前回とロックカート
reset$		jmp	fire_reset		; が同じでなければ
;						; リセット
entry$		lda	!fire_flag
		beq	skip$
		tax				; フラグがたっていれば
		jmp	(!driver_fire,x)	; その処理を行なう
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;フラグの立っていないときの処理（フラグをたてるため）
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
skip$		lda	!_flag,y
		and	#ON_comp		; コンピューターカート？
		beq	exit$

		lda	#60			; １秒おきに抽選する
		jsr	check_fire
		bcc	exit$	
						; X = ドライバー number
	if	debug_mode
		lda	!debug_FLAG
		and	#ALL_SET
		beq	nomal$
		lda	!table_select+10H
		bra	special$
	endif

nomal$		lda	!table_select,x	
special$	sta	<0
		lda	!patern_select,x
		sta	<2
		ldx	<register
		ldy	<rank_number,x		; 順位による攻撃変化
		jsl	>Random
		and	(<0),y			; 確率テーブル参照
		sta	!fire_random
		bne	exit$
		lda	(<2),y			; パターンテーブル参照
		sta	!fire_flag
exit$		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
table_select	dw	mario$
		dw	luige$
		dw	kuppa$
		dw	peach$
		dw	cong$
		dw	noko$
		dw	kinopio$
		dw	yossy$
		dw	debug$
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
mario$
luige$		dw	00,00,03,03,03,03,0ffffh,0ffffh
peach$
kinopio$
yossy$		dw	00,00,03,03,03,03,0ffffh,0ffffh
cong$		dw	00,00,00,00,00,00,03,03
kuppa$		dw	00,00,00,00,00,00,0ffffh,0ffffh
noko$		dw	03,03,03,03,03,03,0ffffh,0ffffh	
debug$		dw	0,0,0,0,0,0,0,0
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
patern_select	
		dw	mario$
		dw	luige$
		dw	kuppa$
		dw	peach$
		dw	cong$
		dw	noko$
		dw	kinopio$
		dw	yossy$
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
mario$
luige$		dw	12,08,08,08,08,08,08,08
peach$
kinopio$			
yossy$		dw	10,04,04,04,04,04,04,04
kuppa$
noko$
cong$		dw	10,04,04,04,04,04,04,04
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
;各種攻撃フラグ(index-jump)
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
driver_fire	dw	0		; 0
		dw	driver_banana0	; 2  バナナタイプセット(遠い）
		dw	driver_banana1	; 4  バナナタイプセット(どこでも)
		dw	driver_banana2	; 6  バナナタイプセット(近い）
		dw	driver_star	; 8  前方無敵セット
		dw	driver_bananaA	; 10 バナナタイプを前方へ投げる
		dw	driver_star2	; 12 後方無敵セット
;--------------------------------------------------------------------
;====================================================================
;	前方バナナ攻撃に合格したとき
;====================================================================
driver_bananaA
		ldx	<register		; マイカート
		ldy	#banana_dist
		lda	<_backward_dist,x	; 前方距離
		jsr	distance_check

		phx
		ldy	<_backward_kart,x	; 攻撃する敵カート(前方）
		sty	<register
		ldy	#5
		jsr	Mount_fire
		pla				; a = register
		jsr	Set_keikoku		; バックミラー警告

		jmp	set_wait

banana_dist	dw	090h,030h
;====================================================================
;	バナナセットに合格したとき
;====================================================================
;	x = マイカート index
;	y = 敵カート index
;- - - - - - - - - - - - - - - - - - - - - - - 
driver_banana2	ldy	#banana_table_L2
		bra	db_100
driver_banana0	ldy	#banana_table_L0
		bra	db_100
driver_banana1	ldy	#banana_table_L1
db_100		ldx	<register
		lda	<_forward_dist,x	; 前方距離
		jsr	distance_check
		jsr	screen_check		; y = target kart
		sty	<register
		ldy	#4
		jsr	Mount_fire
		jmp	set_wait		; ロングタイマをセット
;- - - - - - - - - - - - - - - - - - - - - - - 
banana_table_L0	dw	0c0h,030h	; 遠くでセット
banana_table_L1	dw	0c0h,010h	; オールマイティ
banana_table_L2	dw	070h,008h	; 近くでセット
;====================================================================
;	スターセットに合格したとき
;====================================================================
driver_star2
		ldx	<register
		ldy	#star_table
		lda	<_backward_dist,x	;後方距離
		jsr	distance_check
		ldy	<_backward_kart,x
		phy				; >>
		jsr	Set_keikoku
		ply				; <<
		bra	common_star
driver_star
		ldx	<register
		ldy	#star_table
		lda	<_forward_dist,x	; 前方距離
		jsr	distance_check
		ldy	<_forward_kart,x
common_star	ldx	#60*5
		stx	<_muteki_timer,y
		lda	<register
		and	#100h
		jsl	>sound_star
		jmp	set_wait
;- - - - - - - - - - - - - - - - - - - - - - - 
star_table	dw	040h,020h


;--------------------------------------------------------------------
;	後方警告のセット
;--------------------------------------------------------------------
Set_keikoku	ldx	#060*3			; タイマーセット
		stx	!danger_status+0
;- - - - - - - - - - 
		ldx	#2
		ldy	#0
		cmp	#player_r0
		beq	camera$
		txa
		tyx
		tay
camera$		bit	<player_index,x		; モードチェック
		tyx
		bvc	skip$
		lda	#080h			; 過去のモードをセット
		tsb	!danger_status+1
		lda	#020h			; バックミラーモード
		ora	<camera_control,x	; に固定セット
		sta	<camera_control,x	
skip$		rts
;--------------------------------------------------------------------
;	範囲チェック (絶対距離)
;--------------------------------------------------------------------
;- - - - - - - - - - - - - - - - - - - - - - -	; 範囲外ならセットせず
distance_check	cmp	!0,y
		bcs	exit$
		cmp	!2,y
		bcc	exit$
		rts
exit$		pla				; << del return
		rts
;--------------------------------------------------------------------
;	範囲チェック (画面上）		
;--------------------------------------------------------------------
screen_check	ldy	<_forward_kart,x
		lda	(<work),y
		CLC
		ADC	#080h+8h	; 中心からのズレチェック
		cmp	#8h*2
		bcc	set$
		pla
set$		rts
;--------------------------------------------------------------------
;	タイマをリセット
;--------------------------------------------------------------------
fire_reset	stz	!fire_counter		; カウンタのリセット
		stz	!fire_flag		; フラグのリセット
		rts
;--------------------------------------------------------------------
;	基本タイマ	
;--------------------------------------------------------------------
; IN .....	Areg. = チェックする時間
; OUT ....	CLC 規定時間未満
; 	   	SEC チェック
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
check_fire	cmp	!fire_counter		; 0
		bcs	skip$
		sec				; (sec) flag set
		stz	!fire_counter	
		rts
skip$		lda	#0			;  sec
		adc	!fire_counter
		sta	!fire_counter		; (clc) flag clear
		rts
;--------------------------------------------------------------------
;	ロングタイマ( １度セットが ＯＮになると
;		      次回のセットは４秒後となる！ )
;--------------------------------------------------------------------
set_wait
		lda	#60*3
		sta	!fire_long
		stz	!fire_counter
		stz	!fire_flag
		rts
;#####################################################################
;#####	GP用	カメ、バナナ、発射ルーチン			######
;#####################################################################
;*********************************************************************
;		カメ、バナナの発射セット
;*********************************************************************
item_index_select
		dw	item_index0,item_index1
		dw	item_index2,item_index3
;- - - - - - - - - - - - - - - - - - - - - - 
item_index3	dw	item_r0,item_r1		;画面８個 ( ＶＳ用 )
		dw	item_r2,kame_r3
		dw	kame_r2,kame_r3
		dw	kame_r4,kame_r5,0
;- - - - - - - - - - - - - - - - - - - - - - 
item_index2	dw	item_r0,item_r1		;画面６個 ( ＶＳ用 ）
		dw	item_r2,item_r3
		dw	kame_r2,kame_r3,0
;- - - - - - - - - - - - - - - - - - - - - - 
item_index1	dw	item_r0,item_r1		;画面４個 ( ＧＰ用 )
		dw	item_r2,item_r3,0
;- - - - - - - - - - - - - - - - - - - - - - 
item_index0	dw	item_r0,item_r1,0	;画面２個 ( ＧＰ用 ）
;--------------------------------------------------------------------
;カートよりアイテムが発射されました！
;- - - - - - - - - - - - - - - - - - - - - - 
;	input	ix....カート index
;		iy....アイテム発射 number
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Mount_fire	lda	!item_control		;アイテムありモード？
		beq	skip$			
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
skip$		phy
;- - - - - - - - - - - - - - - - - - - - - - 
;開いているワークを探す
;- - - - - - - - - - - - - - - - - - - - - - 
		ldy	!item_index
		ldx	!0,y
loop$		lda	<_status,x
		bpl	linklist$
		iny
		iny
		ldx	!0,y
		bne	loop$
;- - - - - - - - - - - - - - - - - - - - - - 
;開いているワークが無いため....
;- - - - - - - - - - - - - - - - - - - - - - 
		ldy	#item_root
		ldx	<_item_backward,y
		phx
		jsr	Remove_item
		plx
;- - - - - - - - - - - - - - - - - - - - - - 
;アイテム表示順リンクリスト作成
;- - - - - - - - - - - - - - - - - - - - - - 
linklist$
;- - - - - - - - - - - - - - - - - - - - - - 
;アイテム発射タイミングセット
;- - - - - - - - - - - - - - - - - - - - - - 
		lda	<register		;
		sta	<_fire_register,x
		tay
		lda	!_flag,y
		bpl	keikoku_enemy
keikoku_mycar	lda	#0			; 警告時間のセット
		bra	keikoku_set
keikoku_enemy	lda	#60
keikoku_set	sta	<_keikoku_timer,x	; １秒警告！
;- - - - - - - - - - - - - - - - - - - - - - 
		ply
		tya
		asl	A
		tay
		sta	<_item_no,X		;
;- - - - - - - - - - - - - - - - - - - - - - 
;アイテム発射タイミングセット
;- - - - - - - - - - - - - - - - - - - - - - 
		lda	!move_register,y
		sta	<_item_register,x
;- - - -
		lda	#4000H
		sta	<_HP,X			; hit point
		lda	#008H
		sta	<_hit_timer,x		; 当たりをはずす！

;- - - - - - - - - - - - - - - - - - - - - - 
;すでに表示されているときは１度消してから表示する !
; (優先順位チェックのため！)
;- - - - - - - - - - - - - - - - - - - - - - 
		LDA	#0
		LDY	<screen_register
		BEQ	mount_100
		STA	<_distance_A,X
		BRA	mount_200
mount_100	STA	<_distance_B,X
mount_200	LDA	<_status,X
		BPL	connect
		PHX
		JSL	>Erase_sprite
		PLX
;- - - - - - - - - - - - - - - - - - - - - - 
;スプライト連結
;- - - - - - - - - - - - - - - - - - - - - - 
connect		LDY	<register		; Y= player register
		LDA	#item0
		STA	<_object_A,X
		JSR	Connect_A
		LDA	#item0X
		STA	<_object_B,X
		JSR	Connect_B
;- - - - - - - - - - - - - - - - - - - - - - 
;アイテム連結
;- - - - - - - - - - - - - - - - - - - - - - 
		ldy	#item_root
		jsr	Connect_item
;- - - - - - - - - - - - - - - - - - - - - - 
;パラメーター
;- - - - - - - - - - - - - - - - - - - - - - 
		LDA	#ON_item
		STA	<_status,X
		STZ	<_item_status,x
		LDA	#005H
		STA	<_item_wait,X		; set wait timer
		RTS
;--------------------------------------------------------------------
;
;
;
;
;
;#####################################################################
;#####		アイテム					######
;#####################################################################
;*********************************************************************
;	アイテム用のBG check
;*********************************************************************
check_BG_SP	ldy	<register
		lda	!_situationZL+1,y
		bne	skip$
		jmp	check_BG
skip$		lda	#40h
		sta	!_BGcheck_status,y
		INX
		INX
		JMP	(!0,X)
;*********************************************************************
;	アイテム転送アドレスの決定
;*********************************************************************
trans_item	STX	<temporary		;W
		LDA	2,X			;W
		STA	<pointer		;W
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		LDY	#-2			;W
		LDA	<size			;W
find_loop10	INY				;W
		INY				;W
		CMP	(<pointer),Y		;W
		BCC	find_loop10
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		LDX	<register
		LDA	<_item_wait,X		; wait ?
		PHA				;>>
		TXA
		CLC
		ADC	<screen_register	; A screen ?
		TAX
		STY	<_transAnew,X		; set patern
		LDA	<_transA,X
		ADC	<temporary		;(CLC)
		TAY				;
		PLA				;<<
		BNE	item_off
		LDX	4,Y			;
		JMP	(!0,X)
item_off	RTS
;*********************************************************************
;		ITEM DATA
;*********************************************************************
item0		dw	0
		dw	mapmode_check,item0_main,item0_map
;- - - - - - - - - - - - - - - - - - - - - -
item0_main	dw	fire_move_check
		dw	project_Z,check_BG_SP,over_checkA,screen_A
		dw	attre,subst,item_char
;- - - - - - - - - - - - - - - - - - - - - - 
item0_map	dw	fire_move_check,check_BG_SP,ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
item0X		dw	0
		dw	mapmode_check,item0X_main,item0X_map
;- - - - - - - - - - - - - - - - - - - - - - 
item0X_main	dw	trans_fire
		dw	project_Z,over_checkB,attre,setobj,item_char_B
		dw	screen_B,ret
;- - - - - - - - - - - - - - - - - - - - - - 
item0X_map	dw	trans_fire,ret
;--------------------------------------------------------------------
item_char_B	DW	disp_B_check
item_char	
		DW	trans_item,zoom_check
		DW	z_item0,z_item1,z_item2,z_item3
		DW	z_item4,z_item5,z_item6,z_item7
		DW	z_item7,z_item7,z_item7,z_item7
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
z_item7
z_item6
z_item5
z_item4		DW	monon8_item,2D60H
z_item3
z_item2
z_item1		DW	monon16_item,2D60H
z_item0		DW	monon16,2D60H
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	転送用ズームパターンデータ
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
s_16	EQU	0040H
s_08	EQU	0020H
zi_0	EQU	000H
zi_1	EQU	080H
zi_2	EQU	100H
zi_3	EQU	180H
zi_4	EQU	200H
zi_5	EQU	220H
zi_6	EQU	240H
zi_7	EQU	260H
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
zoom_item	DW	s_16,zi_0	;0 (0) 16x16 size
		DW	s_16,zi_1	;1 (1)
		DW	s_16,zi_2	;2 (2)
		DW	s_16,zi_3	;3 (3)
		DW	s_08,zi_4	;4 (4) 8x8 size
		DW	s_08,zi_5	;5 (5)
		DW	s_08,zi_6	;6 (6)
		DW	s_08,zi_7	;7 (7)
		DW	s_08,zi_7	;8 (7)
		DW	s_08,zi_7	;9 (7)
		DW	s_08,zi_7	;A (7)
		DW	s_08,zi_7	;B (7)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
zoom_check	dw	0e0h	; -	size 0	16 dot
		dw	0b8h	; - 	size 1	16 dot
		dw	090h	; -	size 2
		dw	070h	; - 	size 3
		dw	050h	; -	size 4
		dw	040h	; -	size 5
		dw	020h	; -	size 6
		dw	0	; -	size 7
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 




;*********************************************************************
;		PROGRAM ITEM
;*********************************************************************
;cf 	screen over = _ptn <- min_patern 
;---------------------------------------------------------------------
over_checkA	TXY
		LDX	<register
		LDA	<_ptn_A,X
		CMP	#min_patern
		BNE	no_overA
		LDA	#min_item
		STA	<_transAnew,X
no_overA	TYX
		INX
		INX
		JMP	(!0,X)
;---------------------------------------------------------------------
over_checkB	TXY
		LDX	<register
		LDA	<_ptn_B,X
		CMP	#min_patern
		BNE	no_overB
		LDA	#min_item
		STA	<_transBnew,X
no_overB	TYX
		INX
		INX
		JMP	(!0,X)
;*********************************************************************
;		TRANS ADDRESS SET
;*********************************************************************
trans_fire	PHX			;>>
		LDY	<register
		LDX	<_item_no,Y
		JSR	(!select_fire,X)
		PLX
		INX
		INX
		JMP	(!0,X)			;<<
;---------------------------------------------------------------------
;キラーのアニメーション
;---------------------------------------------------------------------
anime_killer	lda	#killer_anime
		tyx
		sta	<_item_workA,X
		sta	<_item_workB,X
		lda	<frame_counter
		and	#0010h
		beq	skip$
		lda	#4000h
skip$	
		ora	#0400h
		sta	<0
		lda	<_attribute,x
		and	#80ffh
		ora	<0
		sta	<_attribute,x
		rts
;---------------------------------------------------------------------
;	こうらの転送アドレス
;---------------------------------------------------------------------
anime_koura	tyx
		lda	#koura_anime
		bra	anime_skip
;---------------------------------------------------------------------
;	バナナの転送アドレス
;---------------------------------------------------------------------
anime_banana	tyx
		lda	#banana_anime
		bra	anime_skip
;---------------------------------------------------------------------
;	敵の攻撃アイテムのアニメーション
;		*クッパのファイア転送アドレス
;		*どくきのこの転送アドレス
;		*ヨッシーたまごの転送アドレス
;---------------------------------------------------------------------
anime_every
		ldx	<_fire_register,y	; アイテムを出した本人
		lda	<_status,x
		tyx
		tay
		lda	!attr_select,y
		ora	<_attribute,x
		sta	<_attribute,x
		lda	!type_select,y
anime_skip	sta	<_item_workA,x
		sta	<_item_workB,x
		rts
;---------------------------------------------------------------------
type_select	DW	doku_anime	; mario	
		DW	doku_anime	; luige
		DW	firebomb_anime	; koopa	
		DW	doku_anime	; peach	
		DW	banana_anime	; cong
		DW	koura_anime	; kame
		DW	doku_anime	; kinopio
		DW	tamago_anime	; yossy
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
;		; ATTR	; EOR DATA
;		; 0(00)	; 0C 	
;		; 1(02)	; 0E
;		; 2(04)	; 08
;		; 3(06)	; 0A
;		; 4(08)	; 04
;		; 5(0a)	; 06	; ヨッシーたまごカラー / 毒きのこカラー
;		; 6(0c)	; 00	; バナナカラー ( 基本attr )
;		; 7(0e)	; 02
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
attr_select	DW	0600h		; mario	
		DW	0600h		; luige
		DW	0		; koopa	
		DW	0600h		; peach	
		DW	0		; cong
		DW	0		; kame
		DW	0600h		; kinopio
		DW	0600h		; yossy
;---------------------------------------------------------------------
; カメのアニメーション
;---------------------------------------------------------------------
anime_kame	LDA	#kame_anime
		STA	<work
;- - - - - - - - - - - - - - - - - - - - - - - -
		TYX
		LDA	<_anime_timer,X
		INC	A
		CMP	#12
		BCC	set_timer
		LDA	#0
set_timer	STA	<_anime_timer,X
		AND	#01100B
		TAY
		LDA	(<work),Y
		INY
		INY
		STA	<_item_workA,X
		STA	<_item_workB,X
		LDA	<_attribute,X
		AND	#03FFFH+8000H
		ORA	(<work),Y
		STA	<_attribute,X
		RTS
;---------------------------------------------------------------------
; 転送キャラクター先頭データ
;---------------------------------------------------------------------
banana_anime	EQU	8000H		; バナナ
koura_anime	EQU	8500H		; こうら（とまっている）
doku_anime	EQU	8780H		; どくきのこ
killer_anime	EQU	0d580h		; キラー
firebomb_anime	EQU	8A00H		; ケセラン
tamago_anime	EQU	8C80H		; ヨッシーたまご
;- - - - - - - - - - - - - - - - - - - - - - - -
kame_anime	DW	8280H,0		; カメ
		DW	8500H,0
		DW	8500H,4000H
;*********************************************************************
;		fire poition & speed initial
;*********************************************************************
owner		equ	0
;- - - - - - - - - - - - - - - - - -
fire_move_check
		PHX
		LDX	<register
		LDA	<_item_wait,X
		BEQ	fire_move_exit
		DEC	A
		STA	<_item_wait,X
		BEQ	fire_move_exit
;- - - - - - - - - - - - - - - - - -
;;
		LDY	<_fire_register,X	; Y = player register
		LDA	!_situationXH,Y		; *initial position*
		STA	<_situationXH,X
		LDA	!_situationYH,Y
		STA	<_situationYH,X
		STZ	<_situationZL+1,X
		LDA	<_item_no,X
		TAX
		JSR	(!fire_initial,X)	; *initial fire*
;;
;- - - - - - - - - - - - - - - - - -
fire_move_exit	PLX
		INX
		INX
		JMP	(!0,X)
;--------------------------------------------------------------------
;	バナナミサイル初期スピードセット
;--------------------------------------------------------------------
		ext	open_shot
					; Y = 敵カート index
fire_bananabomb
;- - - - - - - - - - - - - - - - - -
		SEP	#00100000B
		MEM8
		LDA	#00H
		LDX	<register
		STA	<_attribute+1,X
		REP	#00100000B
		MEM16
		LDA	!_poseQ,Y	; 	angle
		CLC
		ADC	#8000H		;
		LDY	#0800H		; 	power
		JSL	>Move_situation	;
		STZ	<_velocityX,X	; 	speed = 0
		STZ	<_velocityY,X	;
		STZ	<_velocityZ,X	;

		rts


;- - - - - - - - - - - - - - - - - - - - - - - 
; 周回遅れロックオン
;- - - - - - - - - - - - - - - - - - - - - - - 
calc_rockon	SEP	#00100000B
		MEM8
		lda	!_lap,y
		inc	a
		cmp	!area_number
		bcc	safe$
		lda	#0		
safe$		sta	<work		; マイカートのエリア
		ldy	#2
		lda	#0ffh
		sta	<rock_dist	; 距離を MAX にする！
		ldx	!rank_index,y
loop$		lda	<_flag+0,x	; カートが存在しなければスキップ
		ora	<_flag+1,x
		beq	entry$
		lda	<_lap,x		; 敵カートのエリア
		sec
		sbc	<work
		bpl	skip$
		adc	!area_number
skip$		cmp	<rock_dist
		beq	set$
		bcs	entry$
set$		sta	<rock_dist	; 距離をセット
		stx	<rock_index	; index をキープ
entry$		iny
		iny
		ldx	!rank_index,y
		bne	loop$
		REP	#00100000B
		MEM16
		lda	<rock_index	; ロックオンした index
		rts
;--------------------------------------------------------------------
;	赤ガメの初期スピードセット
;--------------------------------------------------------------------
fire_red_kame
;					y = player の index
		lda	<game_status
		beq	GP$
;- - - - - - - - - - - - - - - - - - - - - - -
VS$		lda	#player_r0		;相手を直接ねらう！
		cpy	#player_r0
		bne	skip_1$
		lda	#player_r1
		bra	skip_1$
;- - - - - - - - - - - - - - - - - - - - - - -
GP$		
		lda	!rank_number,y		; 順位が上のプレイヤー
;						; をねらう！
		dec	a
		dec	a
		bpl	skip$

		phy			; >>
		jsr	calc_rockon	; ねらうカートを計算
		ply			; <<	A = rockon index
		bra	skip_1$		
;
skip$		tax
		lda	!rank_index,x
skip_1$		ldx	<register		
		sta	<_rockon_index,x
		lda	#8
		sta	<_missile_timer,x
;- - - - - - - - - - - - - - - - - - - - - - -
		SEP	#00100000B
		MEM8
		LDA	#06H
		BRA	skip_kame
;--------------------------------------------------------------------
;	ノーマルカメの初期スピードセット
;--------------------------------------------------------------------
fire_kame	SEP	#00100000B
		MEM8
		LDA	#00H
		LDX	<register
skip_kame	STA	<_attribute+1,X
		REP	#00100000B
		MEM16
;- - - - - - - - - - - - - - - - - - - - - -
		lda	<_item_wait,x
		dec	a
		bne	skip$
		lda	<_fire_register,x
		and	#0100h
		jsl	>sound_kame
;- - - - - - - - - - - - - - - - - - - - - -
skip$		LDA	!_poseQ,Y
		STA	<_poseQ,X
		STZ	<_velocityZ,X	;	; Z clear
		LDA	#0300H			; item power
		CLC
		ADC	!_vF,Y
		CMP	#07800h
		BCC	skip2$
		LDA	#07800h
skip2$		STA	<_item_speed,X
		JMP	Set_velocity
;--------------------------------------------------------------------
;	バナナ初期位置セット
;--------------------------------------------------------------------
shot_time	equ	0
 ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
fire_banana	SEP	#00100000B
		MEM8
		LDA	#00H
		LDX	<register
		STA	<_attribute+1,X
		REP	#00100000B
		MEM16
		LDA	!_poseQ,Y	; 	angle
		CLC
		ADC	#8000H		;
		LDY	#0800H		; 	power
		JSL	>Move_situation	;
		STZ	<_velocityX,X	; 	speed = 0
		STZ	<_velocityY,X	;
		STZ	<_velocityZ,X	;
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
fire_newbanana	SEP	#00100000B
		MEM8
		LDA	#00H
		LDX	<register
		STA	<_attribute+1,X
		REP	#00100000B
		MEM16
;- - - - - - - - - - - - - - - - - - - - - -
		lda	<_item_wait,x
		dec	a
		bne	skip$
		lda	<_fire_register,x
		and	#0100h
		jsl	>sound_kame
;- - - - - - - - - - - - - - - - - - - - - -
skip$		LDA	!_poseQ,Y
		STA	<_poseQ,X
		LDA	#0140H
		STA	<_velocityZ,X	;	; Z clear
		LDA	#0300H			; item power
		CLC
		ADC	!_vF,Y
		CMP	#07800h
		BCC	skip2$
		LDA	#07800h
skip2$		STA	<_item_speed,X
		STZ	<_keikoku_timer,x
		JMP	Set_velocity

;*********************************************************************
;		INITIATE ITEM
;*********************************************************************
work_attr	equ	0
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
attr_data	db	0,2,4,6,0e8h,0eah,0ech,0eeh
item_GPVS	db	0,0,0		; GP mode
		db	4		; VS mode
		db	0,0		; TM mode
		db	4		; battle mode
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
item_set_select	dw	0		; GP item set
		dw	0		; VS item set
		dw	0ffffh		; TM - - - - - 
		dw	0		; BT item set
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
item_initselect	dw	noset_item	; GP
		dw	Openset_item	; VS
		dw	noset_item	; TM
		dw	noset_item	; BT
;---------------------------------------------------------------------
Init_item	
		lda	!ending_flag
		beq	entry$
;- - - -
		lda	#0ffffh
		sta	!item_flag
		sta	!item_control
		lda	#noset_item
		sta	!item_index
;- - - -	
		rts
;- - - - - - - - - - - - - - - - - - - -

entry$		ldx	<game_status		; debug
		beq	skip$

		phb
		stz	!1400h
		ldx	#1400h
		txy
		iny
		lda	#400h-2
		mvn	#0,#0
		plb	

skip$		ldx	<game_status
		lda	!item_set_select,x	; debug
		sta	!item_flag		; debug
		sta	!item_control
		bne	noset_item
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- 

;最大何個までおけるか？
		lda	<SEQ_register
		lsr	a
		tax
		lda	!item_GPVS,x
		and	#00ffh
		sta	!item_power	power data on spilit
		tax
;- - - - - - - - - - - - - - - - - - - - - - - -
		ldy	!item_index_select,x
		sty	!item_index
		stz	<work_attr		; 0,2,4,6 ......
;- - - - - - - - - - - - - - - - - - - - - - - -
loop$		ldx	0,y
		beq	exit$
;- - - - - - - - - - - - - - - - - - - - - - - -
		phy
		ldy	<work_attr
		lda	!attr_data,y
		and	#00ffh
		sta	<_attribute,x		; item address set
		inc	<work_attr
		ply
;- - - - - - - - - - - - - - - - - - - - - - - -
;しなくてもＯＫか？
		lda	#item_root
		sta	<_item_backward,x
		sta	<_item_forward,x
;
		stz	<_status,x	; アイテム 初期設定
		stz	<_flag,x
		stz	<_velocityX,x
		stz	<_velocityY,x
		stz	<_velocityZ,x
;;
		stz	<_situationZH,x
		stz	<_situationZL,x
;;
		stz	<_unable_control,x
		stz	<_hit_timer,x
;
		lda	#move_kame
		sta	<_item_register,x
		lda	#min_item		; item min zoom
		sta	<_transA,x
		sta	<_transB,x
		sta	<_transAnew,x
		sta	<_transBnew,x
		stz	<_item_workA,x
		stz	<_item_workB,x
;- - - - - - - - - - - - - - - - - - - - - - - -
		iny
		iny
		bra	loop$
;- - - - - - - - - - - - - - - - - - - - - - - -
exit$		ldx	<game_status
		jmp	(item_initselect,x)
;- - - - - - - - - - - - - - - - - - - - - - - -
noset_item	rts
;*********************************************************************
;	アイテムのイニシャルセット
;*********************************************************************

;- - - - - - - - - - - - - - - - - - - - - - - - -
Openset_item
		lda	!map_number
		xba
		lsr	a
		lsr	a			;clc
		adc	#OFFSET	polenet_ROM
		sta	<position_addr+0
		lda	#BANK	polenet_ROM
		sta	<position_addr+2
;- - - - - - - - - - - - - - - - - - - - - - - - -
		ldy	#20h
loop$		lda	[<position_addr],y
		beq	exit$
		sta	<position_data
		phy			; >>
		jsr	input_item
		ply			; <<
		iny  
		iny
		cpy	#20h+10h	; ( data max )
		bne	loop$
exit$		rts
;- - - - - - - - - - - - - - - - - - - - - - - - -	
input_item
		ldy	!item_index
		ldx	!0,y
loop$		lda	<_status,x
		bpl	linklist$
		iny
		iny
		ldx	!0,y
		bne	loop$
;- - - - - - - - - - - - - - - - - - - - - - - - -
linklist$
		ldy	#0

;- - - - - 
		bit	<position_data
		bmi	banana$
kame$		ldy	#6			;キラーを初期セット
		bvs	tate$
		lda	#200h
		sta	<_velocityX,x
		bra	skip$
tate$		lda	#200h
		sta	<_velocityY,x
		bra	skip$
banana$		ldy	#0			
skip$		sty	<_item_no,x		;バナナを初期セット
		lda	!move_register,y
		sta	<_item_register,x
;- - - - -
		lda	#player_r0
		sta	<_fire_register,x
;- - - - - 
		lda	#4000h
		sta	<_HP,x
		lda	#ON_item
		sta	<_status,x
		stz	<_item_wait,x
;- - - - - - - - - - - - - - - - - - - - - - - - -	
		ldy	#player_r0		; スプライト連結
		lda	#item0
		sta	<_object_A,X
		jsr	Connect_A
		lda	#item0X
		sta	<_object_B,X
		jsr	Connect_B
;- - - - - - - - - - - - - - - - - - - - - - - - -	
		ldy	#item_root		;アイテム連結
		jsr	Connect_item
;- - - - - - - - - - - - - - - - - - - - - - - - -	


		lda	<position_data
		pha
		and	#0007fh
		ASL	A
		ASL	A
		ASL	A
		adc	#4
		sta	<_situationXH,x
		pla
		and	#03f80h
		LSR	A
		LSR	A
		LSR	A
		LSR	A
		adc	#4
		sta	<_situationYH,x
		rts

;*********************************************************************
;	転送アドレスの計算
;*********************************************************************
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	今回の転送 VRAM ADDRESS
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
vram_select	
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
		dw	5600h		; 0 	Ascreen VRAM
		dw	5620h		; 1	Ascreen VRAM 
		dw	6600h		; 	Bscreen VRAM
		dw	6620h		; 	Bscreen VRAM
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
		dw	5640h		; 2
		dw	5660h		; 3
		dw	6640h
		dw	6660h
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		dw	5880h		; 4	敵車エリア！！
		dw	58a0h		; 5
		dw	6880h
		dw	68a0h
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		dw	58c0h		; 6	敵車エリア！！
		dw	58e0h		; 7
		dw	68c0h
		dw	68e0h
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	今回の転送 INDEX
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
register_select	
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
		dw	item_r0+_transA
		dw	item_r1+_transA
		dw	item_r0+_transB
		dw	item_r1+_transB
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
		dw	item_r2+_transA
		dw	item_r3+_transA
		dw	item_r2+_transB
		dw	item_r3+_transB
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		dw	kame_r2+_transA
		dw	kame_r3+_transA
		dw	kame_r2+_transB
		dw	kame_r3+_transB
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
		dw	kame_r4+_transA
		dw	kame_r5+_transA
		dw	kame_r4+_transB
		dw	kame_r5+_transB
total_item	equ	6	; 
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	使用ワーク
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
work_0		equ	0
work_frame	equ	2		;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	プログラム
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Main_item	lda	!item_control		; control flag
		bne	exit$
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		lda	<frame_counter
		and	#03H
		asl	a
		sta	<work_frame
;- - - - - - - - - - - - - - - - - - - - - - - - - -
		ldx	!item_power
;- - - - - - - - - - - - - - - - - - - - - - - - - -
loop$		txa
		asl	a
		asl	a			;clc
		adc	<work_frame
		tay
;- - - - - - - - - - - - - - - - - - - - - - - - - -
		phx				;>>
		lda	!vram_select,y
		sta	!item_vram,x		; trans VRAM
		ldx	!register_select,y
;
		lda	<4,X			;新しい転送アドレス
		sta	<0,X			;古い転送アドレス
		asl	A      			;(CLC)
		adc	#zoom_item		; item select
		tay
;
		lda	<8,X
		beq	skip$
		adc	!2,y		;(CLC)
skip$		plx				;<<
		sta	!item_buff,x		; trans ADDR
		lda	!0,y
		sta	!item_count,x		; trans COUNT
;
		dex
		dex
		bpl	loop$

exit$		rts
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;
;
;*********************************************************************
;		アイテムキャラクターの転送
;*********************************************************************
DMA_item	
;---------------------------------------------------------------------
		lda	!item_control
		bne	noset$
		SEP	#00010000B
		IDX8
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
		ldy	#80H		;B
		sty	!Screen_step	;B	VRAM inc 
		lda	#1801H		;W	DMA parameter
		sta	!DMA_0+0	;W
		ldy	#07FH		;B
		sty	!DMA_0+4	;B	A bank
		stz	!DMA_0+5	;B	counter clear
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
		ldx	!item_power
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
loop$		lda	!item_buff,x	;W	<- buffer start 0
		beq	exit$
		sta	!DMA_0+2	;W	A address
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
		ldy	!item_count,x	;B	<- buffer count
		sty	!DMA_0+5	;B	data count
		lda	!item_vram,x	;W	<- vram
		sta	!Screen_address	;W	VRAM address
		ldy	#1		;B	DMA channel 0 start
		sty	!DMA_burst	;B
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
		ora	#100H		;W
		sta	!Screen_address	;W
		ldy	!item_count,x	;B	<- buffer count
		sty	!DMA_0+5	;B	data count
		ldy	#1
		sty	!DMA_burst	;B
;- - - - - - - - - - - - - - - - - - - - - - - - - - - 
exit$		dex
		dex
		bpl	loop$
		REP	#00010000B
		IDX16
;- - - - - - - - - - - - - - - - - - - - - - - - - - - 
noset$		RTS
;#####################################################################
;#####		MOVE ROUTIN					######
;#####################################################################
;*********************************************************************
;		アイテムの移動
;*********************************************************************
; *移動パターン
;		DW	ＢＧチェック
;		DW	コントロール可能、コントロール不能
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
move_enemybana	DW	item_entry,enemy_banana,enemy_banana,jump_demo
move_mybanana	DW	item_entry,my_banana,my_banana,jump_demo
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
move_kame	DW	item_entry,calc_position,calc_position,jump_demo
move_missile	DW	item_entry,calc_velocity,calc_erase,jump_demo
move_bananabomb	DW	item_entry,jump_bomb,jump_bomb,jump_demo
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
calc_erase	DW	kame_check,move_object,ret
calc_velocity	DW	kame_missile,move_object,ret
calc_position	DW	move_object,ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
my_banana	dw	set_my_banana
enemy_banana	dw	set_enemy_bana
		dw	every_set
		dw	mario$,luige$,kuppa$,peach$,cong$
		dw	noko$,kinopio$,yossy$
mario$
luige$
noko$
kinopio$
peach$
cong$		dw	set_my_banana
kuppa$		dw	fire_ball,move_object,exit_ret
yossy$		dw	move_object,yossy_tamago
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
jump_bomb	dw	bomb_open
		dw	move_object
		dw	Z_stop
		dw	bomb_exit
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
jump_demo	dw	demo_open,move_object,Z_stop,demo_exit

;*********************************************************************
;		自分のおいたバナナ！
;*********************************************************************
exit_ret
set_my_banana	rts

;*********************************************************************
;		敵がおいたバナナ！
;*********************************************************************
set_enemy_bana
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
; 警告 チェック	
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		txy
		ldx	<register
		lda	<_keikoku_timer,x
		beq	exit$
		dec	a
		bne	skip$
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
; 発射 イニシャル
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		sta	<_keikoku_timer,x
		stz	<_situationZL+1,x

		lda	#5			;	
		sta	<_hit_timer,x
;
		lda	<_situationXH,x
		sta	<_itemX,x
		lda	<_situationYH,x
		sta	<_itemY,x
;
		ldy	<_fire_register,x
		jsl	>sound_banana

		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
; 警告のときの座標
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
skip$		sta	<_keikoku_timer,x
		lda	#5			; 当たりをはずす
		sta	<_hit_timer,x
		ldy	<_fire_register,x	; 投げたカート index
		jmp	Copy_situation		; 座標コピー
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
exit$		tyx
		INX
		INX
		JMP	(!0,X)
;--------------------------------------------------------------------
;	各種アイテムの MOVE
;--------------------------------------------------------------------
		ext	speed_vxvy_BK
;- - - - - - - - - - - - - - - - - - - 
every_set	stx	<0
		ldy	<register
		ldx	<_fire_register,y
		lda	<_status,x
		clc
		adc	<0
		tay
		ldx	!2,y
		jmp	(!0,x)
;- - - - - - - - - - - - - - - - - - - 
;	クッパの火
;- - - - - - - - - - - - - - - - - - - 
fire_ball	phx
		ldx	<register
		lda	<_itemX,x
		sta	<_situationXH,x
		lda	<_itemY,x
		sta	<_situationYH,x
		ldy	#0600h
		lda	<_poseQ,x
		clc
		adc	#0400h
		sta	<_poseQ,x
		sty	<2
		sta	<0
		jsl	>speed_vxvy_BK
		plx
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - 
;	ヨッシーたまご
;- - - - - - - - - - - - - - - - - - - 
yossy_tamago	ldx	<register
		lda	<_situationZH+0,x	;負になったら
		bpl	calc$
		stz	<_situationZL+1,x
		stz	<_situationZH+0,x
		lda	#040h
		sta	<_velocityZ,x
		rts

calc$		lda	#0fff8h			;重力計算
		clc	
		adc	<_velocityZ,x
		sta	<_velocityZ,x
		rts
;- - - - - - - - - - - - - - - - - - - 



;*********************************************************************
;		アイテム接触後デモ
;*********************************************************************
demo_open				;  移動初期設定
		phx
		ldx	<register
		lda	#8000h		; V flip
		ora	<_attribute,x
		sta	<_attribute,x
		lda	#10		; あたりなし！
		sta	<_hit_timer,x
		plx
		INX
		INX
		JMP	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
					; 移動終了チェック
demo_exit	ldx	<register
		lda	<_situationZL+1,x
		bne	exit$
		stz	<_velocityX,x
		stz	<_velocityY,x
		stz	<_velocityZ,x
		stz	<_item_status,x
		jsl 	>Erase_sprite	; アイテム消去
exit$		rts 
;*********************************************************************
;		敵ミサイル move
;*********************************************************************
						; 警告チェック	
bomb_open	phx				; >>
		ldx	<register
;- - - -
		lda	#3			; 当たりをはずす
		sta	<_hit_timer,x
;- - - - 
		lda	<_keikoku_timer,x
		beq	exit$
		dec	a
		bne	skip$
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
						; 発射 イニシャル
		sta	<_keikoku_timer,x
		jsl	>open_shot		; ベクトル決定
		lda	#0
		jsl	>sound_missile
		bra	exit$
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
skip$		sta	<_keikoku_timer,x
		lda	#5			; 当たりをはずす
		sta	<_hit_timer,x
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		ldy	<_fire_register,x	; 投げたカート index
		jsr	Copy_situation		; 座標コピー
		pla				; << del return
		lda	!_poseQ,y		; 前方ヘ位置修正
		ldy	#0800h
		jsl	>Move_situation
		rts
;- - - - - - - - - - - - - - - - - - - - -
exit$		plx				; <<
		INX
		INX
		JMP	(!0,X)	
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
						; 移動終了チェック
bomb_exit	ldx	<register
		lda	<_situationZL+1,x
		bne	exit$
		stz	<_velocityX,x
		stz	<_velocityY,x
		stz	<_velocityZ,x
;
		lda	#move_mybanana	
		ldy	<_item_no,x
		cpy	#0ch
		beq	skip$
		lda	#move_enemybana		; バナナタイプ攻撃
skip$		sta	<_item_register,x
;
		lda	<_situationXH,x
		sta	<_itemX,x
		lda	<_situationYH,x
		sta	<_itemY,x

exit$		rts

;*********************************************************************
;		赤ガメの移動ルーチン
;*********************************************************************
						; カベあたりチェック
kame_check	txy
		ldx	<register
		lda	<_BGcheck_flag,x
		bpl	exit$
		lda	#8000h
		sta	<_item_status,x
		lda	#100h
		sta	<_velocityZ,x
		stz	<_velocityX,x
		stz	<_velocityY,x

exit$		tyx
		INX
		INX
		JMP	(!0,X)
;---------------------------------------------------------------------
						; サーチ移動
kame_missile	phx
		ldx	<register
		jsl	>Kame_missile
		plx
		INX
		INX
		JMP	(!0,X)
;---------------------------------------------------------------------
;
;
;
;
;
;*********************************************************************
;		アイテム移動メインルーチン
;*********************************************************************
OBJmove		LDX	!item_control
		BNE	exit$
		LDX	!item_index
		LDY	!0,x
loop$		STY	<register
		PHX				;>>
		LDX	<_item_register,Y
		BEQ	skip$
		JSR	(!0,X)
skip$		PLX				;<< 
		INX
		INX
		LDY	!0,x
		BNE	loop$
exit$		RTS
;*********************************************************************
;		アイテム BGcheck
;*********************************************************************
; BG check が ＯＫ ならば発射！
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
item_entry	txy				; Y=vector register
		ldx	<register
		bit	<_status,X		; exsist ?
		bpl	nomount_item		; no
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		bit	<_item_status,x
		bmi	over_item
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		jsr	BGcheck_item		; アイテムのＢＧチェック
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
		lda	<_BGcheck_status,x	; 落っこちＢＧ ？
		and	#020h
		bne	erase_item
		bcs	control_off
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
control_ok	ldx	2,Y			; コントロール可能
		jmp	(!0,X)
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
control_off	ldx	4,y			; コントロール不能
		jmp	(!0,x)
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
over_item	ldx	6,y			; とばされデモ !
		jmp	(!0,x)
;- - - - - - - - - - - - - - - - - - - - - - - - - - 
erase_item	lda	#8000h			; とばされデモへ
		sta	<_item_status,x
		lda	#80h
		sta	<_velocityZ,x
		lda	<_velocityX,x		; スピード半減
		CMP	#1000000000000000B
		ROR	A
		sta	<_velocityX,x
		lda	<_velocityY,x
		CMP	#1000000000000000B
		ROR	A
		sta	<_velocityY,x
nomount_item	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;
;
;
;
;
;
;
;============= 汎用ルーチン ==========================================
;*********************************************************************
;		ベクトル移動
;*********************************************************************
;		A = velocity power
;		Y = player register
;		X = fire register
;		JSR	Set_velocity
;--------------------------------------------------------------------
Call_velocity	JSR	Set_velocity
		RTL
;--------------------------------------------------------------------
Set_velocity	PHA
		SEP	#00100000B
		MEM8
		LDA	#dsp_triangle		;B
		STA	!DSP_data		;B
		REP	#00100001B
		MEM16
		LDA	<_poseQ,X		; (angle Q)
		STA	!DSP_data		;W
		PLA
		STA	!DSP_data		;W (power)
		CLC
		LDA	>DSP_status
		BPL	$-4
		LDA	!DSP_data		;W (L * sin Q)
		STA	<_velocityX,X		;W
		LDA	!DSP_data		;W (L * cos Q)
		EOR	#1111111111111111B
		INC	A
		STA	<_velocityY,X		;W
		RTS
;--------------------------------------------------------------------
		EXTEND
objdata	SECT	REL
		mem16
		idx16
;*********************************************************************
;		赤ガメの移動
;*********************************************************************
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Kame_missile	PHB
		PHK
		PLB
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		LDA	<_situationXH,X		;自分のポジション
		PHA				;>>
		LDY	<_situationYH,X
		LDA	<_rockon_index,X
		PLX				;<<
		JSR	Camera_Q
;- - - - - - - - - - -
		pha
		ldx	<register
		lda	<_missile_timer,x
		beq	skip$
		dec	a
		sta	<_missile_timer,x
		bra	search$
skip$		ldy	<_rockon_index,x	; ジャンプでよける
		lda	!_situationZL+1,y
		bne	search$
;- - - - - - - - - - -
		ldy	#0C0h		; ロックオンミサイル範囲データ
		cpy	<dist_X
		bcc	search$
		cpy	<dist_Y
		bcc	search$
;- - - - - - - - - - -
		pla
		sta	<_poseQ,x		
	;;	ldy	<_rockon_index,x	; ねらわれた kart-index
	;;	lda	!_vF,y
	;;	cmp	<_item_speed,x
	;;	bcc	rock$
	;;	sta	<_item_speed,x		; _vF のほうが
		bra	rock$			; おおきければストア
;- - - - - - - - - - -
search$		
		pla
		LDY	#lim_data
		JSR	Limit_camera
rock$		LDA	<_item_speed,X
		JSL	>Call_velocity
exit$		PLB
		RTL
;- - - - - - - - - - -
	if	0
	endif
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
lim_data	DW	0800H,-800H,400H,-400H
;====================================================================
;;exsample		|	(16bit)
;;		LDA	???
;;		LDY	#dp
;;		LDX	#pose_P
;;		JSR	Limit_camera
;;			|	(16bit)
;;
;;	dp	DW	+limit,-limit,+inc,-inc
;======================================================================
Limit_camera	STA	<work
		SBC	<_poseQ,X	; main angle
		BPL	P_skip	
		INY
		INY
		CMP	!0,Y
		BPL	P_direct
		BRA	P_skip2
P_skip		CMP	!0,Y
		BMI	P_direct
P_skip2		INY
		INY
		INY
		INY
		CLC
		LDA	!0,Y
		ADC	<_poseQ,X	; main angle
		STA	<_poseQ,X
P_exit		RTS
P_direct	LDA	<work
		STA	<_poseQ,X
		RTS
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Limit_camera2	STA	<work
		SBC	<0,X		; main angle
		BPL	skip$
;- - - - - - - - - - - - - - - - - - - - 
		CMP	!6,Y		;差が小さければ
		BPL	exit$
		CMP	!8,Y		;差が大きすぎれば
		BMI	direct$
		LDA	!10,Y		;addition data 
		BRA	set$
;- - - - - - - - - - - - - - - - - - - - 
skip$		CMP	!0,Y		;差が小さければ
		BMI	exit$
		CMP	!2,Y		;差が大きすぎれば
		BPL	direct$
		LDA	!4,Y		; addition data
;- - - - - - - - - - - - - - - - - - - - 
set$		ADC	<0,X		; main angle
		STA	<0,X		; main angle
exit$		RTS
;- - - - - - - - - - - - - - - - - - - -
direct$		LDA	<work		; calc angle
		STA	<0,X		; main angle
		RTS
;*********************************************************************
;;
;;exsample		|	( 16bit mode )
;;		LDX	<axis_X+2		; now X position
;;		LDY	<axis_Y+2		; now Y position
;;		LDA	#ball_r0		; parameter
;;		JSR	Camera_Q
;;		STA	<pose_Q			; angle
;;			|	( 16bit mode )
;;
;;		<< range 0 - 3FFH >>
;;
;===========================================================================
mypos_X		EQU	00
mypos_Y		EQU	02
enemy_X		EQU	04
enemy_Y		EQU	06
dist_X		EQU	08
dist_Y		EQU	10
flag		EQU	12
;===========================================================================
;------------------------------------------------ read parameter ------
Camera_Q	STX	<mypos_X		;W
		STY	<mypos_Y		;W
		TAX
		LDA	<_situationXH,X		;W
		STA	<enemy_X		;W
		LDA	<_situationYH,X		;W
		STA	<enemy_Y		;W
;----------------------------------------------------------------------
entry_camera	LDY	#0		; flag!
;------------------------------------------------
		SEC
		LDA	<mypos_X	; camera
		SBC	<enemy_X	; point
		BPL	camera_100
		LDY	#2
		EOR	#0FFFFH
		INC	A
camera_100	ASL	A		
		ASL	A
		ASL	A
		ASL	A
		STA	<dist_X
;------------------------------------------------
		SEC
		LDA	<mypos_Y	; camera
		SBC	<enemy_Y	; point
		BPL	camera_200
		INY
		EOR	#0FFFFH
		INC	A
camera_200	ASL	A
		ASL	A
		ASL	A
		ASL	A
		STA	<dist_Y
		STY	<flag
;---------------------------------------------------------------------
		CMP	<dist_X		;W	(X>Y)?
		BMI	Xbig_entry	;	yes -> big
;----------------------------------------------------------------------
Xsmall_entry	LDY	<dist_X		;W(small)
		LDA	<dist_Y		;W(big)
		XBA			;W
		JSR	Div
	;;;	STA	!ans_1		;W	debug
		BIT	#0FF00H		;W
		BEQ	small_100
		LDA	#000FFH		;W
small_100	AND	#000FFH		;W
		TAY			;WW
		SEP	#00100000B
		MEM8
		LDA	!Data_atan,Y	;B
		LDY	<flag		;W	1 or 2 ?
		DEY			;W	yes -> 110
		BEQ	small_110
		DEY			;W
		BEQ	small_110
		EOR	#0FFH		;B
		INC	A		;B
small_110	LSR	<flag		;B	0 or 2
		BCC	small_120	;	yes -> 120
		CLC			;
		ADC	#128		;B
small_120	REP	#00100000B
		MEM16
		XBA			;W	**00H
		RTS
;-------------------------------------------------
Xbig_entry	LDY	<dist_Y		;W(small)
		LDA	<dist_X		;W(big)
		XBA			;W
		JSR	Div
	;	STA	!ans_1		;W	debug
		BIT	#0FF00H		;W
		BEQ	entry_110
		LDA	#000FFH		;W
entry_110	AND	#000FFH		;W
		TAY			;WW
		SEP	#00100000B
		MEM8
		LDA	!Data_atan,Y	;B
		LDY	<flag		;B	0 or 3
		BEQ	entry_120	;	yes -> 120
		CPY	#3		;B
		BEQ	entry_120	;
		EOR	#0FFH		;B
		INC	A		;B
entry_120	LSR	<flag		;B
		LDY	<flag		;B
		CLC			;
		ADC	!XY_data,Y	;B
		REP	#00100000B
		MEM16
		XBA			;W	**00H
		RTS
;======================================================================
Div		SEP	#00100000B
		MEM8
		STY	!4204H
		STA	!4206H
		NOP
		NOP
		NOP
		NOP	
		NOP
		NOP
		NOP
		NOP	
		REP	#00100000B
		MEM16
		LDA	!4214H
		RTS
;----------------------------------------------------------------
XY_data
	DB	192,64
;======================================================================
Data_atan
	DB	   0,   0,   0,   0,   1,   1,   1,   1
	DB	   1,   1,   2,   2,   2,   2,   2,   2
	DB	   3,   3,   3,   3,   3,   3,   3,   4
	DB	   4,   4,   4,   4,   4,   5,   5,   5
	DB	   5,   5,   5,   6,   6,   6,   6,   6
	DB	   6,   6,   7,   7,   7,   7,   7,   7
	DB	   8,   8,   8,   8,   8,   8,   8,   9
	DB	   9,   9,   9,   9,   9,  10,  10,  10
	DB	  10,  10,  10,  10,  11,  11,  11,  11
	DB	  11,  11,  11,  12,  12,  12,  12,  12
	DB	  12,  12,  13,  13,  13,  13,  13,  13
	DB	  13,  14,  14,  14,  14,  14,  14,  14
	DB	  15,  15,  15,  15,  15,  15,  15,  16
	DB	  16,  16,  16,  16,  16,  16,  17,  17
	DB	  17,  17,  17,  17,  17,  17,  18,  18
	DB	  18,  18,  18,  18,  18,  19,  19,  19
	DB	  19,  19,  19,  19,  19,  20,  20,  20
	DB	  20,  20,  20,  20,  20,  21,  21,  21
	DB	  21,  21,  21,  21,  21,  21,  22,  22
	DB	  22,  22,  22,  22,  22,  22,  23,  23
	DB	  23,  23,  23,  23,  23,  23,  23,  24
	DB	  24,  24,  24,  24,  24,  24,  24,  24
	DB	  25,  25,  25,  25,  25,  25,  25,  25
	DB	  25,  25,  26,  26,  26,  26,  26,  26
	DB	  26,  26,  26,  27,  27,  27,  27,  27
	DB	  27,  27,  27,  27,  27,  28,  28,  28
	DB	  28,  28,  28,  28,  28,  28,  28,  28
	DB	  29,  29,  29,  29,  29,  29,  29,  29
	DB	  29,  29,  29,  30,  30,  30,  30,  30
	DB	  30,  30,  30,  30,  30,  30,  31,  31
	DB	  31,  31,  31,  31,  31,  31,  31,  31
	DB	  31,  31,  32,  32,  32,  32,  32,  32
;- - - - - - 
;#####################################################################
;	現在使われているアイテム数をチェック	
;#####################################################################
;		y レジスタに 0
;			     2
;			     4
;		             6	使われているアイテムの数をセット
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Count_item	stz	<0
		ldx	!item_index
		beq	exit$
		bra	entry$
loop$		lda	!_status,y
		bpl	skip$
		inc	<0
skip$		inx
		inx
entry$		lda	>dbank_00000,x
		tay
		bne	loop$
exit$		lda	<0
		rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Allclear_item	ldx	!item_index
		beq	exit$
		bra	entry$
loop$		lda	!_status,y		; ワークをつかっている？
		bpl	next$
;- - - - - - - - - - - - - - - - - - - - - - -
		lda	!_item_status,y
		bmi	next$
		lda	#8000h
		sta	!_item_status,y
		lda	!_velocityZ,y
		bmi	next$
		lda	#0080h
		sta	!_velocityZ,y
;- - - - - - - - - - - - - - - - - - - - - - -
next$		inx
		inx
entry$		lda	>dbank_00000,x
		tay
		bne	loop$
exit$		rtl
;======================================================================
Banana_search	PHB
		PHK
		PLB
		ldx	<register
		lda	<_situationXH,x	; 目標座標
		ldy	<_situationYH,x
		tax
		lda	#player_r0	; 敵 index
	;;;	jsr	Camera_Q
		
		lda	!_poseQ+player_r0
		plb
		rtl
;- - - - - - - - - - - - - - - - - - - - - - - -
		END
