                                                                                                                                                                                                                                                         
* BLiTTER BASE ADDRESS

blitter         equ     $FF8A00

* BLiTTER REGISTER OFFSETS

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
vbl_vec:	equ	$70

vertflag:	equ	$0100
stmodes:	equ	$0080
overscan:	equ	$0040
pal:		equ	$0020
vga:		equ	$0010
tv:		equ	$0000

col80:		equ	$0008
col40:		equ	$0000
numcols:	equ	$0007

bps16:		equ	4
bps8:		equ	3
bps4:		equ	2
bps2:		equ	1
bps1:		equ	0
mybit:		equ	%0000001000000000

mapw:	equ	256
maph:	equ	256
sw:	equ	320
sh:	equ	240
nplanes:	equ	8
*****************************************************************
*	Falcon Slide Demo.					*
*	Version 1.0						*
*****************************************************************
	include	'fequates.s'
start:
	move.l	4(a7),a3		base page
	move.l	#mystack,a7
	move.l	$c(a3),d0		text len
	add.l	$14(a3),d0		data len
	add.l	$1c(a3),d0		BSS len
	add.l	#$100,d0		basepage
	move.l	d0,-(sp)
	move.l	a3,-(sp)
	clr.w	-(sp)
	move.w	#$4a,-(sp)
	trap	#1			shrink memory
	lea	12(sp),sp

	clr.l	-(sp)		;as usual the first thing to
	move.w	#$20,-(sp)	;do is go into supervisor mode
	trap	#1
	addq.l	#6,sp
	move.l	d0,savesp

	bsr	maketable

	bsr	putrout
	bsr	putvbl
	bsr	setupscreen
	bsr	savecolors
	bsr	clearscreens
	bsr	setpal
	bsr	doblock
	bsr	unpackwords

*	move.w	#68,d0		;ystart
*	move.w	#33,d1		;height
*	bsr	putwords
*	move.l	$4ba,timerstart
*	move.l	#0,frames
*	move.w	#1,ycount
mainloop:
	move.l	#array1,source
	move.l	#array2,dest
	bsr	cycle
	bsr	showset
*	addq.l	#1,frames
	move.l	#array2,source
	move.l	#array1,dest
	bsr	cycle
	bsr	showset
*	addq.l	#1,frames
	bsr	messages
	bsr	keyboard
	bra	mainloop

cnt:	dc.l	0
avg:	dc.w	0
m:	dc.w	0
s:	dc.l	0
d:	dc.l	0
width:	equ	80
height:	equ	54
source:	dc.l	0
dest:	dc.l	0
*****************************************************************
*	Pass in source the address of the first set		*
*	and dest the address of the second set			*
*****************************************************************
cycle:
	move.l	source,a0
	add.l	#(width)+1,a0		;s=source+width+1
	move.l	dest,a1
	add.l	#(width*2)+1,a1		;d=des+width+1
	moveq	#0,d7
cycleloop1:
	move.w	#width-2-1,d6
cycleloop2:
	moveq	#0,d0		;d0 for avg
	moveq	#0,d1
	move.b	-width-1(a0),d1
	add.w	d1,d0
	moveq	#0,d1
	move.b	-width(a0),d1
	add.w	d1,d0
	moveq	#0,d1
	move.b	-width+1(a0),d1
	add.w	d1,d0

	moveq	#0,d1
	move.b	-1(a0),d1
	add.w	d1,d0
	moveq	#0,d1
	move.b	1(a0),d1
	add.w	d1,d0

	moveq	#0,d1
	move.b	width-1(a0),d1
	add.w	d1,d0
	moveq	#0,d1
	move.b	width(a0),d1
	add.w	d1,d0
	moveq	#0,d1
	move.b	width+1(a0),d1
	add.w	d1,d0

	move.w	d0,d1		;m=avg&7
	add.w	d6,d1
	andi.w	#7,d1
	asr.w	#3,d0		;avg>>=3

	andi.w	#3,d1
	bne.s	nocool
	cmpi.w	#5,d7		;if (cnt<=4*width)
	bgt.s	nc1
	sub.b	#4,d0		;avg--
	bra.s	nocool
nc1:
	tst.b	d0		;else if(avg>0)
	ble.s	nocool
	subq.b	#1,d0		;avg--
nocool:
	move.b	d0,(a1)+	;d[0]=avg also does d+=1
	addq.l	#1,a0		;s+=1
	dbf	d6,cycleloop2
	addq.l	#2,a0
	addq.l	#2,a1
	addq.w	#1,d7
	cmpi.w	#height-3,d7
	ble.s	cycleloop1
	rts

doblock:
	move.l	viewscreen1,a0
	move.w	my,d0
	mulu	#320,d0
	add.l	d0,a0
	move.w	mx,d0
	and.w	#$fff0,d0
	add.l	d0,a0
	rept	10
*	move.w	#-1,(a0)
*	move.w	#-1,2(a0)
*	move.w	#-1,4(a0)
*	move.w	#-1,6(a0)
*	move.w	#-1,8(a0)
*	move.w	#-1,10(a0)
	move.w	#-1,12(a0)
	move.w	#-1,14(a0)
	add.l	#320,a0
	endr

	rts

showset:
*	move.l  #$111,d0
*	movec   d0,cacr
	move.l	viewscreen1,a0
	move.l	dest,a1
	add.l	#width*height,a1
	move.l	#height-4-1,d7
	lea	planetable1,a2
	lea	planetable2,a3
	lea	planetable3,a4
	lea	planetable4,a5
