*-----------------------------------------------------------------------------*
	INCDIR	DF0:Include/
	INCLUDE	CUSTOM.i
	INCLUDE	CIA.i
	INCLUDE	OFFSETS.i

	INCLUDE	MACROS.i

*-----------------------------------------------------------------------------*
PlaneWidth 	= 45
PlaneHeigth	= 280
PlaneSize	= PlaneWidth*PlaneHeigth
Planes		= 4

Size		= 8

*-----------------------------------------------------------------------------*
START	movem.l	d0-a6,-(sp)

	move.l	$4.w,a6
	jsr	_LVOForbid(a6)

	moveq	#0,d0
	lea	GfxName(pc),a1
	jsr	_LVOOpenLibrary(a6)
	tst.l	d0
	beq.w	.Error

	move.l	d0,GfxBase
	move.l	d0,a6
	move.l	$22(a6),Temp_ActiView
	move.l	$26(a6),Temp_CopList1
	move.l	$32(a6),Temp_CopList2

	sub.l	a1,a1
	jsr	_LVOLoadView(a6)

	jsr	_LVOWaitTOF(a6)
	jsr	_LVOWaitTOF(a6)

	lea	$dff000,a6
	move.w	$02(a6),Temp_DMACON
	move.w	$10(a6),Temp_ADKCON
	move.w	$1c(a6),Temp_INTENA
	move.l	$6c.w,Temp_Lev3Int

	move.w	#$7fff,$96(a6)
	move.w	#$7fff,$9a(a6)
	move.w	#$7fff,$9c(a6)
	move.w	#$7f00,$9e(a6)

	lea	LEV3_INTERRUPT(pc),a0
	move.l	a0,$6c.w

	bsr.w	Calc_Tables

	move.w	#%1000001111000000,$96(a6)
	move.w	#%1100000000100000,$9a(a6)

*-----------------------------------------------------------------------------*
.Main	Frame	311

;	move.w	#$fff,$dff180
	bsr.w	Zoomer
;	move.w	#$777,$dff180

	addq.l	#1,Frames

	btst	#6,$bfe001
	bne.s	.Main

*-----------------------------------------------------------------------------*
	move.l	Temp_ActiView(pc),a1
	move.l	GfxBase(pc),a6
	jsr	_LVOLoadView(a6)

	lea	$dff000,a6
	move.w	#$7fff,$96(a6)
	move.w	#$7fff,$9a(a6)
	move.w	#$7fff,$9e(a6)

	move.l	Temp_CopList1(pc),$80(a6)
	move.l	Temp_CopList2(pc),$84(a6)
	move.l	Temp_Lev3Int(pc),$6c.w

	move.w	Temp_ADKCON(pc),d0
	or.w	#$8000,d0
	move.w	d0,$9e(a6)

	move.w	Temp_DMACON(pc),d0
	or.w	#$8000,d0
	move.w	d0,$96(a6)

	move.w	Temp_INTENA(pc),d0
	or.w	#$c000,d0
	move.w	d0,$9a(a6)

	move.l	$4.w,a6
	move.l	GfxBase(pc),a1
	jsr	_LVOCloseLibrary(a6)

.Error	jsr	_LVOPermit(a6)

	movem.l	(sp)+,d0-a6
	moveq	#0,d0

	move.l	Time(pc),d0
	move.l	Frames(pc),d1
	move.l	d0,d2
	divs.w	d1,d2
	rts

*-----------------------------------------------------------------------------*
Temp_ADKCON	dc.w	0
Temp_DMACON	dc.w	0
Temp_INTENA	dc.w	0
Temp_CopList1	dc.l	0
Temp_CopList2	dc.l	0
Temp_Lev3Int	dc.l	0
Temp_ActiView	dc.l	0

Time		dc.l	0
Frames		dc.l	0

GfxBase		dc.l	0

GfxName		dc.b	'graphics.library',0
		even

*-----------------------------------------------------------------------------*
LEV3_INTERRUPT
	movem.l	d0-a6,-(SP)

	addq.l	#1,Time

	movem.l	(SP)+,d0-a6
	move.w	#%0000000000100000,$dff09c
	rte

*-----------------------------------------------------------------------------*
CALC_TABLES
	lea	ColTab,a0
	lea	Uncle,a1
	lea	Palette,a2
	move.w	#16*128-1,d2

