;* USE THIS COPPERLIST IF YOU WANT TO *

>extern "asmdisk1:binary/perspective",perspective

org $30000
load $30000

o:	jmp	rutin
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
doss:	dc.b	"dos.library",0
	even
graf:	dc.b	"graphics.library",0
	even
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
copp:	blk.l	1,0
grap:	blk.l	1,0
lagr:	blk.l	1,0
stack:	blk.l	1,0
screen:	dc.l	0
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rutin:	move.l	$4,a6		; Find the Copperlist-Pointer...
	jsr	-150(a6)
	move.l	d0,stack
	lea	graf(pc),a1
	clr.l	d0
	jsr	-552(a6)
	move.l	d0,grap
	add.l	#$32,d0
	move.l	d0,copp
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	move.l	copp,a5		; Start the Copperlist
	move.w  #$00a0,$dff096
	move.l  (a5),lagr
	move.l  #list,(a5)
	move.w  #$8380,$dff096
	move.l	#$40000,a0
	clr.l	d0
	clr.l	d1

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
next:	cmp.b	#$ff,$dff006
	bne	next
;	move.w	#$000f,$dff180
	jsr	cpixel
;	move.w	#$0ff0,$dff180

	move.w	#0,my
	move.w	#0,mx
	move.b	$dff00a,my+1
	move.b	$dff00b,mx+1
	cmp.b	#$33,$bfec01
	bne	key
	sub.w	#1,depth
key:	cmp.b	#$37,$bfec01
	bne	key2
	add.w	#1,depth
key2:	add.w	#2,b
	cmp.w	#360,b
	blt	go
	move.w	#2,b
go:
	add.w	#4,a
	cmp.w	#360,a
	blt	go1
	move.w	#0,a
go1:
	add.w	#1,c
	cmp.w	#360,c
	blt	go2
	move.w	#0,c
go2:
	move.w	#0,nu
	bsr	initlinedraw
ploop:	move.l	#coords,a4	; Count all coords
	move.l	#coords2,a6
	move.w	nu,d2
	add.l	d2,a4
	add.l	d2,a6
	move.w	(a4),d0
	move.w	2(a4),d1
	move.w	4(a4),d2
	bsr	vectorcalc
	move.w	x2,d0
	move.w	y2,d1
	move.w	z2,d2
	lea	perspective,a3
	add	depth,d2
	add	d2,d2
	move	(a3,d2),d5
	muls	d5,d0
	muls	d5,d1
	add.l	d0,d0
	add.l	d1,d1
	swap	d0
	swap	d1
	add.w	mx,d0
	add.w	my,d1
	move.w	d0,(a6)
	move.w	d1,2(a6)
	add.w	#6,nu
	move.w	no,d2
	cmp.w	nu,d2
	bne	ploop

;	move.w	#$0f00,$dff180
	lea	connections,a4
	move.l	#40,d4
	clr.l	d2
	clr.l	d3
	clr.l	d5
	clr.l	d6

lloop:	lea	coords2,a6
	move.w	(a4),d5
	move.w	2(a4),d6
	mulu	#6,d5
	mulu	#6,d6
	move.w	(a6,d5),d0
	move.w	2(a6,d5),d1
	move.w	(a6,d6),d2
	move.w	2(a6,d6),d3
	move.l	screen,a0
	bsr	initlinedraw
	bsr	linedraw
;	bsr	pixel
	add.l	#4,a4
	cmp.w	#-1,(a4)
	bne	lloop
	btst	#6,$bfe001
	bne	next

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

close:	move.l	copp,a5		; Close Copperlist
	move.w  #$0080,$dff096
	move.l  lagr,(a5)
	move.w  #$80a0,$dff096
	move.l	$4,a6
	move.l	stack,d0
	jsr	-156(a6)
	clr.l	d0
	rts

pixel:	clr.l	d2
	mulu	#$28,d1
	divu	#8,d0
	move.b	d0,d2

	add.l	d1,a0
	add.l	d2,a0
	swap	d0
	not.b	d0
	
	bset	d0,(a0)
	rts