ssl1:
	move.l	#(width/4)-1,d6
	move.w	d7,-(sp)
ssl2:
	moveq	#0,d7
	move.b	-(a1),d7
	cmpi.b	#63,d7
	ble.s	.as0
	move.w	#%1111000000000000,d0
	move.w	#%1111000000000000,d1
	move.w	#%1111000000000000,d2
	move.w	#%1111000000000000,d3
	move.w	#%1111000000000000,d4
	move.w	#%1111000000000000,d5
	bra.s	twoof4
.as0:
	asl.w	#4,d7		;color*16
	move.w	(a2,d7.w),d0	
	move.w	2(a2,d7.w),d1	
	move.w	4(a2,d7.w),d2	
	move.w	6(a2,d7.w),d3	
	move.w	8(a2,d7.w),d4	
	move.w	10(a2,d7.w),d5
twoof4:
	moveq	#0,d7
	move.b	-(a1),d7
	cmpi.b	#63,d7
	ble.s	.as0
	or.w	#%0000111100000000,d0
	or.w	#%0000111100000000,d1
	or.w	#%0000111100000000,d2
	or.w	#%0000111100000000,d3
	or.w	#%0000111100000000,d4
	or.w	#%0000111100000000,d5
	bra.s	threeof4
.as0:
	asl.w	#4,d7		;color*16
	or.w	(a3,d7.w),d0	
	or.w	2(a3,d7.w),d1	
	or.w	4(a3,d7.w),d2	
	or.w	6(a3,d7.w),d3	
	or.w	8(a3,d7.w),d4	
	or.w	10(a3,d7.w),d5
threeof4:
	moveq	#0,d7
	move.b	-(a1),d7
	cmpi.b	#63,d7
	ble.s	.as0
	or.w	#%0000000011110000,d0
	or.w	#%0000000011110000,d1
	or.w	#%0000000011110000,d2
	or.w	#%0000000011110000,d3
	or.w	#%0000000011110000,d4
	or.w	#%0000000011110000,d5
	bra.s	fourof4
.as0:
	asl.w	#4,d7		;color*16
	or.w	(a4,d7.w),d0	
	or.w	2(a4,d7.w),d1	
	or.w	4(a4,d7.w),d2	
	or.w	6(a4,d7.w),d3	
	or.w	8(a4,d7.w),d4	
	or.w	10(a4,d7.w),d5
fourof4:
	moveq	#0,d7
	move.b	-(a1),d7
	cmpi.b	#63,d7
	ble.s	.as0
	or.w	#%0000000000001111,d0
	or.w	#%0000000000001111,d1
	or.w	#%0000000000001111,d2
	or.w	#%0000000000001111,d3
	or.w	#%0000000000001111,d4
	or.w	#%0000000000001111,d5
	bra.s	fiveof4
.as0:
	asl.w	#4,d7		;color*16
	or.w	(a5,d7.w),d0	
	or.w	2(a5,d7.w),d1	
	or.w	4(a5,d7.w),d2	
	or.w	6(a5,d7.w),d3	
	or.w	8(a5,d7.w),d4	
	or.w	10(a5,d7.w),d5
fiveof4:
	movem.w	d0-d5,(a0)
	movem.w	d0-d5,(320*1)(a0)
	movem.w	d0-d5,(320*2)(a0)
	movem.w	d0-d5,(320*3)(a0)
	lea	16(a0),a0
	dbf	d6,ssl2
	add.l	#320*3,a0
	move.w	(sp)+,d7
	dbf	d7,ssl1
*	move.l  #$3111,d0
*	movec   d0,cacr
*	bsr	doblock
	rts

unpackwords:
	lea	words,a0
	lea	wordscreen,a1
	bsr	ice_unpack
	rts

messages:
	tst.w	burnoff
	bmi	normalmess
	subq.w	#1,burnoff
	bpl	messback
.mok1:
	move.l	messagead,a0
	move.w	mystart(a0),d0
	bpl	.mok
	move.l	#messscript,messagead
	bra	.mok1
.mok:	move.w	mheight(a0),d1
	bsr	putwords
	move.w	mtime(a0),mtimer
	add.l	#madd,a0
	move.l	a0,messagead
	move.w	#-1,burnoff
	bra	messback

normalmess:
	subq.w	#1,mtimer
	bpl	messback
	move.l	messagead,a0
	sub.l	#madd,a0
	move.w	mburny(a0),d0
	move.w	mburnwidth(a0),d1
	bsr	putburn
	move.l	messagead,a0
	sub.l	#madd,a0
	move.w	mystart(a0),d0
	move.w	mheight(a0),d1
	bsr	clearwords
	move.w	#15,burnoff
	bra	messback
messback:
	rts
putburn:
	tst.w	d0
	beq	noburn		;blank
	lea	array1,a0
	mulu	#width,d0
	add.l	d0,a0
	lea	width(a0),a1
	move.w	#width,d2
	sub.w	d1,d2
	asr.w	#1,d2
	add.w	d2,a0
	add.w	d2,a1
	move.w	#150,d2
	subq.w	#1,d1
pburnloop:
	move.b	d2,(a0)+
	move.b	d2,(a1)+
	dbf	d1,pburnloop
noburn:
	rts	


burnoff:	dc.w	0
messagead:	dc.l	messscript
mtimer:		dc.w	0
		dc.w	0
*************************************************
	rsreset
mystart:	rs.w	1	;ystart
mheight:	rs.w	1	;height
mtime:		rs.w	1	;time to be visible
mburny:		rs.w	1
mburnwidth:	rs.w	1
mlast:		rs.w	1

