*	sound stuff	*
soundstarth:	equ	2
soundstartm:	equ	4
soundstartl:	equ	6
soundendh:	equ	$e
soundendm:	equ	$10
soundendl:	equ	$12
soundmode:	equ	$20
sounddma:	equ	0

*	blitter stuff	*
halftone:	equ	0
src_xinc:	equ	32
src_yinc:	equ	34
src_addr:	equ	36
endmask1:	equ	40
endmask2:	equ	42
endmask3:	equ	44
dst_xinc:	equ	46
dst_yinc:	equ	48
dst_addr:	equ	50
x_count:	equ	54
y_count:	equ	56
hop:		equ	58
op:		equ	59
line_num:	equ	60
skew:		equ	61
fhop_source:	equ	1
fhop_halftone:	equ	0
fskewfxsr:	equ	7
fskewnfsr:	equ	6
flinebusy:	equ	7
flinehog:	equ	6
flinesmudge:	equ	5
mhop_source:	equ	$02
mhop_halftone:	equ	$01
mskewfxsr:	equ	$80
mskewnfsr:	equ	$40
mlinebusy:	equ	$80
mlinehog:	equ	$40
mlinesmudge:	equ	$20



textx:		equ	0
texty:		equ	2
textz:		equ	4
textvel:	equ	6
cspritex:	equ	0
cspritey:	equ	2
cspriteheight:	equ	8
cspritewidth:	equ	10
cspritead:	equ	4
nsamount2:	equ	1
ewamount2:	equ	1
nsamount:	equ	25
ewamount:	equ	25
iea:	equ	$fffa07
ieb:	equ	$fffa09
isra:	equ	$fffa0f
ima:	equ	$fffa13
tbcr:	equ	$fffa1b
tbdr:	equ	$fffa21
vbl_vec:	equ	$70
key_vec:	equ	$118
hbl_vec:	equ	$120
magic:		equ	1650
magic2:		equ	1650
numstars:	equ	35
speed:		equ	350
zclip:		equ	10
start:
	clr.l   -(SP)           ;Go into supervisor mode
        move.w  #$20,-(SP)
        trap    #1
        addq.l  #6,SP
        move.l  D0,savesup
	move.b	#0,$484
	move.l	$426,rvsave
	move.l	$42a,resave
	move.w	#4,-(sp)
	trap	#14
	addq.l	#2,sp
	move.w	d0,ressave

	move.w	#0,-(sp)	;set to low res
	move.l	#-1,-(sp)
	move.l	#-1,-(sp)
	move.w	#5,-(sp)
	trap	#14
	add.l	#12,sp
	lea	palsave,a0
	move.l	#$ff8240,a1
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+

	move.b	$ff8201,d0
	lsl.w	#8,d0
	move.b	$ff8203,d0
	bsr	randomseed

	lea	bluepalette,a0
	jsr	mydocolors
*	jsr	putrout
	jsr	getscrn
	jsr	clearboth
	jsr	setuphbl
	jsr	plotinit
	jsr	prestars
	move.l	#box,whichob
	move.l	#text,textpointer
	lea	bvpb,a0
	move.w	#0,theta(a0)
	move.w	#128,phi(a0)
	move.w	#0,rho(a0)
	bsr	dosound
	bsr	putcred
testloop:
	jsr	testwords
	jsr	flip_scr
	jsr	keyboard
	bra	testloop

***************************
putcred:
	move.l	hiden,a1
	move.l	seen,a2
	lea	29600(a1),a1
	lea	29600(a2),a2
	lea	cred,a0
	moveq	#8,d0
pcl:
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	move.l	(a0),(a1)+
	move.l	(a0)+,(a2)+
	lea	64(a1),a1
	lea	64(a2),a2
	dbf	d0,pcl
	rts

*****************************************
*	new sound chip stuff		*
*****************************************
dosound:
	lea	$ff8900,a0	;sound register base address
	move.w	#0,sounddma(a0)
	move.l	#music,d0
	move.w	d0,soundstartl(a0)
	lsr.l	#8,d0
	move.w	d0,soundstartm(a0)
	lsr.l	#8,d0
	move.w	d0,soundstarth(a0)

	move.l	#musicend,d0
	move.w	d0,soundendl(a0)
	lsr.l	#8,d0
	move.w	d0,soundendm(a0)
	lsr.l	#8,d0
	move.w	d0,soundendh(a0)

	move.w	#%0000000000000000,soundmode(a0)
	move.w	#%0000000000000011,sounddma(a0)
	rts
*****************************************
*	Blitter clear			*
*****************************************
blitclear:
	move.l	#$ff8a00,a0
*waitblit:
*	btst	#mlinebusy,$ff8a3c
*	bne	waitblit

	move.l	hiden,a1
	lea	3520(a1),a1
	move.l	a1,dst_addr(a0)	;set dest address
	move.l	a1,src_addr(a0)	;*
	move.w	#0,src_xinc(a0)
	move.w	#0,src_yinc(a0)
	move.w	#2,dst_xinc(a0)
	move.w	#0,dst_yinc(a0)
	move.w	#80,x_count(a0)
	move.w	#157,y_count(a0)
	move.w	#-1,endmask1(a0)
	move.w	#-1,endmask2(a0)
	move.w	#-1,endmask3(a0)
	move.b	#$0,op(a0)
	move.b	#0,hop(a0)
	move.b	#0,skew(a0)
*	move.b	#mlinebusy,line_num(a0)
	move.b	#%10000000,$ff8a3c
	rts



*******************************************
stars:
	lea	starblock,a0
	move.w	(a0)+,d7	;number
starsloop:
	move.w	2(a0),pixelx
	move.w	4(a0),pixely
	move.w	#0,pixelcolor
	bsr	singleplot

	move.w	(a0)+,d0
	add.w	d0,(a0)
	cmpi.w	#319,(a0)
	ble	star1
	move.w	#0,(a0)
star1:
	move.w	(a0)+,pixelx
	move.w	(a0)+,pixely
	move.w	(a0)+,pixelcolor
	bsr	singleplot
	dbf	d7,starsloop
	rts

prestars:
	lea	starblock,a0
	move.w	(a0)+,d7
pstarl:
	move.w	#3,d0
	bsr	randomplus
	addq.w	#1,d0
	move.w	d0,d6
	move.w	d0,(a0)+	;velocity
	move.w	#319,d0
	bsr	randomplus
	move.w	d0,(a0)+	;x
	move.w	#154,d0
	bsr	randomplus
	add.w	#22,d0
	move.w	d0,(a0)+	;y

	cmpi.w	#1,d6
	bne	ps1
	move.w	#2,(a0)+
	dbf	d7,pstarl
	rts
ps1:
	cmpi.w	#2,d6
	bne	ps2
	move.w	#4,(a0)+
	dbf	d7,pstarl
	rts
ps2:
	move.w	#8,(a0)+
	dbf	d7,pstarl
	rts

starblock:
	dc.w	numstars
	blk.w	[numstars+1]*4,0
******************************************
setuphbl:
	move.w	#$2700,sr
	move.l	#hbllist,hblsave
	move.b	ieb,oldieb
	move.b	iea,oldiea
	move.b	ima,oldima
	move.l	key_vec,oldkeyvec
	move.l	key_vec,keyt+2
	move.l	#key_handler,key_vec		;put new key stuff in
	move.l	hbl_vec,oldhblvec

	move.b	#%01000000,ieb
	and.b	#$fe,iea	;stop hblank
	move.l	hbl_vec,oldhblvec
	move.l	#hblhandler1,hbl_vec
	move.b	#%00000001,iea
	or.b	#1,ima

	move.l	vbl_vec,oldvblvec
	move.l	#vbl_handler,vbl_vec
	move.b	#0,tbcr
	move.b	#22,tbdr
	move.b	#8,tbcr
	move.w	#$2300,sr
	rts

hblhandler2:
	movem.l a0/a1,-(sp)
	move.l	#$ff8240,a0
*	lea	palette2,a1
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	movem.l (sp)+,a0/a1
	move.b	#0,tbcr
	move.b	#100,tbdr
	move.b	#8,tbcr
	bclr	#0,isra
	rte
hblhandler1:
	movem.l d0/a0,-(sp)
	move.l	hblsave,a0
	move.w	(a0)+,d0
	bmi	endlist
	move.w	d0,$ff8240
	move.b	#0,tbcr
	move.w	(a0)+,d0
	move.l	a0,hblsave
	move.b	d0,tbdr
	move.b	#8,tbcr
	bclr	#0,isra
	movem.l (sp)+,d0/a0
	rte
endlist:
	movem.l a0/a1,-(sp)
	move.l	#$ff8240,a0
*	lea	palette2,a1
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	move.l	(a1)+,(a0)+
	movem.l (sp)+,a0/a1
	move.b	#0,tbcr
	move.w	(a0)+,d0
	move.l	a0,hblsave
	move.b	d0,tbdr
	move.b	#8,tbcr
	bclr	#0,isra
	movem.l (sp)+,d0/a0
	rte

hbllist:
	dc.w	$0888,155,$0000,100

hblsave:	dc.l	0
	
vbl_handler:
	move.l	#hbllist,hblsave
	move.b	#0,tbcr
	move.b	#22,tbdr
	move.b	#8,tbcr
vblt:
	movem.l d0-d7/a0-a6,-(sp)
	move.w	#$0000,$ff8240
	bsr	stars
	movem.l (sp)+,d0-d7/a0-a6
	rte

key_handler:
	move.w	#$2500,sr
keyt:	jmp	$0


oldvblvec:	blk.l	1,0
oldkeyvec:	blk.l	1,0
oldhblvec:	blk.l	1,0
oldieb: 	blk.b	1,0
oldiea: 	blk.b	1,0
oldima: 	blk.b	1,0
even

restoremfp:
	move.b	oldieb,ieb
	move.b	oldiea,iea
	move.b	oldima,ima
	move.l	oldkeyvec,key_vec
	move.l	oldhblvec,hbl_vec
	move.l	oldvblvec,vbl_vec
	rts

*****************************************
clip_poly:
	move.l	a0,a1
	move.w	d7,d0
	lsl	#2,d0
	lea	-4(a1,d0.w),a2
	movem	(a2)+,d0/d1
	move	d0,d2
	move.w	d1,d3

*	move.w	2(a6),d6
	move.w	#cymin,d6
	cmp.w	d6,d3
	bge.s	next_cp1_t
	bra.s	next_cp2_t
cp_lp1_t:
	movem	(a1)+,d0/d1
	cmp.w	d6,d1
	bge.s	cp1_t
	bsr	horiz_cross
	moveq	#-1,d4
	bra.s	next_cp2_t
cp3_t:
	bsr	horiz_cross
cp1_t:
	move.w	d0,(a2)+
	move.w	d1,(a2)+
	move.w	d0,d2
	move.w	d1,d3
next_cp1_t:
	dbra	d7,cp_lp1_t
	bra.s	cp5_t
cp_lp2_t:
	move.w	d0,d2
	move.w	d1,d3
	movem	(a1)+,d0/d1
	cmp.w	d6,d1
next_cp2_t:
	dbge	d7,cp_lp2_t
	beq.s	cp1_t
	bgt.s	cp3_t

cp5_t:
	subq.l	#4,a2
	move.w	(a2)+,d0
	move.w	(a2)+,d1
	move.w	d0,d2
	move.w	d1,d3
	move.l	a2,d7
	sub.l	a1,d7
	beq	cp_off
	lsr	#2,d7
*	move.w	(a6),d6
	move.w	#cxmin,d6
	cmp.w	d6,d2
	bge.s	next_cp1_l
	bra.s	next_cp2_l
cp_lp1_l:
	movem	(a1)+,d0/d1
	cmp.w	d6,d0
	bge.s	cp1_l
	bsr	vert_cross
	moveq	#-1,d4
	bra.s	next_cp2_l
cp3_l:
	bsr	vert_cross
cp1_l:
	move.w	d0,(a2)+
	move.w	d1,(a2)+
	move.w	d0,d2
	move.w	d1,d3
next_cp1_l:
	dbra	d7,cp_lp1_l
	bra	cp5_l
cp_lp2_l:
	move.w	d0,d2
	move.w	d1,d3
	movem	(a1)+,d0/d1
	cmp	d6,d0
next_cp2_l:
	dbge	d7,cp_lp2_l
	beq.s	cp1_l
	bgt.s	cp3_l

