שתשת                                        *-----------------------------------------------------------------------------*
	INCDIR	DF1:Include/
	INCLUDE	CUSTOM.i
	INCLUDE	CIA.i
	INCLUDE	OFFSETS.i

	INCLUDE	MACROS.i

*-----------------------------------------------------------------------------*
PlaneWidth 	= 32
PlaneHeight	= 64
PlaneSize	= PlaneWidth*PlaneHeight
Planes		= 4

Size		= 4

*-----------------------------------------------------------------------------*
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

	lea	COPPERLIST(pc),a0
	move.l	a0,$80(a6)
	tst.w	$88(a6)

	bsr.w	Calc_Tables

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

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

	bsr.w	Swap_Planes
	bsr.w	Clear_Planes
	bsr.w	Calc_Coords
	bsr.w	Rotate
;	move.w	#$f00,$dff180

	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	BitTab1(pc),a0
	lea	Textr(pc),a1
	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	move.w	#15,d3
	sub.w	d0,d3
	move.b	d0,(a0)+
	dbf	d1,.Loop1

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

CALC_MODULO
	lea	Modulo(pc),a0
	move.l	#$27ddfffe,d0
	move.w	#PlaneHeight-1,d1
.Loop	move.l	d0,(a0)+
	move.w	#$0108,(a0)+
	move.w	#-PlaneWidth,(a0)+
	move.w	#$010a,(a0)+
	move.w	#-PlaneWidth,(a0)+
	add.l	#[Size-1]<<24,d0
	move.l	d0,(a0)+
	move.l	#$01080000,(a0)+
	move.l	#$010a0000,(a0)+
	add.l	#$01000000,d0
	dbf	d1,.Loop
	rts

*-----------------------------------------------------------------------------*
SWAP_PLANES
	lea	BplPtrs(pc),a0

	movem.l	ShowPL(pc),d0-d2
	exg.l	d0,d1
	exg.l	d1,d2
	movem.l	d0-d2,ShowPL

	move.l	ShowPL(pc),d0
	moveq	#Planes-1,d1

.Loop	move.w	d0,6(a0)
	swap.w	d0
	move.w	d0,2(a0)
	swap.w	d0
	add.l	#PlaneSize,d0
	addq.l	#8,a0
	dbf	d1,.Loop
	rts

ShowPL	dc.l	Pic1
WorkPL	dc.l	Pic2
ClrPL	dc.l	Pic3

*-----------------------------------------------------------------------------*
CLEAR_PLANES
	lea	$dff000,a6
	move.l	ClrPL(pc),a0
	WBLIT
	move.l	a0,$54(a6)
	move.l	#$01000000,$40(a6)
	move.w	#0,$66(a6)
	move.w	#PlaneHeight*Planes<<6+PlaneWidth/2,$58(a6)
	rts	

*-----------------------------------------------------------------------------*
CALC_COORDS
	moveq	#0,d0
	moveq	#0,d1
	move.b	$dff00b,d0
	move.b	$dff00a,d1
	move.w	d0,Xcentre
	move.w	d1,Ycentre

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


	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
	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

	movem.w	Kx(pc),d0-d2
;	addq.w	#2*2,d0
;	addq.w	#2*2,d1
;	addq.w	#1*2,d2
	and.w	#511,d0
	and.w	#511,d1
	and.w	#511,d2
	movem.w	d0-d2,Kx
	rts

*-----------------------------------------------------------------------------*
ROTATE	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,d4
	move.w	d4,Xadd1

	move.w	d3,d5
	sub.w	d1,d5
	muls.w	#128,d5
	divs.w	#PlaneWidth*8,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,d4
	move.w	d4,Xadd2

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

	moveq	#0,d0
	move.w	0(a0),d0
	muls.w	#64,d0

	moveq	#0,d1
	move.w	2(a0),d1
	muls.w	#64,d1


	lea	PreTab(pc),a0

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

	REPT	PlaneWidth*8
	move.w	d0,d2
	asr.w	#7,d2
	move.w	d2,(a0)+
	move.w	d1,(a0)+
	add.w	a3,d0
	add.w	a4,d1
	ENDR


	move.l	a7,Stack

	move.l	WorkPL(pc),a0
	lea	BitTab1(pc),a1

	sub.l	a3,a3
	sub.l	a4,a4
	move.w	#$007f,d0
	move.w	#$3f80,d1
	moveq	#0,d3
	moveq	#0,d6
	move.w	#PlaneHeight,Ycount
	move.w	#32,Ycount

.Loop2	lea	PreTab(pc),a5

	move.w	a3,d2
	asr.w	#7,d2
	move.w	d2,a6
	move.w	#PlaneWidth-1,d2