madd:		equ	mlast-mystart

messscript:
	dc.w	0,23,25,19,64
	dc.w	26,27,20,19,6
	dc.w	54,34,30,19,40
	dc.w	90,14,30,19,20
	dc.w	107,14,20,19,25
	dc.w	124,14,10,19,4
	dc.w	139,14,30,19,22
	dc.w	156,1,60,0,0
	dc.w	-1,-1,-1,-1,-1

*************************************************
*	ystart in d0 and height in d1		*
*************************************************
putwords:
	movem.l	a0-a1,-(sp)
	lea	wordscreen,a0
	move.l	viewscreen1,a1
	mulu	#40,d0
	add.l	d0,a0
	add.l	#320*120,a1
pwloop:
	rept	20
	move.w	(a0)+,d0
	move.w	d0,12(a1)
	move.w	d0,14(a1)
	add.l	#16,a1
	endr
	dbf	d1,pwloop
	movem.l	(sp)+,a0-a1
	rts
*************************************************
*	ystart in d0 and height in d1		*
*************************************************
clearwords:
	movem.l	a0-a1,-(sp)
	move.l	viewscreen1,a1
	add.l	#320*120,a1
	moveq	#0,d0
cwloop:
	rept	20
	move.w	d0,12(a1)
	move.w	d0,14(a1)
	add.l	#16,a1
	endr
	dbf	d1,cwloop
	movem.l	(sp)+,a0-a1
	rts



waitvbl:
	move.w	#1,vblflag
wvbloop:
	tst.w	vblflag
	bpl	wvbloop
	rts

swapnshow:
	move.l	viewscreen1,d0
	move.l	viewscreen2,viewscreen1
	move.l	d0,viewscreen2

	bsr	waitvbl
	move.l	viewscreen1,d0
	move.l	d0,d1
	move.l	d1,d2
	lsr.l	#8,d0
	lsr.l	#8,d0
	move.w	d0,vid_bh
	lsr.l	#8,d1
	and.l	#$000000ff,d1
	move.w	d1,vid_bm
	and.l	#$000000ff,d2
	move.w	d2,vid_bl
	rts

*********************************************************
*	Takes an x and y in d0,d1 and returns new x y	*
*	in d0,d1 rotated d2 degrees around 0,0.		*
*	Note, x,y are from origin.			*
*********************************************************
rotatexy:
	bsr	sincos
	moveq	#0,d4
	moveq	#0,d5
	move.w	d0,d4
	muls	d3,d4		;cos*x1
	move.w	d1,d5
	muls	d2,d5		;sin*y1
	lsl.l	#2,d4
	lsl.l	#2,d5
	swap	d4
	swap	d5
	sub.w	d5,d4
	move.w	d4,d6		;new x

	moveq	#0,d4
	moveq	#0,d5
	move.w	d1,d4
	muls	d3,d4		;cos*y1
	move.w	d0,d5
	muls	d2,d5		;sin*x1
	lsl.l	#2,d4
	lsl.l	#2,d5
	swap	d4
	swap	d5
	add.w	d5,d4
	move.w	d4,d1		;new y
	move.w	d6,d0
	rts


*********************************************************
*	Takes angle in d2 and returns sin in d2		*
*	and cos in d3					*
*********************************************************
sincos:
	tst.w	d2
	bpl.s	noaddi
	add.w	#360,d2
noaddi:
	lea	sintab,a1
	move.l	d2,d3
	lsl.w	#1,d2
	move.w	(a1,d2.w),d2	;d2 is sin
	cmp.w	#270,d3
	blt.s	plus9
	sub.w	#270,d3
	bra.s	sendsin
plus9:
	add.w	#90,d3
sendsin:
	lsl.w	#1,d3
	move.w	(a1,d3.w),d3	;d3 is cos
	rts


		section data