cp5_l:
	subq.l	#4,a2
	move.w	(a2)+,d0
	move.w	(a2)+,d1
	move.w	d0,d2
	move.w	d1,d3
	move.l	a2,d7
	sub.l	a1,d7
	beq	cp_off
	lsr	#2,d7
*	move.w	(a6),d6
	move.w	#cymax,d6
	cmp.w	d6,d3
	ble.s	next_cp1_b
	bra.s	next_cp2_b
cp_lp1_b:
	movem	(a1)+,d0/d1
	cmp.w	d6,d1
	ble.s	cp1_b
	bsr	horiz_cross
	moveq	#1,d4
	bra.s	next_cp2_b
cp3_b:
	bsr	horiz_cross
cp1_b:
	move.w	d0,(a2)+
	move.w	d1,(a2)+
	move.w	d0,d2
	move.w	d1,d3
next_cp1_b:
	dbra	d7,cp_lp1_b
	bra	cp5_b
cp_lp2_b:
	move.w	d0,d2
	move.w	d1,d3
	movem	(a1)+,d0/d1
	cmp	d6,d1
next_cp2_b:
	dble	d7,cp_lp2_b
	beq.s	cp1_b
	blt.s	cp3_b

cp5_b:
	subq.l	#4,a2
	move.w	(a2)+,d0
	move.w	(a2)+,d1
	move.w	d0,d2
	move.w	d1,d3
	move.l	a2,d7
	sub.l	a1,d7
	beq	cp_off
	lsr	#2,d7
*	move.w	(a6),d6
	move.w	#cxmax,d6
	move.l	a0,a2
	cmp.w	d6,d2
	ble.s	next_cp1_r
	bra.s	next_cp2_r
cp_lp1_r:
	movem	(a1)+,d0/d1
	cmp.w	d6,d0
	ble.s	cp1_r
	bsr	vert_cross
	moveq	#1,d4
	bra.s	next_cp2_r
cp3_r:
	bsr.s	vert_cross
cp1_r:
	move.w	d0,(a2)+
	move.w	d1,(a2)+
	move.w	d0,d2
	move.w	d1,d3
next_cp1_r:
	dbra	d7,cp_lp1_r
	bra	cp5_r
cp_lp2_r:
	move.w	d0,d2
	move.w	d1,d3
	movem	(a1)+,d0/d1
	cmp	d6,d0
next_cp2_r:
	dble	d7,cp_lp2_r
	beq.s	cp1_r
	blt.s	cp3_r
cp5_r:
	move.l	a2,d7
	sub.l	a0,d7
	beq.s	cp_off
	lsr.w	#2,d7
	moveq	#0,d0
	rts
cp_off:
	moveq	#-1,d0
	rts
horiz_cross:
	move.w	d0,d4
	sub.w	d2,d4
	move.w	d1,d5
	sub.w	d6,d5
	muls	d5,d4
	move	d1,d5
	sub.w	d3,d5
	divs	d5,d4
	neg	d4
	add	d0,d4
	move.w	d4,(a2)+
	move.w	d6,(a2)+
	rts
vert_cross:
	move.w	d1,d4
	sub.w	d3,d4
	move.w	d0,d5
	sub.w	d6,d5
	muls	d5,d4
	move	d0,d5
	sub.w	d2,d5
	divs	d5,d4
	neg	d4
	add	d1,d4
	move.w	d6,(a2)+
	move.w	d4,(a2)+
	rts

surfacedfn:	dc.w	0	;color
		dc.l	surfacevrt
surfacevrt:	dc.w	0	;number of points
		blk.w	600,0

*****************************************
*	my own personal poly draw	*
*****************************************
draw_polygon3:
	movem.l	d0-d7/a0-a6,-(sp)
	move.w	surfacedfn,d0		;color
	lea	surfacevrt,a0
	move.w	(a0)+,d7		;count
	addq.w	#1,d7

	move.w	d0,-(sp)
	bsr	clip_poly
	move	(sp)+,a1
	bmi	abort_poly
	move	a1,d0
	move.l	a6,-(sp)

waitblit:
	btst	#7,$ff8a3c
	bne	waitblit

	move.w	d0,d1
	lsl.w	#3,d1
	lea	col_dat,a1
	adda	d1,a1
	lea	col_code,a5
	move.l	(a1)+,(a5)+
	move.l	(a1),(a5)+
	move.b	d0,(a5)

	move.w	d7,d0
	move.w	d0,d2
	move.w	d2,d6
	lsl.w	#2,d0
	lea	(a0,d0.w),a1
	lea	(a1,d0.w),a2
	move.l	a1,a4
	move.w	#$8000,d0
	move.w	#$7fff,d1
	bra.s	next_coord
coord_lp:
	move.l	(a0)+,d3
	cmp.w	d3,d0
	bge.s	check_low_y
	move.w	d3,d0
check_low_y:
	cmp.w	d3,d1
	ble.s	coord_trans
	move.w	d3,d1
	move.l	a1,a4
coord_trans:
	move.l	d3,(a1)+
	move.l	d3,(a2)+
next_coord:
	dbra	d6,coord_lp

	move.w	d0,d7
	sub.w	d1,d7

	move.l	a4,a3
	move.l	(a4),d0
flat_tp_lp1:
	addq.l	#4,a4
	cmp	2(a4),d0
	beq.s	flat_tp_lp1
	bra.s	look_back
flat_tp_lp2:
	subq.l	#4,a3
look_back:
	cmp.w	-2(a3),d0
	beq.s	flat_tp_lp2

	move.l	hiden,a6
	lsl.w	#5,d0
	add.w	d0,a6
	lsl.w	#2,d0
	add.w	d0,a6
	moveq	#0,d6
	bra	start_poly
polyfill_lp:
	move.l	d3,d0
	swap	d0
	bpl.s	no_rnd_1
	addq.w	#1,d0
no_rnd_1:
	move.l	d4,d1
	swap	d1
	bpl.s	no_rnd_r
	addq.w	#1,d1
no_rnd_r:
	add.l	a1,d3
	add.l	a2,d4

	cmp.w	d0,d1
	bgt.s	v_order_ok
	exg	d0,d1
v_order_ok:
	move.w	d0,d2
	sub.w	d0,d1
	lsr.w	#1,d2
	and.w	#$fff8,d2
	lea	(a6,d2.w),a0
	and.w	#$f,d0
	moveq	#-1,d2
	lsr	d0,d2
	add.w	d1,d0
	sub.w	#16,d0
	bpl	multi_span
	addq.w	#1,d0
	neg.w	d0
	moveq	#-1,d1
	lsl.w	d0,d1
	and.w	d1,d2
	move.w	d2,d1
	not	d2
	jsr	2(a5)
	bra.s	row_done
multi_span:
	move.w	d2,d1
	not	d2
	jsr	2(a5)
	addq.w	#1,d0
	move.w	d0,d1
	lsr.w	#4,d0
	and.w	#$f,d1
	move.w	d1,-(sp)
	cmpi.w	#14,d0
	bge	none
	movem.l	-8(a5),d1/d2
	bra.s	next_p_row
p_row_lp:
	move.l	d1,(a0)+
	move.l	d2,(a0)+
next_p_row:
	dbra	d0,p_row_lp
none:	move.w	(sp)+,d1
	moveq	#-1,d2
	lsr.w	d1,d2
	move.w	d2,d1
	not	d1
	jsr	2(a5)
row_done:
	tst.w	d7
	beq.s	poly_done
	subq.w	#1,d5
	bpl.s	more_rows_1
start_poly:
	sub.l	a2,d4
	moveq	#0,d3
	move.w	(a3),d3
	swap	d3
	move.w	-(a3),d5
	sub	4(a3),d5
	moveq	#0,d0
	move.w	d5,d0
	moveq	#0,d1
	move.w	-(a3),d1
	sub.w	4(a3),d1

	bsr.s	get_grad
	move.l	d0,a1
	cmpi.w	#1,d6
	bmi.s	two_verts
	addq.w	#1,d7
	bra.s	next_scan
more_rows_1:
	subq.w	#1,d6
	bpl.s	more_rows_r
	addq.w	#1,d5
	sub.l	a1,d3
two_verts:
	moveq	#0,d4
	move.w	-4(a4),d4
	swap	d4
	moveq	#0,d1
	move.w	(a4)+,d1
	move.w	(a4)+,d6
	sub.w	-6(a4),d6
	moveq	#0,d0
	move.w	d6,d0
	sub.w	-8(a4),d1

	bsr.s	get_grad
	move.l	d0,a2
	addq.w	#1,d7
	bra.s	next_scan
more_rows_r:
	lea	160(a6),a6
next_scan:
	dbra	d7,polyfill_lp
poly_done:
	addq.l	#4,sp
abort_poly:
	movem.l	(sp)+,d0-d7/a0-a6
	rts
get_grad:
	beq.s	vert_grad
	bmi.s	neg_grad

	divu	d0,d1
	swap	d0
	move.w	d1,d0
	swap	d0
	clr	d1
	divu	d0,d1
	move.w	d1,d0
	rts
vert_grad:
	moveq	#0,d0
	rts
neg_grad:
	neg.w	d1
	divu	d0,d1
	swap	d0
	move.w	d1,d0
	swap	d0
	clr	d1
	divu	d0,d1
	move.w	d1,d0
	neg.l	d0
	rts

col_code:
	dc.l	0,0
	dc.w	0
	btst	#0,(a5)
	bne.s	s_p_a

	and.w	d2,(a0)+
	bra.s	c_p_a
s_p_a:
	or.w	d1,(a0)+
c_p_a:
	btst	#1,(a5)
	bne.s	s_p_b
	and.w	d2,(a0)+
	bra.s	c_p_b
s_p_b:
	or.w	d1,(a0)+
c_p_b:
	btst	#2,(a5)
	bne.s	s_p_c
	and.w	d2,(a0)+
	bra.s	c_p_c
s_p_c:
	or.w	d1,(a0)+
c_p_c:
	btst	#3,(a5)
	bne.s	s_p_d
	and.w	d2,(a0)+
	rts
s_p_d:
	or.w	d1,(a0)+
	rts

col_dat:
	dc.l	$00000000,$00000000
	dc.l	$ffff0000,$00000000
	dc.l	$0000ffff,$00000000
	dc.l	$ffffffff,$00000000
	dc.l	$00000000,$ffff0000
	dc.l	$ffff0000,$ffff0000
	dc.l	$0000ffff,$ffff0000
	dc.l	$ffffffff,$ffff0000
	dc.l	$00000000,$0000ffff
	dc.l	$ffff0000,$0000ffff
	dc.l	$0000ffff,$0000ffff
	dc.l	$ffffffff,$0000ffff
	dc.l	$00000000,$ffffffff
	dc.l	$ffff0000,$ffffffff
	dc.l	$0000ffff,$ffffffff
	dc.l	$ffffffff,$ffffffff

startmask:
	dc.w	$ffff,$7fff,$3fff,$1fff
	dc.w	$0fff,$07ff,$03ff,$01ff
	dc.w	$00ff,$007f,$003f,$001f
	dc.w	$000f,$0007,$0003,$0001
	dc.w	$0000
endmask:
	dc.w	$0000,$8000,$c000,$e000
	dc.w	$f000,$f800,$fc00,$fe00
	dc.w	$ff00,$ff80,$ffc0,$ffe0
	dc.w	$fff0,$fff8,$fffc,$fffe
	dc.w	$ffff


*************************************
leftbutton:	equ	1
rightbutton:	equ	2
bothbuttons:	equ	3
**********************************
clearboth:
	move.l	seen,a0
	move.l	hiden,a1
	move.w	#15999,d0
cbl:
	move.w	#0,(a0)+
	move.w	#0,(a1)+
	dbf	d0,cbl
	rts
*************************************
sortfaces:
	movem.l	a0-a2,-(sp)
	move.w	(a0)+,d7	;number of em
	subq.w	#2,d7		;account for first centre z
sfl1:
	move	#-1,a5		;flag for noswaps
	move.l	a0,a6
	move.l	a6,a4
	move.w	d7,d6

	addq.l	#2,a6		;skip color word
	move.w	(a6)+,d5	;num of verts in face
	move.w	d5,d4
	addq.w	#1,d4		;for div
	moveq	#0,d1