cpixel:	
	move.l	bp,d0
	move.w	bpls+6,d1
	swap	d1
	move.w	bpls+2,d1
	swap	d1
	move.w	d0,bpls+6
	swap	d0
	move.w	d0,bpls+2
	move.l	d1,bp
	swap 	d0
	move.l	d1,screen
	add.l	#40*8,d1
	move.l	d1,$dff054	
	move.w	#0,$dff064
	move.w	#0,$dff066
	move.l	#$0000,$dff044
	move.w	#$0100,$dff040
	move.w	#$0000,$dff042
	move.w	#$4014,$dff058
ts:	btst	#14,$dff002
	bne	ts
	
	rts

vectorcalc:
	move.w	a,d6
	lsl.w	#1,d6
	lea	sinus(pc),a0

	move.w	(a0,d6),d3

	move.w	d3,d5
	muls	d1,d3
	lsr.l	#8,d3
	lsr.l	#6,d3	;d3 holds y*sin(a)
	lea	cosinus(pc),a1
	move.w	(a1,d6),d4

	move.w	d4,d7
	muls	d0,d4
	lsr.l	#8,d4
	lsr.l	#6,d4	;d4 holds x*cos(a)
	
	sub.w	d3,d4	;d4 holds x*cos(a)-y*sin(a)=x1
	move.w	d4,x1
	muls	d1,d7
	muls	d0,d5
	lsr.l	#8,d7
	lsr.l	#6,d7
	lsr.l	#8,d5
	lsr.l	#6,d5
	add.w	d5,d7	;d7 holds y*cos(a)-x*sin(a)=y1
	move.w	d7,y1

	
	move.w	b,d6
	lsl.w	#1,d6


	move.w	(a0,d6),d3

	move.w	d3,d5
	muls	d2,d3
	lsr.l	#8,d3
	lsr.l	#6,d3	;d3 holds z*sin(b)

	move.w	(a1,d6),d4

	move.w	d4,d7
	muls	y1,d4
	lsr.l	#8,d4
	lsr.l	#6,d4	;d4 holds y1*cos(b)
	
	sub.w	d3,d4	;d4 holds y1*cos(b)-z*sin(b)=y2
	move.w	d4,y2
	muls	d2,d7
	muls	y1,d5
	lsr.l	#8,d7
	lsr.l	#6,d7
	lsr.l	#8,d5
	lsr.l	#6,d5
	add.w	d5,d7	;d7 holds z*cos(b)+y1*sin(b)=z1
	move.w	d7,z1

	

	move.w	c,d6
	lsl.w	#1,d6


	move.w	(a0,d6),d3

	move.w	d3,d5
	muls	x1,d3
	lsr.l	#8,d3
	lsr.l	#6,d3	;d3 holds x1*sin(c)

	move.w	(a1,d6),d4

	move.w	d4,d7
	muls	z1,d4
	lsr.l	#8,d4
	lsr.l	#6,d4	;d4 holds z1*cos(c)
	
	sub.w	d3,d4	;d4 holds z1*cos(c)-x1*sin(c)=z2
	move.w	d4,z2
	muls	x1,d7
	muls	z1,d5
	lsr.l	#8,d7
	lsr.l	#6,d7
	lsr.l	#8,d5
	lsr.l	#6,d5
	add.w	d5,d7	;d7 holds x1*cos(c)+z1*sin(c)=x2
	move.w	d7,x2

	rts

swid=40