sintab: dc.w       0,286,572,857,1143,1428,1713,1997,2280
        dc.w       2563,2845,3126,3406,3686,3964,4240,4516
        dc.w       4790,5063,5334,5604,5872,6138,6402,6664
        dc.w       6924,7182,7438,7692,7943,8192,8438,8682
        dc.w       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
        dc.w       14849,14962,15082,15191,15296,15396,15491,15582
        dc.w       15668,15749,15826,15897,15964,16026,16083,16135
        dc.w       16182,16225,16262,16294,16322,16344,16362,16374
        dc.w       16382,16384

        dc.w       16382,16374,16362,16344,16322,16294,16262,16225
        dc.w       16182
        dc.w       16135,16083,16026,15964,15897,15826,15749,15668
        dc.w       15582,15491,15396,15296,15191,15082,14962,14849
        dc.w       14726,14598,14466,14330,14189,14044,13894,13741
        dc.w       13583,13421,13255,13085,12911,12733,12551,12365
        dc.w       12176,11982,11786,11585,11381,11174,10963,10749
        dc.w       10531,10311,10087,9860,9630,9397,9162,8923
        dc.w       8682,8438,8192,7943,7692,7438,7182,6924
        dc.w       6664,6402,6138,5872,5604,5334,5063,4790
        dc.w       4516,4240,3964,3686,3406,3126,2845,2563
        dc.w       2280,1997,1713,1428,1143,857,572,286,0

        dc.w       -286,-572,-857,-1143,-1428,-1713,-1997,-2280
        dc.w       -2563,-2845,-3126,-3406,-3686,-3964,-4240,-4516
        dc.w       -4790,-5063,-5334,-5604,-5872,-6138,-6402,-6664
        dc.w       -6924,-7182,-7438,-7692,-7943,-8192,-8438,-8682
        dc.w       -8923,-9162,-9397,-9630,-9860,-10087,-10311,-10531
        dc.w       -10749,-10963,-11174,-11381,-11585,-11786,-11982
        dc.w       -12176
        dc.w       -12365,-12551,-12733,-12911,-13085,-13255,-13421
        dc.w       -13583
        dc.w       -13741,-13894,-14044,-14189,-14330,-14466,-14598
        dc.w       -14726
        dc.w       -14849,-14962,-15082,-15191,-15296,-15396,-15491
        dc.w       -15582
        dc.w       -15668,-15749,-15826,-15897,-15964,-16026,-16083
        dc.w       -16135
        dc.w       -16182,-16225,-16262,-16294,-16322,-16344,-16362
        dc.w       -16374,-16382,-16384

        dc.w       -16382,-16374,-16362,-16344,-16322,-16294,-16262
        dc.w       -16225,-16182
        dc.w       -16135,-16083,-16026,-15964,-15897,-15826,-15749
        dc.w       -15668
        dc.w       -15582,-15491,-15396,-15296,-15191,-15082,-14962
        dc.w       -14849
        dc.w       -14726,-14598,-14466,-14330,-14189,-14044,-13894
        dc.w       -13741
        dc.w       -13583,-13421,-13255,-13085,-12911,-12733,-12551
        dc.w       -12365
        dc.w       -12176,-11982,-11786,-11585,-11381,-11174,-10963
        dc.w       -10749
        dc.w       -10531,-10311,-10087,-9860,-9630,-9397,-9162,-8923
        dc.w       -8682,-8438,-8192,-7943,-7692,-7438,-7182,-6924
        dc.w       -6664,-6402,-6138,-5872,-5604,-5334,-5063,-4790
        dc.w       -4516,-4240,-3964,-3686,-3406,-3126,-2845,-2563
        dc.w       -2280,-1997,-1713,-1428,-1143,-857,-572,-286,0


*****************************************
*	number in d0.l			*
*	d1.l is base			*
*	d2,x cursor			*
*	d3,y cursor			*
*****************************************
prtnum:
	movem.l	d0/d1,-(sp)
	lea	posstring,a0
	add.w	#32,d3
	move.b	d3,2(a0)	
	add.w	#32,d2
	move.b	d2,3(a0)
	move.l	a0,-(sp)
	move.w	#9,-(sp)
	trap	#1
	addq.l	#6,sp
	movem.l	(sp)+,d0/d1

	lea	linebuffer,a0
	clr.l	(a0)+
	clr.l	(a0)+
	clr.l	(a0)+
	clr.l	(a0)+
	clr.l	(a0)+
loop1:
	divu	d1,d0
	swap	d0
	addi	#'0',d0
	cmpi.w	#'9',d0
	ble.s	ok
	addq.w	#7,d0
ok:
	move.b	d0,-(a0)
	clr	d0
	swap	d0
	bne	loop1
loop2:
	move.l	a0,-(sp)
	move.w	#9,-(sp)
	trap	#1
	addq.l	#6,sp
	rts

clearnums:
	lea	clearstring,a0
	add.w	#32,d3
	move.b	d3,2(a0)	
*	move.b	d3,10(a0)	
	add.w	#32,d2
	move.b	d2,3(a0)
*	move.b	d2,11(a0)	
	move.l	a0,-(sp)
	move.w	#9,-(sp)
	trap	#1
	addq.l	#6,sp
	rts
linebuffer:
	ds.l	5
digits:
	dc.b	0
posstring:	dc.b	27,'Y',0,0,0,0
clearstring:	dc.b	27,'Y',0,0,'   ',0,0
	even
syncmode:	dc.w	1

waitkey:
	move.w	#1,-(sp)
	trap	#1
	addq.l	#2,sp
	rts
keyboard:
	move.w	#$ff,-(sp)
	move.w	#$6,-(sp)
	trap	#1
	addq.l	#4,sp
	tst.l	d0
	beq	keyback
	swap	d0
	cmp.b	#16,d0		*space
	beq	exit		*yes/no
	rts
*spacekey:
*	cmpi.b	#$39,d0
*	bne	pluskey
*	lea	array1,a0
*	add.l	#width*15+20,a0
*	rept	40
*	move.b	#234,(a0)+
*	endr
*	rts
keyback:
	rts

pause:
	move.w	#7,-(sp)
	trap	#1
	addq.l	#2,sp
	rts

clearscreens:
	lea	blitter,a6
.waitblit:
	btst	#7,line_num(a6)
	bne	.waitblit

	move.l	viewscreen1,a0
	move.l	viewscreen2,a1
	move.l	a0,dst_addr(a6)
	move.w	#2,dst_xinc(a6)
	move.w	#2,dst_yinc(a6)
	move.w	#sw,x_count(a6)
	move.w	#sh,y_count(a6)
	move.w	#-1,endmask1(a6)
 	move.w	#-1,endmask2(a6)
	move.w	#-1,endmask3(a6)
	move.b	#0,skew(a6)
	move.b	#$0,op(a6)
	move.b	#2,hop(a6)
	bset	#6,line_num(a6)
	bset	#7,line_num(a6)
nextscreen:
.waitblit:
	btst	#7,line_num(a6)
	bne	.waitblit
	move.l	a1,dst_addr(a6)
	move.w	#2,dst_xinc(a6)
	move.w	#2,dst_yinc(a6)
	move.w	#sw,x_count(a6)
	move.w	#sh,y_count(a6)
	bset	#6,line_num(a6)
	bset	#7,line_num(a6)
	rts



