
**********************
; The framework in this source is appauling.. If you intend to use this
; you are well advised to replace it with a decent one.. See other examples
; on previous coders disks or look at HOW TO CODE 4...
;
; 'AGA Copper corruption Fix - (Botch style method - cheap and dirty)
; 'Absolute Address references to chipmemory at location $b0000 REMOVED!
; 'Seem`s to work sort of okay now but your better off with a decent frame! 
*********************
;

; This just uses to GFX piccys to morph between, it uses 20 frames, and
; you can change the FrameHeight...

;	Opt	c-
	Section	"Morpher Code",Code_c

FrameHeight	= 128
FrameSize	= (32*FrameHeight)

			IncDir	ram:

start			movem.l	d0-d7/a0-a6,-(sp) 
			bsr	killsys	  
	
			lea	copperlist(pc),a0 
			lea	hardware,a6	  
			move.l	a0,cop1lc(a6)	  
			move.w	#$83c0,dmacon(a6)

			Move.l	FrameStart(pc),a0
			Lea	FirstPiccy(pc),a1
			Bsr	CopyPiccy

			Move.l	FrameEnd(pc),a0
			Lea	LastPiccy(pc),a1
			Bsr	CopyPiccy

			Move.l	FrameEnd(pc),a0
			Add.l	#FrameSize,a0
			Lea	LastPiccy(pc),a1	
			Bsr	CopyPiccy

			Lea	ColourZero+2(pc),a0
			Move.w	#$000,(a0)	
			Bsr	DoMorph
			Lea	ColourZero+2(pc),a0
			Move.w	#$000,(a0)

Loop:			Bsr	Anim8
			Btst	#6,$Bfe001	  
			Bne.s	Loop	  
		
			Bsr	ReturnSys	  
			Movem.l	(sp)+,d0-d7/a0-a6 
			moveq	#0,d0	  
			Rts

Anim8	Lea	Screen,a0
	Lea	CopperBPLS(pc),a1
	Move.w	#21,d7
AnimLoop	Move.l	a0,d1
	Move.w	d1,6(a1)
	Swap	d1
	Move.w	d1,2(a1)
	Bsr	VBL
	Move.w	#$4000,d0
Wait	Dbf	d0,Wait
	Bsr	VBL

	Btst	#6,$Bfe001
	Beq	ExitAnim8
	Add.l	#FrameSize,a0
	Dbf	d7,AnimLoop
		
	Bsr	Pause
	
	Sub.l	#FrameSize,a0
	
	Move.w	#21,d7
AnimLoop1	Move.l	a0,d1
	Move.w	d1,6(a1)
	Swap	d1
	Move.w	d1,2(a1)
	Bsr	VBL
	Move.l	#$4000,d0
Wait1	Dbf	d0,Wait1
	Bsr	VBL
	Btst	#6,$Bfe001
	Beq	ExitAnim8
	Sub.l	#FrameSize,a0
	Dbf	d7,AnimLoop1
	
	Bsr	Pause
ExitAnim8	Rts

Pause	Move.w	#10,d3
WaitX1	Bsr	VBL
	Move.w	#$2000,d0
WaitX	Btst	#2,$Dff016
	Beq	ExitPause
	Btst	#6,$Bfe001
	Beq	ExitAnim8
	Dbf	d0,WaitX
	Bsr	VBL
	Dbf	d3,WaitX1
ExitPause	Rts

VBL	Move.l	$Dff004,d0
	And.l	#$1ff00,d0
	Cmp.l	#$13000,d0
	Bne	VBL
	Rts

CopyPiccy	Move.w	#(FrameSize/4)-1,d0
CopyPicLoop	Move.l	(a1)+,(a0)+
	Dbf	d0,CopyPicLoop
	Rts

DoMorph	Lea	MorphDatList(pc),a0
	Move.l	#$ffff0000,$00(a0)
	Move.l	#$ffff0000,$04(a0)
	Move.l	#$ffff0000,$82(a0)
	Move.l	#$ffff0000,$86(a0)

	Lea	FrameList(pc),a0
	Move.w	#18,d0
FrameCLear	Move.w	#(FrameSize/4)-1,d1
	Move.l	(a0)+,a1
GFXCLearLoop	Move.l	#0,(a1)+
	Dbf	d1,GFXCLearLoop
	Dbf	d0,FrameCLear

	Move.l	FrameStart(pc),a0
	Move.l	FrameEnd(pc),a1
	Lea	MorphDatList+4(pc),a2
	Lea	MorphDatList+$86(pc),a3
	Lea	MorphFlag(pc),a6
	Or.b	#3,(a6)