.Loop2	moveq	#7,d1

.Loop1	moveq	#0,d0
	btst	d1,0*16*128(a1)
	beq.s	.B0
	bset	#0,d0
.B0	btst	d1,1*16*128(a1)
	beq.s	.B1
	bset	#1,d0
.B1	btst	d1,2*16*128(a1)
	beq.s	.B2
	bset	#2,d0
.B2	btst	d1,3*16*128(a1)
	beq.s	.B3
	bset	#3,d0
.B3	add.w	d0,d0
	add.w	d0,d0
	move.w	2(a2,d0.w),(a0)+
	dbf	d1,.Loop1

	addq.l	#1,a1
	dbf	d2,.Loop2		

CALC_COPLIST
	lea	CopCol1(pc),a0
	lea	CopCol2,a1
	move.w	#PlaneHeigth-1,d0
	move.l	#$1f39fffe,d1
.Loop	move.l	d1,(a0)+
	move.l	d1,(a1)+
	REPT	PlaneWidth
	move.l	#$01800000,(a0)+
	move.l	#$01800000,(a1)+
	ENDR
	add.l	#$01000000,d1
	dbf	d0,.Loop
	rts

*-----------------------------------------------------------------------------*
SWAP_PLANES
	lea	$dff000,a6

	movem.l	ShowCop(pc),d0-d1
	exg.l	d0,d1
	movem.l	d0-d1,ShowCop

	move.l	ShowCop(pc),$80(a6)
	tst.w	$88(a6)

	movem.l	ShowLin(pc),d0-d1
	exg.l	d0,d1
	movem.l	d0-d1,ShowLin

	move.l	WorkLin(pc),a0
	movem.l	(a0),d0-d7
	exg.l	d0,d1
	exg.l	d1,d2
	exg.l	d2,d3
	exg.l	d3,d4
	exg.l	d4,d5
	exg.l	d5,d6
	exg.l	d6,d7
	movem.l	d0-d7,(a0)
	rts

ShowCop	dc.l	Copperlist1
WorkCop	dc.l	Copperlist2

ShowLin	dc.l	LinePt1
WorkLin	dc.l	LinePt2

LinePt1	dc.l	0*[PlaneWidth*4+4]
	dc.l	4*[PlaneWidth*4+4]
	dc.l	1*[PlaneWidth*4+4]
	dc.l	5*[PlaneWidth*4+4]
	dc.l	2*[PlaneWidth*4+4]
	dc.l	6*[PlaneWidth*4+4]
	dc.l	3*[PlaneWidth*4+4]
	dc.l	7*[PlaneWidth*4+4]

LinePt2	dc.l	0*[PlaneWidth*4+4]
	dc.l	4*[PlaneWidth*4+4]
	dc.l	1*[PlaneWidth*4+4]
	dc.l	5*[PlaneWidth*4+4]
	dc.l	2*[PlaneWidth*4+4]
	dc.l	6*[PlaneWidth*4+4]
	dc.l	3*[PlaneWidth*4+4]
	dc.l	7*[PlaneWidth*4+4]

*-----------------------------------------------------------------------------*
CALC_COORDS
	add.w	#5,Xcentre
	add.w	#1,Ycentre
	and.w	#511,Xcentre
	and.w	#511,Ycentre

	movem.w	Zptrs(pc),d0-d1
	add.w	#2,d0
	add.w	#2,d1
	and.w	#511,d0
	and.w	#511,d1
	movem.w	d0-d1,Zptrs

	lea	Sin(pc),a0
	move.w	(a0,d0.w),d0
	add.w	(a0,d1.w),d0
	add.w	#512+28,d0
	move.w	d0,Dist


	lea	Sin(pc),a0
	lea	Cos(pc),a1
	lea	Coords(pc),a2
	lea	XYcoord(pc),a3