plotuv:
	movem.l	d0/d1/a1,-(sp)
	moveq	#0,d0
	move.l	d0,d1
*	move.l	vu,d0
	lsl.l	#2,d0
	swap	d0
	ext.l	d0
	add.l	d0,d0
*	move.l	vv,d1
	lsl.l	#2,d1
	swap	d1
	ext.l	d1
*	mulu	#mapw*2,d1
	lsl.l	#8,d1
	lsl.l	#1,d1

	add.l	d1,d0
	add.l	d0,a1
	move.w	(a1),(a0)+
	movem.l	(sp)+,d0/d1/a1
	rts



buttondat:	dc.w	0
mx:		dc.w	0
my:	dc.w	0
*************puts my mouse interupt in***************** 
putrout:move.w  #34,-(sp)
        trap    #14
        addq.l  #2,sp
        move.l  d0,a0
	move.l	16(a0),oldmouse
        move.l  #myrout,16(a0)
        rts
lastb:		dc.w	-1
mousehasgoneup:	dc.w	0

**************my ubeut mouse interupt*******************
myrout:
	movem.l	d0-d2/a0-a1,-(sp)
	moveq	#0,d0	
	move.b	(a0),d0
	cmpi.b	#$fa,d0
	bne	myr1
	move.w	#1,buttondat
	bra	myrxy
myr1:
	cmpi.b	#$f9,d0
	bne	myr2
	move.w	#2,buttondat
	bra	myrxy
myr2:
	cmpi.b	#$fb,d0
	bne	myr3
	move.w	#3,buttondat
	bra	myrxy
myr3:
	move.w	#1,mousehasgoneup
	move.w	#0,buttondat
myrxy:
	moveq	#0,d0
	move.b	1(a0),d0
	ext.w	d0
	moveq	#0,d1
	move.b	2(a0),d1
	ext.w	d1
	add.w	d0,mx
	add.w	d1,my
*	sub.w	d1,my2
myr4:	move.w	mx,d0
	move.w	my,d1
	bsr	extra
	move.w	d0,mx
	move.w	d1,my
	movem.l	(sp)+,d0-d2/a0-a1
	rts

extra:  cmpi.w	#mminx,d0
        bge	extra1
        move.w	#mminx,d0
        bra	extra2
extra1: cmpi.w   #mmaxx,d0
        ble	extra2
        move.w  #mmaxx,d0
extra2:	cmpi.w  #mminy,d1
        bge	extra3
        move.w  #mminy,d1
        bra	extra4
extra3: cmpi.w   #mmaxy,d1
        ble	extra4
        move.w  #mmaxy,d1
extra4:
        rts

mminx:	equ	20
mmaxx:	equ	sw
mminy:	equ	20
mmaxy:	equ	sh


putvbl:
	move.l	vbl_vec,vblt+2		;set up vbl handler
	move.l	vbl_vec,oldvblvec
	move.l	#vbl_handler,vbl_vec
	rts

halfframe:	dc.w	0
ddl:		dc.w	-1
vbl_handler:
	move.w	#-1,vblflag
vblt:
	jmp	$0.L



exit:
*	move.l	$4ba,timerend
	move.w  #34,-(sp)
	trap    #14
	addq.l  #2,sp
	move.l  d0,a0
	move.l	oldmouse,16(a0)

	lea	memlist,a6
demem:
	move.l	(a6)+,d0
	bmi	nomoremem
	beq	demem
	bsr	deallocate
	bra	demem
nomoremem:
	move.l	oldvblvec,vbl_vec

	bsr	restorecolors

	move.w	savemode,-(sp)
	move.w	#3,-(sp)
	move.l	savescreen,-(sp)
	move.l	savescreen,-(sp)
	move.w	#5,-(sp)
	trap	#14
	add.l	#14,sp

*	move.l	timerend,d0
*	sub.l	timerstart,d0
*	divu.l	#200,d0			;take it to seconds
*	move.l	frames,d1
*	divu.l	d0,d1
*	move.l	d1,d0
*	moveq	#10,d1
*	moveq	#0,d2
*	moveq	#0,d3
*	bsr	prtnum

*	move.w	#1,-(sp)
*	trap	#1
*	addq.l	#2,sp


	move.l	savesp,-(sp)
	move.w	#$20,-(sp)
	trap	#1
	addq.l	#6,sp

	clr.w	-(sp)
	trap	#1

deallocate:
	move.l	d0,-(sp)
	move.w	#$49,-(sp)
	trap	#1
	addq.l	#6,sp
	rts

clearmem:
	move.l	#(sw*sh),d0
	subq.l	#1,d0
	moveq	#0,d1
cml:
	move.w	d1,(a0)+
	subq.l	#1,d0
	bpl	cml
	rts

