	incdir	df0:
	Include	"CustomRegisters"
	Section	Cube,Code_c

Ciaapra = $BFE001
Openlibrary = -30-522	
Disable	    = -120
Enable	    = -126
Startlist   = 38
Execbase = 4

	Move.l	Execbase,a6
	Jsr	Disable(a6)

;-------- Switch Copper DMA ----------

	Move.l	#Clstart,Cop1lc
	Clr	Copjmp1

	Move.w	#$8780,Dmacon
	Move.w	#$0020,Dmacon
	Lea	Spr0data,a0
	Moveq	#7,d0
Clop
	Clr.l	(a0)
	Addq.l	#8,a0
	Dbf	d0,Clop

;------ Wait for Vertical position 1 --------

Wait:	Move.l	$dff004,d2
	And.l	#$0001ff00,d2	
	Cmp.l	#$00000100,d2
	Bne.s	Wait

	Addq	#2,Zrot
	And	#$1fe,Zrot
	Addq	#4,Yrot
	And	#$1fe,Yrot
	Subq	#2,Xrot
	And	#$1fe,Xrot
	Bsr	TD_rout

	Btst	#6,Ciaapra
	Bne	Wait

;------ Restore old Copper list -----------

	Move.l	Execbase,a6
	Move.l	#Grname,a1
	Clr.l	d0
	Jsr	Openlibrary(a6)
	Move.l	d0,a4
	Move.l	Startlist(a4),Cop1lc
	Clr.w	Copjmp1
	Move.w	#$83E0,Dmacon
	Jsr	Enable(a6)
	Clr.l	d0
	Rts

;--------- 3D graphics ------------
TD_rout
	Move.l	Current(pc),d0
	Move	d0,Screen+2
	Swap	d0
	Move	d0,Screen+6
	Eor.l	#$3000,Current
	Move.l	Current(pc),a0
	Move.l	#$1f00000,Bltcon0
	Move.l	a0,Bltdpth
	Clr	Bltadat
	Clr	Bltdmod
	Move	#256*64+20,Bltsize

	Move	#No_points-1,d7
	Lea	Points(pc),a4	
	Lea	Sintable+$40(pc),a1
	Lea	Rotated_coords(pc),a2
	Lea	Perspective(pc),a3
TD_loop
	Move	(a4)+,d0
	Move	d0,d2
	Move	(a4)+,d1
	Move	d1,d3

	Move	Zrot(pc),d6
	Move	$40(a1,d6),d4
	Move	-$40(a1,d6),d5
	Muls	d4,d0
	Muls	d5,d1
	Sub.l	d1,d0
	Add.l	d0,d0
	Swap	d0		;d0 holds intermediate x coord
	Muls	d5,d2
	Muls	d4,d3
	Add.l	d3,d2
	Add.l	d2,d2
	Swap	d2		;d2 holds intermediate y coord
	Move	d2,d4

	Move	(a4)+,d1	;z coord
	Move	d1,d3
	Move	Xrot(pc),d6
	Move	$40(a1,d6),d5
	Move	-$40(a1,d6),d6
	Muls	d5,d2
	Muls	d6,d1
	Sub.l	d1,d2
	Add.l	d2,d2
	Swap	d2		;d2 holds the final y coord
	Muls	d5,d3
	Muls	d6,d4
	Add.l	d4,d3
	Add.l	d3,d3
	Swap	d3		;d3 holds intermediate z coord

	Move	d0,d1
	Move	d3,d4
	Move	Yrot(pc),d6
	Move	$40(a1,d6),d5
	Move	-$40(a1,d6),d6
	Muls	d5,d3
	Muls	d6,d0
	Sub.l	d0,d3
	Add.l	d3,d3
	Swap	d3		;d3 holds the final z coord
	Muls	d6,d4
	Muls	d5,d1
	Add.l	d4,d1
	Add.l	d1,d1
	Swap	d1		;d1 holds the final x coord

	Add	Depth(pc),d3
	Add	d3,d3
	Move	(a3,d3),d5
	Muls	d5,d1
	Muls	d5,d2
	Add.l	d1,d1
	Swap	d1
	Add	#160,d1
	Add.l	d2,d2
	Swap	d2
	Add	#128,d2
	
	Move	d1,(a2)+
	Move	d2,(a2)+
	Dbf	d7,TD_loop

	Move	#No_connects-1,d7
	Lea	$dff000,a5
	Lea	Connect(pc),a3
	Lea	Rotated_coords(pc),a4
	Moveq	#40,d0
	Lea	Mul40(pc),a1
	Lea	Bits(pc),a2
B_wait2
	Btst	#14,Dmaconr
	Bne.s	B_wait2

	Move	#$ffff,Bltafwm
	Move	d0,$60(a5)	;Bltcmod
	Move	d0,$66(a5)	;Bltdmod
	Move	#$ffff,$72(a5)	;Bltbdat
Draw_loop
	Move	(a3)+,d6
	Move	(a4,d6),d0
	Move	2(a4,d6),d1
	Move	(a3)+,d6
	Move	(a4,d6),d2
	Move	2(a4,d6),d3
	Cmp	d0,d2
	Bne.s	Draw
	Cmp	d1,d3
	Beq.s	Nodraw	