linedraw:
cmp.w	d0,d2
bne.s	ld_not1pix
cmp.w	d1,d3
bne.s	ld_not1pix
rts
ld_not1pix:
movem.l	d4/d7/a3-a4,-(a7)
moveq	#0,d7
sub.w	d0,d2
bge.s	ld_xok
neg.w	d2
addq.w	#2,d7
ld_xok:
sub.w	d1,d3
bge.s	ld_yok
neg.w	d3
addq.w	#4,d7
ld_yok:
cmp.w	d3,d2
bgt.s	ld_xyok
bne.s	ld_not45
add.w	#16,d7
ld_not45:
exg	d2,d3
addq.w	#8,d7
ld_xyok:
add.w	d3,d3
move.w	d3,d4
sub.w	d2,d4
add.w	d3,d3
move.w	d3,a3
add.w	d2,d2
add.w	d2,d2
sub.w	d2,d3
mulu	#swid,d1
move.l	a0,a4
add.w	d1,a4
move.w	d0,d1
lsr.w	#3,d1
add.w	d1,a4
andi.w	#$f,d0
ror.w	#4,d0
add.w	#$bc8,d0
swap	d0
move.w	(a1,d7.w),d0
lsl.w	#4,d2
addq.w	#2,d2
ld_wldraw:
btst	#6,$2(a2)
bne.s	ld_wldraw
move.l	d0,$40(a2)
move.w	d3,$64(a2)
move.w	a3,$62(a2)
move.w	d4,$52(a2)
move.l	a4,$48(a2)
move.l	a4,$54(a2)
move.w	d2,$58(a2)
movem.l	(a7)+,d4/d7/a3-a4
rts

initlinedraw:
lea.l	octant(pc),a1
move.l	#$dff000,a2
waitinit:
btst	#6,$2(a2)
bne.s	waitinit
move.l	#-1,$44(a2)
move.l	#$ffff8000,$72(a2)
move.w	#swid,$60(a2)
move.w	#swid,$66(a2)
rts

octant:
dc.w	$0051,$0055,$0059,$005d
dc.w	$0041,$0049,$0045,$004d
dc.w	$0011,$0015,$0019,$001d
dc.w	$0001,$0009,$0005,$000d



a:	dc.l	0
b:	dc.l	0
c:	dc.l	0
x2:	dc.l	0
y2:	dc.l	0
z2:	dc.l	0
x1:	dc.l	0
y1:	dc.l	0
z1:	dc.l	0
mx:	dc.l	0
my:	dc.l	0
depth:	dc.w	$100
sinus:

	dc.w	0,286,572,857,1143,1428,1713,1997,2280,2563,2845,3126
	dc.w	3406,3686,3964,4240,4516,4790,5063,5334,5604,5872
	dc.w	6138,6402,6664,6924,7182,7438,7692,7943,8192,8438
	dc.w	8682,8923,9162,9397,9630,9860,10087,10311,10531
	dc.w	10749,10963,11174,11381,11585,11786,11982,12176
	dc.w	12365,12551,12733,12911,13085,13255,13421,13583
	dc.w	13741,13894,14044,14189,14330,14466,14598,14726,14849
	dc.w	14968,15082,15191,15296,15396,15491,15582,15668,15749
	dc.w	15826,15897,15964,16026,16083,16135,16182,16225,16262
	dc.w	16294,16322,16344,16362,16374,16382,16383

cosinus:
	dc.w	16382,16374,16362,16344,16322,16294,16262,16225,16182
	dc.w	16135,16083,16026,15964,15897,15826,15749,15668,15582
	dc.w	15491,15396,15296,15191,15082,14968,14849,14726,14598
	dc.w	14466,14330,14189,14044,13894,13741,13583,13421,13255
	dc.w	13085,12911,12733,12551,12365,12176,11982,11786,11585
	dc.w	11381,11174,10963,10749,10531,10311,10087,9860,9630
	dc.w	9397,9163,8923,8682,8438,8192,7943,7692,7438,7132,6924
	dc.w	6664,6402,6138,5872,5604,5334,5063,4790,4516,4240,3964
	dc.w	3686,3406,3126,2845,2563,2280,1997,1713,1428
	dc.w	1143,857,572,286,0
	
dc.w	-286,-572,-857,-1143,-1428,-1713,-1997,-2280,-2563,-2845,-3126
dc.w	-3406,-3686,-3964,-4240,-4516,-4790,-5063,-5334,-5604,-5872
dc.w	-6138,-6402,-6664,-6924,-7182,-7438,-7692,-7943,-8192,-8438
dc.w	-8682,-8923,-9162,-9397,-9630,-9860,-10087,-10311,-10531
dc.w	-10749,-10963,-11174,-11381,-11585,-11786,-11982,-12176
dc.w	-12365,-12551,-12733,-12911,-13085,-13255,-13421,-13583
dc.w	-13741,-13894,-14044,-14189,-14330,-14466,-14598,-14726,-14849
dc.w	-14968,-15082,-15191,-15296,-15396,-15491,-15582,-15668,-15749
dc.w	-15826,-15897,-15964,-16026,-16083,-16135,-16182,-16225,-16262
dc.w	-16294,-16322,-16344,-16362,-16374,-16382,-16383