*********************************************************
*	One call does it all				*
*	Allocates memory for 3 screens 			*
*	targa load/hold area is internal.		*
*	Then sets all the hardware stuff to create	*
*	a 384*480 16bit screen				*
*********************************************************
setupscreen:
	move.l	#(((sw/16)*nplanes*sh)*2)+8,-(sp)	;thats 1 screen size
	move.w	#$48,-(sp)
	trap	#1
	addq.l	#6,sp
	tst.l	d0
	bmi	exit
	move.l	d0,savemem1
	and.l	#$fffffffc,d0
	move.l	d0,viewscreen1
	move.l	d0,a0
	bsr	clearmem

	move.l	#(((sw/16)*nplanes*sh)*2)+8,-(sp)	;thats 1 screen size
	move.w	#$48,-(sp)
	trap	#1
	addq.l	#6,sp
	tst.l	d0
	bmi	exit
	move.l	d0,savemem2
	and.l	#$fffffffc,d0
	move.l	d0,viewscreen2

	move.w	#2,-(sp)
	trap	#14
	addq.l	#2,sp
	move.l	d0,savescreen

	move.w	#-1,-(sp)
	move.w	#88,-(sp)
	trap	#14
	addq.l	#4,sp
	move.w	d0,savemode

	move.w	#vertflag|vga|col40|bps8,-(sp)
	move.w	#3,-(sp)
	move.l	viewscreen1,-(sp)
	move.l	viewscreen1,-(sp)
	move.w	#5,-(sp)
	trap	#14
	add.l	#14,sp

*	move.w	#2,-(sp)
*	trap	#14
*	addq.l	#2,sp
*	move.l	d0,savescreen2
	rts


*********************************************************
*	copy whole screen with blitter			*
*	set screen to copy to in a1			*
*********************************************************
copywhole:
	move.l	savescreen2,a0
*	move.l	viewscreen,a1
	lea	blitter,a6
.waitblit:
	btst	#7,line_num(a6)
	bne	.waitblit

	move.l	a0,src_addr(a6)
	move.l	a1,dst_addr(a6)
	move.w	#2,src_xinc(a6)
	move.w	#2,dst_xinc(a6)
	move.w	#2,src_yinc(a6)
	move.w	#2,dst_yinc(a6)
	move.w	#sw,x_count(a6)
	move.w	#sh,y_count(a6)
	move.w	#-1,endmask1(a6)
	move.w	#-1,endmask2(a6)
	move.w	#-1,endmask3(a6)
	move.b	#0,skew(a6)
	move.b	#$3,op(a6)
	move.b	#2,hop(a6)
	bset	#6,line_num(a6)
	bset	#7,line_num(a6)
	rts

doscreens:
*	lea	scrnback,a0
*	move.l	savescreen2,a1
*	jsr	ice_unpack
*	move.l	viewscreen1,a1
*	bsr	copywhole
*	move.l	viewscreen2,a1
*	bsr	copywhole
*	rts

;********************************************* Unpackroutine von ICE-PACK
; assemble with Devpac or any other Assembler
; length of this unpacking routine: 294 bytes
;  a0 = address of packed data
;  a1 = address of unpacked data
ice_unpack:
	movem.l d0-a6,-(sp)
	bsr	ice04
	cmpi.l	#'Ice!',d0		; Is file packed?
	bne	ice03			; no, leave this routine
	bsr	ice04
	lea	-8(a0,d0.l),a5
	bsr	ice04
*	move.l	d0,(sp)
	movea.l a1,a4
	movea.l a1,a6
	adda.l	d0,a6
	movea.l a6,a3
	move.b	-(a5),d7
	bsr	ice06
ice03:
	movem.l (sp)+,d0-a6
	rts
ice04:	moveq	#3,d1
ice05:	lsl.l	#8,d0
	move.b	(a0)+,d0
	dbra	d1,ice05
	rts
ice06:	bsr	ice0a
	bcc	ice09
	moveq	#0,d1
	bsr	ice0a
	bcc	ice08
	lea	ice17(pc),a1
	moveq	#4,d3
ice07:	move.l	-(a1),d0
	bsr	ice0c
	swap	d0
	cmp.w	d0,d1
	dbne	d3,ice07
	add.l	20(a1),d1
ice08:	move.b	-(a5),-(a6)
	dbra	d1,ice08
ice09:	cmpa.l	a4,a6
	bgt	ice0f
	rts
ice0a:	add.b	d7,d7
	bne	ice0b
	move.b	-(a5),d7
	addx.b	d7,d7
ice0b:	rts
ice0c:	moveq	#0,d1
ice0d:	add.b	d7,d7
	bne	ice0e
	move.b	-(a5),d7
	addx.b	d7,d7
ice0e:	addx.w	d1,d1
	dbra	d0,ice0d
	rts
ice0f:	lea	ice18(pc),a1
	moveq	#3,d2
ice10:	bsr	ice0a
	dbcc	d2,ice10
	moveq	#0,d4
	moveq	#0,d1
	move.b	1(a1,d2.w),d0
	ext.w	d0
	bmi	ice11
	bsr	ice0c
ice11:	move.b	6(a1,d2.w),d4
	add.w	d1,d4
	beq	ice13
	lea	ice19(pc),a1
	moveq	#1,d2
ice12:	bsr	ice0a
	dbcc	d2,ice12
	moveq	#0,d1
	move.b	1(a1,d2.w),d0
	ext.w	d0
	bsr	ice0c
	add.w	d2,d2
	add.w	6(a1,d2.w),d1
	bpl	ice15
	sub.w	d4,d1
	bra	ice15
ice13:	moveq	#0,d1
	moveq	#5,d0
	moveq	#-1,d2
	bsr	ice0a
	bcc	ice14
	moveq	#8,d0
	moveq	#$3f,d2
ice14:	bsr	ice0c
	add.w	d2,d1
ice15:	lea	2(a6,d4.w),a1
	adda.w	d1,a1
	move.b	-(a1),-(a6)
ice16:	move.b	-(a1),-(a6)
	dbra	d4,ice16
	bra	ice06

	DC.B $7f,$ff,$00,$0e,$00,$ff,$00,$07
	DC.B $00,$07,$00,$02,$00,$03,$00,$01
	DC.B $00,$03,$00,$01
