
*******************************************************************************
* AnimInit: Setup IFF-Animation parameters & frame pointers, etc.
* ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
*******************************************************************************
		rsreset
ANIM_PTR	rs.l	1	;animgfxptr
ANIM_SIZE	rs.l	1	;animgfxsize
ANIM_COP_PTR	rs.l	1	;coppercols
ANIM_BUFF1_PTR	rs.l	1	;screenbase1
ANIM_BUFF2_PTR	rs.l	1	;screenbase2
ANIM_RESERVED	rs.l	2	;reserved for future..
ANIM_FRAME_WID	rs.w	1	;framewidth
ANIM_DEPTH	rs.w	1	;bitplaneam
ANIM_FRAME_TOT	rs.w	1	;frameam
ANIM_CURR_FRAME	rs.w	1	;currframe
ANIM_FRAME_PTR	rs.l	1	;frameptr
ANIM_FRAMELIST	rs.l	50*6 	;framelists
		rsreset

_LVOAnimInit:	move.l	a0,ANIM_BUFF1_PTR(a6)
		move.l	a1,ANIM_BUFF2_PTR(a6)
		move.l	a2,ANIM_COP_PTR(a6)
		move.l	a3,ANIM_PTR(a6)
		move.l	d0,ANIM_SIZE(a6)

		bsr.w	initframe_ptr

		move.l	ANIM_PTR(a6),a1
		move.l	(a1)+,d0	   ;move 1st long from iff data
		cmp.l	#'FORM',d0	   ;does it have a form header?
		beq.b	foundiff
cant_convert:	moveq	#-1,d0
		rts

foundiff	move.l	(a1)+,d1
newform		move.l	(a1)+,d0
		cmp.l	#"ANIM",d0
		beq.b	GetAnim
		cmp.l	#"ILBM",d0
		beq.b	GetAnim
		bra.s	cant_convert

GetAnim		move.l	(a1)+,d0
		move.l	(a1)+,d1
		cmp.l	#"FORM",d0
		beq.b	newform
		cmp.l	#"BMHD",d0
		beq.w	getbitvars
		cmp.l	#"BODY",d0
		beq.w	getbody
		cmp.l	#"DPAN",d0
		beq.w	getanimvar
		cmp.l	#"DLTA",d0
		beq.w	getdeltas
		cmp.l	#"CMAP",d0
		beq.w	getcmap

endhunk		add.l	d1,a1		;add offset now in d1 to adr in a1 
		btst	#0,d1
		beq.b	skiptest
		addq.l	#1,a1

skiptest	move.l	ANIM_PTR(a6),a5
		add.l	ANIM_SIZE(a6),a5
		cmp.l	a5,a1
		blt.b	GetAnim

*-------------- blitcopy 1st frame to mainscren

		move.l	ANIM_BUFF1_PTR(a6),a0
		move.l	ANIM_BUFF2_PTR(a6),a1

		lea	$dff000,a5
waitblitter	btst	#14,2(a5)
		bne.b	waitblitter
		moveq	#-1,d0
		move.l	d0,bltafwm(a5)
		move.l	#$09f00000,bltcon0(a5)
		move.l	a0,bltapth(a5)
		move.l	a1,bltdpth(a5)
		moveq	#0,d0
		move.l	d0,bltamod(a5)
		move.w	#(512*64)+20,bltsize(a5)
		
initframe_ptr	lea	ANIM_FRAMELIST(a6),a0
		move.l	a0,ANIM_FRAME_PTR(a6)
		rts

getbitvars	lea	ANIM_FRAME_WID(a6),a5
		move.w	(a1),(a5)		;get frame width
		move.b	8(a1),2(a5)		;get no.of bitplanes
		bra.b	endhunk
	
getanimvar	lea	ANIM_FRAME_TOT(a6),a5
		move.w	2(a1),(a5)		;get anim no.
		bra.b	endhunk

getbody:	move.l	ANIM_BUFF1_PTR(a6),a3
		move.l	d1,d7
		move.l	a1,a2
		move.l	a2,a4
		add.l	d1,a4
decloop		moveq	#0,d0
		move.b	(a2)+,d0
		bmi.b	getbyte
dataloop	move.b	(a2)+,(a3)+
		dbf	d0,dataloop
		bra.b	checklast