.Loop1	move.b	#$f0,d7
	bsr.s	ROW
	move.b	#$0f,d7
	bsr.s	ROW

	addq.l	#1,a0
	dbf	d2,.Loop1

	subq.w	#1,d6
	tst.w	d6
	bgt.s	.same
	move.w	#2,d6
	lea	PlaneWidth(a0),a0
.same	lea	-PlaneWidth(a0),a0

	add.w	Xadd2(pc),a3
	add.w	Yadd2(pc),a4
	subq.w	#1,Ycount
	bgt.w	.Loop2

	move.l	Stack(pc),a7

	addq.l	#1,Frames
	rts


ROW	move.w	(a5)+,d4
	move.w	(a5)+,d5
	add.w	a6,d4
	add.w	a4,d5
	and.w	d0,d4
	and.w	d1,d5
	add.w	d5,d4
	moveq	#0,d3
	move.b	(a1,d4.w),d3
	move.b	d3,d4
	muls.w	#PlaneWidth,d3

	btst	#0,d4
	beq.s	.C0
	or.b	d7,(a0,d3.w)
	or.b	d7,PlaneWidth(a0,d3.w)
	or.b	d7,2*PlaneWidth(a0,d3.w)
.C0	lea	PlaneSize(a0),a0
	btst	#1,d4
	beq.s	.C1
	or.b	d7,(a0,d3.w)
	or.b	d7,PlaneWidth(a0,d3.w)
	or.b	d7,2*PlaneWidth(a0,d3.w)
.C1	lea	PlaneSize(a0),a0
	btst	#2,d4
	beq.s	.C2
	or.b	d7,(a0,d3.w)
	or.b	d7,PlaneWidth(a0,d3.w)
	or.b	d7,2*PlaneWidth(a0,d3.w)
.C2	lea	PlaneSize(a0),a0
	btst	#3,d4
	beq.s	.C3
	or.b	d7,(a0,d3.w)
	or.b	d7,PlaneWidth(a0,d3.w)
	or.b	d7,2*PlaneWidth(a0,d3.w)
.C3	lea	-3*PlaneSize(a0),a0

	not.w	d7

	btst	#0,d4
	bne.s	.B0
	and.b	d7,(a0,d3.w)
	and.b	d7,PlaneWidth(a0,d3.w)
	and.b	d7,2*PlaneWidth(a0,d3.w)
.B0	lea	PlaneSize(a0),a0
	btst	#1,d4
	bne.s	.B1
	and.b	d7,(a0,d3.w)
	and.b	d7,PlaneWidth(a0,d3.w)
	and.b	d7,2*PlaneWidth(a0,d3.w)
.B1	lea	PlaneSize(a0),a0
	btst	#2,d4
	bne.s	.B2
	and.b	d7,(a0,d3.w)
	and.b	d7,PlaneWidth(a0,d3.w)
	and.b	d7,2*PlaneWidth(a0,d3.w)
.B2	lea	PlaneSize(a0),a0
	btst	#3,d4
	bne.s	.B3
	and.b	d7,(a0,d3.w)
	and.b	d7,PlaneWidth(a0,d3.w)
	and.b	d7,2*PlaneWidth(a0,d3.w)
.B3	lea	-3*PlaneSize(a0),a0

	not.w	d7
	rts
	
*-----------------------------------------------------------------------------*
Stack	dc.l	0
Zptrs	dc.w	0,0
Ycount	dc.w	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	226
XCentre	dc.w	200
YCentre	dc.w	200

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

XYcoord	blk.w	128,0
PreTab	blk.l	PlaneWidth*8,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

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

SprPtrs	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,$00c1+[[$28+PlaneHeight*Size]&$ff]<<8
	dc.w	$0092,$0048,$0094,$0048+PlaneWidth*4-8
	dc.w	$0108,$0000,$010a,$0000
	dc.w	$0102,$0000,$0104,$0000
	dc.w	$0100,$4200

	dc.w	$180,$000,$182,$fff,$184,$eee,$186,$ddd
	dc.w	$188,$ccc,$18a,$bbb,$18c,$aaa,$18e,$999
	dc.w	$190,$888,$192,$777,$194,$666,$196,$555
	dc.w	$198,$444,$19a,$333,$19c,$222,$19e,$111
	
BplPtrs	dc.w	$00e0,$0000,$00e2,$0000,$00e4,$0000,$00e6,$0000
	dc.w	$00e8,$0000,$00ea,$0000,$00ec,$0000,$00ee,$0000

Modulo	blk.w	PlaneHeight/Size*12,0

	dc.w	$ffff,$fffe

*-----------------------------------------------------------------------------*
	incdir	DF1:FILES/
Textr	incbin	face2.raw

BitTab1	blk.b	128*128,0
BitTab2	blk.b	PlaneWidth*8*PlaneHeight,0

Pic1	blk.b	PlaneSize*Planes,0
Pic2	blk.b	PlaneSize*Planes,0
Pic3	blk.b	PlaneSize*Planes,0