sfl3a:
	move.w	(a6)+,d2
	asl.w	#3,d2		;*8
	add.w	4(a1,d2.w),d1	;add the z
	dbf	d5,sfl3a
	divs	d4,d1		;d1 has initial centre z
	ext.l	d1
sfl2:
	addq.l	#2,a6
	move.w	(a6)+,d5		;num of verts in face
	move.w	d5,d4
	addq.w	#1,d4			;for div
	moveq	#0,d3
sfl3:
	move.w	(a6)+,d2
	asl.w	#3,d2			;*8
	add.w	4(a1,d2.w),d3		;add the z
	dbf	d5,sfl3
	divs	d4,d3		;theres centre z
	ext.l	d3
	cmp.w	d1,d3
	bgt	swapcoords
	move.w	d3,d1
	addq.l	#2,a4		;other pointer into list (skip col)
	move.w	(a4)+,d0
	addq.w	#1,d0
	add.w	d0,d0
	add.w	d0,a4		;now pointing at next face
	dbf	d6,sfl2
	cmpi.w	#-1,a5
	bne	sfl1
	movem.l	(sp)+,a0-a2
	bra	aftersort

swapcoords:
	move.w	#1,a5
	move.l	a4,a3		;another copy
	move.w	2(a3),d0
	addq.w	#2,d0		;make up for color and num and -1
	lea	holdingpen,a2
swapl1:
	move.w	(a3)+,(a2)+
	dbf	d0,swapl1

	move.w	2(a3),d0
	addq.w	#2,d0		;make up for color and num and -1
swapl2:
	move.w	(a3)+,(a4)+
	dbf	d0,swapl2

	lea	holdingpen,a2
	move.w	2(a2),d0
	addq.w	#2,d0		;make up for color and num and -1
	move.l	a4,a3
swapl3:
	move.w	(a2)+,(a3)+
	dbf	d0,swapl3
	dbf	d6,sfl2

	bra	sfl1
holdingpen:	blk.w	20,0
thetainc:	dc.w	0
phiinc:	dc.w	0
rhoinc:	dc.w	0
clz:		dc.w	1500
mytheta:	dc.w	0
myphi:		dc.w	0
myrho:		dc.w	0
whichob:	dc.l	0
textpointer:	dc.l	0
text3d:
	dc.w	0,0,0		;xyz
	dc.w	1		;vel
lettersblock:
	blk.w	13*21,0
textspeed:
	dc.w	0
textstyle:
	dc.w	0
testwords:
	lea	bvpb,a5
	lea	text3d,a6
	cmpi.w	#0,textz(a6)
	ble	newline
	cmpi.w	#1,textstyle
	bne	ts2
	addq.w	#8,theta(a5)
ts2:
	cmpi.w	#2,textstyle
	bne	ts3
	add.w	#14,phi(a5)
ts3:
	cmpi.w	#3,textstyle
	bne	normal
	add.w	#10,rho(a5)
normal:
	moveq	#20,d7
	move.w	textspeed,d0
*	sub.w	d0,textvel(a6)
*	move.w	textvel(a6),d0
	sub.w	d0,textz(a6)	;move it away
	lea	lettersblock,a5
	move.w	texty(a6),d5
	move.w	textz(a6),d6
textloop:
	move.w	d5,oby(a5)
	move.w	d6,obz(a5)
	move.l	a5,whichob
	movem.l	d5-d7/a5,-(sp)
	bsr	dobefore
	movem.l	(sp)+,d5-d7/a5
	lea	13*2(a5),a5
	dbf	d7,textloop
	rts

newline:
	move.w	#0,theta(a5)
	move.w	#128,phi(a5)
	move.w	#0,rho(a5)
	move.w	#100,textvel(a6)
	move.w	#2500,textz(a6)
	move.l	textpointer,a0		;where we are in story
	lea	lettersblock,a1
	lea	letterslist,a2
	lea	numberslist,a4
	move.w	#-504,d2		;letters x
	moveq	#20,d0
newloop:
	moveq	#0,d1
	move.b	(a0)+,d1
	cmpi.w	#32,d1
	bne.s	normlet
	move.l	#blanklet,a3
	bra.s	spacelet
normlet:
	cmpi.w	#57,d1
	bgt.s	realnorm
	sub.w	#48,d1
	asl.w	#2,d1
	move.l	(a4,d1.w),a3
	bra.s	spacelet
realnorm:
	sub.w	#65,d1
	asl.w	#2,d1			;mult by 4
	move.l	(a2,d1.w),a3
spacelet:
	move.l	(a3)+,(a1)+
	move.w	d2,(a1)+
	addq.l	#2,a3		;x
	move.w	#0,(a1)+
	addq.l	#2,a3		;y
	move.w	#0,(a1)+
	addq.l	#2,a3		;z
	move.l	(a3)+,(a1)+
	move.l	(a3)+,(a1)+
	move.w	#filled,(a1)+
	addq.l	#2,a3
	move.w	(a3)+,(a1)+
	move.w	(a3)+,(a1)+
	move.w	(a3)+,(a1)+
	add.w	#48,d2
	dbf	d0,newloop
	moveq	#0,d0
	move.b	(a0)+,d0
	move.w	d0,textspeed
	moveq	#0,d0
	move.b	(a0)+,d0	;style byte
	move.w	d0,textstyle
	lea	textend,a1
	cmp.l	a1,a0
	blt	noreset
	lea	text,a0
noreset:
	move.l	a0,textpointer
	rts

text:
	DC.B	'          A          ',60,2
	DC.B	'           T         ',60,1
	DC.B	'          A          ',60,1
	DC.B	'           R         ',60,2
	DC.B	'          I          ',60,1
	dc.b	'         ATARI       ',60,0
	dc.b	' ARE PROUD TO PRESENT',60,0
	DC.B	'        THE NEW      ',60,0
	DC.B	'          STE        ',60,0
	DC.B	'      BETTER SOUND   ',60,0
	DC.B	'      MORE COLORS    ',60,0
	DC.B	'          AND        ',60,2
	DC.B	'        BLITTER      ',60,0
	DC.B	'      THE STE HAS    ',60,0
	DC.B	'  HARDWARE SCROLLING ',60,0
	DC.B	'     4096 COLORS     ',60,0
	DC.B	'AND STEREO DMA SOUND ',60,0
	DC.B	'         XXXX        ',60,1
	DC.B	'         XXXX        ',60,2
	DC.B	'         XXXX        ',60,3
textend:
even

dobefore:
	move.l	whichob,a5
	move.w	obx(a5),plx
	move.w	oby(a5),ply
	move.w	obz(a5),plz
drawobject:
	move.l	whichob,a3 	;Point to verticies
	tst.l	obviewpb(a3)
	bmi	dontbother
	bsr	init_vtrans
	move.l	whichob,a3 	;Point to verticies
	bsr	trans_vert	;Transform verticies
	move.l	whichob,a0
	lea	vtrans_vrt,a1	;list of transformed vertices
	lea	ptrans_vrt,a2	;list of onscreen coords
	move.w	linecolinfo(a0),linecolor
	cmpi.w	#dots,style(a0)
	beq	objectisdots
	cmpi.w	#balls,style(a0)
	beq	objectisballs
	move.w	hidenflag(a0),hdf
	move.l	a0,a3
	move.l	obfacelist(a0),a0
	tst.w	facesort(a3)
	bpl	sortfaces
aftersort:
	move.w	(a0)+,d0	;number of faces
	subq	#1,d0
tdloop:
	move.w	(a0)+,facecolor1
	move.w	(a0)+,numfacesave	;number of points in face
	tst.w	hdf
	bmi	pdt
	move.w	(a0),d2		;offset of face point
	move.w	2(a0),d3	;second point
	move.w	4(a0),d4	;third point

	lsl.w	#3,d2
	lsl.w	#3,d3
	lsl.w	#3,d4

	move.w	(a1,d3.w),d5	;get x2
	move.w	d5,kx
	sub.w	(a1,d2.w),d5	;x2-x1
	move.w	d5,px
	move.w	2(a1,d3.w),d5	;get y2
	move.w	d5,ky
	sub.w	2(a1,d2.w),d5	;y2-y1
	move.w	d5,py
	move.w	4(a1,d3.w),d5	;get z2
	move.w	d5,kz
	sub.w	4(a1,d2.w),d5	;z2-z1
	move.w	d5,pz

	move.w	(a1,d4.w),d5	;x3
	sub.w	(a1,d2.w),d5	;x3-x1
	move.w	2(a1,d4.w),d6	;y3
	sub.w	2(a1,d2.w),d6	;y3-y1
	move.w	4(a1,d4.w),d7	;z3
	sub.w	4(a1,d2.w),d7	;z3-z1

	move.w	d5,d1
	move.w	d6,d2
	move.w	d7,d3

	muls	py,d3
	muls	pz,d2
	sub.w	d2,d3
	move.w	d3,rx
	muls	pz,d1
	muls	px,d7
	sub.w	d7,d1
	move.w	d1,ry
	muls	px,d6
	muls	py,d5
	sub.w	d5,d6
	move.w	d6,rz

	moveq	#0,d1		;projection centre x
	sub.w	kx,d1
	moveq	#0,d2		;projection centre y
	sub.w	ky,d2
	moveq	#0,d3		;projection centre z
	sub.w	kz,d3
	muls	rx,d1
	muls	ry,d2
	muls	rz,d3
	add.l	d1,d2
	add.l	d2,d3
	ble	notvisible
pdt:
	move.w	numfacesave,d1
	move.l	whichob,a5
	cmpi.w	#filled,style(a5)
	beq	drawfilled
	move.w	(a0),d2
	asl.w	#2,d2		;*4 for offsett
	move.w	(a2,d2.w),x1s
	move.w	2(a2,d2.w),y1s
	subq.w	#1,d1
	bpl.s	visible
	addq.w	#1,d1
visible:
	move.w	(a0),d2
	asl.w	#2,d2		;*4 for offsett
	move.w	(a2,d2.w),x1
	move.w	2(a2,d2.w),y1
	move.w	2(a0),d2
	asl.w	#2,d2		;*4 for offsett
	move.w	(a2,d2.w),x2
	move.w	2(a2,d2.w),y2
	move.w	x2,x2s
	move.w	y2,y2s
	bsr	clipit
	addq.l	#2,a0
	dbf	d1,visible
	move.w	x1s,x1
	move.w	y1s,y1
	move.w	x2s,x2
	move.w	y2s,y2
	bsr	clipit
	addq.l	#2,a0
	dbf	d0,tdloop
	rts

drawfilled:
	move.w	facecolor1,surfacedfn	;color
*	move.w	facecolor2,surfacedfn+2
	lea	surfacevrt,a5
	move.w	d1,(a5)+		;number of points
dfloop:
	move.w	(a0)+,d2
	asl.w	#2,d2		;*4 for offsett
	move.w	(a2,d2.w),(a5)+
	move.w	2(a2,d2.w),(a5)+
	dbf	d1,dfloop
	bsr	draw_polygon3
	dbf	d0,tdloop
	rts

notvisible:
	move.w	numfacesave,d1
	addq.w	#1,d1
	add.w	d1,d1
	add.w	d1,a0	
	dbf	d0,tdloop
dontbother:
	rts


objectisballs:
	lea	ptrans_vrt,a1
	lea	vtrans_vrt,a2
	move.w	numdots(a0),d0		;number of em
	subq.w	#1,d0
oibl1:
	moveq	#-1,d7		;flag
	move.w	d0,d6		;counter
	move.l	a2,a6
	move.l	a1,a5
oibl2:
	move.w	4(a6),d1	;trans z
	cmp.w	12(a6),d1	;trans z
	blt	swapball
	addq.l	#8,a6
	addq.l	#4,a5
	dbf	d6,oibl2
	tst.w	d7
	bpl	oibl1
	bra.s	drawballs
	rts

swapball:
	moveq	#1,d7
	move.w	(a5),d3		;get x
	move.w	2(a5),d4
	move.w	4(a5),(a5)
	move.w	6(a5),2(a5)
	move.w	d3,4(a5)
	move.w	d4,6(a5)

	move.w	12(a6),4(a6)
	move.w	d1,12(a6)

	addq.l	#4,a5
	addq.l	#8,a6
	dbf	d6,oibl2
	bra	oibl1

drawballs:
	addq.w	#1,d0		;counter
dbloop:
	move.w	4(a2),d1
	cmp.w	#1000,d1
	bgt.s	dba