Draw
	Bsr	Line
Nodraw
	Dbf	d7,Draw_loop
Bwit
	Btst	#14,Dmaconr
	Bne.s	Bwit
	Rts

;----------- Line Draw ------------
Line
	Moveq	#0,d4
	Move	d1,d4
	Add	d4,d4
	Move	(a1,d4),d4
	Moveq	#-$10,d5
	And	d0,d5
	Lsr	#3,d5
	Add	d5,d4
	Add.l	a0,d4

	Moveq	#0,d5
	Sub	d1,d3
	Roxl.b	d5
	Tst	d3
	Bge.s	Y2gy1
	Neg	d3
Y2gy1
	Sub	d0,d2
	Roxl.b	d5
	Tst	d2
	Bge.s	X2gx1
	Neg	d2
X2gx1

	Move	d3,d1
	Sub	d2,d1
	Bge.s	Dygdx
	Exg	d2,d3
Dygdx
	Roxl.b	d5
	Move.b	Octant_table(pc,d5),d5
	Add	d2,d2
Wblit
	Btst	#14,Dmaconr
	Bne.s	Wblit

	Move	d2,$62(a5)	;Bltbmod
	Sub	d3,d2
	Bge.s	Signn1
	Or.b	#$40,d5
Signn1
	Move	d2,$52(a5)	;Bltaptl
	Sub	d3,d2
	Move	d2,$64(a5)	;Bltamod

	Move	#$8000,$74(a5)	;Bltadat
	Add	d0,d0
	Move	(a2,d0),$40(a5)	;Bltcon0
	Move	d5,$42(a5)	;Bltcon1
	Move.l	d4,$48(a5)	;Bltcpth
	Move.l	d4,$54(a5)	;Bltdpth
	Lsl	#6,d3
	Addq	#2,d3
	Move	d3,$58(a5)	;Bltsize
	Rts

;---------- Constants -------------

Octant_table
	Dc.b	1,17,9,21,5,25,13,29

Grname:	Dc.b	"graphics.library",0

	Even

;----------- Variables ------------

Xrot	Dc.w	$100
Yrot	Dc.w	0
Zrot	Dc.w	0
Current	Dc.l	$70000
Depth	Dc.w	180
Depthpt	Dc.w	0

;---------- Copperlists -----------
Clstart:
	Wait	0,20
	Mov	$1a81,Diwstrt
	Mov	$39c1,Diwstop
	Mov	$0038,Ddfstrt
	Mov	$00d0,Diwstop
Screen
	Mov	0,Bpl1ptl
	Mov	7,Bpl1pth
	Mov	$1200,Bplcon0
	Mov	0,Bpl1mod
	Mov	0,Color00
	Mov	$fff,Color01
	Wait	224,255
	Wait	$fe,$ff

;--------- Binaries -------------
No_points	= 8
No_connects	= 12
No_faces	= 6

Points
	Dc.w	100,100,100
	Dc.w	-100,100,100
	Dc.w	-100,-100,100
	Dc.w	100,-100,100

	Dc.w	100,100,-100
	Dc.w	-100,100,-100
	Dc.w	-100,-100,-100
	Dc.w	100,-100,-100

Connect
	Dc.w	0,4
	Dc.w	4,8
	Dc.w	8,12
	Dc.w	12,0

	Dc.w	16,20
	Dc.w	20,24
	Dc.w	24,28
	Dc.w	28,16

	Dc.w	0,16
	Dc.w	4,20
	Dc.w	8,24
	Dc.w	12,28

Rotated_coords	
	Dcb.w	No_points*2,0
