;*******************************************************************
;
;	STARFOX2
;
;	Gameover SEQ
;
;	                       programed by H.Yajima
;
;*******************************************************************
	INCPUB	gameover
;------------------------------------------------------------
;
;
;
;
;
;
;
;*******************************************************************
;	object macro
;*******************************************************************

M2dOBJdata	macro
	db	1		; program code
	dw	\1&0ffffh	; program address
	db	\2		; animation SEQ number
	dw	\3		; position X
	dw	\4		; position Y
	dw	\5		; speed X
	dw	\6		; speed Y
	db	\7
	endm
Mdataend	macro
	db	0
	endm

Mady	macro
	tya
	clc
	adc	\1
	tay
	endm

;=======================================================================
; 3D polygon shape
;=======================================================================
_backward		equ	0	; 34byte
_forward		equ	2	;
_program		equ	4	; JSL (program code )
				; Low
				; High
				; Bank
_velocityF		equ	8	
_positionX		equ	10
_axisX		equ	12
_positionY		equ	14
_axisY		equ	16
_velocityX		equ	18
_velocityY		equ	20
;=======================================================================
; 2D sprite object
;=======================================================================
_SEQaddress		equ	22	;2byte
_SEQbank		equ	24	;2byte
_OBJaddress		equ	26	;2byte
_animeNO		equ	28
_anime_pointer	equ	30	;2byte
_anime_counter	equ	32	;2byte
_obj_pointer		equ	34	;2byte
_STR_pointer		equ	36	;2byte
_STR_counter		equ	38	;2byte

;=======================================================================

;*******************************************************************
;	gameover
;*******************************************************************
	longi
	shorta
;------------------------------------------------------------
button_start	equ	10h


;------------------------------------------------------------
gameover_l
	php
	phb
	phk
	plb
;-------------------------------------------
	ai16
	jsr	init_gameover
;-------------------------------------------
	a8
	km_screenoff

	Mset	212ch,010h
	Mset	2105h,1
	Mset	2101h,0

	km_dmacgx4VRAM	0,kawaguti_cgx,0,$30
	km_setspritemode	nosprite
	km_IRQenable titleirq,226
	jsl	init_sprites_l
	km_screenon

;-------------------------------------------
.loop
	lda	#iv_titleirq
	sta	trans_flag
	km_waittrans

	jsl	do_sprites_l

	ai16
	jsr	main_gameover

	a8
	km_testjoypad	start
	beq	.loop

;-------------------------------------------
	km_setgamemode	missioncontinue
	km_screenoff
;-------------------------------------------
	plb
	plp
	rtl
;*******************************************************************
	longi
	longa
;*******************************************************************
;	initialize
;*******************************************************************
init_gameover

	ldy	#testdata&0ffffh
	jsl	Init_OBJtest

	rts

;*******************************************************************
;	main
;*******************************************************************
main_gameover

	stz	sprite_register
	stz	sprite_start

	jsl	Main_OBJtest
	rts

;***********************************************************************
;;
;;	2D SPRITE SET SYSTEM
;;
;;
;;
;;
;***********************************************************************

;---------------------------------------------------------------------
register		equ	objcontrol+0
sprite_register	equ	objcontrol+2
sprite_start		equ	objcontrol+4
SEQaddr		equ	objcontrol+6	; 4byte
OBJaddr		equ	objcontrol+10	; 4byte
;---------------------------------------------------------------------
Xlinklist_free	equ	objcontrol+20
Xlinklist_root	equ	objcontrol+22
;---------------------------------------------------------------------
word_free		equ	objcontrol+24
word_root		equ	objcontrol+28
word_object		equ	objcontrol+32
;---------------------------------------------------------------------
word_object_size	equ	64
word_object_total	equ	3
;---------------------------------------------------------------------
temp	equ	Xaddr	; 4byte
work	equ	Xadd	; 2byte
;---------------------------------------------------------------------
centerH	equ	Xwork1
centerV	equ	Xwork2
flipattr	equ	Xwork3
pos_pointer	equ	Xwork4
char_pointer	equ	Xwork5
obj_counter	equ	Xwork6
objectNO	equ	Xwork7
;---------------------------------------------------------------------
;
;
;
;
;
;
;
;
;
;
;
;
;
;***********************************************************************
;	Object Test Program <<<< MAIN >>>>>
;***********************************************************************
Main_OBJtest	
	phb
	phk
	plb
;----------------------------------------------------
	lda	#word_root
	sta	Xlinklist_root