*	lea	ballsp0,a0
	bra.s	drawball
dba:
	cmp.w	#2000,d1
	bgt.s	dbb
*	lea	ballsp1,a0
	bra.s	drawball
dbb:
*	lea	ballsp2,a0
drawball:
	addq.l	#8,a2
	move.w	(a1)+,cspritex(a0)
	move.w	(a1)+,cspritey(a0)
	movem.l	d0/a1,-(sp)
*	bsr	drawclipped
	movem.l	(sp)+,d0/a1
	dbf	d0,dbloop
	rts



objectisdots:
	move.w	#12,pixelcolor
	lea	ptrans_vrt,a1	;list of onscreen coords
	lea	vtrans_vrt,a2
	move.w	plz,d1
	move.w	numdots(a0),d0	;get the number of points
	subq.w	#1,d0
	tst.w	hidenflag(a0)
	bmi	nohides
dotloop:
	cmp.w	4(a2),d1
	blt	nopl
	tst.w	4(a2)
	bmi	nono
	addq.l	#8,a2
	move.w	#12,pixelcolor
	move.w	(a1)+,pixelx
	move.w	(a1)+,pixely
	bsr	singleplot
	dbf	d0,dotloop
	rts
nopl:
	addq.l	#8,a2
	move.w	#13,pixelcolor
	move.w	(a1)+,pixelx
	move.w	(a1)+,pixely
	bsr	singleplot
	dbf	d0,dotloop
	rts
nono:	addq.l	#4,a1
	addq.l	#8,a2
	dbf	d0,dotloop
	rts


nohides:
	move.w	(a1)+,pixelx
	move.w	(a1)+,pixely
	bsr	singleplot
	dbf	d0,nohides
	rts

kx:	dc.w	0
px:	dc.w	0
ky:	dc.w	0
py:	dc.w	0
kz:	dc.w	0
pz:	dc.w	0
rx:	dc.w	0
ry:	dc.w	0
rz:	dc.w	0
hdf:		dc.w	0
numfacesave:	dc.w	0
facepoints:	dc.w	0
facecolor1:	dc.w	0
facecolor2:	dc.w	0
cxmin:		equ	0
cxmax:		equ	319
cymin:		equ	22
cymax:		equ	199-23
cbits:	blk.w	1,0
cbits2:	blk.w	1,0
xsav:	blk.w	1,0
ysav:	blk.w	1,0
*/**//*/*//*//*/*//*//*/*/*//*/*/*/*//*/*/*/*//*//*//*///*/*/
bitcode:clr.l   d4
        cmpi.w  #cxmin,d0
        bge     b1
        or.b    #8,d4
b1:     cmpi.w  #cxmax,d0
        ble     b2
        or.b    #4,d4
b2:     cmpi.w  #cymin,d1
        bge     b3
        or.b    #1,d4
b3:     cmpi.w  #cymax,d1
        ble     b4
        or.b    #2,d4
b4:     move.w  d4,cbits
        rts
*****
bitc2:   clr.l   d5
        cmpi.w  #cxmin,d2
        bge     b5
        or.b    #8,d5
b5:     cmpi.w  #cxmax,d2
        ble     b6
        or.b    #4,d5
b6:     cmpi.w  #cymin,d3
        bge     b7
        or.b    #1,d5
b7:     cmpi.w  #cymax,d3
        ble     b8
        or.b    #2,d5
b8:     move.w  d5,cbits2
        rts
********************************************************
clipit:
	movem.l	d0-d7/a0,-(sp)
	move.w	x1,d0
	move.w	y1,d1
	move.w	x2,d2
	move.w	y2,d3

	bsr     bitcode
        bsr     bitc2
clipit2:or.b    d4,d5
        tst.b   d5
        beq     cliphome        ;finish if
        move.w  cbits,d4
        move.w  d2,xsav
        move.w  d3,ysav
        move.w  cbits2,d5
clip1:  and.b   d4,d5
        tst.b   d5
        bgt     clipb           ;home if line completely out
        move.w  cbits,d4
        move.w  cbits2,d5
        sub.w   d0,d2           ;d1 has dx
        move.w  d2,dx
        sub.w   d1,d3           ;d3 has dy
        move.w  d3,dy
        move.w  xsav,d2
        move.w  ysav,d3
        tst.w   d4
        beq     clip2   	;if x1<xmin
        cmpi.w  #cxmin,d0 	;y1=y1+dy*(xmin-x1)/dx
        bge     c1      
        move.w  #cxmin,d7         ;put xmin in d7
        sub.w   d0,d7
        muls    dy,d7           ;multiply by dy
        divs    dx,d7
        add.w   d1,d7
        move.w  d7,d1
        move.w  #cxmin,d0         ;x1=xmin
        bra     c4
c1:     cmpi.w  #cxmax,d0         ;if x1>xmax
        ble     c2              ;y1=y1+dy*(xmax-x1)/dx
        move.w  #cxmax,d7         ;put xmax in d7
        sub.w   d0,d7
        muls    dy,d7           ;multiply by dy
        divs    dx,d7
        add.w   d1,d7
        move.w  d7,d1
        move.w  #cxmax,d0         ;x1=xmax
        bra     c4
c2:     cmpi.w  #cymin,d1         ;if y1<ymin
        bge     c3
        move.w  #cymin,d7         ;put ymin in d7
        sub.w   d1,d7
        muls    dx,d7           ;multiply by dx
        divs    dy,d7
        add.w   d0,d7
        move.w  d7,d0
        move.w  #cymin,d1         ;y1=ymin
        bra     c4
c3:     cmpi.w  #cymax,d1         ;if y1>xmax
        ble     c4
        move.w  #cymax,d7         ;put ymax in d7
        sub.w   d1,d7
        muls    dx,d7           ;multiply by dy
        divs    dy,d7
        add.w   d0,d7
        move.w  d7,d0
        move.w  #cymax,d1         ;y1=ymax
c4:     bsr     bitcode
        bra     cliploop
******
clip2:  cmpi.w  #cxmin,d2 ;	y1=y1+dy*(xmin-x1)/dx
        bge     cc1     
        move.w  #cxmin,d7         ;put xmin in d7
        sub.w   d2,d7
        muls    dy,d7           ;multiply by dy
        divs    dx,d7
        add.w   d3,d7
        move.w  d7,d3
        move.w  #cxmin,d2         ;x2=xmin
        bra     cc4
cc1:    cmpi.w  #cxmax,d2         ;if x2>xmax
        ble     cc2
        move.w  #cxmax,d7         ;put xmax in d7
        sub.w   d2,d7
        muls    dy,d7           ;multiply by dy
        divs    dx,d7
        add.w   d3,d7
        move.w  d7,d3
        move.w  #cxmax,d2         ;x1=xmax
        bra     cc4
cc2:    cmpi.w  #cymin,d3         ;if y1<ymin
        bge     cc3
        move.w  #cymin,d7         ;put ymin in d7
        sub.w   d3,d7
        muls    dx,d7           ;multiply by dx
        divs    dy,d7
        add.w   d2,d7
        move.w  d7,d2
        move.w  #cymin,d3         ;y1=ymin
        bra     cc4
cc3:    cmpi.w  #cymax,d3         ;if y1>xmax
        ble     cc4
        move.w  #cymax,d7         ;put ymax in d7
        sub.w   d3,d7
        muls    dx,d7           ;multiply by dy
        divs    dy,d7
        add.w   d2,d7
        move.w  d7,d2
        move.w  #cymax,d3         ;y1=ymax
cc4:    bsr     bitc2
        bra     cliploop

cliploop:
        bra     clipit2
cliphome:
        move.w  d0,x1
        move.w  d1,y1
        move.w  d2,x2
        move.w  d3,y2
	bsr	myline
	movem.l	(sp)+,d0-d7/a0
	rts
clipb:
	movem.l	(sp)+,d0-d7/a0
	rts
*********************************************************
linecolor:
	blk.w	1,0
***********************************************
*	lets plot a fucking line
*	but lets do it fast
*	first some conventions
*	draws line on hiden screen
*	between x1,y1,x2,y2 
***********************************************
myline:
*	movem.l	d4-d7/a0,-(sp)
calcdx:
	move.w	x2,d0
	sub.w	x1,d0	;x2-x1
	move.w	d0,dx	;d0 is dx
	bpl	calcdy
	neg	d0
calcdy:
	move.w	y2,d1
	sub.w	y1,d1	;y2-y1	
	move.w	d1,dy	;d6 is dy
	bpl	cmparedxdy
	neg	d1
cmparedxdy:
	cmp.w	d0,d1
	bgt	ymajor	;if dy is greater then ymajor
xmajor:
*	tst.w	dy
*	beq	horizontal	;special case
	tst.w	dx
	bpl	noswapx
	move.w	x2,d0
	move.w	x1,x2
	move.w	d0,x1
	move.w	y2,d0
	move.w	y1,y2
	move.w	d0,y1
	neg	dx
	neg	dy
noswapx:
	moveq	#0,d0
	move.w	dx,d0
	divs	dy,d0
	bmi	xpositive

xnegative:
	move.l	hiden,a0	;screen ad
	move.w	dx,d0
	move.w	d0,d7	;counter is d7
	subq.w	#1,d7
	asr.w	#1,d0	;div by 2
	move.w	d0,d6	;dump is d6
	move.w	x1,d0	;will hold bitpattern
	move.w	d0,d2
	move.w	y1,d1
	lsl.w	#5,d1	;mult y by 128
	adda.w	d1,a0	;add it to screen address
	lsl.w	#2,d1	;mult by 32 makes mult by 160
	adda.w	d1,a0	;a0 now has start screen address
	and.w	#$fff0,d0	;mask off last 4 bits gives word across
	lsr.w	#1,d0
	add.w	d0,a0
	moveq	#0,d4
	tst.w	d7
	bmi	specxneg
	move.w	d2,d3
	and.w	#15,d3
	bne	xmnloop
	subq.l	#8,a0
xmnloop:
	move.w	d2,d3
	and.w	#15,d3
	bne	xmnla
	bsr	putlinein
	moveq	#0,d4
	addq.l	#8,a0
xmnla:	sub.w	#15,d3
	neg	d3
	bset	d3,d4
	sub.w	dy,d6	;sub dy from dump
	bpl	xmn
	add.w	dx,d6
	bsr	putlinein
	adda.l	#160,a0		;moveit to next line
	moveq	#0,d4
xmn:
	addq.w	#1,d2
	dbf	d7,xmnloop
specxneg:
	move.w	d2,d3
	and.w	#15,d3
	bne	spct1
	rts
spct1:	sub.w	#15,d3
	neg	d3
	bset	d3,d4
	bsr	putlinein
	rts

putlinein:
	move.w	d4,d5
	eor.w	#$ffff,d5
	and.w	d5,(a0)		;clearout old pixels
	and.w	d5,2(a0)
	and.w	d5,4(a0)
	and.w	d5,6(a0)
	move.w	linecolor,d5
plane1:
	btst	#0,d5
	beq	plane2
	or.w	d4,(a0)
plane2:
	btst	#1,d5
	beq	plane3
	or.w	d4,2(a0)
plane3:
	btst	#2,d5
	beq	plane4
	or.w	d4,4(a0)
plane4:
	btst	#3,d5
	beq	plane5
	or.w	d4,6(a0)
plane5:
	rts

xpositive:
	move.l	hiden,a0	;screen ad
	move.w	dx,d0
	move.w	d0,d7	;counter is d7
	subq.w	#1,d7
	asr.w	#1,d0	;div by 2
	move.w	d0,d6	;dump is d6
	move.w	x1,d0	;will hold bitpattern
	move.w	d0,d2
	move.w	y1,d1
	lsl.w	#5,d1	;mult y by 128
	adda.w	d1,a0	;add it to screen address
	lsl.w	#2,d1	;mult by 32 makes mult by 160
	add.w	d1,a0	;a0 now has start screen address
	and.w	#$fff0,d0	;mask off last 4 bits gives word across
	lsr.w	#1,d0
	add.w	d0,a0
	moveq	#0,d4
	move.w	d2,d3
	and.w	#15,d3
	bne	xmploop
	subq.l	#8,a0
xmploop:
	move.w	d2,d3
	and.w	#15,d3
	bne	xmpla
	bsr	putlinein
	moveq	#0,d4
	addq.l	#8,a0
