*******************************************************************************
* p4i 3.0.3
*******************************************************************************
* OUT	ccr	eq=ERROR, ne=OK
*******************************************************************************

p4i	movem.l	d0-d7/a0-a6,-(sp)
	lea.l	p4_PixFlNmsAdrs,a2
	lea.l	p4_IIs,a3
	bsr	LdPix
	beq.s	.exit

	lea.l	DsplDef,a0
	move.l	#p4_VDOMODE_b,(TCS_DD_VdoMode,a0)
	clr.l	(TCS_DD_UsrLst0,a0)
	clr.l	(TCS_DD_UsrLst1,a0)
	move.w	#p4_DSPLX0,(TCS_DD_DsplX0,a0)
	move.w	#p4_DSPLY0,(TCS_DD_DsplY0,a0)
	move.w	#p4_DSPLX1,(TCS_DD_DsplX1,a0)
	move.w	#p4_DSPLY1,(TCS_DD_DsplY1,a0)
	move.w	#p4_SCRSZ,(TCS_DD_ScrWd,a0)
	move.w	#p4_SCRSZ,(TCS_DD_ScrHt,a0)
	move.w	#p4_DSPLBRTNS,(TCS_DD_brtns,a0)
	move.w	#p4_GFXCTXT,(TCS_DD_GfxCtxt+TCS_GC_flgs,a0)
	CALLTCS	InitDspl
	move.l	d0,DI0Adr
	beq.s	.exit

	lea.l	DsplDef,a0
	move.l	#p4_VDOMODE_f,(TCS_DD_VdoMode,a0)
	CALLTCS	InitDspl
	move.l	d0,DI1Adr
	beq.s	.exit

	movea.l	DI0Adr,a0
	movea.l	DI1Adr,a1
	CALLTCS	EnbXPfld
	beq.s	.exit

	movea.l	DI0Adr,a0
	CALLTCS	ShwDspl
	movea.l	DI1Adr,a0
	CALLTCS	ShwDspl

	move.w	#0,ccr
.exit	movem.l	(sp)+,d0-d7/a0-a6
	rts



*******************************************************************************
* p4m_ShwFPfld 1.1.2
*******************************************************************************
* INFO	shws the frnt pfld only
* OUT	ccr	ne=cont
*******************************************************************************

p4m_ShwFPfld	movem.l	d0-d1/a0-a1/a6,-(sp)
	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.ChkLMB
.rot	bsr	p4_rot

.ChkLMB	CHKLMB	.exit
	movea.l	DI1Adr,a0
	moveq.l	#0,d0
	CALLTCS	SetFPfldOpct	;shw back pfld
	move.l	#p4m_ShwBPfld,(4,a5)
.exit	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4m_ShwBPfld 1.1.2
*******************************************************************************
* INFO	shws the back pfld only
* OUT	ccr	ne=cont
*******************************************************************************

p4m_ShwBPfld	move.l	d0,-(sp)
	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.ChkLMB
.rot	bsr	p4_rot

.ChkLMB	CHKLMB	.exit
	move.l	#p4m_WtOpct0,(4,a5)
.exit	moveq.l	#1,d0	;cont
	move.l	(sp)+,d0
	rts



*******************************************************************************
* p4m_WtOpct0 0.0.0
*******************************************************************************
* INFO	wts opct to get to 0%
* OUT	ccr	ne=cont
*******************************************************************************

p4m_WtOpct0	movem.l	d0-d1/a0-a1/a6,-(sp)
	movea.l	DI0Adr,a0
	move.l	PartCtr,d0
	lsr.l	#1,d0
	moveq.l	#0,d1
	divul.l	#180,d1:d0	;d1: PartCtr mod 180
	move.w	(p4_SinTab.l,d1.l*2),d0	;512*scl (in [0...512])
	lsr.w	#1,d0	;opct: 256*scl
	bne.s	.fx	;if not 0%...
	move.l	#p4m_ChgOpct100,(4,a5)