;----------------------------------------------------
				; < 動くものすべてのメインループ >>
	ldx	Xlinklist_root
;----------------------------------------------------
	ifeq	0

.loop	lda	_forward,x
	cmp	Xlinklist_root
	beq	.exit
	sta	register
;- - - - - - - - - - - - - - - - - - 
	clc
	adc	#_program
	sta	work
	ldx	#0 
	phk
	jsr	(work,x)
;- - - - - - - - - - - - - - - - - - 
	ldx	register
	bra	.loop
;----------------------------------------------------

	endc

.exit


	plb
	rtl
;-----------------------------------------------------------------------
;***********************************************************************
;	Object Test Program
;***********************************************************************
	


;----------------------------------------------------------
SEQ_gameover	dwcode	OBJ_gameover
	dwcode	SEQ_0
	dwcode	SEQ_1
	dwcode	SEQ_2
	dwcode	SEQ_3
	dwcode	SEQ_4
	dwcode	SEQ_5
	dwcode	SEQ_6
	dwcode	SEQ_7
;----------------------------------------------------------
SEQ_0	db	20,0
	db	82h
SEQ_1	db	1,1
	db	82h
SEQ_2	db	1,2
	db	82h
SEQ_3	db	1,3
	db	82h
SEQ_4	db	1,4
	db	82h
SEQ_5	db	1,5
	db	82h
SEQ_6	db	1,6
	db	82h
SEQ_7	db	1,7
	db	82h
;----------------------------------------------------------
OBJ_gameover	dwcode	OBJ_0
	dwcode	OBJ_1
	dwcode	OBJ_2
	dwcode	OBJ_3
	dwcode	OBJ_4
	dwcode	OBJ_5
	dwcode	OBJ_6
	dwcode	OBJ_7
;----------------------------------------------------------
OBJ_0	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverG
;----------------------------------------------------------
OBJ_1	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverA
;----------------------------------------------------------
OBJ_2	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverM
;----------------------------------------------------------
OBJ_3	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverE
;----------------------------------------------------------
OBJ_4	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverO
;----------------------------------------------------------
OBJ_5	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverV
;----------------------------------------------------------
OBJ_6	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverE
;----------------------------------------------------------
OBJ_7	db	1,1
	dwcode	HV_gameover
	dwcode	CA_gameoverR
;----------------------------------------------------------
HV_gameover	dw	0fcfch
CA_gameoverG	dw	0
CA_gameoverA	dw	1
CA_gameoverM	dw	2
CA_gameoverE	dw	3
CA_gameoverO	dw	4
CA_gameoverV	dw	5
CA_gameoverR	dw	6
;----------------------------------------------------------
testdata
;----------------------------------------------------------
	dl		SEQ_gameover
	M2dOBJdata	prog_root,0h,080h,080h,0h,0h,0
	M2dOBJdata	prog_root,1h,088h,080h,0h,0h,0
	Mdataend
;----------------------------------------------------------
prog_root
	phk
	plb
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
	jsl	SetOAM
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
	rtl
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 







;***********************************************************************
;	Object Test Program <<<< INITIAL >>>>>
;***********************************************************************
;
; index Y register
;
;======================================================================

Init_OBJtest

	phy

	lda	#word_free		; address
	sta	Xlinklist_free
	lda	#word_root
	sta	Xlinklist_root

	lda	#word_object_size	; size
	ldy	#word_object_total	; counter
	jsl	InitLinklist

	ply
	jsr	InitObject

	rtl

;***********************************************************************
;	Object Initial
;***********************************************************************
InitObject

;---------------------------

	lda.w	0,y
	tax
	inc	a
	inc	a
	sta	SEQaddr+0	; address

	a8
	lda.w	2,y
	sta	SEQaddr+2	; bank
	sta	temp+2		; bank
	phb			; >
	pha			;  >
	plb			;  
	a16
	lda.w	0,x
	sta	OBJaddr+0	; address
	plb			; 

	iny
	iny
	iny

;---------------------------- ; memeory connect

.initloop
;- - - - - - - - - - - - - - - - - - - - - - - 
	lda.w	0,y
	and	#00ffh
	beq	.exit
	jsl	KeepLinklist	; IX = register
	bcs	.exit
	jsl	ConnectLinklist	; IX = register
;- - - - - - - - - - - - - - - - - - - - - - - 
	stx	register
	lda.w	0,y
	and	#00ffh
	asl	a
	tax
	jsr	(set_select,x)