.loop	movem.w	(a2)+,d0/d1/d2		;x1,y1,z1

	move.w	Ky(pc),d7
	move.w	(a1,d7.w),d3
	move.w	d3,d4
	move.w	(a0,d7.w),d5
	move.w	d5,d6
	muls.w	d0,d3
	muls.w	d2,d5
	add.l	d3,d5
	asr.l	#8,d5			;x2

	muls.w	d0,d6
	muls.w	d2,d4
	sub.l	d6,d4
	asr.l	#8,d4			;z2

	move.w	Kx(pc),d7
	move.w	(a1,d7.w),d0
	move.w	d0,d2
	move.w	(a0,d7.w),d3
	move.w	d3,d6
	muls.w	d1,d0
	muls.w	d4,d3
	sub.l	d3,d0
	asr.l	#8,d0			;y3

	muls.w	d1,d6
	muls.w	d4,d2
	add.l	d6,d2
	asr.l	#8,d2			;z3

	move.w	Kz(pc),d7
	asr.w	#2,d7
	add.w	d7,d7

	move.w	(a1,d7.w),d1
	move.w	d1,d3
	move.w	(a0,d7.w),d4
	move.w	d4,d6		
	muls.w	d5,d1
	muls.w	d0,d4
	sub.l	d4,d1
	asr.l	#8,d1

	muls.w	d5,d6
	muls.w	d0,d3
	add.l	d6,d3
	asr.l	#8,d3

	muls.w	Dist(pc),d1
	asr.l	#8,d1
	add.w	Xcentre(pc),d1
	move.w	d1,(a3)+

	muls.w	Dist(pc),d3
	asr.l	#8,d3
	add.w	Ycentre(pc),d3
	move.w	d3,(a3)+	

	cmp.w	#9999,(a2)
	bne.w	.loop

	move.w	Kz(pc),d0
	add.w	#2,d0
	and.w	#1023,d0
	move.w	d0,Kz
	rts

*-----------------------------------------------------------------------------*
SetByte	MACRO
	move.w	d0,d2
	move.w	d1,d3
	asr.w	#7,d2
	and.w	d4,d2
	and.w	d5,d3
	add.w	d2,d3
	move.w	(a0,d3.w),\1*4(a1)
	add.w	a3,d0
	add.w	a4,d1
	ENDM

*-----------------------------------------------------------------------------*
ZOOMER	bsr.w	Swap_Planes
	bsr.w	Calc_Coords

	lea	XYcoord(pc),a0

	move.w	00(a0),d0
	move.w	02(a0),d1
	move.w	04(a0),d2
	move.w	06(a0),d3

	move.w	d2,d4
	sub.w	d0,d4
	muls.w	#128,d4
	divs.w	#PlaneWidth*8/Size,d4
	move.w	d4,Xadd1

	move.w	d3,d5
	sub.w	d1,d5
	muls.w	#128,d5
	divs.w	#PlaneWidth*8/Size,d5
	move.w	d5,Yadd1
	
	move.w	00(a0),d0
	move.w	02(a0),d1
	move.w	08(a0),d2
	move.w	10(a0),d3
	
	move.w	d2,d4
	sub.w	d0,d4
	muls.w	#128,d4
	divs.w	#PlaneWidth*8/Size,d4
	move.w	d4,Xadd2

	move.w	d3,d5
	sub.w	d1,d5
	muls.w	#128,d5
	divs.w	#PlaneWidth*8/Size,d5
	move.w	d5,Yadd2

	moveq	#0,d0
	move.w	0(a0),d0
	muls.w	#128/2,d0
	move.w	d0,a5

	moveq	#0,d0
	move.w	2(a0),d0
	muls.w	#128/2,d0
	move.w	d0,a6


	lea	ColTab,a0

	move.l	WorkCop(pc),a1
	lea	CopCol1-Copperlist1+6(a1),a1

	move.l	WorkLin(pc),a3
	add.l	(a3),a1

	move.w	Xadd1(pc),a3
	move.w	Yadd1(pc),a4

	move.w	#256-2,d4
	move.w	#$7f00,d5
	moveq	#PlaneHeigth/Size-1,d7

.Loop2	move.w	a5,d0
	move.w	a6,d1

	SetByte	00
	SetByte	01
	SetByte	02
	SetByte	03
	SetByte	04
	SetByte	05
	SetByte	06
	SetByte	07
	SetByte	08
	SetByte	09
	SetByte	10
	SetByte	11
	SetByte	12
	SetByte	13
	SetByte	14
	SetByte	15
	SetByte	16
	SetByte	17
	SetByte	18
	SetByte	19
	SetByte	20
	SetByte	21
	SetByte	22
	SetByte	23
	SetByte	24
	SetByte	25
	SetByte	26
	SetByte	27
	SetByte	28
	SetByte	29
	SetByte	30
	SetByte	31
	SetByte	32
	SetByte	33
	SetByte	34
	SetByte	35
	SetByte	36
	SetByte	37
	SetByte	38
	SetByte	39
	SetByte	40
	SetByte	41
	SetByte	42
	SetByte	43
	
	lea	Size*[PlaneWidth*4+4](a1),a1
	add.w	Xadd2(pc),a5
	add.w	Yadd2(pc),a6
	dbf	d7,.Loop2
	rts