.fx	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.exit
.rot	bsr	p4_rot

.exit	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4m_ChgOpct100 0.0.0
*******************************************************************************
* INFO	chgs opct till it gets to 100%
* OUT	ccr	ne=cont
*******************************************************************************

p4m_ChgOpct100	movem.l	d0-d1/a0-a1/a6,-(sp)
	movea.l	DI0Adr,a0
	move.l	PartCtr,d0
	lsr.l	#1,d0
	moveq.l	#0,d1
	divul.l	#180,d1:d0	;d1: PartCtr mod 180
	move.w	(p4_SinTab.l,d1.l*2),d0	;512*scl (in [0...512])
	lsr.w	#1,d0	;opct: 256*scl
	cmpi.w	#256,d0
	blo.s	.ChgOpct	;if not 100%...
	move.l	#p4m_ChgOpct50,(4,a5)

.ChgOpct	CALLTCS	SetFPfldOpct
	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.exit
.rot	bsr	p4_rot

.exit	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4m_ChgOpct50 0.0.0
*******************************************************************************
* INFO	chgs opct till it gets to 50%
* OUT	ccr	ne=cont
*******************************************************************************

p4m_ChgOpct50	movem.l	d0-d1/a0-a1/a6,-(sp)
	movea.l	DI0Adr,a0
	move.l	PartCtr,d0
	lsr.l	#1,d0
	moveq.l	#0,d1
	divul.l	#180,d1:d0	;d1: PartCtr mod 180
	move.w	(p4_SinTab.l,d1.l*2),d0	;512*scl (in [0...512])
	lsr.w	#1,d0	;opct: 256*scl
	cmpi.w	#128,d0
	bne.s	.ChgOpct	;if not 50%...
	move.l	#p4m_ShwPflds,(4,a5)

.ChgOpct	CALLTCS	SetFPfldOpct
	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.exit
.rot	bsr	p4_rot

.exit	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4m_ShwPflds 0.0.0
*******************************************************************************
* INFO	shws both pflds
* OUT	ccr	ne=cont
*******************************************************************************

p4m_ShwPflds	move.l	d0,-(sp)
	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.ChkLMB
.rot	bsr	p4_rot

.ChkLMB	CHKLMB	.exit
	move.l	#p4m_WtOpct50,(4,a5)
.exit	moveq.l	#1,d0	;cont
	move.l	(sp)+,d0
	rts



*******************************************************************************
* p4m_WtOpct50 0.0.0
*******************************************************************************
* INFO	wts opct to get to 50%
* OUT	ccr	ne=cont
*******************************************************************************

p4m_WtOpct50	movem.l	d0-d1/a0-a1/a6,-(sp)
	movea.l	DI0Adr,a0
	move.l	PartCtr,d0
	lsr.l	#1,d0
	moveq.l	#0,d1
	divul.l	#180,d1:d0	;d1: PartCtr mod 180
	move.w	(p4_SinTab.l,d1.l*2),d0	;512*scl (in [0...512])
	lsr.w	#1,d0	;opct: 256*scl
	cmpi.w	#128,d0
	bne.s	.fx	;if not 50%...
	move.l	#p4m_ChgOpct0,(4,a5)

.fx	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.exit
.rot	bsr	p4_rot

.exit	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4m_ChgOpct0 0.0.0
*******************************************************************************
* INFO	chgs opct till it gets to 0%
* OUT	ccr	ne=cont
*******************************************************************************

p4m_ChgOpct0	movem.l	d0-d1/a0-a1/a6,-(sp)
	movea.l	DI0Adr,a0
	move.l	PartCtr,d0
	lsr.l	#1,d0
	moveq.l	#0,d1
	divul.l	#180,d1:d0	;d1: PartCtr mod 180
	move.w	(p4_SinTab.l,d1.l*2),d0	;512*scl (in [0...512])
	lsr.w	#1,d0	;opct: 256*scl
	bne.s	.ChgOpct	;if not 0%...
	move.l	#p4m_DXP,(4,a5)

