**********************************************************************
		incdir	"sys:include/"
		include	"exec/exec_lib.i"
		include	"hardware/custom.i"
**********************************************************************
CALL		MACRO
		jsr	_LVO\1(a6)
		ENDM
**********************************************************************
		rsset	-4
PixelMask	rs.w	1	; mask to OR with bitplanes
WordsInRaster	rs.w	1	; number of words left in current raster
InitialX	rs.w	1	; inital x
InitialY	rs.w	1	; inital y
LinesLeft	rs.w	1	; number of lines left to draw
**********************************************************************
BootBlock:	dc.b	"DOS",0
		dc.l	"CKSM"
		dc.l	$370

		movem.l	d1-d7/a0-a6,-(a7)
		CALL	Forbid
		CALL	Disable
		lea	$dff000,a4
		bsr.w	WaitVBlank
		lea	$7c800,a5
		move.l	a5,cop2lc(a4)
		clr.w	copjmp2(a4)
		move.w	#$07e0,dmacon(a4)
		move.w	#$8240,dmacon(a4)

		lea	Copper(pc),a6
		moveq	#((Palette-Copper)/4)-1,d7
L2		move.l	(a6)+,(a5)+
		dbf	d7,L2

		move.w	#$0180,d0		; color 0
		moveq	#31,d7
L3		move.w	d0,(a5)+
		move.w	(a6)+,(a5)+
		addq.w	#2,d0
		dbf	d7,L3

		move.w	#$00e0,d0		; init bitplane pointers
		moveq	#0,d1
		moveq	#8,d7
L4		move.w	d0,(a5)+
		addq.w	#2,d0
		move.w	#$0007,(a5)+
		move.w	d0,(a5)+
		addq.w	#2,d0
		move.w	d1,(a5)+
		addi.w	#256*40,d1
		subq.l	#2,d7
		bpl.b	L4

		move.l	d7,(a5)+		; $fffffffe

		move.l	#$30d8a600,(a5)+	; control words
MakeSprite	move.w	(a6)+,d7		; get height/gap pair
		bmi.b	DoneSprite
		move.w	d7,d6
		lsr.w	#8,d7			; extract height part
.heightloop	move.w	(a6)+,(a5)+		; sprite data
		clr.w	(a5)+			; clear plane 2
		dbf	d7,.heightloop
		andi.w	#$00ff,d6		; extract gap part
.gaploop	clr.l	(a5)+			; blank
		dbf	d6,.gaploop
		bra.b	MakeSprite

DoneSprite:	move.l	#$80000014,(a5)+	; mask & word per raster count

StartJulia:	lea	$70000,a0
.1		btst.b	#6,dmaconr(a4)
		bne.b	.1
		move.l	a0,bltdpt(a4)
		move.l	#$01000000,bltcon0(a4)
		clr.w	bltdmod(a4)
		move.w	#(640*64)+40,bltsize(a4)

FindJulia:	move.l	(a6)+,(a5)
		bne.b	GotJulia
		lea	JuliaData(pc),a6
		bra.b	FindJulia

GotJulia:	lea	Plot00+2(pc),a1
		move.w	(a5),(RasterInit-Plot00)(a1)	; initial m
		move.w	(a6),(a1)			; pixel step
		move.w	(a6)+,(RasterAdd-Plot00)(a1)	; raster step
		move.w	(a6)+,(Initial_C1-Plot00)(a1)	; initial c1
		move.w	(a6)+,(Initial_C2-Plot00)(a1)	; initial c2
		move.l	a6,((BootBlock+4)-(Plot00+2))(a1) ; save julia pointer
		move.w	#256,LinesLeft(a5)		; vertical height
		move.w	#256*40,d2
		lea	(a0,d2.w),a1
		lea	(a1,d2.w),a2
		lea	(a2,d2.w),a3
		lea	$04000000,a6		; for magnitude test

.1		btst.b	#6,dmaconr(a4)
		bne.b	.1

		bsr.w	WaitVBlank
		move.w	#$83a0,dmacon(a4)
		lea	(a3,d2.w),a4

PixelLoop:	move.w	InitialX(a5),d1		; inital x
		move.w	InitialY(a5),d0		; inital y
		moveq	#30,d7
Initial_C1:	move.w	#$0000,d4		; initial c1
Initial_C2:	move.w	#$0000,d5		; initial c2
		move.w	d0,d2
		move.w	d1,d3
		bra.b	CheckMagnitude

IterateJulia:	sub.l	d3,d2		; x^2 - y^2
		lsl.l	#4,d2		; fix decimal point
		swap	d2		; ...
		add.w	d4,d2		; x1 = x^2 - y^2 + c1

		move.w	d1,d3		; y
		muls	d0,d3		; x * y
		lsl.l	#5,d3		; fix decimal point and multiply by 2
		swap	d3		; ...
		add.w	d5,d3		; y1 = 2 * x * y + c2

		move.w	d2,d0		; x = x1
		move.w	d3,d1		; y = y1