ice17:	DC.B $00,$00,$01,$0d,$00,$00,$00,$0e
	DC.B $00,$00,$00,$07,$00,$00,$00,$04
	DC.B $00,$00,$00,$01
ice18:	DC.B $09,$01,$00,$ff,$ff,$08,$04,$02
	DC.B $01,$00
ice19:	DC.B $0b,$04,$07,$00,$01,$1f,$ff,$ff
	DC.B $00,$1f
	even

	section data


savecolors:
	pea	savedcolors
	move.w	#256,-(sp)
	move.w	#0,-(sp)
	move.w	#94,-(sp)
	trap	#14
	add.l	#10,sp
	rts
restorecolors:
	pea	savedcolors		;color array
	move.w	#256,-(sp)		;number to set
	move.w	#0,-(sp)		;index to start at
	move.w	#93,-(sp)
	trap	#14
	add.l	#10,sp
	rts

setpal:
	lea	clut1,a0
	move.w	#256,numcol
	bsr	dopal
	rts

*************************************************
*	Requires address of pal dat 		*
*	in a0 and num cols in d0		*
*************************************************
dopal:
	movem.l	d0-a6,-(sp)
	move.l	a0,-(sp)		;color array
	move.w	numcol,-(sp)		;number to set
	move.w	#0,-(sp)		;index to start at
	move.w	#93,-(sp)
	trap	#14
	add.l	#10,sp
	movem.l	(sp)+,d0-a6
	rts

maketable:
	moveq	#0,d7		;color
	moveq	#0,d6		;color
	lea	planetable1,a2
	lea	planetable2,a3
	lea	planetable3,a4
	lea	planetable4,a5
ssl2b:
	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
	moveq	#0,d5
	move.b	d6,d7
	cmpi.b	#63,d7
	ble	.as0
	move.w	#%1111000000000000,d0
	move.w	#%1111000000000000,d1
	move.w	#%1111000000000000,d2
	move.w	#%1111000000000000,d3
	move.w	#%1111000000000000,d4
	move.w	#%1111000000000000,d5
	bra	twoof4b
.as0:
	asr.b	#1,d7
	bcc	.as1
	move.w	#%1111000000000000,d0
.as1:
	asr.b	#1,d7
	bcc	.as2
	move.w	#%1111000000000000,d1
.as2:
	asr.b	#1,d7
	bcc	.as3
	move.w	#%1111000000000000,d2
.as3:
	asr.b	#1,d7
	bcc	.as4
	move.w	#%1111000000000000,d3
.as4:
	asr.b	#1,d7
	bcc	.as5
	move.w	#%1111000000000000,d4
.as5:
	asr.b	#1,d7
	bcc	twoof4b
	move.w	#%1111000000000000,d5
twoof4b:
	movem.w	d0-d5,(a2)
	add.l	#16,a2
	move.b	d6,d7
	cmpi.b	#63,d7
	ble	.as0
	move.w	#%0000111100000000,d0
	move.w	#%0000111100000000,d1
	move.w	#%0000111100000000,d2
	move.w	#%0000111100000000,d3
	move.w	#%0000111100000000,d4
	move.w	#%0000111100000000,d5
	bra	threeof4b
.as0:
	asr.b	#1,d7
	bcc	.as1
	move.w	#%0000111100000000,d0
.as1:
	asr.b	#1,d7
	bcc	.as2
	move.w	#%0000111100000000,d1
.as2:
	asr.b	#1,d7
	bcc	.as3
	move.w	#%0000111100000000,d2
.as3:
	asr.b	#1,d7
	bcc	.as4
	move.w	#%0000111100000000,d3
.as4:
	asr.b	#1,d7
	bcc	.as5
	move.w	#%0000111100000000,d4
.as5:
	asr.b	#1,d7
	bcc	threeof4b
	move.w	#%0000111100000000,d5
threeof4b:
	movem.w	d0-d5,(a3)
	add.l	#16,a3
	move.b	d6,d7
	cmpi.b	#63,d7
	ble	.as0
	move.w	#%0000000011110000,d0
	move.w	#%0000000011110000,d1
	move.w	#%0000000011110000,d2
	move.w	#%0000000011110000,d3
	move.w	#%0000000011110000,d4
	move.w	#%0000000011110000,d5
	bra	fourof4b
.as0:
	asr.b	#1,d7
	bcc	.as1
	move.w	#%0000000011110000,d0
.as1:
	asr.b	#1,d7
	bcc	.as2
	move.w	#%0000000011110000,d1
.as2:
	asr.b	#1,d7
	bcc	.as3
	move.w	#%0000000011110000,d2
.as3:
	asr.b	#1,d7
	bcc	.as4
	move.w	#%0000000011110000,d3
.as4:
	asr.b	#1,d7
	bcc	.as5
	move.w	#%0000000011110000,d4
.as5:
	asr.b	#1,d7
	bcc	fourof4b
	move.w	#%0000000011110000,d5
fourof4b:
	movem.w	d0-d5,(a4)
	add.l	#16,a4
	move.b	d6,d7
	cmpi.b	#63,d7
	ble	.as0
	move.w	#%0000000000001111,d0
	move.w	#%0000000000001111,d1
	move.w	#%0000000000001111,d2
	move.w	#%0000000000001111,d3
	move.w	#%0000000000001111,d4
	move.w	#%0000000000001111,d5
	bra	fiveof4b
.as0:
	asr.b	#1,d7
	bcc	.as1
	move.w	#%0000000000001111,d0