*-----------------------------------------------------------------------------*
Zptrs	dc.w	0,0

Xadd1	dc.w	0
Yadd1	dc.w	0
Xadd2	dc.w	0
Yadd2	dc.w	0

Kx	dc.w	0*2
Ky	dc.w	0*2
Kz	dc.w	0*2

Dist	dc.w	256
XCentre	dc.w	0
YCentre	dc.w	0

Coords	dc.w	-63,-63,000
	dc.w	+63,-63,000
	dc.w	-63,+63,000
	dc.w	+63,+63,000
	dc.w	9999

XYcoord	blk.w	128,0

Sin	DC.W	$0000,$0006,$000C,$0012,$0019,$001F,$0025,$002B
	DC.W	$0031,$0037,$003E,$0044,$004A,$0050,$0056,$005B
	DC.W	$0061,$0067,$006D,$0072,$0078,$007D,$0083,$0088
	DC.W	$008D,$0093,$0098,$009D,$00A2,$00A6,$00AB,$00B0
	DC.W	$00B4,$00B9,$00BD,$00C1,$00C5,$00C9,$00CD,$00D0
	DC.W	$00D4,$00D7,$00DB,$00DE,$00E1,$00E4,$00E6,$00E9
	DC.W	$00EC,$00EE,$00F0,$00F2,$00F4,$00F6,$00F7,$00F9
	DC.W	$00FA,$00FB,$00FC,$00FD,$00FE,$00FE,$00FF,$00FF
Cos	DC.W	$00FF,$00FF,$00FF,$00FE,$00FE,$00FD,$00FC,$00FB
	DC.W	$00FA,$00F9,$00F7,$00F6,$00F4,$00F2,$00F0,$00EE
	DC.W	$00EC,$00E9,$00E6,$00E4,$00E1,$00DE,$00DB,$00D7
	DC.W	$00D4,$00D0,$00CD,$00C9,$00C5,$00C1,$00BD,$00B9
	DC.W	$00B4,$00B0,$00AB,$00A6,$00A2,$009D,$0098,$0093
	DC.W	$008D,$0088,$0083,$007D,$0078,$0072,$006D,$0067
	DC.W	$0061,$005B,$0056,$0050,$004A,$0044,$003E,$0037
	DC.W	$0031,$002B,$0025,$001F,$0019,$0012,$000C,$0006
	DC.W	$0000,$FFF9,$FFF3,$FFED,$FFE6,$FFE0,$FFDA,$FFD4
	DC.W	$FFCE,$FFC8,$FFC1,$FFBB,$FFB5,$FFAF,$FFA9,$FFA4
	DC.W	$FF9E,$FF98,$FF92,$FF8D,$FF87,$FF82,$FF7C,$FF77
	DC.W	$FF72,$FF6C,$FF67,$FF62,$FF5D,$FF59,$FF54,$FF4F
	DC.W	$FF4B,$FF46,$FF42,$FF3E,$FF3A,$FF36,$FF32,$FF2F
	DC.W	$FF2B,$FF28,$FF24,$FF21,$FF1E,$FF1B,$FF19,$FF16
	DC.W	$FF13,$FF11,$FF0F,$FF0D,$FF0B,$FF09,$FF08,$FF06
	DC.W	$FF05,$FF04,$FF03,$FF02,$FF01,$FF01,$FF00,$FF00
	DC.W	$FF00,$FF00,$FF00,$FF01,$FF01,$FF02,$FF03,$FF04
	DC.W	$FF05,$FF06,$FF08,$FF09,$FF0B,$FF0D,$FF0F,$FF11
	DC.W	$FF13,$FF16,$FF19,$FF1B,$FF1E,$FF21,$FF24,$FF28
	DC.W	$FF2B,$FF2F,$FF32,$FF36,$FF3A,$FF3E,$FF42,$FF46
	DC.W	$FF4B,$FF4F,$FF54,$FF59,$FF5D,$FF62,$FF67,$FF6C
	DC.W	$FF72,$FF77,$FF7C,$FF82,$FF87,$FF8D,$FF92,$FF98
	DC.W	$FF9E,$FFA4,$FFA9,$FFAF,$FFB5,$FFBB,$FFC1,$FFC8
	DC.W	$FFCE,$FFD4,$FFDA,$FFE0,$FFE6,$FFED,$FFF3,$FFF9
	DC.W	$0000,$0006,$000C,$0012,$0019,$001F,$0025,$002B
	DC.W	$0031,$0037,$003E,$0044,$004A,$0050,$0056,$005B
	DC.W	$0061,$0067,$006D,$0072,$0078,$007D,$0083,$0088
	DC.W	$008D,$0093,$0098,$009D,$00A2,$00A6,$00AB,$00B0
	DC.W	$00B4,$00B9,$00BD,$00C1,$00C5,$00C9,$00CD,$00D0
	DC.W	$00D4,$00D7,$00DB,$00DE,$00E1,$00E4,$00E6,$00E9
	DC.W	$00EC,$00EE,$00F0,$00F2,$00F4,$00F6,$00F7,$00F9
	DC.W	$00FA,$00FB,$00FC,$00FD,$00FE,$00FE,$00FF,$00FF
	DC.W	$00FF,$00FF,$00FF,$00FE,$00FE,$00FD,$00FC,$00FB

