/*
  Compile and link it with the ACEmath020.o
  and burn rubber!
  Also do not forget to superoptimize it...
*/


LIBRARY "graphics.library"

DECLARE FUNCTION SetDrMd LIBRARY graphics

CONST ScaledShift=13

SHORTINT ITER,ALPHA,BETA
SHORTINT MAALX,MAALY
SHORTINT GX1,GX2,GY1,GY2
SHORTINT GRENS,AI
SHORTINT NX,VNX,NY,VNY,SNX,SNY,SX,SY
SHORTINT PKOL

LONGINT XMIN,XMAX,YMIN,YMAX

ADDRESS RastPortPtr


/*
   Change number of iterations if you want to zoom!
*/

ITER=1024


XMIN=-2.25*8192
XMAX=0.75*8192
YMIN=-1.5*8192
YMAX=1.5*8192

/*
XMIN=-.25*8192
XMAX=.75*8192
YMIN=-.5*8192
YMAX=.5*8192
*/


ALPHA=320
BETA=255

SUB SetPal

 PALETTE 0,0,0,0
 PALETTE 1,1,1,1
 c1 = 0 : c2 = .5 : c3 = 1 : dc1 = 1/6.5 : dc2 = 1/6.5 : dc3 = 1/6.5
 FOR a% = 2 TO 15
   IF c1+dc1 < 0 OR c1+dc1 > 1 THEN dc1 = -dc1
   c1 = c1+dc1
   IF c2+dc2 < 0 OR c2+dc2 > 1 THEN dc2 = -dc2
   c2 = c2+dc2
   IF c3+dc3 < 0 OR c3+dc3 > 1 THEN dc3 = -dc3
   c3 = c3+dc3
   PALETTE a%,c1,c2,c3
 NEXT a%

END SUB


SUB Z00MBOX
   Shared GX1,GX2,GY1,GY2,ALPHA,BETA,RastPortPtr
	SHORTINT GRABBED
	RastPortPtr=WINDOW(8)
   SetDrMd(RastPortPtr,2)
   GX2=0
   GY2=0
   TEL=0
   Repeat 
      If Mouse(0) THEN
         GX1=Mouse(1) : GY1=Mouse(2) : GX2=GX1 : GY2=GY1
         While TEL<10
				LINE (GX1,GY1)-(GX2,GY1) /* -> */
				LINE (GX2,GY1)-(GX2,GY2) /* |  */
				LINE (GX1,GY2)-(GX2,GY2) /* <- */
				LINE (GX1,GY1)-(GX1,GY2) /* |  */
'            Box GX1,GY1 To GX2,GY2
            GX2=Mouse(1) : GY2=GY1+(GX2-GX1)*0.8
				LINE (GX1,GY1)-(GX2,GY1) /* -> */
				LINE (GX2,GY1)-(GX2,GY2) /* |  */
				LINE (GX1,GY2)-(GX2,GY2) /* <- */
				LINE (GX1,GY1)-(GX1,GY2) /* |  */
'            Box GX1,GY1 To GX2,GY2
            If Mouse(0)=0 THEN
               ++TEL
            End If 
         Wend 
			LINE (GX1,GY1)-(GX2,GY1) /* -> */
			LINE (GX2,GY1)-(GX2,GY2) /* |  */
			LINE (GX1,GY2)-(GX2,GY2) /* <- */
			LINE (GX1,GY1)-(GX1,GY2) /* |  */
			GRABBED=True
'         Box GX1,GY1 To GX2,GY2 : GRABBED=True
         If GX1>GX2 THEN
				 T=GX1 : GX1=GX2 : GX2=T
			End If 
         If GY1>GY2 THEN
				 T=GY1 : GY1=GY2 : GY2=T
			End If 
      End If 
   Until GRABBED
   SetDrMd(RastPortPtr,1)
END SUB


SUB SHORTINT CHEKGRID(SHORTINT X,SHORTINT Y,SHORTINT _SIZE)

   CHEKGRID=0