.ChgOpct	CALLTCS	SetFPfldOpct
	move.l	PartCtr,d0
	btst.l	#0,d0
	beq.s	.rot	;if not zm turn...
	bsr	p4_zm
	bra.s	.exit
.rot	bsr	p4_rot

.exit	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4m_DXP 1.1.1
*******************************************************************************
* INFO	preps all for Dual Mode
* OUT	ccr	ne=cont
*******************************************************************************

p4m_DXP	movem.l	d0-d3/a0-a1/a6,-(sp)
	movea.l	DI1Adr,a0
	movea.l	([p4_II_Ataru.l],TCS_II_GfxAdr.w),a1
	moveq.l	#0,d0
	moveq.l	#0,d1
	move.w	#p4_ATARUSZ,d2
	move.w	#p4_ATARUSZ,d3
	CALLTCS	WrtBrsh0
	movea.l	DI1Adr,a0
	CALLTCS	CPUFRPass0
	movea.l	DI1Adr,a0
	CALLTCS	EquVdoBufs	;chg fpfld gfx

	movea.l	DI0Adr,a0
	move.b	#p4_TRNSPCOL,d0
	CALLTCS	EnbDXPfld

	move.l	#-1,PartCtr
	move.l	#p4m_XFadeDXPIn,(4,a5)
	move.w	#0,ccr
	movem.l	(sp)+,d0-d3/a0-a1/a6
	rts



*******************************************************************************
* p4m_XFadeDXPIn 1.1.0
*******************************************************************************
* INFO	Dual Cross Pfld is shwn with a cross fade in
* OUT	ccr	ne=cont
*******************************************************************************

p4m_XFadeDXPIn	movem.l	d0-d1/a0-a1/a6,-(sp)
	move.l	PartCtr,d0
	cmpi.l	#256,d0
	bls.s	.fade
	CHKLMB	.zm
	move.l	#p4m_SyncZm,(4,a5)
	bra.s	.zm

.fade	WTRSTLN	p4_DSPLY1-10
	movea.l	DI1Adr,a0
	move.b	#p4_TRNSPCOL,d1
	CALLTCS	SetFPfldOpct	;x-fade in

.zm	move.l	PartCtr,d0
	bsr	p4_zm
	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4m_SyncZm 0.1.1
*******************************************************************************
* INFO	wts till the zm is syncd w/ PartCtr=0
* OUT	ccr	ne=cont
*******************************************************************************

p4m_SyncZm	movem.l	d0-d1,-(sp)
	move.l	PartCtr,d0
	addi.l	#90,d0
	moveq.l	#0,d1
	divul.l	#180,d1:d0
	cmpi.w	#90,d1
	bne.s	.zm
	move.l	#-1,PartCtr
	move.l	#p4m_FadeDXPOut,(4,a5)
.zm	move.l	PartCtr,d0
	bsr	p4_zm
	moveq.l	#1,d0	;cont
	movem.l	(sp)+,d0-d1
	rts



*******************************************************************************
* p4m_FadeDXPOut 0.0.1
*******************************************************************************
* INFO	Dual Cross Pfld is faded out
* OUT	ccr	ne=cont, eq=end
*******************************************************************************

p4m_FadeDXPOut	movem.l	d0-d1/a0-a1/a6,-(sp)
	move.l	#256,d1
	sub.l	PartCtr,d1
	bmi.s	.zm

	movea.l	DI1Adr,a0
	moveq.l	#TCS_VM_RGBW,d0
	CALLTCS	SetRGBxMode	;fade out

.zm	move.l	PartCtr,d0
	bsr	p4_zm

	WTRSTLN	p4_DSPLY1-1
	btst.b	#6,$bfe001	;retcode
	movem.l	(sp)+,d0-d1/a0-a1/a6
	rts



*******************************************************************************
* p4c 0.0.3
*******************************************************************************