getbyte		cmp.b	#-128,d0
		beq.b	checklast
		neg.b	d0
		move.b	(a2)+,d2
byteloop	move.b	d2,(a3)+
		dbf	d0,byteloop
checklast	cmpa.l	a2,a4
		bgt.b	decloop
		bra.w	endhunk
	
getdeltas	move.l	a1,a2
		move.l	ANIM_FRAME_PTR(a6),a4
		moveq	#0,d3

		move.b	ANIM_DEPTH(a6),d3
		subq.b	#$1,d3
setpointers	move.l	(a2)+,d2
		beq.b	nopoint
		add.l	a1,d2
nopoint		move.l	d2,(a4)+
		dbf	d3,setpointers

		lea	ANIM_FRAME_PTR(a6),a5
		move.l	a4,(a5)
		bra.w	endhunk

getcmap:	move.l	ANIM_COP_PTR(a6),a2
		move.l	a1,a3
		moveq	#0,d0

		move.b	ANIM_DEPTH(a6),d0
		add.b	d0,d0
		add.b	d0,d0
		subq.l	#1,d0			;num of colours to extract
getc:		moveq	#0,d3			;clear d3 just in case
		move.b	(a3)+,d3		;8 bits of red
		and.w	#$00f0,d3		;
		rol.w	#4,d3
		move.b	(a3)+,d3
		and.b	#$f0,d3
		move.b	(a3)+,d2
		and.w	#$00f0,d2		;
		lsr.b	#4,d2			;correct division not ror
		or.b	d2,d3
		move.w	d3,(a2)
		addq.l	#4,a2
		dbra	d0,getc
		bra.w	endhunk

*-------------- swap screen view...

_LVOAnimBuffer:	lea	ANIM_BUFF1_PTR(a6),a1
		move.l	(a1),d0
		move.l	4(a1),(a1)
		move.l	d0,4(a1)

		moveq	#0,d1
		move.b	frame_depth(pc),d1
		subq.l	#1,d1
.bpinit:	move.w	d0,6(a0)
		swap	d0
		move.w	d0,2(a0)
		swap	d0
		add.l	d2,d0
		addq.l	#8,a0
		dbra	d1,.bpinit
		rts

*******************************************************************************
* AnimFrame: Extract an animation frame...
* ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
*******************************************************************************

_LVOAnimUnpackFrame:
		move.l	ANIM_FRAME_PTR(a6),a0
		move.l	ANIM_BUFF1_PTR(a6),a5
		moveq	#0,d0
		move.l	d0,d1
		move.l	d0,d2
		move.l	d0,d4
		move.l	d0,d5
		move.l	d0,d6
		move.l	d0,d7
		move.b	ANIM_DEPTH(a6),d7
		move.w	ANIM_FRAME_WID(a6),d5
		asr.w	#3,d5
		move.w	d5,d6
		mulu	d7,d6

startbitplane:	move.l	(a0),a1		;adr of whatever frame ptr points to in a1
		tst.l	(a0)+
		beq.b	nextbitplane
		move.l	a5,a4
		move.w	d5,d4
startcolumn	move.b	(a1)+,d0
		beq.b	nextcolumn
		move.l	a4,a3
depack		move.b	(a1)+,d1
		beq.b	byterun
		bpl.b	skipscans
		and.w	#$7f,d1
copydata:	move.b	(a1)+,(a3)
		lea	(a3,d6.w),a3
		subq.b	#1,d1
		bne.b	copydata
		bra.b	nextcode
byterun		move.b	(a1)+,d1
		move.b	(a1)+,d2
replicate	move.b	d2,(a3)
		lea	(a3,d6.w),a3
		subq.b	#$1,d1
		bne.b	replicate
		bra.b	nextcode
skipscans	lea	(a3,d6.w),a3
		subq.b	#1,d1
		bne.b	skipscans
nextcode	subq.w	#1,d0
		bne.b	depack
nextcolumn	addq	#1,a4
		subq.w	#1,d4
		bne.b	startcolumn
nextbitplane	lea	(a5,d5.w),a5
		subq.b	#$1,d7
		bne.b	startbitplane
		rts