MorphFrame	Move.w	(a2)+,d0
	Bge	DoFrameDat1
	Bra	CalcFrame
 
GetFrame	Lea	MorphDatList(pc),a2
	Bra	MorphFrame
 
DoFrameDat1	Move.w	(a2)+,d1
DoFrameDat2	Move.w	(a3)+,d2
	Bge	CreateFrame
	Bra	CalcFrame1
 
GetHalfData	Lea	MorphDatList+$82(pc),a3
	Bra	DoFrameDat2
 
CreateFrame	Move.w	(a3)+,d3
	Move.l	a0,-(sp)
	Lea	PosTabList(pc),a0
	Sub.w	d0,d2
	Sub.w	d1,d3
	Lsl.w	#5,d2
	Lsl.w	#5,d3
	Lea	FrameList(pc),a4
	Lea	MorphBitList(pc),a6
	Move.w	#19,d7
	Tst.w	d2
	Bmi	MorphDat2
	Tst.w	d3
	Bmi	MorphDat1
FrameAddrLoop	Move.l	(a4)+,a5
	Add.b	0(a6,d2.w),d0
	Add.b	0(a6,d3.w),d1
	Move.w	d1,d4
	Add.w	d4,d4
	Move.w	0(a0,d4.w),d4
	Move.w	d0,d5
	Asr.w	#3,d5
	Add.w	d5,d4
	Moveq.l	#7,d5
	Sub.w	d0,d5
	Bset	d5,0(a5,d4.w)
	Addq.w	#1,a6
	Dbf	d7,FrameAddrLoop
	Move.l	(sp)+,a0
	Bra	MorphFrame
 
MorphDat1	Neg.w	d3
DoMorphSeg1	Move.l	(a4)+,a5
	Add.b	0(a6,d2.w),d0
	Sub.b	0(a6,d3.w),d1
	Move.w	d1,d4
	Add.w	d4,d4
	Move.w	0(a0,d4.w),d4
	Move.w	d0,d5
	Asr.w	#3,d5
	Add.w	d5,d4
	Moveq.l	#7,d5
	Sub.w	d0,d5
	Bset	d5,0(a5,d4.w)
	Addq.w	#1,a6
	Dbf	d7,DoMorphSeg1
	Move.l	(sp)+,a0
	Bra	MorphFrame
 
MorphDat2	Neg.w	d2
	Tst.w	d3
	Bmi	MorphDat3
DoMorphSeg2	Move.l	(a4)+,a5
	Sub.b	0(a6,d2.w),d0
	Add.b	0(a6,d3.w),d1
	Move.w	d1,d4
	Add.w	d4,d4
	Move.w	0(a0,d4.w),d4
	Move.w	d0,d5
	Asr.w	#3,d5
	Add.w	d5,d4
	Moveq.l	#7,d5
	Sub.w	d0,d5
	Bset	d5,0(a5,d4.w)
	Addq.w	#1,a6
	Dbf	d7,DoMorphSeg2
	Move.l	(sp)+,a0
	Bra	MorphFrame
 
MorphDat3	Neg.w	d3
DoMorphSeg3	Move.l	(a4)+,a5
	Sub.b	0(a6,d2.w),d0
	Sub.b	0(a6,d3.w),d1
	Move.w	d1,d4
	Add.w	d4,d4
	Move.w	0(a0,d4.w),d4
	Move.w	d0,d5
	Asr.w	#3,d5
	Add.w	d5,d4
	Moveq.l	#7,d5
	Sub.w	d0,d5
	Bset	d5,0(a5,d4.w)
	Addq.w	#1,a6
	Dbf	d7,DoMorphSeg3
	Move.l	(sp)+,a0
	Bra	MorphFrame
 
CalcFrame	Lea	MorphDatList(pc),a2
	Move.w	(a2),d4
	Move.w	2(a2),d5
	And.w	#$ffe0,d4
DrawData	Add.w	#$20,d4
	Cmp.w	#$100,d4
	Bne	EndPosTab
	Moveq.l	#0,d4
	Addq.w	#1,d5
	Cmp.w	#FrameHeight,d5
	Bne	EndPosTab
	Moveq.l	#0,d5
	Lea	MorphFlag(pc),a6
	And.b	#$fe,(a6)
	Tst.b	(a6)
	Beq	EndByteDraw
	Move.l	FrameStart(pc),a0