ASSEM
;	ILLEGAL
	MOVE.W	-2(A5),D5	;X
	MOVE.W	-4(A5),D6	;Y
	MOVE.W	-6(A5),D7	;_SIZE
	MOVE.L	_RPort,A3
	MOVE.L	_GfxBase,A6
	MOVE.W	D5,D3			;X
	SUB.W		D7,D3			;X-_SIZE
	MOVE.W	D6,D4			;Y
	ADD.W		D7,D4			;Y+_SIZE
	MOVE.W	D3,D0			;XSIZE
	MOVE.W	D6,D1			;Y
	MOVE.L	A3,A1
	JSR		_LVOReadPixel(A6)
	MOVE.L	D0,D2			;PKOL
	MOVE.L	A3,A1
	MOVE.L	D5,D0			;X
	MOVE.L	D6,D1			;Y
	JSR		_LVOReadPixel(A6)
	CMP.L		D0,D2
	BNE.S		CHEKGRIDFALSE
	MOVE.W	D3,D0			;XSIZE
	MOVE.W	D4,D1			;YSIZE
	MOVE.L	A3,A1
	JSR		_LVOReadPixel(A6)
	CMP.L		D0,D2
	BNE.S		CHEKGRIDFALSE
	MOVE.W	D5,D0
	MOVE.W	D4,D1
	MOVE.L	A3,A1
	JSR		_LVOReadPixel(A6)
	CMP.L		D0,D2
	BNE.S		CHEKGRIDFALSE
	MOVE.L	D2,D0
	MOVE.L	A3,A1
	JSR		_LVOSetAPen(A6)
	SUB.W		D6,D4		;init SY loop counter.
	MOVE.W	D3,D7		;save initial SX
	SUB.W		D3,D5		;init SX loop counter.
	MOVE.W	D5,D2		;save SX loop counter.
FORSY:
FORSX:
	MOVE.W	D3,D0		;SX
	MOVE.W	D6,D1		;SY
	MOVE.L	A3,A1
	JSR		_LVOWritePixel(A6)
	ADDQ.W	#1,D3
	DBRA		D5,FORSX
	MOVE.W	D7,D3		;restore initial SX
	MOVE.W	D2,D5		;restore SX loop counter
	ADDQ.W	#1,D6
	DBRA		D4,FORSY
	BRA.S		CHEKGRIDDONE
CHEKGRIDFALSE:
END ASSEM

	CHEKGRID=-1

ASSEM
CHEKGRIDDONE:
END ASSEM

END SUB
	
/*	

	YSIZE=Y+_SIZE
	XSIZE=X-_SIZE

   PKOL=ReadPixel(XSIZE,Y)
   If POINT(X,Y)=PKOL THEN
      If POINT(XSIZE,YSIZE)=PKOL THEN
         If POINT(X,YSIZE)=PKOL THEN
            For SY=Y To YSIZE
               For SX=XSIZE To X
                  PSET(SX,SY),PKOL
               Next 
            Next 
         Else 
            CHEKGRID=-1
         End If 
      Else 
         CHEKGRID=-1
      End If 
   Else 
      CHEKGRID=-1
   End If 
END SUB
*/

SUB _BOERKENPIXEL(SHORTINT NX,SHORTINT NY)

   Shared ITER,MAALX,MAALY,BETA,XMIN,YMIN

	LONGINT P,Q,X,Y,R,KWX,KWY,SCALEDVALUE

	SHORTINT K,KOL

   P=XMIN+NX*MAALX
   Q=YMIN+NY*MAALY
   X=0
   Y=0
   K=0
	SCALEDVALUE=SHL(4,ScaledShift)
   '
   DO: 
		Y=(X+X)*Y
		Y=SHR(Y,ScaledShift)
		Y=Y+Q
'      Y=((X+X)*Y)\4096+Q
'      Y=(2*X*Y)\4096+Q
      X=KWX-KWY+P
      ++K
      '
'      KWX=(X*X)\4096
'      KWY=(Y*Y)\4096
		KWX=X*X
		KWY=Y*Y
		KWX=SHR(KWX,ScaledShift)
		KWY=SHR(KWY,ScaledShift)
      R=KWX+KWY
      If R>SCALEDVALUE THEN
         KOL=K
         GOTO ExitDO
      Else 
         If K>ITER THEN
            KOL=0
            GOTO ExitDO 
         End If 
      End If 
   GOTO DO 
ExitDO:
   '
   PSET(NX,NY),KOL
END SUB