*-----------------------------------------------------------------------------*
COPPERLIST1
	dc.w	$0001,$fffe,$0100,$0000

	dc.w	$0120,$0000,$0122,$0000,$0124,$0000,$0126,$0000
	dc.w	$0128,$0000,$012a,$0000,$012c,$0000,$012e,$0000
	dc.w	$0130,$0000,$0132,$0000,$0134,$0000,$0136,$0000
	dc.w	$0138,$0000,$013a,$0000,$013c,$0000,$013e,$0000

	dc.w	$008e,$2881,$0090,$28c1
	dc.w	$0092,$0048,$0094,$00c0
	dc.w	$0108,$0000,$010a,$0000
	dc.w	$0102,$0000,$0104,$0000
	dc.w	$0100,$0200

	dc.w	$00e0,$0000,$00e2,$0000,$00e4,$0000,$00e6,$0000
	dc.w	$00e8,$0000,$00ea,$0000,$00ec,$0000,$00ee,$0000

CopCol1	blk.b	PlaneHeigth*[PlaneWidth*4+4],0

	dc.w	$ffff,$fffe

COPPERLIST2
	dc.w	$0001,$fffe,$0100,$0000

	dc.w	$0120,$0000,$0122,$0000,$0124,$0000,$0126,$0000
	dc.w	$0128,$0000,$012a,$0000,$012c,$0000,$012e,$0000
	dc.w	$0130,$0000,$0132,$0000,$0134,$0000,$0136,$0000
	dc.w	$0138,$0000,$013a,$0000,$013c,$0000,$013e,$0000

	dc.w	$008e,$2881,$0090,$28c1
	dc.w	$0092,$0048,$0094,$00c0
	dc.w	$0108,$0000,$010a,$0000
	dc.w	$0102,$0000,$0104,$0000
	dc.w	$0100,$0200

	dc.w	$00e0,$0000,$00e2,$0000,$00e4,$0000,$00e6,$0000
	dc.w	$00e8,$0000,$00ea,$0000,$00ec,$0000,$00ee,$0000

CopCol2	blk.b	PlaneHeigth*[PlaneWidth*4+4],0

	dc.w	$ffff,$fffe

*-----------------------------------------------------------------------------*
Palette		
	dc.w	$0180,$0feb,$0182,$0eda,$0184,$0eca,$0186,$0db9
	dc.w	$0188,$0da9,$018a,$0c98,$018c,$0c88,$018e,$0b78
	dc.w	$0190,$0a78,$0192,$0a68,$0194,$0968,$0196,$0957
	dc.w	$0198,$0857,$019a,$0847,$019c,$0747,$019e,$0fec

	incdir	DF1:
Uncle	incbin	plasma2.RAW

ColTab	blk.w	128*128,0