EndPosTab	Move.l	(a0)+,d7
	Beq	DrawData
	Moveq.l	#$1f,d6
TestDrawBit	Btst	d6,d7
	Beq	NoDrawByte
	Move.w	d4,(a2)+
	Move.w	d5,(a2)+
NoDrawByte	Addq.w	#1,d4
	Dbf	d6,TestDrawBit
	Move.w	#$ffff,(a2)
	Bra	GetFrame
 
CalcFrame1	Lea	MorphDatList+$82(pc),a3
	Move.w	(a3),d4
	Move.w	2(a3),d5
	And.w	#$ffe0,d4
DrawData1	Add.w	#$20,d4
	Cmp.w	#$100,d4
	Bne	EndPosTab2
	Moveq.l	#0,d4
	Addq.w	#1,d5
	Cmp.w	#FrameHeight,d5
	Bne	EndPosTab2
	Moveq.l	#0,d5
	Lea	MorphFlag(pc),a6
	And.b	#$fd,(a6)
	Tst.b	(a6)
	Beq	EndByteDraw
	Move.l	FrameEnd(pc),a1
EndPosTab2	Move.l	(a1)+,d7
	Beq	DrawData1
	Moveq.l	#$1f,d6
TestNextDraw	Btst	d6,d7
	Beq	NoByteDraw
	Move.w	d4,(a3)+
	Move.w	d5,(a3)+
NoByteDraw	Addq.w	#1,d4
	Dbf	d6,TestNextDraw
	Move.w	#$ffff,(a3)
	Bra	GetHalfData 
EndByteDraw	Rts	

KillSys	Bsr.s	SysWait	

	Move.l	$4,a6	
	Lea	GFXName(pc),a1	
	Moveq	#0,d0	
	Jsr	-552(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) 
	Rts

SysWait	Move.w	#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	Dc.l	0	
OldCop2	Dc.l	0	
OldIntEna	Dc.w	0	
OldDmaCon	Dc.w	0	

MorphFlag	Dc.w	0
FrameStart	Dc.l	Screen
FrameList	
A Set FrameSize
	Rept	19
	Dc.l	Screen+A
A Set A+FrameSize
	Endr
FrameEnd	Dc.l	Screen+A

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	

CopperList	Cwt	$15	
	Cmv	$0200,BplCon0	
	Cmv	$00bb,BplCon1	
	Cmv	$000a,BplCon2	
	Cmv	$0040,DdfStrt	
	Cmv	$00b8,DdfStop	
	Cmv	$169e,DiwStrt	
	Cmv	$36a3,DiwStop
	Cmv	$0,BplMod1	
	Cmv	$0,BplMod2	
	dc.w	$1fc,0,$106,0
	Cwt	$25		
ColourZero	Cmv	$0000,Color00	
	Cmv	$0fff,Color01
	
CopperBPLS	Cmv	$a,BplPt0h	
	Cmv	$0,BplPt0l	
	Cmv	$0,BplPt1h	
	Cmv	$0,BplPt1l	
	Cmv	$0,BplPt2h	
	Cmv	$0,BplPt2l	
	Cmv	$0,BplPt3h	
	Cmv	$0,BplPt3l	
	Cmv	$0,BplPt4h
	Cmv	$0,BplPt4l 
	
	Cwt	$28	
	Cmv	$1200,BplCon0	

	Cwt	$a7
	Cmv	$0200,BplCon0	
	
	Pal
	Cwt	$28	
	Cmv	$0200,BplCon0
					
	EndCop	
			cnop	0,4
MorphDatList	Incbin	Morph3e60c.Dat
			cnop	0,4
PosTabList	Incbin	PosTab.Dat
			cnop	0,4
MorphBitList	Incbin	MorphBitTab.Dat
			cnop	0,4
FirstPiccy	Incbin	FirstFrame.Raw
			Ds.b	$3000
			cnop	0,4
LastPiccy	Incbin	LastFrame.Raw
			Ds.b	$3000
Screen:		ds.b 10240*4		;$b0000

****Custom Chip Registers****

Hardware	= $Dff000

;Control Registers

Dmaconr	= $002
Vposr	= $004
Vhposr	= $006
Joy0dat	= $00A
Joy1dat	= $00C
Clxdat	= $00E
Intenar	= $01C
Intereqr	= $01E
Copcon	= $02E

;Blitter Registers

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

;Copper Registers

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

;BitPlane Registers 

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

;Colour Registers

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