;- - - - - - - - - - - - - - - - - - - - - - - 
	bra	.initloop
;- - - - - - - - - - - - - - - - - - - - - - - 	

.exit	rts
;=======================================================================
set_select
	dwcode	0
	dwcode	set_PC

;***********************************************************************
;	set program & character
;***********************************************************************
;- - - - - - - - - - - - - - - - - - - - - - - 
set_PC
	ldx	register
	lda.w	1,y
	sta	_program+1,x
	a8			
	lda	#5ch		; long jump ( = JMP >addr )
	sta	_program+0,x
	phb			; NOW databank = program bank
	pla
	sta	_program+3,x	; data bank
	a16
;- - - - - - - - - - - - - - - - - - - - - - - 
	lda	SEQaddr+0
	sta	_SEQaddress+0,x 	; low,high
	lda	SEQaddr+1
	sta	_SEQaddress+1,x 	; high bank
	lda	OBJaddr
	sta	_OBJaddress,x
;- - - - - - - - - - - - - - - - - - - - - - - 
	lda.w	3,y			;
	and	#00ffh
	sta	_animeNO,x
	asl	a
	adc	SEQaddr+0
	sta	temp+0
;- - - - - - - - - - - - - - - - - - - - - - - 
	lda	[temp]			; set initial pointer
	sta	_anime_pointer,x
	sta	temp
	lda	[temp]
	and	#0ff00h
	xba
	asl	a
	adc	OBJaddr
	sta	temp
	lda	[temp]
	sta	_obj_pointer,x	
;- - - - - - - - - - - - - - - - - - - - - - - 	
	lda.w	4,y			; start position sprite
	stz	_positionX,x
	sta	_axisX,x
	lda.w	6,y
	stz	_positionY,x
	sta	_axisY,x
;- - - - - - - - - - - - - - - - - - - - - - - 
	lda.w	8,y			; start sprite 
	sta	_velocityX,x
	lda.w	10,y
	sta	_velocityY,x
;- - - - - - - - - - - - - - - - - - - - - - - 
	lda.w	12,y
	and	#00ffh
	sta	_anime_counter,x
;- - - - - - - - - - - - - - - - - - - - - - - 
	stz	_STR_pointer,x		; 
;- - - - - - - - - - - - - - - - - - - - - - - 
	Mady	13
	rts
;=======================================================================



;***********************************************************************
;	LinkList library
;***********************************************************************
;	Areg	structure size
;	Yreg	structure counter
;=======================================================================
InitLinklist
;---------------------------- ; free link
	sta	work
	ldx	Xlinklist_free
	lda	#word_object
.loop	sta	_forward,x
	tax
	clc
	adc	work
	dey
	bne	.loop
	stz	_forward,x
;---------------------------- ; root reset
	ldx	Xlinklist_root
	txa
	sta	_backward,x
	sta	_forward,x
	rtl
;=======================================================================
ConnectLinklist
	phy			; <
	ldy	Xlinklist_root
	sty	_backward,x	; *->prev
	txa
	ldx	_forward,y
	sta	_backward,x	; (root->next)->prev
	sta.w	_forward,y	; root->next
	txy
	tax
	sty	_forward,x	; *->next
	ply			; >>
	rtl
;=======================================================================
KeepLinklist
	phy			; >>
	ldy	Xlinklist_free
	lda.w	_forward,y
	bne	.exit
	sec
	ply			; <
	rtl
;- - - - - - - - - - - - - - - - - - - - - - - -
.exit	tax
	lda	_forward,x
	sta.w	_forward,y
	clc
	ply			; <
	rtl

;**********************************************************
;	OAMSET MAIN 
;**********************************************************
;
;Xregister = OBJ address
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

SetOAM

	phb
	ldx	register

	a8
	lda	_SEQaddress+2,x
	pha
	plb
	a16

	jsr	Set_Anime	; animation set

	ldx	register
	lda	_axisX,x
	sta	centerH
	lda	_axisY,x
	sta	centerV

	ldy	_obj_pointer,x

	lda.w	2,y		; position address
	sta	pos_pointer
	lda.w	4,y		; character address
	sta	char_pointer
	lda.w	1,y		; character total
	and	#00ffh
	sta	obj_counter
	lda.w	0,y		; program NO
	and	#00ffh
	asl	a
	tax
	jsr	(OAM_progselect,x)

	jsr	OAMSkip		; < high speed >> 4char skip

	plb
	rtl