*******************************************************************************
killsys		bsr.s	syswait	
		move.l	4.w,a6	
		lea	gfxname(pc),a1	
		jsr	-408(a6)	
		lea	oldcop1(pc),a5
		move.l	$26(a0),$0(a5)	
		move.l	$32(a0),$4(a5)	
		lea	hardware,a6
		move.w	intenar(a6),d0	
		move.w	dmaconr(a6),d1  
		or.w	#$8000,d0	
		and.w	#$03ff,d1	
		or.w	#$8000,d1	
		move.w	d0,$8(a5)	
		move.w	d1,$a(a5)	
		move.w	#$7fff,intena(a6) 
		move.w	#$7fff,dmacon(a6) 
		lea	copperlist(pc),a0 
		move.l	a0,cop1lc(a6)	  
		move.w	#$83c0,dmacon(a6)
		rts

syswait		moveq	#15,d7
syswaitloop	move.l	#$05000,d1	
		bsr.s	waitvbl	
		bsr.s	dowaitvbl	
		dbf	d7,syswaitloop	
		rts

dowaitvbl	move.l	#$03000,d1	
waitvbl		movem.l	d0-d1/a6,-(sp)	
		lea	hardware,a6	
waitvblloop	move.l	vposr(a6),d0	
		and.l	#$1ff00,d0	
		cmp.l	d1,d0	
		bne.s	waitvblloop	
		movem.l	(sp)+,d0-d1/a6	
		rts		

returnsys	lea	hardware,a6	
		move.w	oldintena(pc),intena(a6)
		move.w	olddmacon(pc),dmacon(a6)
		move.l	oldcop1(pc),cop1lc(a6)
		move.l	oldcop2(pc),cop2lc(a6)
		rts

gfxname		dc.b	"graphics.library",0
		even
oldcop1		ds.l	1	
oldcop2		ds.l	1	
oldintena	ds.w	1	
olddmacon	ds.w	1

cmv		macro
		dc.w	\2,\1
		endm
cwt		macro
		dc.w	(\1*$100)+$01,$fffe
		endm	
pal		macro
		dc.w	$ffe1,$fffe
		endm	
endcop		macro
		dc.w	$ffff,$fffe
		endm	

hardware= $dff000
dmaconr	= $002
vposr	= $004
vhposr	= $006
joy0dat	= $00a
joy1dat	= $00c
clxdat	= $00e
intenar	= $01c
intereqr= $01e
copcon	= $02e
bltcon0	= $040
bltcon1	= $042
bltafwm	= $044
bltalwm	= $046
bltcpth	= $048
bltcptl	= $04a
bltbpth	= $04c
bltbptl	= $04e
bltapth	= $050
bltaptl	= $052
bltdpth	= $054
bltdptl	= $056
bltsize	= $058
bltcmod	= $060
bltbmod	= $062
bltamod	= $064
bltdmod	= $066
bltcdat	= $070
bltbdat	= $072
bltadat	= $074
cop1lc	= $080
cop1lch	= $080
cop1lcl	= $082
cop2lc	= $084
cop2lch	= $084
cop2lcl	= $086
copjmp1	= $088
copjmp2	= $08a
diwstrt	= $08e
diwstop	= $090
ddfstrt	= $092
ddfstop	= $094
dmacon	= $096
clxcon	= $098
intena	= $09a
intreq	= $09c
bplcon0	= $100
bplcon1	= $102
bplcon2	= $104
bplmod1	= $108
bplmod2	= $10a
bplpt0h	= $0e0
bplpt0l	= $0e2
bplpt1h	= $0e4
bplpt1l	= $0e6
bplpt2h	= $0e8
bplpt2l	= $0ea
bplpt3h	= $0ec
bplpt3l	= $0ee
bplpt4h	= $0f0
bplpt4l	= $0f2
bplpt5h	= $0f4
bplpt5l	= $0f6
color00	= $180
color01	= $182
color02	= $184
color03	= $186
color04	= $188
color05	= $18a
color06	= $18c
color07	= $18e
color08	= $190
color09	= $192
color10	= $194
color11	= $196
color12	= $198
color13	= $19a
color14	= $19c
color15	= $19e
color16	= $1a0
color17	= $1a2
color18	= $1a4
color19	= $1a6
color20	= $1a8
color21	= $1aa
color22	= $1ac
color23	= $1ae
color24	= $1b0
color25	= $1b2
color26	= $1b4
color27	= $1b6
color28	= $1b8
color29	= $1ba
color30	= $1bc
color31	= $1be
ecsnop	= $1fe