CheckMagnitude:	muls	d2,d2		; x^2
		muls	d3,d3		; y^2
		move.l	d2,d6
		add.l	d3,d6		; z = x^2 + y^2
		cmp.l	a6,d6		; escaped yet?
		dbhi	d7,IterateJulia
		move.w	PixelMask(a5),d6
		moveq	#0,d5
		move.b	JumpTable+1(pc,d7.w),d5
		jmp	JumpTable(pc,d5.w)

JumpTable:	dc.b	Plot00-JumpTable,Plot31-JumpTable
		dc.b	Plot30-JumpTable,Plot29-JumpTable
		dc.b	Plot28-JumpTable,Plot27-JumpTable
		dc.b	Plot26-JumpTable,Plot25-JumpTable
		dc.b	Plot24-JumpTable,Plot23-JumpTable
		dc.b	Plot22-JumpTable,Plot21-JumpTable
		dc.b	Plot20-JumpTable,Plot19-JumpTable
		dc.b	Plot18-JumpTable,Plot01-JumpTable
		dc.b	Plot16-JumpTable,Plot15-JumpTable
		dc.b	Plot14-JumpTable,Plot13-JumpTable
		dc.b	Plot12-JumpTable,Plot11-JumpTable
		dc.b	Plot10-JumpTable,Plot09-JumpTable
		dc.b	Plot08-JumpTable,Plot07-JumpTable
		dc.b	Plot06-JumpTable,Plot05-JumpTable
		dc.b	Plot04-JumpTable,Plot03-JumpTable
		dc.b	Plot02-JumpTable,Plot17-JumpTable

Plot22:		or.w	d6,(a4)
		or.w	d6,(a2)
		or.w	d6,(a1)
		bra.b	Plot00

Plot21:		or.w	d6,(a4)
		or.w	d6,(a2)
		or.w	d6,(a0)
		bra.b	Plot00

Plot20:		or.w	d6,(a4)
		or.w	d6,(a2)
		bra.b	Plot00

Plot18:		or.w	d6,(a4)
		or.w	d6,(a1)
		bra.b	Plot00

Plot26:		or.w	d6,(a4)
Plot10:		or.w	d6,(a3)
		or.w	d6,(a1)
		bra.b	Plot00

Plot23:		or.w	d6,(a4)
		or.w	d6,(a2)
		or.w	d6,(a1)
		or.w	d6,(a0)
		bra.b	Plot00

Plot19:		or.w	d6,(a4)
		or.w	d6,(a1)
		or.w	d6,(a0)
		bra.b	Plot00

Plot27:		or.w	d6,(a4)
Plot11:		or.w	d6,(a3)
		or.w	d6,(a1)
		or.w	d6,(a0)
		bra.b	Plot00

Plot17:		or.w	d6,(a4)
		or.w	d6,(a0)
		bra.b	Plot00

Plot25:		or.w	d6,(a4)
Plot09:		or.w	d6,(a3)
		or.w	d6,(a0)
		bra.b	Plot00

Plot29:		or.w	d6,(a4)
Plot13:		or.w	d6,(a3)
Plot05:		or.w	d6,(a2)
		or.w	d6,(a0)
		bra.b	Plot00

Plot16:		or.w	d6,(a4)
		bra.b	Plot00

Plot24:		or.w	d6,(a4)
Plot08:		or.w	d6,(a3)
		bra.b	Plot00

Plot28:		or.w	d6,(a4)
Plot12:		or.w	d6,(a3)
Plot04:		or.w	d6,(a2)
		bra.b	Plot00

Plot30:		or.w	d6,(a4)
Plot14:		or.w	d6,(a3)
Plot06:		or.w	d6,(a2)
Plot02:		or.w	d6,(a1)
		bra.b	Plot00

Plot31:		or.w	d6,(a4)
Plot15:		or.w	d6,(a3)
Plot07:		or.w	d6,(a2)
Plot03:		or.w	d6,(a1)
Plot01:		or.w	d6,(a0)
Plot00:		addi.w	#$0000,(a5)		; pixel "step"
		ror.w	PixelMask(a5)		; shift mask over
		bpl.w	PixelLoop

		addq.w	#2,a0
		addq.w	#2,a1
		addq.w	#2,a2
		addq.w	#2,a3
		addq.w	#2,a4
		subq.w	#1,WordsInRaster(a5)	; subtract from word counter
		bne.w	PixelLoop

		btst.b	#6,$bfe001
		beq.b	Exit

		move.w	#320/16,WordsInRaster(a5)	; words per raster
		btst.b	#2,$dff016		; new julia?
		beq.b	NewJulia