p4c	movem.l	d0-d1/a0-a2/a6,-(sp)
	move.w	#$20,$dff09a	;clr INTENA.VERTB
	move.w	#$20,$dff09c	;clr INTREQ.VERTB

	movea.l	DI1Adr,a0
	suba.l	a1,a1 
	CALLTCS	HideDspl
	movea.l	DI1Adr,a0
	CALLTCS	DsbDXPfld	;not really necessary
	movea.l	DI1Adr,a0
	CALLTCS	DsbXPfld
	movea.l	DI1Adr,a0
	CALLTCS	FreeDspl
	movea.l	DI0Adr,a0
	suba.l	a1,a1
	CALLTCS	HideDspl
	movea.l	DI0Adr,a0
	CALLTCS	FreeDspl

	lea.l	p4_IIs,a2
	bsr	UnLdPix
	movem.l	(sp)+,d0-d1/a0-a2/a6
	rts



*******************************************************************************
* p4_rot 0.0.0
*******************************************************************************
* INFO	rotzms a pic on the frnt pfld
* IN	d0	PartCtr
*******************************************************************************

p4_rot	movem.l	d0-d6/a0-a1/a6,-(sp)
	movea.l	DI1Adr,a0
	movea.l	([p4_II_Gndm.l],TCS_II_GfxAdr.w),a1
	adda.l	#((p4_GNDMSZ/2)*p4_GNDMSZ)+p4_GNDMSZ/2,a1
	move.l	d0,d4	;ang
	moveq.l	#0,d1
	divul.l	#180,d1:d0	;d1: PartCtr mod 180
	moveq.l	#0,d5
	move.w	(p4_SinTab.l,d1.l*2),d5	;512*scl (in [0...512])
	move.w	#p4_GNDMSZLOG,d6	;WdLog
	moveq.l	#0,d0	;x0
	moveq.l	#0,d1	;y0
	move.w	#p4_SCRSZ-1,d2	;x1
	move.w	#p4_SCRSZ-1,d3	;y1
	CALLTCS	FastRotZmBrsh0	;rotzm

	movea.l	DI1Adr,a0
	CALLTCS	CPUFRPass0
	movem.l	(sp)+,d0-d6/a0-a1/a6
	rts



*******************************************************************************
* p4_zm 0.0.0
*******************************************************************************
* INFO	zms a pic on the back pfld
* IN	d0	PartCtr
*******************************************************************************

p4_zm	movem.l	d0-d1/a0-a2/a6,-(sp)
	addi.l	#90,d0	;avoid same zm of rotzm
	movea.l	DI0Adr,a0
	movea.l	([p4_II_skltn.l],TCS_II_GfxAdr.w),a1
	lea.l	p4_ZmVtxs,a2
	moveq.l	#0,d1
	divul.l	#180,d1:d0	;d1: PartCtr+90 mod 180
	move.w	(p4_SinTab.l,d1.l*2),d1	;512*scl (in [0...512])
	mulu.w	#190,d1	;190*512*scl
	lsr.l	#8,d1	;190*2*scl
	lsr.l	#1,d1	;190*scl
	addq.w	#2,d1	;ScldSz: 190*scl+2 (in [2...192])
	move.w	#p4_SKLTNSZ,d0
	sub.w	d1,d0
	addi.w	#p4_SKLTNSZ,d1
	lsr.w	#1,d0	;(SKLTNSZ-ScldSz)/2
	lsr.w	#1,d1
	subq.w	#1,d1	;(SKLTNSZ+ScldSz)/2-1
	move.w	d0,(a2)
	move.w	d0,(2,a2)
	move.w	d1,(4,a2)
	move.w	d1,(6,a2)
	move.w	#p4_SKLTNSZ,d0
	CALLTCS	FastFitBrshZn0	;zm in

	movea.l	DI0Adr,a0
	CALLTCS	CPUFRPass0
	movem.l	(sp)+,d0-d1/a0-a2/a6
	rts