xmpla:	sub.w	#15,d3
	neg	d3
	bset	d3,d4
	add.w	dy,d6	;sub dy from dump
	bpl	xmp
	add.w	dx,d6
	bsr	putlinein
	moveq	#0,d4
	suba.l	#160,a0		;moveit to next line
xmp:
	addq.w	#1,d2
	dbf	d7,xmploop
	move.w	d2,d3
	and.w	#15,d3
	bne	spct2
	rts
spct2:	sub.w	#15,d3
	neg	d3
	bset	d3,d4
	bsr	putlinein
	rts

ymajor:
	tst.w	dy
	bpl	noswapy
	move.w	x2,d0
	move.w	x1,x2
	move.w	d0,x1
	move.w	y2,d0
	move.w	y1,y2
	move.w	d0,y1
	neg	dx
	neg	dy
noswapy:
	moveq	#0,d0
	move.w	dy,d0
	divs	dx,d0
	bmi	ypositive
ynegative:
	tst.w	dx
	beq	straightup1	;special case vertical line
	move.l	hiden,a0	;screen ad
	move.w	dy,d0
	move.w	d0,d7	;counter is d7
*	subq.w	#1,d7
	asr.w	#1,d0	;div by 2
	move.w	d0,d6	;dump is d6
	move.w	x1,d0	;will hold bitpattern
	move.w	d0,d3
	move.w	y1,d1
	move.w	d1,d2
	lsl.w	#5,d1	;mult y by 128
	adda.w	d1,a0	;add it to screen address
	lsl.w	#2,d1	;mult by 32 makes mult by 160
	add.w	d1,a0	;a0 now has start screen address
	and.w	#$fff0,d0	;mask off last 4 bits gives word across
	lsr.w	#1,d0
	add.w	d0,a0
	move.w	d3,d0	;x
	moveq	#0,d4
	move.w	d0,d3
	and.w	#15,d3
	move.w	#$8000,d4
	lsr.w	d3,d4
ymnloop:
	bsr	putlinein
	add.w	#160,a0		;y+1
	sub.w	dx,d6		;sub dy from dump
	bpl	ymn
	add.w	dy,d6
	addq.w	#1,d0		;x+1
	move.w	d0,d3
	and.w	#15,d3
	bne	ymnla
	addq.l	#8,a0
ymnla:	move.w	#$8000,d4
	lsr.w	d3,d4
ymn:
	dbf	d7,ymnloop
*	movem.l	(sp)+,d4-d7/a0
	rts

ypositive:
	tst.w	dx
	beq	straightup	;special case vertical line
	move.l	hiden,a0	;screen ad
	move.w	dy,d0
	move.w	d0,d7	;counter is d7
	subq.w	#1,d7
	asr.w	#1,d0	;div by 2
	move.w	d0,d6	;dump is d6
	move.w	x1,d0	;will hold bitpattern
	move.w	d0,d3
	move.w	y1,d1
	move.w	d1,d2
	lsl.w	#5,d1	;mult y by 128
	adda.w	d1,a0	;add it to screen address
	lsl.w	#2,d1	;mult by 32 makes mult by 160
	add.w	d1,a0	;a0 now has start screen address
	and.w	#$fff0,d0	;mask off last 4 bits gives word across
	lsr.w	#1,d0
	add.w	d0,a0
	move.w	d3,d0	;x
	moveq	#0,d4
*	move.w	d0,d3
	and.w	#15,d3
	move.w	#$8000,d4
	lsr.w	d3,d4

ymploop:
	bsr	putlinein
	add.w	#160,a0	;y+1
	add.w	dx,d6	;sub dy from dump
	bpl	ymp
	add.w	dy,d6
	subq.w	#1,d0	;x+1
	move.w	d0,d3
	and.w	#15,d3
	cmpi.w	#15,d3
	bne	ympla
	subq.l	#8,a0
ympla:	move.w	#$8000,d4
	lsr.w	d3,d4
ymp:
	dbf	d7,ymploop
*	movem.l	(sp)+,d4-d7/a0
	rts

straightup:
	move.l	hiden,a0	;screen ad
	move.w	dy,d7
	move.w	x1,d0	;will hold bitpattern
	move.w	d0,d3
	move.w	y1,d1
	lsl.w	#5,d1	;mult y by 128
	adda.w	d1,a0	;add it to screen address
	lsl.w	#2,d1	;mult by 32 makes mult by 160
	add.w	d1,a0	;a0 now has start screen address
	and.w	#$fff0,d0	;mask off last 4 bits gives word across
	lsr.w	#1,d0
	add.w	d0,a0	;now a0 is ready
	moveq	#0,d4
	and.w	#15,d3
	move.w	#$8000,d4
	lsr.w	d3,d4	;d4 has proper bit pattern
	add.l	#160,a0
	addq.w	#1,d7
stuploop:
	bsr	putlinein
	add.l	#160,a0
	dbf	d7,stuploop
*	movem.l	(sp)+,d4-d7/a0
	rts	

straightup1:
	move.l	hiden,a0	;screen ad
	move.w	dy,d7
	move.w	x1,d0	;will hold bitpattern
	move.w	d0,d3
	move.w	y1,d1
	lsl.w	#5,d1	;mult y by 128
	adda.w	d1,a0	;add it to screen address
	lsl.w	#2,d1	;mult by 32 makes mult by 160
	add.w	d1,a0	;a0 now has start screen address
	and.w	#$fff0,d0	;mask off last 4 bits gives word across
	lsr.w	#1,d0
	add.w	d0,a0	;now a0 is ready
	moveq	#0,d4
	and.w	#15,d3
	move.w	#$8000,d4
	lsr.w	d3,d4	;d4 has proper bit pattern
	add.l	#160,a0
	addq.w	#1,d7
stuploop1:
	bsr	putlinein
	sub.l	#160,a0
	dbf	d7,stuploop
*	movem.l	(sp)+,d4-d7/a0
	rts	


dump:	blk.w	1,0
gradient:	blk.w	1,0
x1:	blk.w	1,0
x2:	blk.w	1,0
y1:	blk.w	1,0
y2:	blk.w	1,0
dx:	blk.w	1,0
dy:	blk.w	1,0
plx:	dc.w	0
ply:	dc.w	0
plz:	dc.w	0
myviewx:	dc.w	0
myviewy:	dc.w	0

***************************************************************************
*		TRANSFORM A LIST OF VERTICIES
*		On entry,   d6 = number of verticies
*			    a3 = pointer to verticies
*		On exit , a0 = pointer to transformed verticies
*	Transform a list of verticies in 3-D space according to the
* 	viewing transformation.
trans_vert:
	lea.l	vtrans_vrt,a1	;Point to vertex tables
	lea.l	ptrans_vrt,a0
	move.l	a0,-(SP)
	move.l	obviewpb(a3),a5
	move.l	obvert(a3),a3
	move.w	(a3)+,d6	;get number of verts
	subq	#1,d6		;Pre-decrement vertex counter
trans_vert0:
	move	(a3)+,d0		;Get x-coordinate of vertex
	move	(a3)+,d1	;Get y-coordinate
	move	(a3)+,d2	;Get z-coordinate
	bsr	view_trans	;Apply view transformatrmed coordinates
	add.w	plx,d3
	add.w	ply,d4
	add.w	plz,d5
	add.w	myviewx,d3
	add.w	myviewy,d4
	move.w	d3,(a1)+
	move	d4,(a1)+
	cmpi.w	#zclip,d5
	bgt	zok
	move.w	#zclip,d5
zok:	move	d5,(a1)+
	addq.l	#2,a1
okz:	bsr	prsp_trans	;Apply perspective transformation
	move	d3,(a0)+	;Save transformed x-coordinate		
	move	d4,(a0)+	;Save transformed y-coordinate
	dbf	d6,trans_vert0
	move.l	(SP)+,a0	;Restore transformed vertex pointer
	rts

*******************************
*		VIEW TRANSFORM ON A VERTEX
*		On entry, d0 = x-coordinate of vertex
*			  d1 = y-coordinate of vertex
*			  d2 = z-coordinate of vertex
*		On exit , d3 = x-coordinate view transformed
*			  d4 = y-coordinate view transformed
*			  d5 = z-coordinate view transformed
*	Apply the view transform to a vertex.
view_trans:
	move.w	d0,d3			;get x
	muls	c_theta(a5),d3
	move.w	d1,d4			;get y
	muls	s_theta(a5),d4
	add.l	d4,d3
	swap	d3
	rol.l	#1,d3			;thats	x
	move.w	d1,d4			;get y
	muls	c_theta(a5),d4
	muls	s_theta(a5),d0		;x
	sub.l	d0,d4
	swap	d4
	rol.l	#1,d4			;thats	y
	move.w	d4,d1			;x
	move.w	d3,d0			;y

	move.w	d1,d3			;get y
	muls	c_phi(a5),d3
	move.w	d2,d4			;get z
	muls	s_phi(a5),d4
	add.l	d4,d3
	swap	d3
	rol.l	#1,d3			;thats	y
	move.w	d2,d4			;thats z
	muls	c_phi(a5),d4
	muls	s_phi(a5),d1		;y
	sub.l	d1,d4
	swap	d4
	rol.l	#1,d4			;thats	z
	move.w	d4,d2			;y

	move.w	d0,d4			;x
	muls	c_rho(a5),d4
	move.w	d2,d5
	muls	s_rho(a5),d5		;z
	sub.l	d5,d4
	swap	d4
	rol.l	#1,d4			;thats	x
	move.w	d4,d5
	muls	s_rho(a5),d0
	muls	c_rho(a5),d2
	add.l	d0,d2
	swap	d2
	rol.l	#1,d2		;thats	z
	move.w	d2,d5
	move.w	d3,d7
	move.w	d4,d3
	move.w	d7,d4
	rts

worldview_trans:
	tst.w	theta(a5)
	beq	skiptheta
	move.w	d0,d3			;get x
	muls	c_theta(a5),d3
	move.w	d1,d4			;get y
	muls	s_theta(a5),d4
	add.l	d4,d3
	swap	d3
	rol.l	#1,d3			;thats	y
	move.w	d1,d4			;get y
	muls	c_theta(a5),d4
	muls	s_theta(a5),d0		;x
	sub.l	d0,d4
	swap	d4
	rol.l	#1,d4			;thats	x
	move.w	d4,d1			;x
	move.w	d3,d0			;y

skiptheta:
	tst.w	rho(a5)
	beq	skiprho
	move.w	d0,d4			;x
	muls	c_rho(a5),d4
	move.w	d2,d5
	muls	s_rho(a5),d5		;z
	sub.l	d5,d4
	swap	d4
	rol.l	#1,d4			;thats	z
	move.w	d4,d7
	move.w	d0,d4
	muls	s_rho(a5),d4
	move.w	d2,d3
	muls	c_rho(a5),d3
	add.l	d4,d3
	swap	d3
	rol.l	#1,d3		;thats	x
	move.w	d3,d2
	move.w	d7,d0
skiprho:
	tst.w	phi(a5)
	beq	skipphi
	move.w	d1,d3			;get y
	muls	c_phi(a5),d3
	move.w	d2,d4			;get z
	muls	s_phi(a5),d4
	add.l	d4,d3
	swap	d3
	rol.l	#1,d3			;thats	z
	move.w	d2,d4			;thats z
	muls	c_phi(a5),d4
	muls	s_phi(a5),d1		;y
	sub.l	d1,d4
	swap	d4
	rol.l	#1,d4			;thats	y
	move.w	d4,d2			;y
	move.w	d3,d1
skipphi:
	move.w	d0,d3
	move.w	d1,d4
	move.w	d2,d5
	rts
***************************************************************************
*		PERSPECTIVE TRANSFORM
*		On entry, d3 = view transformed x-coordinate
*			  d4 = view transformed y-coordinate
*			  d5 = view transformed z-coordinate
*		On exit , d3 = screen x-coordinate ( Xe )
*			  d4 = screen y-coordinate ( Ye )
*	Calculate the screen coordinates of the vertex. The coordinates are
* centered about the centre of the screen.
*	Note, the distance to the screen is 2048.

prsp_trans:
	swap	d3		;Calculate Xs
	clr	d3		
	asr.l	#8,d3	  
*	asr.l	#1,d3
	divs	d5,d3
	
	swap	d4		;Calculate Ys
	clr	d4
	asr.l	#8,d4
*	asr.l	#1,d4
	divs	d5,d4

	add	#159,d3		;Adjust for centre of screen
	add	#99,d4
	rts