dc.w	-16382,-16374,-16362,-16344,-16322,-16294,-16262,-16225,-16182
dc.w	-16135,-16083,-16026,-15964,-15897,-15826,-15749,-15668,-15582
dc.w	-15491,-15396,-15296,-15191,-15082,-14968,-14849,-14726,-14598
dc.w	-14466,-14330,-14189,-14044,-13894,-13741,-13583,-13421,-13255
dc.w	-13085,-12911,-12733,-12551,-12365,-12176,-11982,-11786,-11585
dc.w	-11381,-11174,-10963,-10749,-10531,-10311,-10087,-9860,-9630
dc.w	-9397,-9163,-8923,-8682,-8438,-8192,-7943,-7692,-7438,-7132,-6924
dc.w	-6664,-6402,-6138,-5872,-5604,-5334,-5063,-4790,-4516,-4240,-3964
dc.w	-3686,-3406,-3126,-2845,-2563,-2280,-1997,-1713,-1428
dc.w	-1143,-857,-572,-286
	dc.w	0,286,572,857,1143,1428,1713,1997,2280,2563,2845,3126
	dc.w	3406,3686,3964,4240,4516,4790,5063,5334,5604,5872
	dc.w	6138,6402,6664,6924,7182,7438,7692,7943,8192,8438
	dc.w	8682,8923,9162,9397,9630,9860,10087,10311,10531
	dc.w	10749,10963,11174,11381,11585,11786,11982,12176
	dc.w	12365,12551,12732,12911,13085,13255,13421,13583
	dc.w	13741,13894,14044,14189,14330,14466,14598,14726,14849
	dc.w	14968,15082,15191,15296,15396,15491,15582,15668,15749
	dc.w	15826,15897,15964,16026,16083,16135,16182,16225,16262
	dc.w	16294,16322,16344,16362,16374,16382,16384

coords:	

dc.w	-100,-100,-100,100,-100,-100,100,100,-100,-100,100,-100
dc.w	-100,-100,100,100,-100,100,100,100,100,-100,100,100

dc.w	-80,-80,-80,80,-80,-80,80,80,-80,-80,80,-80
dc.w	-80,-80,80,80,-80,80,80,80,80,-80,80,80

dc.w	-60,-60,-60,60,-60,-60,60,60,-60,-60,60,-60
dc.w	-60,-60,60,60,-60,60,60,60,60,-60,60,60

dc.w	-40,-40,-40,40,-40,-40,40,40,-40,-40,40,-40
dc.w	-40,-40,40,40,-40,40,40,40,40,-40,40,40

no:	dc.w	32*6
nu:	dc.w	0



connections:

dc.w	0,1,1,2,2,3,0,3,4,5,5,6,6,7,4,7,0,4,1,5,2,6,3,7,8,9,9,10
dc.w	10,11,8,11,12,13,13,14,14,15,12,15,16,17,17,18,18,19,19,16
dc.w	20,21,21,22,22,23,20,23,8,12,9,13,10,14,11,15,16,20,17,21
dc.w	18,22,19,23,24,25,25,26,26,27,24,27,28,29,29,30,30,31,28,31
dc.w	24,28,25,29,26,30,27,31,-1,-1

coords2:	blk.b	2000,0

perspective:	equ	$60000
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
even
bp:	dc.l	$45000
list:	
;	dc.w 	%0000000100000000,$0096
	dc.l	$01800000,$01820fff
	dc.l	$2001fffe
;	dc.w 	%1000000100000000,$0096
bpls:	dc.l	$00e00004,$00e20000
	dc.l	$01001200,$01020000
	dc.l	$ffddfffe,$2001fffe
;	dc.w 	%0000000100000000,$0096
	dc.l	$fffffffe	