SUB VULIN
   Shared ALPHA,BETA,GRENS
	SHORTINT NX,NY,SNX,SNY,VNX,VNY
   For NY=0 To BETA Step 4
      VNX=0
      For NX=4 To ALPHA Step 4
         VNX=NX-4
         '
         ' 4 op 4 check 
         '
         '  
         If CHEKGRID(NX,NY,4) THEN
            '
            'nieuwgrid 
            '
            'Wait Key  
            SNX=NX
            SNY=NY
            NX=NX-2
            If POINT(NX,NY)=1 THEN
               _BOERKENPIXEL(NX,NY)
            End If 
            NY=NY+2
            For NX=VNX To VNX+5 Step 2
               _BOERKENPIXEL(NX,NY)
            Next NX
            NX=VNX+2
            NY=NY+2
            _BOERKENPIXEL(NX,NY)
            NX=SNX
            NY=SNY
            'Wait Key  
            '
            '2 op 2 check
            '
            '
            'linksboven  
            '
            IF CHEKGRID(NX-2,NY,2) THEN
               SNX=NX
               SNY=NY
               NX=NX-3
               _BOERKENPIXEL(NX,NY)
               ++NY
               _BOERKENPIXEL(NX,NY)
               --NX
               _BOERKENPIXEL(NX,NY)
               NX=SNX
               NY=SNY
            End If 
            '  
            'rechtsboven 
            '
            IF CHEKGRID(NX,NY,2) THEN
               SNX=NX
               SNY=NY
               --NX
               _BOERKENPIXEL(NX,NY)
               ++NY
               _BOERKENPIXEL(NX,NY)
               --NX
               _BOERKENPIXEL(NX,NY)
               NX=SNX
               NY=SNY
            End If 
            '  
            'linksonder
            '
            IF CHEKGRID(NX-2,NY+2,2) THEN
               SNX=NX
               SNY=NY
               NX=NX-3
               NY=NY+2
               _BOERKENPIXEL(NX,NY)
               ++NY
               _BOERKENPIXEL(NX,NY)
               --NX
               _BOERKENPIXEL(NX,NY)
               NX=SNX
               NY=SNY
            End If 
            '  
            'rechtsonder 
            '
            IF CHEKGRID(NX,NY+2,2) THEN
               SNX=NX
               SNY=NY
               --NX
               NY=NY+2
               _BOERKENPIXEL(NX,NY)
               ++NY
               _BOERKENPIXEL(NX,NY)
               --NX
               _BOERKENPIXEL(NX,NY)
               NX=SNX
               NY=SNY
            End If 
         End If 
      Next 
   Next 
END SUB

SUB MAKEGRID
   Shared ALPHA,BETA
	SHORTINT NX,NY
   Cls 1
   For NY=0 To BETA Step 4
      For NX=0 To ALPHA Step 4
         _BOERKENPIXEL(NX,NY)
      Next 
   Next 
END SUB

'
SCREEN 1,320,256,4,1
WINDOW 1,"Mandelbrot",(0,0)-(ALPHA,BETA),8,1

RastPortPtr=WINDOW(8)

SETPAL

/* Hmm, quick and very dirty loop, could be much better... */
Repeat 
   MAALX=(XMAX-XMIN)/(ALPHA-1)
   MAALY=(YMAX-YMIN)/(BETA-1)
	T!=TIMER
   MAKEGRID
   VULIN

	LOCATE 0,0:PRINT TIMER-T!

	REPEAT
		SLEEP
		K$=INKEY$
	UNTIL K$<>""
	IF K$<>"s" OR K$<>"S" THEN
	   Z00MBOX
	   XMAX=XMIN+GX2*MAALX
	   YMAX=YMIN+GY2*MAALY
	   '
	   XMIN=XMIN+GX1*MAALX
	   YMIN=YMIN+GY1*MAALY
	END IF
Until K$="s" OR K$="S"

WINDOW CLOSE 1
SCREEN CLOSE 1

/*
   Z00MBOX
   XMAX=XMIN+GX2*MAALX
   YMAX=YMIN+GY2*MAALY
   '
   XMIN=XMIN+GX1*MAALX
   YMIN=YMIN+GY1*MAALY
'Loop 
'  
'
Procedure SETPAL
   Restore KOLDATA
   For T=0 To 31
      Read KOL
      Colour T,KOL
   Next 
   KOLDATA:
   Data $0,$200,$400,$600,$800,$A00,$C00,$E00
   Data $E03,$E07,$E0A,$C0C,$B0C,$70C,$40C,$10C
   Data $2D,$6D,$9E,$EE,$EB,$E7,$F4,$F0
   Data $2F0,$4F0,$6F0,$8F0,$AF0,$CF0,$EF0,$FF0
End Proc
*/