***************************************************************************
*		INITIALISE VIEW TRANSFORM
*	Initialise the viewing transformation.
*	expects	address of object data in a5
init_vtrans:
	move.l	obviewpb(a5),a5
	move	theta(a5),d3		;Calculate SIN amd COS theta
	bsr	trig
	move	d4,s_theta(a5)
	move	d5,c_theta(a5)
	
	move	phi(a5),d3	;Calculate SIN and COS phi
	bsr	trig
	move	d4,s_phi(a5)
	move	d5,c_phi(a5)

	move	rho(a5),d3	;Calculate Vl
	bsr	trig
	move.w	d4,s_rho(a5)
	move.w	d5,c_rho(a5)
	rts

***************************************************************************
*		CALCULATE SINE AND COSINE OF ANGLE
*		On entry, d3 = angle
*		On exit ,   d4 = sine of angle
*			    d5 = cosine of angle
*	Find the sine and cosine of an angle.

trig:	addi.w	#$40,d3		;Find cCOS of angle
	bsr	find_sin
	move	d4,d5
	subi.w	#$40,d3		;Find SIN of angle
	bsr	find_sin
	rts

***************************************************************************
*		FIND SINE OF AN ANGLE
*		On entry, d3 = angle
*		On exit ,   d5 = cosine of angle 
*	Find the cosine of an angle. The value of the sign is a 16 bit
* signed number.
*	Note, to scale down, divide by 15 bits, ie &8000.
find_cos:
	move	d4,-(SP)	;Save SIN
	move	d3,-(SP)	;Save angle
	addi.w	#$40,d3		;Find COS of angle
	bsr	find_sin
	move	d4,d5
		
	move	(SP)+,d3	;Restore angle
	move	(SP)+,d4	;Restore SIN
		
	rts	

***************************************************************************
*		FIND THE SIN OF AN ANGLE
*		On entry, d3 = angle
*		On exit ,   d4 = SIN of angle
*	Find the SIN of an angle. The value of the sign is a 16 bit
* signed number.
*	Note, to scale down, divide by 15 bits, ie &8000.

find_sin:
	move	d3,-(SP)	;Save angle	

	and.l	#$7F,d3		;Move to quadrants 1 and 2
	btst	#6,d3		;Test if in 1st quadrant
	beq	quad0		;Branch if in 1st quadrant
	bclr	#6,d3		;Reflect angle into 1st quadrant
	subi.b	#$3F,d3
	neg.b	d3
		
quad0:	asl	#1,d3		;Get value of SIN from table
	lea.l	sin_vt,a6
	move	0(a6,d3),d4
		
	move	(SP)+,d3

	btst	#7,d3		;Adjust value if 3rd or 4th quadrant
	beq	quad1
	neg	d4		;Negate SIN value
		
quad1:	rts

***************************************************************************
*		SIN LOOK UP TABLE
*	This is the SIN value look up table. Values for the 1st quadrant
* are given only. The values range from 0 - 32758 for angles 0 - 63.
* Thus, the value of a sine in the 1st quadrant is a 15 bit number.
* Therefore, the table can be used to construct a 16 bit signed value of
* SIN for angles 0 - 255.

sin_vt:	dc.w	0,804,1608,2411
	dc.w	3212,4011,4808,5602
	dc.w	6393,7180,7962,8740
	dc.w	9512,10279,11039,11793
	dc.w	12540,13279,14010,14733
	dc.w	15447,16151,16846,17531
	dc.w	18205,18868,19520,20160
	dc.w	20788,21403,22006,22595
	dc.w	23170,23732,24279,24812
	dc.w	25330,25832,26320,26791
	dc.w	27246,27684,28106,28511
	dc.w	28899,29269,29622,29957
	dc.w	30274,30572,30853,31114
	dc.w	31357,31581,31786,31972
	dc.w	32138,32286,32413,32522
	dc.w	32610,32679,32729,32758

clear:	dc.w	1
****************************************
keyboard:
        move.w  #$ff,-(sp)
        move.w  #6,-(sp)
        trap    #1
        addq.l  #4,sp
        tst.l   d0
        beq     keyback
        swap    d0
quit:   cmpi.w  #$10,d0
        bne     spaceb
        bra     gem
spaceb:
	cmpi.w	#$39,d0
	bne	keyback
	bra	pause
keyback:rts

mcontrol:	dc.w	-1
obcounter:	dc.l	0
letterslist:
	dc.l	lettera,letterb,letterc,letterd,lettere,letterf
	dc.l	letterg,letterh,letteri,letterj,letterk,letterl
	dc.l	letterm,lettern,lettero,letterp,letterq,letterr
	dc.l	letters,lettert,letteru,letterv,letterw,letterx
	dc.l	lettery,letterz
numberslist:
	dc.l	lettero,letteri,letter2,letter3,letter4,letter5,letter6
	dc.l	letter7,letter8,letter9

*****************************
pause:  
        move.w  #$ff,-(sp)
        move.w  #6,-(sp)
        trap    #1
        addq.l  #4,sp
        tst.l   d0
        beq     pause
        swap    d0
        cmpi.w  #$1e,d0
        bne     keyback 
        bsr     gkey
        cmpi.w  #$32,d0
        bne     keyback
        bsr     gkey
        cmpi.w  #$1e,d0
        bne     keyback
        bsr     gkey
        cmpi.w  #$31,d0
        bne     keyback
        bsr     gkey
        cmpi.w  #$20,d0
        bne     keyback
        bsr     gkey
        cmpi.w  #$1e,d0
        bne     keyback
	move.w	#1,cheat
	rts

gkey:
        move.w  #$ff,-(sp)
        move.w  #6,-(sp)
        trap    #1
        addq.l  #4,sp
        tst.l   d0
        beq     gkey
        swap    d0
        rts
gkey2:
	movem.l	d1-d7/a0-a6,-(sp)
gk3:    move.w  #$ff,-(sp)
        move.w  #6,-(sp)
        trap    #1
        addq.l  #4,sp
        tst.l   d0
        beq     gk3
	swap    d0
*	bsr	fitcode
	movem.l	(sp)+,d1-d7/a0-a6
        rts
cheat:	dc.w	-1


***********************************
mydocolors:
	move.l	#$ff8240,a1
	moveq	#15,d0
mdcloop:
	move.w	(a0)+,(a1)+
	dbf	d0,mdcloop
	rts

************get screen address***************
getscrn:move.w  #2,-(sp)
        trap    #14
        addq.l  #2,sp
        move.l  d0,screen
        move.l  d0,screen1
        move.l  d0,screen2
        subi.l  #$8000,screen2
        move.l  screen1,seen
        move.l  screen2,hiden
	move.l	screen2,screen3
	subi.l	#$8000,screen3
	move.l	screen3,generalstore
	subi.l	#100000,generalstore
	move.l	#ytable2,ytable
	move.l	#ytable1,sytable
	rts
screen1:	dc.l	0
screen2:	dc.l	0
screen3:	dc.l	0
generalstore:	dc.l	0
seen:	dc.l	0
hiden:	dc.l	0
screen:	dc.l	0


********************************************
* Atari ST hi-speed plotting subroutine    *
* For Low-resolution mode only		   *
********************************************
plotinit:
	move.l	seen,a0		;screen addr in A0
	move.b	#200,d1		;200 Y positions
	lea	ytable1,a1	;y table address in A1

iloop:
	move.l	a0,(a1)+	;move address to table
	adda.w	#160,a0		;increment address
	subq.b	#1,d1		;1 less y position
	bne	iloop		;loop if there's more!

	move.l	hiden,a0	;screen addr in A0
	move.b	#200,d1		;200 Y positions
	lea	ytable2,a1	;y table address in A1

iloop2:
	move.l	a0,(a1)+	;move address to table
	adda.w	#160,a0		;increment address
	subq.b	#1,d1		;1 less y position
	bne	iloop2		;loop if there's more!
	rts

pixelx:	blk.w	1,0
pixely:	blk.w	1,0
pixelcolor:
	blk.w	1,0
ytable1:	blk.l	200,0
ytable2:	blk.l	200,0
ytable:		blk.l	1,0
sytable:	blk.l	1,0
**********************************************
singleplot:
	movem.l	d0-d5/a0-a1,-(sp)
	move.w	pixelx,d0      ;x coordinate in D0
	cmp.w	#cxmax,d0
	bgt	pltxit
	cmpi.w	#cxmin,d0
	blt	pltxit
	move.w	d0,d3         ;duplicate in D3
	andi.w	#15,d3        ;mask off lower 4 bits
	move.w	pixely,d1      ;get y coordinate,
	cmp.w	#cymax,d1
	bgt	pltxit
	cmpi.w	#cymin,d1
	blt	pltxit
	lsl.w	#2,d1          ;mult by 4 for index
	move.w	pixelcolor,d2      ;get color number

	lsr.w	#1,d0             ;x coord / 2
	and.w	#$00f8,d0      ;strip lower 3 bits
	move.w	d0,a0        ;move x offset to A0
	move.l	sytable,a1   ;get y table addr
	adda.l	(a1,d1.w),a0 ;got final pixel addr!

	move.w #$8000,d4     ;set ON pixel mask
	lsr.w d3,d4          ;shift right D3 times
	move.w	d4,d5

myphere:
	move.w	d5,d0
	tst.w	d2
	beq	clearpix
	move.w	(a0),d3
	or.w	2(a0),d3
	or.w	4(a0),d3
	or.w	6(a0),d3
	eor.w	#-1,d3
	and.w	d3,d5
	cmp.w	d0,d5
	bne	pltxit
	eor.w	#-1,d5
	and.w d5,(a0)        ;turn off old pixel
	and.w d5,2(a0)       ;(both longwords)
	and.w d5,4(a0)       ;(both longwords)
	and.w d5,6(a0)       ;(both longwords)

******************************
* Now turn on the new pixel! *
******************************
	btst #0,d2           ;set the bit?
	beq bit2             ;no!
	or.w d4,(a0)         ;turn it on!
bit2:
	btst #1,d2           ;set it?
	beq bit4             ;no!
	or.w d4,2(a0)        ;turn it on!
bit4:
	btst #2,d2           ;set bit?
	beq bit8             ;no!
	or.w d4,4(a0)        ;turn it on!
bit8:
	btst #3,d2           ;set bit?
	beq pltxit           ;no, exit.
	or.w d4,6(a0)        ;turn it on!
pltxit:
	movem.l	(sp)+,d0-d5/a0-a1
	rts                  ;bye!
pltxit2:
	movem.l	(sp)+,d0-d5/a0-a1
	moveq	#-1,d0
	rts                  ;bye!

clearpix:
	move.w	(a0),d3
	eor.w	#-1,d3
	and.w	d3,d5
	eor.w	#-1,d5
	and.w d5,(a0)        ;turn off old pixel
	and.w d5,2(a0)       ;(both longwords)
	and.w d5,4(a0)       ;(both longwords)
	and.w d5,6(a0)       ;(both longwords)
	movem.l	(sp)+,d0-d5/a0-a1
	rts                  ;bye!

flip_scr:
	move.l	seen,d1
	move.l	d1,d2
	add.l	#4000,d1
	add.l	#20000,d2
skloop:
	move.l	#$ff8205,a0
	moveq	#0,d0
	move.b	(a0),d0
	asl.l	#8,d0
	addq.l	#2,a0
	move.b	(a0),d0
	asl.l	#8,d0
	addq.l	#2,a0
	move.b	(a0),d0
	cmp.l	d1,d0
	blt.s	skloop
	cmp.l	d2,d0
	bgt.s	skloop
	move.l  seen,A6
        move.l  hiden,seen
        move.l  A6,hiden
        move.l  sytable,A6
        move.l  ytable,sytable
        move.l  A6,ytable
	bsr	blitclear
	move.b	seen+1,$ff8201
	move.b	seen+2,$ff8203
	addq.w	#1,frames
	rts

numvbl:		dc.w	0
frames:		dc.w	0
framess:		dc.w	0
*****************************************
rnd:	blk.l	5,0
*******************************************************************
randomseed:	ADD.L	D0,D1
		MOVEM.L D0/D1,RND