Sintable
	DC.W	$15FC,$1920,$1C44,$1F68
	DC.W	$228C,$25B0,$28D4,$2B1F
	DC.W	$2E10,$30FB,$33DE,$36B9
	DC.W	$398C,$3C56,$3F17,$41CD
	DC.W	$447A,$471C,$49B3,$4C3F
	DC.W	$4EBF,$5133,$539A,$55F5
	DC.W	$5842,$5A82,$5CB3,$5ED7
	DC.W	$60EB,$62F1,$64E8,$66CF
	DC.W	$68A6,$6A6D,$6C23,$6DC9
	DC.W	$6F5E,$70E2,$7254,$73B5
	DC.W	$7504,$7641,$776B,$7884
	DC.W	$7989,$7A7C,$7B5C,$7C29
	DC.W	$7CE3,$7D89,$7E1D,$7E9C
	DC.W	$7F09,$7F61,$7FA6,$7FD8
	DC.W	$7FF5,$7FFF,$7FF5,$7FD8
	DC.W	$7FA6,$7F61,$7F09,$7E9C
	DC.W	$7E1D,$7D89,$7CE3,$7C29
	DC.W	$7B5C,$7A7C,$7989,$7884
	DC.W	$776B,$7641,$7504,$73B5
	DC.W	$7254,$70E2,$6F5E,$6DC9
	DC.W	$6C23,$6A6D,$68A6,$66CF
	DC.W	$64E8,$62F1,$60EB,$5ED7
	DC.W	$5CB3,$5A82,$5842,$55F5
	DC.W	$539A,$5133,$4EBF,$4C3F
	DC.W	$49B3,$471C,$447A,$41CD
	DC.W	$3F17,$3C56,$398C,$36B9
	DC.W	$33DE,$30FB,$2E10,$2B1F
	DC.W	$2826,$2527,$2223,$1F19
	DC.W	$1C0B,$18F8,$15E1,$12C7
	DC.W	$FAB,$C8B,$96A,$647
	DC.W	$324,0,$FCDB,$F9B8
	DC.W	$F695,$F374,$F054,$ED38
	DC.W	$EA1E,$E707,$E3F4,$E0E6
	DC.W	$DDDC,$DAD8,$D7D9,$D4E0
	DC.W	$D1EF,$CF04,$CC21,$C946
	DC.W	$C673,$C3A9,$C0E8,$BE32
	DC.W	$BB85,$B8E3,$B64C,$B3C0
	DC.W	$B140,$AECC,$AC65,$AA0A
	DC.W	$A7BD,$A57D,$A34C,$A128
	DC.W	$9F14,$9D0E,$9B17,$9930
	DC.W	$9759,$9592,$93DC,$9236
	DC.W	$90A1,$8F1D,$8DAB,$8C4A
	DC.W	$8AFB,$89BE,$8894,$877B
	DC.W	$8676,$8583,$84A3,$83D6
	DC.W	$831C,$8276,$81E2,$8163
	DC.W	$80F6,$809E,$8059,$8027
	DC.W	$800A,$8000,$800A,$8027
	DC.W	$8059,$809E,$80F6,$8163
	DC.W	$81E2,$8276,$831C,$83D6
	DC.W	$84A3,$8583,$8676,$877B
	DC.W	$8894,$89BE,$8AFB,$8C4A
	DC.W	$8DAB,$8F1D,$90A1,$9236
	DC.W	$93DC,$9592,$9759,$9930
	DC.W	$9B17,$9D0E,$9F14,$A128
	DC.W	$A34C,$A57D,$A7BD,$AA0A
	DC.W	$AC65,$AECC,$B140,$B3C0
	DC.W	$B64C,$B8E3,$BB85,$BE32
	DC.W	$C0E8,$C3A9,$C673,$C946
	DC.W	$CC21,$CF04,$D1EF,$D4E0
	DC.W	$D7D9,$DAD8,$DDDC,$E0E6
	DC.W	$E3F4,$E707,$EA1E,$ED38
	DC.W	$F054,$F374,$F695,$F9B8
	DC.W	$FCDB,0,$324,$647
	DC.W	$96A,$C8B,$FAB,$12C7
	DC.W	$15E1,$18F8,$1C0B,$1F19
	DC.W	$2223,$2527,$2826,$2B1F
	DC.W	$2E10,$30FB,$33DE,$36B9
	DC.W	$398C,$3C56,$3F17,$41CD
	DC.W	$447A,$471C,$49B3,$4C3F
	DC.W	$4EBF,$5133,$539A,$55F5
	DC.W	$5842,$5A82,$5CB3,$5ED7
	DC.W	$60EB,$62F1,$64E8,$66CF
	DC.W	$68A6,$6A6D,$6C23,$6DC9
	DC.W	$6F5E,$70E2,$7254,$73B5
	DC.W	$7504,$7641,$776B,$7884
	DC.W	$7989,$7A7C,$7B5C,$7C29
	DC.W	$7CE3,$7D89,$7E1D,$7E9C
	DC.W	$7F09,$7F61,$7FA6,$7FD8
	DC.W	$7FF5,$7FFF,$7FF5,$7FD8
	dc.w	$7fd8,$7fa6,$7f61,$7f09
	dc.w	$7e9c,$7e1d,$9d89,$7ce3
	dc.w	$7c29,$7b5c,$7a7c,$7989
	dc.w	$7884,$776b,$7641,$7504
	dc.w	$73b5,$7254,$70e2,$6f5e
	dc.w	$6dc9,$6c23,$6a6d,$68a6
	dc.w	$66cf,$64e8,$62f1,$60eb
	dc.w	$5ed7,$5cb3,$5a82,$5842
	dc.w	$55f5,$539a,$5133,$4ebf
	dc.w	$4c3f,$49b3,$471c,$447a
	dc.w	$41cd,$3f17,$3c56,$398c
	dc.w	$36b9,$33de,$30fb,$2e10
	dc.w	$2b1f,$28d4,$25b0,$228c
	dc.w	$1f68,$1c44,$1920,$15fc
Perspective
	Incbin	"Perspective"

Mul40
A set 0
	Rept	320
	Dc.w	A*40
A set A+1
	Endr

A set 0
Bits
	Rept	320
	Dc.w	((A&$f)*$1000)+$bca
A set A+1
	Endr

Size
A set 0
	Rept	320
	Dc.w	(A*64)+2
A set A+1
	Endr

	end
