[comp.sources.atari.st] v02i080: mandel -- Fast Mandelbrot set generator

koreth%panarthea.ebay@sun.com (Steven Grimm) (08/21/89)

Submitted-by: SQ79%liverpool.ac.uk@NSFnet-Relay.AC.UK (Mark Powell)
Posting-number: Volume 2, Issue 80
Archive-name: mandel

Here is the source to the Mandelbrot generator that has just been posted
to the binaries newsgroup. Sorry about the lack of comments, but thats
just the sloppy way I program.

Mark Powell

ARPAnet : sq79%liv.ac.uk@{ucl-cs.arpa,cs.ucl.ac.uk}
USENET  : ...!mcvax!ukc!liv.ac.uk!sq79
---------------------cut here------------------------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  MANDEL.S
# Wrapped by koreth@panarthea on Sun Aug 20 15:06:22 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'MANDEL.S' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MANDEL.S'\"
else
echo shar: Extracting \"'MANDEL.S'\" \(17097 characters\)
sed "s/^X//" >'MANDEL.S' <<'END_OF_FILE'
X
Xtemp	equ	$30
X
X	move.l	4(sp),a5
X	move.l	#end+4096,d0
X	move.l	a5,d1
X	add.l	d0,d1
X	bclr	#0,d1
X	move.l	d1,sp
X	move.l	d0,-(sp)
X	move.l	a5,-(sp)
X	pea	$4a0000
X	trap	#1
X	lea	12(sp),sp
X	tst	d0
X	beq.s	okay
X
X	lea	nomem(pc),a1
X	bsr	prmes
X	bsr	anykey
X	bra	exit
X
Xokay	clr.l	-(sp)
X	move	#32,-(sp)
X	trap	#1
X	addq.l	#6,sp
X	move.l	d0,oldssp
X
X	dc.w	$a00a
X
X	movem.l	$8240.w,d0-d7
X	movem.l	d0-d7,oldpal
X
X	pea	-1.w
X	move.l	(sp),-(sp)
X	move.l	(sp),-(sp)
X	move	#16,-(sp)
X	trap	#14
X	lea	14(sp),sp
X	move.l	d0,a0
X	move.l	8(a0),keytable
X
X	move	#2,-(sp)
X	trap	#14
X	addq.l	#2,sp
X	move.l	d0,phybase
X	move	#3,-(sp)
X	trap	#14
X	addq.l	#2,sp
X	move.l	d0,logbase
X
X	move	#4,-(sp)
X	trap	#14
X	addq.l	#2,sp
X	move	d0,oldres
X	cmp	#2,d0
X	bne.s	colour
X
X	lea	nomono(pc),a1
X	bsr	prmes
X	bsr	anykey
X	bra	exit1
X
Xcolour	clr	-(sp)
X	pea	-1.w
X	move.l	(sp),-(sp)
X	move	#5,-(sp)
X	trap	#14
X	lea	12(sp),sp
X
X	move	#$2700,sr
X	move.l	$fa06.w,oldier
X	clr.b	$fa07.w
X	move.b	#$40,$fa09.w
X	bclr	#6,$fa0d.w
X	bclr	#6,$fa11.w
X	bset	#6,$fa15.w
X	move.l	$118.w,oldkeyb
X	move.l	#keybrd,$118.w
X	move.l	$456.w,a0
X	move.l	(a0),oldvblq
X	move.l	#vbl,(a0)
X	move.l	#palette,$45a.w
X	move	#$2300,sr
X	
X	lea	keydat(pc),a0
X	moveq	#3-1,d0
X	bsr	sendikbd
X
Xdrawfull
X	move.l	#$a0000000,a3
X	move.l	#$c0000000,a4
X	move.l	#$a3d70a,a1
X
X	bsr	mandel
X
X	bsr	mouseon
X
X* Main loop
X
Xmain	bsr	wvbl
X
X	move	keys(pc),d0
X
X	cmp	#$13,d0		'r' redraw current
X	beq	domand
X	cmp	#1,d0		esc exit from program
X	beq	desktop
X	cmp	#$17,d0		'i' alter iterations
X	bne	noti
X
X* Alter iteration
X
X	movem.l	a1/a3/a4,-(sp)
X	bsr	screendown
X	lea	inpmes(pc),a1
X	bsr	prmes
X
Xwni	cmp	#$17,keys
X	beq.s	wni
X
X	lea	inpbuf(pc),a5
X	move.l	a5,a6
Xnokey	move	keys(pc),d7
X	cmp	#$74,d7
X	bge.s	nokey
X	move.l	keytable(pc),a0
X	move.b	0(a0,d7),d1
X	beq.s	nokey
X	cmp.b	#13,d1
X	beq.s	return
X	cmp.b	#8,d1
X	beq.s	delete
X	cmp.l	#inpbuf+10,a6
X	beq.s	nokey
X	cmp.b	#'0',d1
X	blt.s	nokey
X	cmp.b	#'9',d1
X	bgt.s	nokey
X	move.b	d1,(a6)+
X	move	d1,d0
X	bsr	prchar
Xwaitnk	cmp	keys(pc),d7
X	beq.s	waitnk
X	bra.s	nokey
X
Xdelete	cmp.l	a5,a6
X	beq.s	nokey
X	subq.l	#1,a6
X	lea	delmes(pc),a1
X	bsr	prmes
X	bra.s	waitnk
X
Xreturn	cmp.l	a5,a6		anything in the buffer?
X	beq.s	restscr		if not then leave iterations unchanged
X
X	moveq	#0,d0
X	moveq	#0,d1
Xnxtchar	move.b	(a5)+,d0
X	sub	#'0',d0
X	move.l	d1,d2
X	add.l	d1,d1
X	add.l	d1,d1
X	add.l	d2,d1
X	add.l	d1,d1
X	add.l	d0,d1
X	cmp.l	a5,a6
X	bne.s	nxtchar
X	move.l	d1,iterations+2
X
Xrestscr	moveq	#27,d0		put screen back up
X	bsr	prchar
X	moveq	#'f',d0
X	bsr	prchar
X	bsr	screenup
X	movem.l	(sp)+,a1/a3/a4
X
Xnoti	cmp	#$21,d0		'f' draw full set
X	bne.s	notf
X
X	bsr	mouseoff
X	bra	drawfull
X
Xnotf	cmp	#$61,d0		'undo' redraw last picture
X	bne.s	notundo
X
X	movem.l	lastmand(pc),a1/a3/a4
X	bra	domand
X
Xnotundo	cmp	#$2d,d0
X	bne.s	notx
X
X	move.l	a1,-(sp)
X	bsr	screendown
X	lea	xmes(pc),a1
X	bsr	prmes
X	move.l	a3,d0
X	bsr	prhex32
X	bsr	space
X	move.l	a4,d0
X	bsr	prhex32
X	bsr	space
X	move.l	(sp),d0
X	bsr	prhex32
X	bsr	space
Xwaitnx	cmp	#$2d,keys
X	beq.s	waitnx
Xwaitkey	tst	keys
X	beq.s	waitkey
X	bsr	screenup
X	move.l	(sp)+,a1
X
Xnotx	cmp	#$39,d0		space
X	bne	main
X
X	moveq	#0,d4
X	move	box_width(pc),d4
X	move.l	a1,d0
X	move	d0,d1
X	mulu	d4,d1
X	swap	d0
X	mulu	d4,d0
X	swap	d0
X	clr	d0
X	add.l	d0,d1
X
X* divide d1 by 200
X	move.l	#200,d5
X	moveq	#0,d2
X	moveq	#32-2,d3
X	addq	#1,d3
Xdivlp	addx.l	d1,d1
X	addx.l	d2,d2
X	sub.l	d5,d2
X	bcc.s	subok
X	add.l	d5,d2
Xsubok	eor	#$10,sr
X	dbra	d3,divlp
X	addx.l	d1,d1
X	tst.l	d1
X	bne.s	zoomok
X
X	move	#$2700,sr
X	not	$8240.w
X	lea	$8800.w,a0
X	lea	beepdat(pc),a2
X	moveq	#7-1,d0
Xsndlp	move	(a2)+,d1
X	movep	d1,0(a0)
X	dbra	d0,sndlp
X	not	$8240.w
X	move	#$2300,sr
X	bra	main
X
Xzoomok	movem.l	a1/a3/a4,lastmand
X
X	move	mousex(pc),d2	Calculate top left corner of box, position
X	move	mousey(pc),d3	in d2,d3
X	sub	d4,d3
X	lsl	#3,d4
X	divu	#5,d4
X	sub	d4,d2
X
X	move.l	a1,d4
X	move	d4,d5
X	mulu	d2,d5
X	swap	d4
X	mulu	d2,d4
X	swap	d4
X	clr	d4
X	add.l	d4,d5
X	add.l	d5,a3	a3=a3+x*a1
X
X	move.l	a1,d4
X	move	d4,d5
X	mulu	d3,d5
X	swap	d4
X	mulu	d3,d4
X	swap	d4
X	clr	d4
X	add.l	d4,d5
X	add.l	d5,a4	a4=a4+y*a1
X
X	move.l	d1,a1
X
Xdomand	bsr	mouseoff
X
X	bsr.s	mandel
X
X	bsr	mouseon
X	bra	main
X
X*
X* Display portion of Mandelbrot set with top left corner a3+a4i
X* height and width a1*200
X*
X
Xmandel	movem.l	a1/a3/a4/a7,regstor
X	move	#1,manding
X
X	move.l	$44e.w,a5
X
X	lea	200*160(a5),a6
X	move.l	a6,compare+2
X
X	move.l	a4,d4		bc=sy
X	moveq	#2-1,d0
Xrow2lp	move	d0,-(sp)
X	move.l	a3,d3		ac=sx
X	bsr	calculate
X	lea	store1(pc),a2
X	move	d1,(a2)+	
X	add.l	a1,d3
X	bsr	calculate
X	move	d1,(a2)+
X
X	move	#318/2-1,d7
Xpairlp	add.l	a1,d3
X	move.l	d3,d2
X	add.l	a1,d3
X	bsr	calculate
X	move	d1,2(a2)
X	cmp	-2(a2),d1
X	beq.s	same
X	exg	d3,d2
X	bsr	calculate
X	move	d1,(a2)
X	move.l	d2,d3
X	bra.s	nxt1
Xsame	move	d1,(a2)
Xnxt1	addq.l	#4,a2
X	dbra	d7,pairlp
X
X	lea	store1(pc),a2
X	moveq	#20-1,d0
Xwordlp	move	d0,-(sp)
X	moveq	#16-1,d2
Xbitlp	move	(a2)+,d1
X	lsr	#1,d1
X	roxl	#1,d0
X	lsr	#1,d1
X	roxl	#1,d5
X	lsr	#1,d1
X	roxl	#1,d6
X	lsr	#1,d1
X	roxl	#1,d7
X	dbra	d2,bitlp
X	move	d0,(a5)+
X	move	d5,(a5)+
X	move	d6,(a5)+
X	move	d7,(a5)+
X	move	(sp)+,d0
X	dbra	d0,wordlp
X
X	add.l	a1,d4		
X	move	(sp)+,d0
X	dbra	d0,row2lp
X
X	lea	store2(pc),a2
X	lea	store1(pc),a4
X*
X* Calculate lines in pairs
X*
X
Xpair2lp	movem.l	d4/a2/a4,-(sp)
X	add.l	a1,d4
X
X	move.l	a3,d3		ac=sx
X	bsr	calculate
X	move	d1,(a2)+	
X	add.l	a1,d3
X	bsr	calculate
X	move	d1,(a2)+
X
X	move	#318/2-1,d7
Xpairlp0	add.l	a1,d3
X	move.l	d3,d2
X	add.l	a1,d3
X	bsr	calculate
X	move	d1,2(a2)
X	cmp	-2(a2),d1
X	beq.s	same0
X	exg	d3,d2
X	bsr	calculate
X	move	d1,(a2)
X	move.l	d2,d3
X	bra.s	nxt10
Xsame0	move	d1,(a2)
Xnxt10	addq.l	#4,a2
X	dbra	d7,pairlp0
X
X	move.l	4(sp),a2
X	move.l	a5,a6
X	lea	160(a5),a5
X	moveq	#20-1,d0
Xwordlp0	move	d0,-(sp)
X	moveq	#16-1,d2
Xbitlp0	move	(a2)+,d1
X	lsr	#1,d1
X	roxl	#1,d0
X	lsr	#1,d1
X	roxl	#1,d5
X	lsr	#1,d1
X	roxl	#1,d6
X	lsr	#1,d1
X	roxl	#1,d7
X	dbra	d2,bitlp0
X	move	d0,(a5)+
X	move	d5,(a5)+
X	move	d6,(a5)+
X	move	d7,(a5)+
X	move	(sp)+,d0
X	dbra	d0,wordlp0
X
X	move.l	(sp)+,d5
X	movem.l (sp),a2/a4
X	move.l	d4,-(sp)
X	move.l	d5,d4
X	move.l	a3,d3
X	moveq	#20-1,d0
Xwordlp1	move	d0,-(sp)
X	moveq	#16-1,d2
Xbitlp1	move	(a2)+,d1
X	cmp	(a4)+,d1
X	beq.s	same1
X	bsr.s	calculate
Xsame1	add.l	a1,d3
X	lsr	#1,d1
X	roxl	#1,d0
X	lsr	#1,d1
X	roxl	#1,d5
X	lsr	#1,d1
X	roxl	#1,d6
X	lsr	#1,d1
X	roxl	#1,d7
X	dbra	d2,bitlp1
X	move	d0,(a6)+
X	move	d5,(a6)+
X	move	d6,(a6)+
X	move	d7,(a6)+
X	move	(sp)+,d0
X	dbra	d0,wordlp1
X
X	movem.l	(sp)+,d4/a2/a4
X	exg	a2,a4
X	add.l	a1,d4
X
Xcompare	cmp.l	#0,a5
X	bne	pair2lp
X
Xmandout	clr	manding
X	movem.l	regstor(pc),a1/a3/a4/a7
X	rts			done mandelbrot
X
X
X* Calculate point at d3+d4i
X
Xcalculate
X	movem.l	d0/d2-d7,-(sp)
X
X	move.l	d3,d5
X	move.l	d4,d6
X	sub.l	a0,a0
X
Xcalc	move.l	d5,d2
X	bsr	square
X	bmi.s	out_of_range
X	move.l	d2,(temp).w
X	move.l	d6,d2
X	bsr	square
X	bmi.s	out_of_range
X	move.l	(temp).w,d1
X	add.l	d2,d1
X	bcs.s	done
X	cmp.l	#$80000000,d1
X	bcc.s	out_of_range
Xiterations
X	cmp.l	#100,a0
X	beq.s	done
X	add.l	d6,d6
X	bsr	multiply
X	add.l	d4,d6
X	move.l	(temp).w,d5
X	sub.l	d2,d5
X	add.l	d3,d5
X	addq	#1,a0
X	bra.s	calc
X
Xout_of_range
X	moveq	#0,d1
X	move	a0,d1
X	divu	#15,d1
X	swap	d1
X	addq	#1,d1
X	movem.l	(sp)+,d0/d2-d7
X	rts
X
Xdone	moveq	#0,d1
X	movem.l	(sp)+,d0/d2-d7
X	rts
X
X* Square a number in d2
X
Xsquare	movem.l	d3/d4,-(sp)
X	tst.l	d2
X	bpl.s	splus
X	neg.l	d2
Xsplus	moveq	#0,d0
X	moveq	#0,d1
X	move.l	d2,d3
X	moveq	#0,d4
X
X	move	d2,d3
X	move	d2,d0
X	mulu	d2,d0
X	swap	d2
X	move	d2,d1
X	mulu	d2,d1
X	mulu	d2,d3
X	swap	d3
X	moveq	#0,d4
X	move	d3,d4
X	clr	d3
X	add.l	d3,d0
X	addx.l	d4,d1
X	add.l	d3,d0
X	addx.l	d4,d1
X
X	rol.l	#3,d0
X	and	#7,d0
X	cmp.l	#$10000000,d1
X	bcc.s	overflow
X	lsl.l	#3,d1
X	or	d0,d1
X	move.l	d1,d2
X	movem.l	(sp)+,d3/d4
X	rts
X
Xoverflow
X	moveq	#-1,d0
X	movem.l	(sp)+,d3-d4
X	rts
X	
X* Multiply d6 by d5
X
Xmultiply
X	movem.l	d2-d4,-(sp)
X
X	moveq	#0,d3
X	move.l	d5,d2
X
X	tst.l	d2
X	bpl.s	d2plus
X	moveq	#1,d3
X	neg.l	d2
Xd2plus	tst.l	d6
X	bpl.s	d6plus
X	eor	#1,d3
X	neg.l	d6
Xd6plus	moveq	#0,d0
X	moveq	#0,d1
X	moveq	#0,d4
X	move	d3,-(sp)
X
X	move	d2,d7
X	move	d2,d0
X	mulu	d6,d0
X	swap	d2
X	move	d2,d3
X	mulu	d6,d3
X	swap	d6
X	move	d2,d1
X	mulu	d6,d1
X	swap	d3
X	moveq	#0,d4
X	move	d3,d4
X	clr	d3
X	add.l	d3,d0
X	addx.l	d4,d1
X	mulu	d6,d7
X	swap	d7
X	move	d7,d4
X	clr	d7
X	add.l	d7,d0
X	addx.l	d4,d1
X
X	rol.l	#3,d0
X	and	#7,d0
X	lsl.l	#3,d1
X	or	d0,d1
X	move.l	d1,d6
X	move	(sp)+,d2
X	tst	d2
X	beq.s	mokay
X	neg.l	d6
Xmokay	movem.l	(sp)+,d2-d4
X	rts
X
X
X* Various routines
X
Xscreendown
X	move.l	phybase(pc),a0
X	lea	-1280(a0),a0
X	move	#-1,-(sp)
X	pea	(a0)
X	pea	(a0)
X	move	#5,-(sp)
X	trap	#14
X	lea	12(sp),sp
X	rts
X
Xscreenup
X	move	#-1,-(sp)
X	move.l	phybase(pc),-(sp)
X	move.l	(sp),-(sp)
X	move	#5,-(sp)
X	trap	#14
X	lea	12(sp),sp
X	rts
X
Xprhex32	move	d0,-(sp)
X	swap	d0
X	bsr.s	prhex16
X	move	(sp)+,d0
Xprhex16	move	d0,-(sp)
X	lsr	#8,d0
X	bsr.s	prhex8
X	move	(sp)+,d0
Xprhex8	move	d0,-(sp)
X	lsr	#4,d0
X	bsr.s	prhex4
X	move	(sp)+,d0
Xprhex4	and	#$f,d0
X	move.b	hexdat(pc,d0),d0
X	bra.s	prchar
X
Xhexdat	dc.b	'0123456789ABCDEF'
X
Xspace	moveq	#32,d0
Xprchar	move	d0,-(sp)
X	pea	$30002
X	trap	#13
X	addq.l	#6,sp
X	rts
X
Xprmes	pea	(a1)
X	move	#9,-(sp)
X	trap	#1
X	addq.l	#6,sp
X	rts
X
Xanykey	lea	anymes(pc),a1
X	bsr.s	prmes
X	pea	$20002
X	trap	#13
X	addq.l	#4,sp
X	rts
X
Xsendikbd
Xkeylp	move.b	(a0)+,d1
X	bsr.s	sendkb
X	dbra	d0,keylp
X	rts
X
Xsendkb	btst	#1,$fc00.w
X	beq.s	sendkb
X	move.b	d1,$fc02.w
X	rts
X	
Xwvbl	move.l	$466.w,d0
Xwaitlp	cmp.l	$466.w,d0
X	beq.s	waitlp
X	rts
X
Xmouseon	movem.l	d0-d7/a0-a6,-(sp)
X	bsr	drawbox
X	bsr	drawm
X	move.l	mousex(pc),nmousex
X	movem.l	(sp)+,d0-d7/a0-a6
X	move	#1,mouse
X	rts
X
Xmouseoff
X	clr	mouse
X	movem.l	d0-d7/a0-a6,-(sp)
X	bsr	undraw
X	bsr	undrawbox
X	movem.l	(sp)+,d0-d7/a0-a6
X	rts
X
X
X* Vertical blank handler
X
Xvbl	move	keys(pc),d0
X
X	cmp	#$32,d0		m set multi-colours
X	bne.s	notm
X
X	movem.l	palette(pc),d0-d7
X	movem.l	d0-d7,$8240.w
X
Xnotm	cmp	#$1f,d0		s set up single colours
X	bne.s	nots
X
X	lea	$8242.w,a0
X	move.l	#$7770606,(a0)+
X	move.l	#$7770606,(a0)+
X	move.l	#$7770606,(a0)+
X	move.l	#$7770606,(a0)+
X	move.l	#$7770606,(a0)+
X	move.l	#$7770606,(a0)+
X	move.l	#$7770606,(a0)+
X	move	#$777,(a0)
X
Xnots	cmp	#$2e,d0		c start cycling
X	bne.s	noc
X
X	move	#1,cycle
X	move	#5,tmpdel
X
Xnoc	cmp	#$2f,d0		v stop cycling
X	bne.s	notsp
X
X	clr	cycle
X
Xnotsp	tst	cycle
X	beq.s	nocyc
X
X	cmp	#$4e,d0		+ on keypad speed up cycling	
X	bne.s	notdec
X
X	cmp	#1,delay
X	beq.s	notdec
X	subq	#1,delay
X
Xnotdec	cmp	#$4a,d0		- on keypad slow down cycling
X	bne.s	notinc
X
X	addq	#1,delay
X
Xnotinc	subq	#1,tmpdel
X	bne.s	nocyc
X	move	delay(pc),tmpdel
X	lea	$8260.w,a0
X	lea	$825e.w,a1
X	move	(a1),d0
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	-(a1),-(a0)
X	move	d0,(a1)
X
Xnocyc	tst	mouse
X	beq	nomouse
X
X	bsr	undraw
X	bsr	undrawbox
X
X	move	keys(pc),d0
X	move.l	nmousex(pc),d2
X	move.l	d2,d1
X	swap	d1
X	cmp	#$48,d0
X	bne.s	notup
X	subq	#1,d2
Xnotup	cmp	#$50,d0
X	bne.s	notdown
X	addq	#1,d2
Xnotdown	cmp	#$4b,d0
X	bne.s	notleft
X	subq	#1,d1
Xnotleft	cmp	#$4d,d0
X	bne.s	notrigh
X	addq	#1,d1
X
Xnotrigh	tst	d1		make sure d1 & d2 are on screen
X	bpl.s	kmxok
X	clr	d1
Xkmxok	cmp	#319,d1
X	ble.s	kmxok1
X	move	#319,d1
Xkmxok1	tst	d2
X	bpl.s	kmyok
X	clr	d2
Xkmyok	cmp	#199,d2
X	ble.s	kmyok1
X	move	#199,d2
Xkmyok1	move	d1,mousex
X	move	d2,mousey	
X
X	tst	leftbutton
X	beq.s	nolb
X	cmp	#1,box_width
X	beq.s	nolb
X	subq	#1,box_width
Xnolb	tst	rightbutton
X	beq.s	norb
X	cmp	#100,box_width
X	beq.s	norb
X	addq	#1,box_width
X
Xnorb	move	box_width(pc),d5
X	moveq	#0,d6
X	move	d5,d6
X	lsl	#3,d6
X	divu	#5,d6
X	cmp	mousex(pc),d6
X	ble.s	mxokay
X	move	d6,mousex
Xmxokay	cmp	mousey(pc),d5
X	ble.s	myokay
X	move	d5,mousey
Xmyokay	bsr	drawbox
X	bsr	drawm
X	move.l	mousex(pc),nmousex
X
Xnomouse	rts
X
X	
Xdrawm	moveq	#0,d0
X	move	mousey(pc),d0
X	move	d0,d1
X	add	d0,d0
X	add	d0,d0
X	add	d1,d0
X	lsl	#5,d0
X	move	mousex(pc),d1
X	move	d1,d2
X	lsr	#1,d1
X	and	#$fff8,d1
X	add	d1,d0
X	move.l	phybase(pc),a0
X	add.l	d0,a0
X	and	#$f,d2
X	lea	trash(pc),a1
X	move.l	mousedatapnt(pc),a2
X	move.l	a0,(a1)+
X	move	#200,d3
X	sub	mousey(pc),d3
X	cmp	#16,d3
X	ble.s	fulsize
X	moveq	#16,d3
Xfulsize	subq	#1,d3
X	move	d3,(a1)+
X	cmp	#152,d1
X	beq.s	rightedge
Xdrawlp	movem.l	(a0),d4-d7
X	movem.l	d4-d7,(a1)
X	lea	16(a1),a1
X	moveq	#0,d0
X	move	(a2)+,d0
X	not	d0
X	swap	d0
X	lsr.l	d2,d0
X	not.l	d0
X	move.l	a0,a4
X	swap	d0
X	and	d0,(a4)+
X	and	d0,(a4)+
X	and	d0,(a4)+
X	and	d0,(a4)+
X	swap	d0
X	and	d0,(a4)+
X	and	d0,(a4)+
X	and	d0,(a4)+
X	and	d0,(a4)+
X	moveq	#0,d0
X	move	(a2)+,d0
X	swap	d0
X	lsr.l	d2,d0
X	or	d0,8(a0)
X	swap	d0
X	or	d0,(a0)
X	moveq	#0,d0
X	move	(a2)+,d0
X	swap	d0
X	lsr.l	d2,d0
X	or	d0,10(a0)
X	swap	d0
X	or	d0,2(a0)
X	lea	160(a0),a0
X	dbra	d3,drawlp
X	rts
Xrightedge
X	movem.l	(a0),d4-d7
X	movem.l	d4-d7,(a1)
X	lea	16(a1),a1
X	move	(a2)+,d0
X	not	d0
X	lsr	d2,d0
X	not	d0
X	move.l	a0,a4
X	and	d0,(a4)+
X	and	d0,(a4)+
X	and	d0,(a4)+
X	and	d0,(a4)+
X	move	(a2)+,d0
X	lsr	d2,d0
X	or	d0,(a0)
X	move	(a2)+,d0
X	lsr	d2,d0
X	or	d0,2(a0)
X	lea	160(a0),a0
X	dbra	d3,rightedge
X	rts
X
Xundraw	lea	trash(pc),a0
X	move.l	(a0)+,a1
X	move	(a0)+,d4
Xundrlp	movem.l	(a0)+,d0-d3
X	movem.l	d0-d3,(a1)
X	lea	160(a1),a1
X	dbra	d4,undrlp
X	rts
X
Xundrawbox
X	move.l	oldbxy(pc),d1
X	bra.s	db
X
Xdrawbox	move.l	mousex(pc),d1
X	move.l	d1,oldbxy
Xdb	move.l	d1,d0
X	swap	d0
X	move	box_width(pc),d2
X	moveq	#0,d3
X	move	d2,d3
X	lsl	#3,d3
X	divu	#5,d3
X
X	move	d1,d4
X	add	d1,d1
X	add	d1,d1
X	add	d4,d1
X	lsl	#5,d1
X	move.l	phybase(pc),a0
X	add	d1,a0
X	move	d0,d7
X	and	#$f,d7
X	eor	#$f,d7
X	lsr	#1,d0
X	and	#$fff8,d0
X	add	d0,a0		a0=address of bottom right corner of box
X	move	d2,d0
X	add	d0,d0
X	add	d0,d0
X	add	d2,d0
X	lsl	#5,d0
X	neg	d0
X	lea	0(a0,d0),a2
X	move	d7,d6
X
X	moveq	#0,d1
Xhorizlp	bset	d7,d1
X	subq	#1,d3
X	bmi.s	donehor
X	addq	#1,d7
X	cmp	#16,d7
X	bne.s	horizlp
X	moveq	#0,d7
X	eor	d1,(a0)
X	eor	d1,0(a0,d0)
X	moveq	#0,d1
X	subq.l	#8,a0
X	bra.s	horizlp
X
Xdonehor	eor	d1,(a0)
X	eor	d1,0(a0,d0)
X
X	add	d0,a0
X	cmp	#8,d7
X	bge.s	upby
X	addq.l	#1,a0
X	bra.s	chkd6
Xupby	and	#7,d7
Xchkd6	cmp	#8,d6
X	bge.s	upby1
X	addq.l	#1,a2
X	bra.s	vertlp
Xupby1	and	#7,d6
X
Xvertlp	lea	160(a0),a0
X	lea	160(a2),a2
X	subq	#1,d2
X	beq.s	donever
X	bchg	d7,(a0)
X	bchg	d6,(a2)
X	bra.s	vertlp
X
Xdonever	rts
X
X
X* Keyboard handler
X	
Xkeybrd	movem.l	d0/d1/a0,-(sp)
X
Xagain	move.b	$fc00.w,d1
X	btst	#7,d1
X	beq	keyout
X	btst	#0,d1
X	beq	keyo
X
X	moveq	#0,d0
X	move.b	$fc02.w,d0
X	tst	length
X	beq.s	nopack
X
X	move.l	bufpnt(pc),a0
X	move.b	d0,(a0)+
X	move.l	a0,bufpnt
X	subq	#1,length
X	bne	keyo
X
X	lea	keybuf(pc),a0
X	and.b	#$fc,(a0)
X	cmp.b	#$f8,(a0)+
X	bne	keyo
X
X	move.b	(a0)+,d0
X	ext	d0
X	add	d0,nmousex
X	move.b	(a0)+,d0
X	ext	d0
X	add	d0,nmousey
X	bra	keyo
X
Xnopack	cmp	#$f6,d0
X	blt.s	akey
X
X	lea	keybuf(pc),a0
X	move.b	d0,(a0)+
X	move.l	a0,bufpnt
X	sub	#$f6,d0
X	move.b	lengths(pc,d0),d0
X	move	d0,length
X	bra	keyo
X
Xlengths	dc.b	7,5,2,2,2,2,6,2,1,1
X
Xakey	cmp	#$52,d0		Test for mouse simulating keys
X	beq.s	leftb
X	cmp	#$74,d0
X	bne.s	notlon
Xleftb	move	#1,leftbutton
X	bra	keyo
Xnotlon	cmp	#$d2,d0
X	beq.s	lefto
X	cmp	#$f4,d0
X	bne.s	notloff
Xlefto	clr	leftbutton
X	bra.s	keyo
Xnotloff	cmp	#$47,d0
X	beq.s	rightb
X	cmp	#$75,d0
X	bne.s	notron
Xrightb	move	#1,rightbutton
X	bra.s	keyo
Xnotron	cmp	#$c7,d0
X	beq.s	righto
X	cmp	#$f5,d0
X	bne.s	notmkey
Xrighto	clr	rightbutton
X	bra.s	keyo
X
X* if not a mouse key then it's a keyboard key
X
Xnotmkey	tst.b	d0		Is it a on or off key
X	bmi.s	keyoff
X
X	move	keys(pc),lastkey
X	move	d0,keys
X	bra.s	keyo
X
Xkeyoff	and	#$7f,d0
X	cmp	keys(pc),d0	Is it current key going off
X	bne.s	notkeys
X
X	move	lastkey(pc),keys	bring lastkey into current
X	clr	lastkey		current key off
X	bra.s	keyo
X
Xnotkeys	cmp	lastkey(pc),d0
X	bne.s	keyo
X
X	clr	lastkey		lastkey off
X
Xkeyo	move	leftbutton(pc),d0
X	and	rightbutton(pc),d0
X	beq.s	noexm
X
X	tst	manding
X	beq.s	noexm
X
X	move.l	#mandout,14(sp)
X
Xnoexm	btst	#5,d1
X	beq.s	keyout
X
X	tst.b	$fc02.w
X
Xkeyout	btst	#4,$fa01.w
X	beq	again
X
X	movem.l	(sp)+,d0/d1/a0
X	bclr	#6,$fa11.w
X	rte
X
X* Return to desktop
X
Xdesktop	move	#$2700,sr
X	move.l	oldier(pc),$fa06.w
X	move.l	oldkeyb(pc),$118.w
X	move.l	$456.w,a0
X	move.l	oldvblq(pc),(a0)
X	move	#$2300,sr
X
X	lea	keydat1(pc),a0
X	moveq	#2-1,d0
X	bsr	sendikbd
X
X	movem.l	oldpal(pc),d0-d7
X	movem.l	d0-d7,$8240.w
X
Xexit1	move	oldres(pc),-(sp)
X	move.l	phybase(pc),-(sp)
X	move.l	logbase(pc),-(sp)
X	move	#5,-(sp)
X	trap	#14
X	lea	12(sp),sp
X	move.l	oldssp(pc),-(sp)
X	move	#32,-(sp)
X	trap	#1
X	addq.l	#6,sp
Xexit	clr	-(sp)
X	trap	#1
X
X
X* Various data
X
Xnomem	dc.b	27,'EOut of memory',0
Xnomono	dc.b	27,'EColour monitors only',0
Xanymes	dc.b	13,10,13,10,'Press any key',0
Xinpmes	dc.b	27,'e',27,'H',27,'b',1,27,'K'
X	dc.b	'Enter number of iterations ',0
Xdelmes	dc.b	8,32,8,0
Xxmes	dc.b	27,'H',27,'K',27,'b',1,0
X
X	even
X
Xmousedatapnt
X	dc.l	mousedata
Xmousedata
X	dc.w	$7F,$FF80,0,$7F,$FF80,$7F00,$FF,$FF00
X	dc.w	$7E00,$1FF,$FE00,$7C00,$3FF,$FC00,$7800,$1FF
X	dc.w	$FE00,$7400,$8FF,$F700,$6200,$1C7F,$E380,$4100
X	dc.w	$3E3F,$C1C0,$80,$FF1F,$E0,$40,$FF8F,$70
X	dc.w	$20,$FFC7,$38,$10,$FFE3,$1C,8,$FFF1
X	dc.w	14,4,$FFFB,4,0,$FFFF,0,0
X
Xbox_width
X	dc.w	60
X
Xmouse	dc.w	0
Xkeys	dc.w	0
Xlastkey	dc.w	0
Xleftbutton	dc.w	0
Xrightbutton	dc.w	0
Xmousex	dc.w	120
Xmousey	dc.w	100
Xnmousex	dc.w	0
Xnmousey	dc.w	0
Xoldbxy	dc.l	0
Xlength	dc.w	0
Xbufpnt	dc.l	0
Xkeybuf	ds.b	8
Xkeydat	dc.b	7,4,8
Xkeydat1	dc.b	7,0
X
Xoldier	dc.l	0
Xoldkeyb	dc.l	0
Xoldssp	dc.l	0
Xoldvblq	dc.l	0
Xoldres	dc.w	0
Xphybase	dc.l	0
Xlogbase	dc.l	0
Xkeytable	dc.l	0
X
Xbeepdat	dc.w	$068,$104,$b00,$c49,$d00,$810,$7fe
X
Xpalette	dc.w	$000,$072,$062,$153,$243,$234,$324,$415
X	dc.w	$414,$413,$412,$500,$410,$320,$241,$062
X
Xcycle	dc.w	0
Xdelay	dc.w	5
Xtmpdel	dc.w	5
X
Xpattern	dc.w	$ffff
X
Xmanding	dc.w	0
Xregstor	ds.l	4
Xlastmand
X	dc.l	$a3d70a,$a0000000,$c0000000
X
Xinpbuf	ds.b	10
X
Xoldpal
Xbuffer	equ	oldpal+32
Xtrash	equ	buffer+512
Xstore1	equ	trash+300
Xstore2	equ	store1+640
Xend	equ	store2+640
END_OF_FILE
if test 17097 -ne `wc -c <'MANDEL.S'`; then
    echo shar: \"'MANDEL.S'\" unpacked with wrong size!
fi
# end of 'MANDEL.S'
fi
echo shar: End of shell archive.
exit 0