;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;***********************************************************************
;
;	OBJ animetion program
;
;***********************************************************************
;;
;; IX = register
;;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Set_Anime
	lda	_anime_counter,x
	beq	.entry
	dec	a
	sta	_anime_counter,x
	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
.entry				; animation entry
	ldy	_anime_pointer,x
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
	a8
	lda.w	0,y
	bpl	.nomal
	asl	a
	bmi	.longtime
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
.code				; datacode
				; 00 - 3f
	a16
	and	#01111110b
	tax
	jsr	(code_select,x)
	bcs	.entry		; < 再度データセット >>
	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
.longtime			; long wait time
	a16
	and	#007fh
	asl	a		; max 3fh * 16 ( 17 秒 )
	asl	a
	asl	a
	bra	.set
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
.nomal				; nomal wait time
	a16
	and	#00ffh
.set	dec	a
	sta	_anime_counter,x
	lda.w	1,y
	and	#00ffh
	asl	a
	adc	_OBJaddress,x	; object address
	tax
	lda.w	0,x
	ldx	register
	sta	_obj_pointer,x	; object pointer
	iny
	iny
	sty	_anime_pointer,x ; next pointer
	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
code_select
	dwcode	data_next	;(0)	start 
	dwcode	data_reset	;(1)
	dwcode	data_end	;(2)	end
	dwcode	data_change	;(3)	change
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
data_next
	ldx	register
	lda	_animeNO,x
	inc	a		; debug
	sta	_animeNO,x	; debug
	asl	a
	adc	_SEQaddress,x
	tay
	lda.w	0,y
	sta	_anime_pointer,x
	sec
	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
data_reset
	ldx	register
	stz	_animeNO,x	; debug	 = lda <_animeNO
	lda	#0		; debug 
	asl	a
	adc	_SEQaddress,x
	tay
	lda.w	0,y
	sta	_anime_pointer,x
	sec
	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
data_end
	clc
	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
data_change
	ldx	register
	lda.w	1,y
	and	#00ffh
	sta	_animeNO,x
	asl	a
	adc	_SEQaddress,x
	tay
	lda.w	0,y
	sta	_anime_pointer,x
	sec
	rts
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 





;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;=======================================================================
;***********************************************************************
;
;	OAM program select
;
;***********************************************************************
OAM_progselect
	dwcode	SetOAMbig	 ;(0)
	dwcode	SetOAMsmall	 ;(1)
	dwcode	SetOAMbig_clip	 ;(2)
	dwcode	SetOAMsmall_clip ;(3)
	dwcode	SetOAM_sub	 ;(4)
	dwcode	SetOAM_sub_clip	 ;(5) full spec
;**********************************************************
;	OAM Set Program
;		H,V position
;		Sub data set
;		H-Clipping
;**********************************************************
SetOAM_sub_clip
;**********************************************************
;	OAM Set Program
;		H,V position
;		Sub data set
;**********************************************************
SetOAM_sub
;**********************************************************
;	OAM Set Program
;		H,V position
;		Sub data constant
;		H-Clipping
;**********************************************************
SetOAMbig_clip
SetOAMsmall_clip
;**********************************************************
;	OAM Set Program
;		H,V position
;		Sub data constant
;**********************************************************
SetOAMsmall
SetOAMbig
;----------------------------------
; Set OAM SUB
;----------------------------------
; Set OAM MAIN
;----------------------------------

	ldx	sprite_register
.loop
	a8

	ldy	pos_pointer
	clc
	lda.w	1,y
	adc	centerV
	xba
	clc
	lda.w	0,y
	adc	centerH
	a16
	sta.l	sprites+0,x	; H,V position
	iny
	iny
	sty	pos_pointer

	ldy	char_pointer
	lda.w	0,y
	sta.l	sprites+2,x	; Char,Attribute
	iny
	iny
	sty	char_pointer

	inx
	inx
	inx
	inx

	dec	obj_counter
	bne	.loop
;----------------------------------------------------------
	stx	sprite_register
;----------------------------------------------------------
	rts

;***********************************************************************
;	OAM Skip program
;***********************************************************************

OAMSkip

;-------------------------------------------
	lda	sprite_register
;- - - - - - - - - - - - - - - - - - - - - -
	ldy	#0e0e0h
.loop	bit	#01111b
	beq	.skip
	tax
	tya
	sta.l	sprites,x
	txa
	inc	a
	inc	a
	inc	a
	inc	a
	bra	.loop
;- - - - - - - - - - - - - - - - - - - - - -
.skip	sta	sprite_register
	rts

;============================================================

	end