RasterInit:	move.w	#$0000,(a5)		; inital raster value
RasterAdd:	addi.w	#$0000,InitialY(a5)		; raster "step"
		subq.w	#1,LinesLeft(a5)
		bne.w	PixelLoop

WaitMouse:	btst.b	#6,$bfe001
		beq.b	Exit
		btst.b	#2,$dff016
		bne.b	WaitMouse

NewJulia:	movea.l	BootBlock+4(pc),a6
		lea	$dff000,a4
.waitRMBup	btst.b	#2,$0016(a4)
		beq.b	.waitRMBup
		bra.w	StartJulia

Exit:		lea	$dff000,a4
		bsr.b	WaitVBlank
		clr.w	$0100(a4)
		movem.l	(a7)+,d1-d7/a0-a6
		CALL	Enable
		CALL	Permit
		lea	DosName(pc),a1
		CALL	FindResident
		movea.l	d0,a0
		movea.l	$16(a0),a0
		moveq	#0,d0
		rts	

WaitVBlank:	btst.b	#0,5(a4)
		bne.b	WaitVBlank
.1		btst.b	#0,5(a4)
		beq.b	.1
		rts	

Copper:		dc.l	$01005200,$01020000,$01080000
		dc.l	$008e2981,$009029c1
		dc.l	$00920038,$009400d0
		dc.l	$01200007,$0122c8d0

Palette:	dc.w	$0000,$0831,$000e,$000d,$000c,$000b,$000a,$0009
		dc.w	$0008,$0007,$0106,$0205,$0304,$0403,$0502,$0611
		dc.w	$0720,$0fff,$0942,$0a53,$0b64,$0c75,$0d86,$0c97
		dc.w	$0ba8,$0a9a,$098b,$0879,$0767,$0555,$0343,$0131

SpriteData:	dc.b	13,9
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000011110000000
		dc.w	%0000011110000000
		dc.w	%0000110011000000
		dc.w	%0000110011000000
		dc.w	%0001100001100000
		dc.w	%0001100001100000
		dc.w	%0001111111100000
		dc.w	%0011111111110000
		dc.w	%0011000000110000
		dc.w	%0011000000110000
		dc.w	%0110000000011000
		dc.w	%0110000000011000

		dc.b	9,9				; "n"
		dc.w	%0001100111000000
		dc.w	%0001101111100000
		dc.w	%0001110001100000
		dc.w	%0001100001100000
		dc.w	%0001100001100000
		dc.w	%0001100001100000
		dc.w	%0001100001100000
		dc.w	%0001100001100000
		dc.w	%0001100001100000
		dc.w	%0001100001100000

		dc.b	9,5				; "a"
		dc.w	%0000011111000000
		dc.w	%0000111011100000
		dc.w	%0000110001100000
		dc.w	%0000000011100000
		dc.w	%0000011111100000
		dc.w	%0000111001100000
		dc.w	%0000110001100000
		dc.w	%0000110001100000
		dc.w	%0000111011100000
		dc.w	%0000011101100000

		dc.b	13,9				; "l"
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000
		dc.w	%0000001100000000

		dc.b	9,9				; "o"
		dc.w	%0000011111000000
		dc.w	%0000111111100000
		dc.w	%0000110001100000
		dc.w	%0001100000110000
		dc.w	%0001100000110000
		dc.w	%0001100000110000
		dc.w	%0001100000110000
		dc.w	%0000110001100000
		dc.w	%0000111111100000
		dc.w	%0000011111000000

		dc.b	13,0				; "g"
		dc.w	%0000011110110000
		dc.w	%0000111111110000
		dc.w	%0000110000110000
		dc.w	%0001100000110000
		dc.w	%0001100000110000
		dc.w	%0001100000110000
		dc.w	%0001100000110000
		dc.w	%0000110001110000
		dc.w	%0000111111110000
		dc.w	%0000011110110000
		dc.w	%0000000000110000
		dc.w	%0000110001100000
		dc.w	%0000111111100000
		dc.w	%0000001110000000

		dc.b	-1,-1				; end

JuliaData:	dc.l	$f800eb00
		dc.w	$0018,$0100,$0ad0,$ec00
		dc.l	$ef000010
		dc.w	$0600,$0100,$f226,$fd56
		dc.l	$0015ee00
		dc.w	$fb40,$ede2,$f0b2,$001d
		dc.l	$05c0ff00
		dc.w	$ef12,$e812,$001d,$f320
		dc.l	$fd21eeae
		dc.w	$0225,$000d,$f420,$fd43
		dc.l	$00000000

DosName:	dc.b	'dos.library',0

BootLen		equ	*-BootBlock