.as1:
	asr.b	#1,d7
	bcc	.as2
	move.w	#%0000000000001111,d1
.as2:
	asr.b	#1,d7
	bcc	.as3
	move.w	#%0000000000001111,d2
.as3:
	asr.b	#1,d7
	bcc	.as4
	move.w	#%0000000000001111,d3
.as4:
	asr.b	#1,d7
	bcc	.as5
	move.w	#%0000000000001111,d4
.as5:
	asr.b	#1,d7
	bcc	fiveof4b
	move.w	#%0000000000001111,d5
fiveof4b:
	movem.w	d0-d5,(a5)
	add.l	#16,a5
	addq.b	#1,d6
	cmpi.b	#64,d6
	blt	ssl2b
	rts






clut1:
	dc.b	0,0*4,0*4,0*4,0,0*4,1*4,1*4,0,0*4,4*4,5*4,0,0*4,7*4,9*4
	dc.b	0,0*4,8*4,11*4,0,0*4,9*4,12*4,0,15*4,6*4,8*4,0,25*4,4*4,4*4
	dc.b	0,33*4,3*4,3*4,0,40*4,2*4,2*4,0,48*4,2*4,2*4,0,55*4,1*4,1*4
	dc.b	0,63*4,0*4,0*4,0,63*4,0*4,0*4,0,63*4,3*4,0*4,0,63*4,7*4,0*4
	dc.b	0,63*4,10*4,0*4,0,63*4,13*4,0*4,0,63*4,16*4,0*4,0,63*4,20*4,0*4
	dc.b	0,63*4,23*4,0*4,0,63*4,26*4,0*4,0,63*4,29*4,0*4,0,63*4,33*4,0*4
	dc.b	0,63*4,36*4,0*4,0,63*4,39*4,0*4,0,63*4,39*4,0*4,0,63*4,40*4,0*4
	dc.b	0,63*4,40*4,0*4,0,63*4,41*4,0*4,0,63*4,42*4,0*4,0,63*4,42*4,0*4

	dc.b	0,63*4,43*4,0*4,0,63*4,44*4,0*4,0,63*4,44*4,0*4,0,63*4,45*4,0*4
	dc.b	0,63*4,45*4,0*4,0,63*4,46*4,0*4,0,63*4,47*4,0*4,0,63*4,47*4,0*4
	dc.b	0,63*4,48*4,0*4,0,63*4,49*4,0*4,0,63*4,49*4,0*4,0,63*4,50*4,0*4
	dc.b	0,63*4,51*4,0*4,0,63*4,51*4,0*4,0,63*4,52*4,0*4,0,63*4,53*4,0*4
	dc.b	0,63*4,53*4,0*4,0,63*4,54*4,0*4,0,63*4,55*4,0*4,0,63*4,55*4,0*4
	dc.b	0,63*4,56*4,0*4,0,63*4,57*4,0*4,0,63*4,57*4,0*4,0,63*4,58*4,0*4
	dc.b	0,63*4,58*4,0*4,0,63*4,59*4,0*4,0,63*4,60*4,0*4,0,63*4,60*4,0*4
	dc.b	0,63*4,61*4,0*4,0,63*4,62*4,0*4,0,63*4,63*4,0*4,0,255,255,255		;63*4,63*4,0*4
	rept	128
	dc.b	0,0,255,255
	endr
r	set	0
g	set	0
b	set	0
	rept	16
	dc.b	0,r,g,b
r	set	r+2
g	set	g+2
b	set	b+15
	endr

*	rept	200
*	dc.b	0,255,255,255
*	endr

	rept	16
	dc.b	0,r,g,b
r	set	r+13
g	set	g+13
b	set	b+0
	endr

	rept	200
	dc.b	0,255,255,255
	endr


	rept	16
	dc.b	0,r,g,b
r	set	r+1
g	set	g+1
b	set	b+0
	endr


planetable1:
	ds.w	64*8
planetable2:
	ds.w	64*8
planetable3:
	ds.w	64*8
planetable4:
	ds.w	64*8




viewscreen2:	dc.l	-1
viewscreen1:	dc.l	-1
memlist:
savemem1:	dc.l	0
savemem2:	dc.l	0
savemem3:	dc.l	0
		dc.l	-1	;end of mem list flag

soundmem:	dc.l	0
howlong:	dc.l	0
handles:	dc.w	0
array1:
		dcb.b	width*height,0
array2:
		dcb.b	width*height,0

words:
	incbin	'fwords.img'
	even
	SECTION BSS

		ds.l	1000
mystack:	ds.w	1	;stacks go backwards
savedcolors:	ds.b	256*4
dummy:		ds.w	1
color:		ds.w	1
pixelx:		ds.w	1
pixely:		ds.w	1
savesp:		ds.l	1
time:		ds.l	1
blitx:		ds.l	1
blity:		ds.l	1
picsource:	ds.l	1
expansion:	ds.w	1
oldmouse:	ds.l	1
whichpic:	ds.l	1
frame:		ds.l	1
whicheffect:	ds.l	1
oldvblvec:	ds.l	1
vblflag:	ds.w	1
savescreen:	ds.l	1
savescreen2:	ds.l	1
savemode:	ds.w	1
save114:	ds.l	1
mastervol:	ds.w	1
bufferword:	ds.w	1
elipseend:	ds.l	1
mapx:		ds.w	1
mapy:		ds.w	1
numcol:		ds.w	1
timerstart:	ds.l	1
timerend:	ds.l	1
frames:		ds.l	1
ycount:		ds.w	1
wordscreen:	ds.b	8000