LongRnd:	MOVEM.L D2-D3,-(SP)	
		MOVEM.L RND,D0/D1
		ANDI.B	#$0E,D0
		ORI.B	#$20,D0
		MOVE.L	D0,D2
		MOVE.L	D1,D3
		ADD.L	D2,D2
		ADDX.L	D3,D3
		ADD.L	D2,D0
		ADDX.L	D3,D1
		SWAP	D3
		SWAP	D2
		MOVE.W	D2,D3
		CLR.W	D2
		ADD.L	D2,D0
		ADDX.L	D3,D1
		MOVEM.L D0/D1,RND
		MOVE.L	D1,D0
		MOVEM.L (SP)+,D2-D3
		RTS
random: 	MOVE.w	D2,-(SP)
		MOVE.W	D0,D2
		BEQ.S	r1
		BSR.S	LongRnd
		CLR.W	D0
		SWAP	D0
		ext.l	d0
		DIVs	D2,D0
		CLR.W	D0
		SWAP	D0
r1:		MOVE.w	(SP)+,D2
		RTS

randomplus:	MOVE.w	D2,-(SP)
		MOVE.W	D0,D2
		BEQ.S	r2
		BSR.S	LongRnd
		CLR.W	D0
		SWAP	D0
		DIVu	D2,D0
		CLR.W	D0
		SWAP	D0
r2:		MOVE.w	(SP)+,D2
		RTS


palsave:	blk.w	16,0
******************************************
*               RETURN TO GEM
gem:
	jsr	restoremfp

	lea	$ff8900,a0
	move.w	#0,sounddma(a0)
	move.b	#%11111110,$ff820a
	move.l	#$ff8240,a0
	lea	palsave,a1
	moveq	#15,d7
rspl:
	move.w	(a1)+,d0
	and.w	#$0777,d0
	move.w	d0,(a0)+
	dbf	d7,rspl

        move.b  #7,$484

        move.w  ressave,-(sp)
        move.l  screen,-(sp)
        move.l  screen,-(sp)
        move.w  #5,-(sp)
        trap    #14
        addi.l  #12,sp

	move.l	rvsave,$426
	move.l	resave,$42a
        
        move.l  savesup,-(SP)    ;Back to user mode
        move.w  #$20,-(SP)
        trap    #1
        addq.l  #6,SP
illegal
	clr.w	-(sp)
	trap	#1

rvsave:	dc.l	0
resave:	dc.l	0

even
savesup:	dc.l	0
ressave:	dc.w	0
filename:	dc.l	0
bluepalette:
	dc.w	$0000,$00ff,$0222,$0f20,$0444,$0ff0,$04f0,$00f0
	dc.w	$0fff,$005f,$000f,$040f,$0f0f,$0f00,$0f50,$00f5

even
vtrans_vrt:	blk.w	1700	;View transformed coordinates	
ptrans_vrt:	blk.w	1700	;Perspective transformed coordinates
***************************************************************************
filled:		equ	0
line:		equ	1
dots:		equ	2
balls:		equ	3
obviewpb:	equ	0	;offsets for object linked list desc'n
obx:		equ	4
oby:		equ	6
obz:		equ	8
obvert:		equ	10
obfacelist:	equ	14
obvrtnum:	equ	0
obfacenum:	equ	0
centrepoint:	equ	20
style:		equ	18
numdots:	equ	20
linecolinfo:	equ	20
obcolors:	equ	22
hidenflag:	equ	22
facesort:	equ	24
canitbehit:	equ	30
obw:		equ	32
onscreenx:	equ	34
onscreeny:	equ	36
obint:		equ	38
obxvel:		equ	40
obyvel:		equ	42
obzvel:		equ	44
worldvpb:	blk.w	20,0
boxvpb:		blk.w	20,0
startvpb:	blk.w	20,0
template:
*	dc.l	met1vpb		;pointer to the vpb
	dc.w	0,0,-1500	;overall object x,y,z
*	dc.l	met1vrt		;pointer to its vertices
*	dc.l	met1face	;pointer to faces
	dc.w	filled		;filled or line or dots
	dc.w	11		;when line becomes color info or numdots
	dc.w	1		;hidden line removal flag
	dc.w	-1		;facesort

box:
	dc.l	boxvpb
	dc.w	0,0,1500
	dc.l	boxvrt
	dc.l	boxface
	dc.w	filled
	dc.w	15
	dc.w	1
	dc.w	1
boxvrt:
	dc.w	9
	dc.w	 -50,50,50
	dc.w	50,50,50
	dc.w	50,50,-50
	dc.w	-50,50,-50

	dc.w	-50,-50,50
	dc.w	50,-50,50
	dc.w	50,-50,-50
	dc.w	-50,-50,-50
	dc.w	0,0,0
boxface:
	dc.w	10
	dc.w	1,3,0,1,2,3
	dc.w	2,2,0,8,1
	dc.w	3,2,1,8,2
	dc.w	4,2,2,8,3
	dc.w	5,2,3,8,0

	dc.w	6,3,4,7,6,5
	dc.w	7,2,5,8,4
	dc.w	8,2,6,8,5
	dc.w	9,2,7,8,6
	dc.w	10,2,4,8,7

bvpb:	blk.w	20,0
letterb:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	bvrt
	dc.l	bface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
bvrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	0,24,0
	dc.w	16,8,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-8,16,0
	dc.w	8,0,0
	dc.w	8,-8,0
	dc.w	8,-16,0
	dc.w	-8,-16,0
	dc.w	-8,-8,0
	dc.w	-8,0,0
bface:
	dc.w	5
	dc.w	1,3,6,2,1,0
	dc.w	1,3,8,3,2,6
	dc.w	1,3,9,4,3,8
	dc.w	1,3,4,9,5,0
	dc.w	1,3,10,7,6,11


letterc:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	cvrt
	dc.l	cface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
cvrt:
	dc.w	8
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,16,0
	dc.w	-8,16,0
	dc.w	-8,-16,0
	dc.w	16,-16,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
cface:
	dc.w	3
	dc.w	1,3,3,2,1,0
	dc.w	1,3,0,7,4,3
	dc.w	1,3,7,6,5,4
letterd:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	dvrt
	dc.l	dface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
dvrt:
	dc.w	8
	dc.w	-16,24,0
	dc.w	0,24,0
	dc.w	16,-8,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-8,16,0
	dc.w	8,-16,0
	dc.w	-8,-16,0
dface:
	dc.w	5
	dc.w	1,2,5,1,0
	dc.w	1,3,5,6,2,1
	dc.w	1,2,6,3,2
	dc.w	1,3,4,3,6,7
	dc.w	1,3,0,4,7,5

lettere:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	evrt
	dc.l	eface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
evrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	0,24,0
	dc.w	0,16,0
	dc.w	-8,16,0
	dc.w	-8,0,0
	dc.w	8,0,0
	dc.w	8,-8,0
	dc.w	-8,-8,0
	dc.w	-8,-16,0
	dc.w	16,-16,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
eface:
	dc.w	4
	dc.w	1,3,3,2,1,0
	dc.w	1,3,7,6,5,4
	dc.w	1,3,11,10,9,8
	dc.w	1,3,11,8,3,0
letterf:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	fvrt
	dc.l	fface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
fvrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,16,0
	dc.w	-8,16,0
	dc.w	-8,8,0
	dc.w	8,8,0
	dc.w	8,0,0
	dc.w	-8,0,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
fface:
	dc.w	3
	dc.w	1,3,3,2,1,0
	dc.w	1,3,7,6,5,4
	dc.w	1,3,9,8,3,0
letterg:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	gvrt
	dc.l	gface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
gvrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	8,24,0
	dc.w	8,16,0
	dc.w	-8,16,0
	dc.w	-8,-16,0
	dc.w	8,-16,0
	dc.w	8,0,0
	dc.w	16,0,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
gface:
	dc.w	4
	dc.w	1,3,3,2,1,0
	dc.w	1,3,9,4,3,0
	dc.w	1,3,9,8,5,4
	dc.w	1,3,8,7,6,5
letterh:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	hvrt
	dc.l	hface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
hvrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,0,0
	dc.w	8,0,0
	dc.w	8,16,0
	dc.w	16,16,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,-8,0
	dc.w	-8,-8,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
hface:
	dc.w	3
	dc.w	1,3,11,10,1,0
	dc.w	1,3,7,6,5,4
	dc.w	1,3,9,8,3,2
letteri:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	ivrt
	dc.l	iface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
ivrt:
	dc.w	4
	dc.w	-8,24,0
	dc.w	0,16,0
	dc.w	0,-24,0
	dc.w	-8,-24,0
iface:
	dc.w	1
	dc.w	1,3,3,2,1,0
letterj:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	jvrt
	dc.l	jface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
jvrt:
	dc.w	7
	dc.w	8,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-16,-8,0
	dc.w	-8,-16,0
	dc.w	8,-16,0
jface:
	dc.w	3
	dc.w	1,3,6,2,1,0
	dc.w	1,3,3,2,6,5
	dc.w	1,2,3,5,4
letterk:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	kvrt
	dc.l	kface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
kvrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,0,0
	dc.w	8,0,0
	dc.w	8,-8,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	-8,-8,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
kface:
	dc.w	3
	dc.w	1,3,9,8,1,0
	dc.w	1,3,7,4,3,2
	dc.w	1,3,6,5,2,7
letterl:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	lvrt
	dc.l	lface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
lvrt:
	dc.w	6
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,-16,0
	dc.w	16,-16,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
lface:
	dc.w	2
	dc.w	1,3,5,2,1,0
	dc.w	1,3,5,4,3,2
letterm:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	mvrt
	dc.l	mface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
mvrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,8,0
	dc.w	0,0,0
	dc.w	-8,8,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
	dc.w	0,16,0
mface:
	dc.w	4
	dc.w	1,3,6,5,9,0
	dc.w	1,3,5,4,1,9
	dc.w	1,3,4,3,2,1
	dc.w	1,3,8,7,6,0
lettern:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	nvrt
	dc.l	nface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
nvrt:
	dc.w	11
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	8,8,0
	dc.w	8,16,0
	dc.w	16,16,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,-8,0
	dc.w	-8,8,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
nface:
	dc.w	3
	dc.w	1,3,10,9,1,0
	dc.w	1,3,8,7,2,1
	dc.w	1,3,6,5,4,3

lettero:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	ovrt
	dc.l	oface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
ovrt:
	dc.w	8
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-8,16,0
	dc.w	8,16,0
	dc.w	8,-16,0
	dc.w	-8,-16,0
oface:
	dc.w	4
	dc.w	1,3,4,5,1,0
	dc.w	1,3,5,6,2,1
	dc.w	1,3,3,2,6,7
	dc.w	1,3,3,7,4,0

letterp:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	pvrt
	dc.l	pface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
pvrt:
	dc.w	11
	dc.w	-16,24,0
	dc.w	0,24,0
	dc.w	16,8,0
	dc.w	16,0,0
	dc.w	-8,0,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
	dc.w	-8,16,0
	dc.w	0,16,0
	dc.w	8,8,0
	dc.w	-8,8,0
pface:
	dc.w	4
	dc.w	1,3,6,5,7,0
	dc.w	1,3,0,7,8,1
	dc.w	1,3,8,3,2,1
	dc.w	1,3,4,3,9,10
letterq:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	qvrt
	dc.l	qface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
qvrt:
	dc.w	9
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-8,0
	dc.w	0,-24,0
	dc.w	-16,-24,0
	dc.w	-8,16,0
	dc.w	8,16,0
	dc.w	8,0,0
	dc.w	-8,-16,0
qface:
	dc.w	4
	dc.w	1,3,5,6,1,0
	dc.w	1,3,6,7,2,1
	dc.w	1,4,4,3,2,7,8
	dc.w	1,3,4,8,5,0

letterr:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	rvrt
	dc.l	rface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
rvrt:
	dc.w	17
	dc.w	-16,24,0
	dc.w	8,24,0
	dc.w	16,16,0
	dc.w	16,8,0
	dc.w	8,0,0
	dc.w	16,-8,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,-8,0
	dc.w	-8,-8,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
	dc.w	-8,16,0
	dc.w	8,16,0
	dc.w	8,8,0
	dc.w	0,0,0
	dc.w	-8,0,0
rface:
	dc.w	6
	dc.w	1,3,12,2,1,0
	dc.w	1,3,14,3,2,13
	dc.w	1,3,15,4,3,14
	dc.w	1,3,9,5,4,16
	dc.w	1,3,8,7,6,5
	dc.w	1,3,0,11,10,12
