10 ' FastBrot Generator
20 ' By D.Catchpole
30 ' 61 West Common Lane
40 ' Scunthorpe
50 ' S.Humberside
60 runit% = 1
70 KEY 138,"gosub 2500"+CHR$(13)
80 KEY 139,"mode 2:ink 0,0:ink 1,24:paper 0:pen 1:mode 2:list"+CHR$(13)
90 ON BREAK GOSUB 2070
100 GOSUB 1460
110 END
120 MODE 2:INK 0,0:INK 1,24:PAPER 0:PEN 1:MODE 2
130 INPUT "Left start   :- ",left
140 INPUT "Bottem start :- ",bottem
150 INPUT "Zoom         :- ",zoom
160 mab% = 1
170 RETURN
180 MODE 0
190 IF runit% = 1 THEN DIM pallet%(16) : runit% = 0
200 FOR loop% = 0 TO 15 : INK loop%,INT(loop%*1.5):pallet%(loop%) = INT(loop%*1.5):NEXT
210 CLS
220 RETURN
230 ' Four phase plot algorithm
240 ' plot first phase
250 IF blank% THEN GOSUB 2460
260 ry = bottem
270 FOR sy = 0 TO 400 STEP 4
280   rx = left
290   FOR sx = 0 TO 640 STEP 8
300     IF mab% THEN GOSUB 920 : ELSE GOSUB 1080
310     PLOT sx,sy,col%
320     IF cyc% = 0 THEN GOSUB 1010
330     rx = rx + (zoom * 4)
340   NEXT
350   ry = ry + (zoom * 2)
360 NEXT
370 ry = bottem + zoom
380 FOR sy = 2 TO 400 STEP 4
390   rx = left + zoom
400   FOR sx = 4 TO 640 STEP 8
410     IF NOT (TEST (sx - 4,sy -2) = TEST (sx + 4,sy -2)) GOTO 460
420     IF NOT (TEST (sx - 4,sy -2) = TEST (sx + 4,sy +2)) GOTO 460
430     IF NOT (TEST (sx - 4,sy -2) = TEST (sx - 4, sy +2)) GOTO 460
440     PLOT sx,sy,TEST(sx - 4,sy -2)
450     GOTO 480
460     IF mab% THEN GOSUB 920 : ELSE GOSUB 1080
470     PLOT sx,sy,col%
480     IF cyc% = 0 THEN GOSUB 1010
490     rx = rx + (zoom * 4)
500   NEXT
510   ry = ry + (zoom * 2)
520 NEXT
530 ry = bottem
540 FOR sy = 0 TO 400 STEP 4
550   rx = left + zoom
560   FOR sx = 4 TO 644 STEP 8
570     IF NOT (TEST (sx - 4,sy) = TEST (sx + 4 ,sy )) GOTO 620
580     IF NOT (TEST (sx - 4,sy) = TEST (sx,sy + 2)) GOTO 620
590     IF NOT (TEST (sx - 2,sy) = TEST (sx,sy - 2)) GOTO 620
600     PLOT sx,sy,TEST(sx - 4,sy)
610     GOTO 640
620     IF mab% THEN GOSUB 920 : ELSE GOSUB 1080
630     PLOT sx,sy,col%
640     IF cyc% = 0 THEN GOSUB 1010
650     rx = rx + (zoom * 4)
660   NEXT
670   ry = ry + (zoom * 2)
680 NEXT
690 ry = bottem + zoom
700 FOR sy = 2 TO 400 STEP 4
710   rx = left
720   FOR sx = 0 TO 640 STEP 8
730     IF NOT (TEST (sx,sy + 2) = TEST (sx,sy - 2)) GOTO 780
740     IF NOT (TEST (sx,sy + 2) = TEST (sx - 4,sy)) GOTO 780
750     IF NOT (TEST (sx,sy + 2) = TEST (sx + 4,sy)) GOTO 780
760     PLOT sx,sy,TEST (sx,sy + 2)
770     GOTO 800
780     IF mab% THEN GOSUB 920 : ELSE GOSUB 1080
790     PLOT sx,sy,col%
800     IF cyc% = 0 THEN GOSUB 1010
810     rx = rx + (zoom * 4)
820   NEXT
830   ry = ry + (zoom * 2)
840 NEXT
850 IF scl% = 1 THEN GOSUB 1970
860 k$ = "" : IF blank% THEN GOSUB 2490
870 WHILE k$ <> "C" : IF cyc% < 2 THEN GOSUB 1010
880   k$ = INKEY$ : k$ = UPPER$(k$)
890 WEND
900 fast% = 1
910 RETURN
920 ' Mandelbrot function
930    cx = rx : cy = ry : iter% = 0
940    WHILE (cx^2 + cy^2 < 1000) AND (iter% < 255)
950      x = cx*cx - cy*cy + rx
960      cy = 2 * cx * cy + ry
970      cx = x:iter% = iter% + 1
980    WEND
990    col% = iter% MOD 16
1000  RETURN
1010 ' Colour cycle
1020    pallet%(16) = pallet%(0)
1030    FOR loop% = 0 TO 15
1040      pallet%(loop%) = pallet%(loop%+1)
1050      INK loop%,pallet%(loop%)
1060    NEXT
1070    RETURN
1080 ' Julia Set iteration
1090 xold = rx : yold = ry : iter% = 0
1100 WHILE ( xold^2 + yold^2 < 1000) AND ( iter% < 255 )
1110   x =  xold * xold - yold * yold + p
1120   y =  2 * xold * yold + q
1130   xold = x : yold = y : iter% = iter% + 1
1140 WEND
1150 col% = iter% MOD 16
1160 RETURN
1170 ' Alternative method
1180 start = TIME
1190 ry = bottem
1200   FOR sy = 0 TO 400 STEP 2
1210     rx = left
1220     FOR sx = 0 TO 640 STEP 4
1230       IF mab% THEN GOSUB 920 : ELSE GOSUB 1080
1240       IF trans% THEN GOSUB 2580 : ELSE PLOT sx,sy,col%
1250       IF cyc% = 0 THEN GOSUB 1010
1260       rx = rx + zoom + zoom
1270     NEXT
1280     ry = ry + zoom
1290   NEXT
1300   IF scl% = 1 THEN GOSUB 1970
1310   k$ = ""
1320   WHILE k$ <> "C" :IF cyc% < 2 THEN GOSUB 1010 :
1330     k$ = INKEY$ : k$ = UPPER$(k$)
1340   WEND
1350   fast% = 0
1360 RETURN
1370 ' get Julia set coordinates
1380  MODE 2:INK 0,0:INK 1,24:PAPER 0:PEN 1:MODE 2
1390  INPUT "Left :- ",left
1400  INPUT "Bottem :- ",bottem
1410  INPUT "Zoom :- ",zoom
1420  INPUT "P :- ",p
1430  INPUT "Q :- ",q
1440  mab% = 0
1450 RETURN
1460 ' Main menu
1470 GOSUB 2090 : getout% = 0
1480 WHILE getout% = 0
1490   MODE 2:INK 0,0:INK 1,24:PAPER 0:PEN 1:MODE 2
1500   LOCATE 25,2 : PRINT CHR$(24)+" Mandlebrot System "+CHR$(24)
1510   LOCATE 5,5 : PRINT "1 ... Mandlebrot Set ( Fast )"
1520   LOCATE 5,7 : PRINT "2 ... Mandlebrot Set ( Accurate )"
1530   LOCATE 5,9 : PRINT "3 ... Julia Set ( Fast )"
1540   LOCATE 5,11: PRINT "4 ... Julia Set ( Accurate )"
1550   LOCATE 5,13: PRINT "5 ... Colour cycle ( On )"
1560   LOCATE 5,15: PRINT "6 ... Colour cycle ( After )"
1570   LOCATE 5,17: PRINT "7 ... Colour cycle ( Off )"
1580   LOCATE 5,19: PRINT "8 ... Scale lines ( On )"
1590   LOCATE 5,21: PRINT "9 ... Scale lines ( Off )"
1600   LOCATE 25,24: PRINT CHR$(24)+" Please enter your choice or Q to quit "+CHR$(24)
1610   LOCATE 45,5 : PRINT "B ... Blank Screen"
1620   LOCATE 45,7 : PRINT "Z ... Zoom in"
1630   LOCATE 45,9 : PRINT "S ... Summary Plot"
1640   LOCATE 45,11 : PRINT "T ... 3D transformation"
1650   LOCATE 50,15 : PRINT CHR$ (24)+"Blank ... ";
1660   IF blank% THEN PRINT "ON"; : ELSE PRINT "Off";
1670   PRINT CHR$(24)
1680   LOCATE 50,17 : PRINT CHR$ (24)+"Colour Cycle ... ";
1690   IF cyc% = 0 THEN PRINT "ON";
1700   IF cyc% = 1 THEN PRINT "AFTER";
1710   IF cyc% = 2 THEN PRINT "OFF";
1720   PRINT CHR$(24)
1730   LOCATE 50,19 : PRINT CHR$(24)+"Scale lines ... ";
1740   IF scl% THEN PRINT "ON"; : ELSE PRINT "OFF";
1750   PRINT CHR$(24)
1760   LOCATE 50,21 : PRINT CHR$ (24)+"3D ... ";
1770   IF trans% THEN PRINT "ON"; : ELSE PRINT "OFF";
1780   PRINT CHR$(24)
1790   k$ = "" : WHILE k$ = "" : k$ = INKEY$ : WEND
1800   IF k$ = "Q" OR k$ = "q" THEN getout% = 1 : k$ = ""
1810   IF k$ = "1" THEN GOSUB 120 :GOSUB 180:GOSUB 230:k$ = ""
1820   IF k$ = "2" THEN GOSUB 120 :GOSUB 180:GOSUB 1170:k$ = ""
1830   IF k$ = "3" THEN GOSUB 1370 : GOSUB 180 : GOSUB 230 :k$ = ""
1840   IF k$ = "4" THEN GOSUB 1370 : GOSUB 180 : GOSUB 1170:k$ = ""
1850   IF k$ = "5" THEN cyc% = 0 : k$ = ""
1860   IF k$ = "6" THEN cyc% = 1 : k$ = ""
1870   IF k$ = "7" THEN cyc% = 2 : k$ = ""
1880   IF k$ = "8" THEN scl% = 1 : k$ = ""
1890   IF k$ = "9" THEN scl% = 0 : k$ = ""
1900   IF k$ = "S" OR k$ = "s" THEN GOSUB 2130 : k$ = ""
1910   IF k$ = "Z" OR k$ = "z" THEN GOSUB 2340 : k$ = ""
1920   IF k$ = "B" OR k$ = "b" THEN GOSUB 2430 : k$ = ""
1930   IF k$ = "T" OR k$ = "t" THEN GOSUB 2650 : k$ = ""
1940   IF k$ <> "" THEN SOUND 1,40,20
1950 WEND
1960 RETURN
1970 ' Draw scale lines
1980   MOVE 0,200 : DRAW 640,200,8
1990   MOVE 320,0 : DRAW 320,400,8
2000   FOR y% = 0 TO 400 STEP 20
2010     MOVE 312,y% : DRAW 328,y%,7
2020   NEXT
2030   FOR x% = 0 TO 640 STEP 32
2040     MOVE x%,196 : DRAW x%,204,7
2050   NEXT
2060 RETURN
2070 ' break
2080 GOSUB 2490 : RUN
2090 ' set defaults
2100 mab% = 1 : cyc% = 0 : scl% = 1 : fast% = 1 : trans% = 1
2110 left = 1.8 : bottem = 0 : zoom = 0.00001
2120 RETURN
2130 ' Summary plot
2140 GOSUB 120
2150 GOSUB 180
2160 ystep = zoom * 8 : xstep = ystep + ystep
2170 ry = bottem
2180 FOR sy = 25 TO 1 STEP -1
2190   rx = left
2200   FOR sx = 1 TO 20 STEP 1
2210     GOSUB 920
2220     PEN col% : LOCATE sx,sy
2230     PRINT CHR$(143);
2240     GOSUB 1010
2250     rx = rx + xstep
2260   NEXT
2270   ry = ry + ystep
2280 NEXT
2290 k$ = ""
2300 WHILE k$ <> "C" : GOSUB 1010
2310   k$ = INKEY$ : k$ = UPPER$(k$)
2320 WEND
2330 RETURN
2340 ' Zoom in on previous image
2350 CLS
2360 INPUT " X marker :- ",xmark
2370 INPUT " Y marker :- ",ymark
2380 left = left + ((zoom+zoom) * ((xmark - 1) * 8))
2390 bottem = bottem + (zoom * ((ymark-1) * 10))
2400 zoom = zoom / 10
2410 GOSUB 180
2420 IF fast% THEN GOSUB 230 ELSE GOSUB 1170
2430 ' Switch blanking on/off
2440 IF blank% THEN blank% = 0 : ELSE blank% = 1
2450 RETURN
2460 ' Turn VDU output off
2470 OUT &BC00,6 : OUT &BD00,0
2480 RETURN
2490 ' Turn VDU output on
2500 FOR f = 0 TO 40
2510  FOR g = 0 TO 12 : NEXT
2520  OUT &BC00,1 : OUT &BD00,f
2530  OUT &BC00,2 : OUT &BD00,46-(20-INT(f/2))
2540  OUT &BC00,6 : OUT &BD00,25-INT((40-f)/1.6)
2550  OUT &BC00,7 : CALL &BD19 : OUT &BD00,30-((40-f)/3.2)
2560 NEXT
2570 RETURN
2580 ' 3d transformation & plot
2590 nx = FIX(sx + 0.707107 * (400 - sy))
2600 ny = FIX(( iter%/4 ) + 0.707107 * (400 - sy))
2610 nb = FIX(1 + 0.707107 * (400 - sy))
2620 MOVE nx,nb : DRAW nx,ny,col%
2630 IF iter% = 255 THEN PLOT nx,ny,4
2640 RETURN
2650 ' Toggle 3d on/off
2660 IF trans% THEN trans% = 0 : ELSE trans% = 1
2670 RETURN