letters:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	svrt
	dc.l	sface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
svrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	8,24,0
	dc.w	8,16,0
	dc.w	-8,16,0
	dc.w	-8,0,0
	dc.w	16,0,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-16,-16,0
	dc.w	8,-16,0
	dc.w	8,-8,0
	dc.w	-16,-8,0
sface:
	dc.w	5
	dc.w	1,3,3,2,1,0
	dc.w	1,3,11,4,3,0
	dc.w	1,3,11,10,5,4
	dc.w	1,3,9,6,5,10
	dc.w	1,3,7,6,9,8
lettert:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	tvrt
	dc.l	tface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
tvrt:
	dc.w	8
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,16,0
	dc.w	0,16,0
	dc.w	0,-24,0
	dc.w	-8,-24,0
	dc.w	-8,16,0
	dc.w	-16,16,0
tface:
	dc.w	2
	dc.w	1,3,7,2,1,0
	dc.w	1,3,5,4,3,6
letteru:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	uvrt
	dc.l	uface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
uvrt:
	dc.w	8
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,-16,0
	dc.w	8,-16,0
	dc.w	8,8,0
	dc.w	16,8,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
uface:
	dc.w	3
	dc.w	1,3,7,2,1,0
	dc.w	1,3,7,6,3,2
	dc.w	1,3,3,6,5,4
letterv:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	vvrt
	dc.l	vface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
vvrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,-8,0
	dc.w	0,-16,0
	dc.w	8,-16,0
	dc.w	8,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	0,-24,0
	dc.w	-16,-8,0
vface:
	dc.w	4
	dc.w	1,3,9,2,1,0
	dc.w	1,3,9,8,3,2
	dc.w	1,3,8,7,4,3
	dc.w	1,3,4,7,6,5
letterw:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	wvrt
	dc.l	wface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
wvrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,-8,0
	dc.w	0,0,0
	dc.w	8,-8,0
	dc.w	8,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	0,-16,0
	dc.w	-16,-24,0
wface:
	dc.w	4
	dc.w	1,3,9,2,1,0
	dc.w	1,3,9,8,3,2
	dc.w	1,3,8,7,4,3
	dc.w	1,3,4,7,6,5
letterx:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	xvrt
	dc.l	xface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
xvrt:
	dc.w	16
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	0,8,0
	dc.w	8,24,0
	dc.w	16,24,0
	dc.w	16,16,0
	dc.w	8,0,0
	dc.w	16,-16,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	0,-8,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
	dc.w	-16,-16,0
	dc.w	-8,0,0
	dc.w	-16,16,0
xface:
	dc.w	4
	dc.w	1,5,15,14,10,2,1,0
	dc.w	1,4,2,6,5,4,3
	dc.w	1,5,10,9,8,7,6,2
	dc.w	1,4,12,11,10,14,13
lettery:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	yvrt
	dc.l	yface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
yvrt:
	dc.w	9
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	0,12,0
	dc.w	8,24,0
	dc.w	16,24,0
	dc.w	4,6,0
	dc.w	4,-24,0
	dc.w	-4,-24,0
	dc.w	-4,6,0
yface:
	dc.w	3
	dc.w	1,3,8,2,1,0
	dc.w	1,3,2,5,4,3
	dc.w	1,4,7,6,5,2,8
letterz:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	zvrt
	dc.l	zface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
zvrt:
	dc.w	8
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	-4,-16,0
	dc.w	16,-16,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	4,16,0
	dc.w	-16,16,0
zface:
	dc.w	3
	dc.w	1,3,7,6,1,0
	dc.w	1,3,5,2,1,6
	dc.w	1,3,5,4,3,2

blanklet:
	dc.l	-1
lettera:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	avrt
	dc.l	aface
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
avrt:
	dc.w	7
	dc.w	8,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,0,0
	dc.w	-8,-24,0
	dc.w	-16,-24,0
aface:
	dc.w	2
	dc.w	1,3,6,5,4,0
	dc.w	1,3,3,2,1,0
letter2:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a2vrt
	dc.l	a2face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a2vrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-8,0
	dc.w	-8,-8,0
	dc.w	-8,-16,0
	dc.w	16,-16,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-16,0,0
	dc.w	8,0,0
	dc.w	8,16,0
	dc.w	-16,16,0

a2face:
	dc.w	5
	dc.w	1,3,11,10,1,0
	dc.w	1,3,10,9,2,1
	dc.w	1,3,3,2,9,8
	dc.w	1,3,7,4,3,8
	dc.w	1,3,7,6,5,4
letter3:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a3vrt
	dc.l	a3face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a3vrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-16,-16,0
	dc.w	8,-16,0
	dc.w	8,-8,0
	dc.w	-8,-8,0
	dc.w	-8,0,0
	dc.w	8,0,0
	dc.w	8,16,0
	dc.w	-16,16,0
a3face:
	dc.w	4
	dc.w	1,3,11,10,1,0
	dc.w	1,3,10,5,2,1
	dc.w	1,3,3,2,5,4
	dc.w	1,3,7,6,9,8
letter4:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a4vrt
	dc.l	a4face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a4vrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,0,0
	dc.w	8,0,0
	dc.w	8,16,0
	dc.w	16,16,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,-8,0
	dc.w	-16,-8,0
a4face:
	dc.w	3
	dc.w	1,3,0,9,2,1
	dc.w	1,3,9,8,3,2
	dc.w	1,3,4,7,6,5

letter5:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a5vrt
	dc.l	a5face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a5vrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,16,0
	dc.w	-8,16,0
	dc.w	-8,0,0
	dc.w	16,0,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-16,-16,0
	dc.w	8,-16,0
	dc.w	8,-8,0
	dc.w	-16,-8,0
a5face:
	dc.w	5
	dc.w	1,3,3,2,1,0
	dc.w	1,3,11,4,3,0
	dc.w	1,3,11,10,5,4
	dc.w	1,3,10,9,6,5
	dc.w	1,3,7,6,9,8
letter6:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a6vrt
	dc.l	a6face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a6vrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	-8,24,0
	dc.w	-8,0,0
	dc.w	16,0,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-8,-8,0
	dc.w	8,-8,0
	dc.w	8,-16,0
	dc.w	-8,-16,0
a6face:
	dc.w	4
	dc.w	1,3,5,9,1,0
	dc.w	1,3,6,7,3,2
	dc.w	1,3,7,8,4,3
	dc.w	1,3,5,4,8,9
letter7:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a7vrt
	dc.l	a7face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a7vrt:
	dc.w	6
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,16,0
	dc.w	-16,16,0
a7face:
	dc.w	2
	dc.w	1,3,5,4,1,0
	dc.w	1,3,4,3,2,1
letter8:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a8vrt
	dc.l	a8face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a8vrt:
	dc.w	12
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	-16,-24,0
	dc.w	-8,16,0
	dc.w	8,16,0
	dc.w	8,0,0
	dc.w	8,-8,0
	dc.w	8,-16,0
	dc.w	-8,-16,0
	dc.w	-8,-8,0
	dc.w	-8,0,0
	dc.w	-16,16,0
a8face:
	dc.w	5
	dc.w	1,3,4,5,1,0
	dc.w	1,3,5,8,2,1
	dc.w	1,3,3,2,8,9
	dc.w	1,3,3,9,4,0
	dc.w	1,3,10,7,6,11
letter9:
	dc.l	bvpb
	dc.w	0,0,1500
	dc.l	a9vrt
	dc.l	a9face
	dc.w	filled
	dc.w	15
	dc.w	-1
	dc.w	-1
a9vrt:
	dc.w	10
	dc.w	-16,24,0
	dc.w	16,24,0
	dc.w	16,-24,0
	dc.w	8,-24,0
	dc.w	8,0,0
	dc.w	-16,0,0
	dc.w	-8,16,0
	dc.w	8,16,0
	dc.w	8,8,0
	dc.w	-8,8,0
a9face:
	dc.w	4
	dc.w	1,3,6,7,1,0
	dc.w	1,3,7,3,2,1
	dc.w	1,3,5,4,8,9
	dc.w	1,3,5,9,6,0


rho:		equ	0
theta:		equ	2
phi:		equ	4
s_theta:	equ	6
c_theta:	equ	8
s_phi:		equ	10
c_phi:		equ	12
s_rho:		equ	14
c_rho:		equ	16
x1s:	dc.w	0
y1s:	dc.w	0
x2s:	dc.w	0
y2s:	dc.w	0
yadd:	dc.l	0
cred:
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$01F1,$0000,$0000,$1000,$E087
	 dc.w	$0000,$0000,$4000,$907D,$0000,$0000,$1000,$E000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0041,$0000,$0000,$0140,$1084
	 dc.w	$0000,$0000,$8000,$5041,$0000,$0000,$2000,$1000
	 dc.w	$E318,$0000,$E318,$E318,$E610,$0611,$E001,$E001
	 dc.w	$0004,$2920,$2924,$2920,$9C00,$0007,$9C07,$0000
	 dc.w	$108E,$308E,$308E,$0000,$4918,$4900,$4900,$4918
	 dc.w	$7000,$001C,$0000,$701C,$094A,$C94A,$0001,$C94B
	 dc.w	$0000,$0000,$8000,$8041,$0000,$0000,$0000,$11C4
	 dc.w	$0000,$0000,$0000,$5241,$0000,$0000,$0000,$1000
	 dc.w	$94A5,$0000,$94A5,$94A5,$0928,$0929,$0001,$0001
	 dc.w	$0026,$EF00,$EF26,$EF00,$A000,$0008,$A008,$0000
	 dc.w	$4949,$4949,$4949,$0001,$4924,$4900,$4900,$4924
	 dc.w	$8000,$0021,$0000,$8021,$2968,$2968,$0002,$296A
	 dc.w	$0000,$0000,$4000,$4041,$0000,$0000,$1220,$6144
	 dc.w	$0000,$0000,$8000,$5241,$0000,$0000,$2000,$1000
	 dc.w	$94A5,$0001,$94A4,$94A4,$0920,$0929,$0009,$0009
	 dc.w	$0125,$EE00,$EF25,$EE00,$A000,$0008,$A008,$0000
	 dc.w	$4949,$4949,$4949,$0009,$4920,$4800,$4800,$4920
	 dc.w	$E001,$0039,$0000,$E039,$2940,$2940,$001A,$295A
	 dc.w	$0000,$0000,$4000,$4041,$0000,$0000,$0140,$1225
	 dc.w	$0000,$0000,$4200,$9459,$0000,$0000,$1000,$6000
	 dc.w	$A525,$0001,$A524,$A524,$6A00,$6A39,$0039,$0039
	 dc.w	$0124,$2800,$2924,$2800,$8003,$2C0B,$AC0B,$0000
	 dc.w	$51CA,$51CA,$51CA,$000A,$7920,$7800,$7800,$7920
	 dc.w	$4001,$301D,$0000,$701D,$2940,$2940,$000A,$294A
	 dc.w	$0000,$0000,$4000,$4041,$0000,$0000,$0410,$12A5
	 dc.w	$0000,$0000,$8200,$1441,$0000,$0000,$2000,$4000
	 dc.w	$8525,$0005,$8520,$8520,$2A00,$2A45,$0045,$0045
	 dc.w	$0124,$2800,$2924,$2800,$8001,$2409,$A409,$0000
	 dc.w	$5228,$5228,$5228,$0028,$4924,$4800,$4800,$4924
	 dc.w	$0005,$1005,$0000,$1005,$2900,$2900,$004A,$294A
	 dc.w	$0000,$0000,$4000,$4041,$0000,$0000,$0221,$1414
	 dc.w	$0000,$0000,$4500,$9241,$0000,$0000,$5000,$2000
	 dc.w	$8498,$0008,$8490,$8490,$E900,$E945,$0045,$0045
	 dc.w	$0924,$2000,$2924,$2000,$0007,$9C87,$9C87,$0000
	 dc.w	$4A28,$4A28,$4A28,$0028,$4918,$4000,$4000,$4918
	 dc.w	$0008,$E438,$0000,$E438,$C600,$C600,$004B,$C64B
	 dc.w	$0000,$0000,$9000,$9049,$0000,$0000,$1000,$E414
	 dc.w	$0000,$0000,$8200,$517D,$0000,$0000,$2000,$1000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0080,$0080,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0400,$0000,$0400,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	 dc.w	$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000

music:
*	blk.b	219456,0
musicend:

