DECLARE SUB GENERATE ()
DECLARE SUB EXPGENERATE ()
DECLARE SUB PALETTES ()
DECLARE SUB DISPLAY ()
DECLARE SUB SHOWLOC ()
COMMON SHARED P() AS SINGLE
DIM P(256) AS SINGLE

OPEN "JULIAC00.BIN" FOR BINARY AS #1
DO
  GET #1, , P(I)
  IF EOF(1) THEN CLOSE : EXIT DO
  I = I + 1
LOOP

DO
  SCREEN 0
  WIDTH 80
  COLOR 15, 0, 0
  CLS
  COLOR 7, 0, 0
  A$ = STRING$(22, 205): L$ = STRING$(8, 219): Z$ = CHR$(0)
  PRINT TAB(29); CHR$(201); A$; CHR$(187)
  PRINT TAB(29); CHR$(186); " JULIA SET  GENERATOR "; CHR$(186)
  PRINT TAB(29); CHR$(186); " PACKAGE V1.5H/120190 "; CHR$(186)
  PRINT TAB(29); CHR$(204); A$; CHR$(185)
  PRINT TAB(29); CHR$(186); "    BY  THE HACKER    "; CHR$(186)
  PRINT TAB(29); CHR$(200); A$; CHR$(188)
  PRINT
  COLOR 15, 0, 0: DEFSNG A-Z
  PRINT "WHAT TO YOU WANT TO DO?"
  PRINT "  (1)  GENERATE A JULIA SET"
  PRINT "  (2)  GENERATE AN EXPANSION OF A JULIA SET"
  PRINT "  (3)  DISPLAY A JULIA"
  PRINT "  (4)  VIEW COLOR PALETTES"
  PRINT "  (5)  SHOW LOCATION OF JULIA SETS / GET COORDINATES"
  PRINT "  (6)  QUIT"
  PRINT
  DO
    INPUT A
    IF A >= 1 AND A <= 6 THEN EXIT DO
  LOOP
  PRINT : PRINT
  IF A = 1 THEN CALL GENERATE
  IF A = 2 THEN CALL EXPGENERATE
  IF A = 3 THEN CALL DISPLAY
  IF A = 4 THEN CALL PALETTES
  IF A = 5 THEN CALL SHOWLOC
  IF A = 6 THEN EXIT DO
LOOP

SUB DISPLAY

  SHARED P() AS SINGLE

  DEFINT L-M

  INPUT "ENTER JULIA SET NUMBER:"; F
  F$ = RIGHT$("00" + MID$(STR$(F), 2), 3)
  OPEN "JULIA" + F$ + ".BIN" FOR BINARY AS #1
  Z = 0: IF MID$(F$, 6, 1) = "Z" THEN Z = 1

  DIM L(96)
  A1 = -1.5
  B1 = 1.5

  SCREEN 12

  FOR I = 1 TO 15
    GET #1, , C
    IF EOF(1) THEN CLOSE : KILL "JULIA" + F$ + ".BIN": BEEP: SCREEN 0: GOTO 3
    PALETTE I, C
  NEXT I

  GET #1, , C1
  GET #1, , C2
  IF Z = 1 THEN GET #1, , A1
  IF Z = 1 THEN GET #1, , B1
  GET #1, , TP
  GET #1, , IG
  SC = 160
  IF Z = 1 THEN GET #1, , SC

  LOCATE 1, 1: PRINT "COORDINATES:"
  LOCATE 2, 2: PRINT C1: LOCATE 3, 2: PRINT C2
  IF Z = 1 THEN LOCATE 5, 1: PRINT "ZOOM OFFSETS:"
  IF Z = 1 THEN LOCATE 6, 2: PRINT A1: LOCATE 7, 2: PRINT B1
  IF Z = 1 THEN LOCATE 9, 1: PRINT "SCALE = "; : PRINT USING "####.##"; SC / 160
  LOCATE 10, 1: PRINT "ITTERATIONS:"; TP
  LOCATE 11, 1: PRINT "IGNORE <"; IG
  LOCATE 13, 1: PRINT "FILENAME: JULIA"; F$

  LINE (159, 0)-(159, 479)
 
  FOR I = 1 TO 15
    LINE (I * 6 + 20, 460)-((I + 1) * 6 + 20, 475), I, BF
  NEXT I

  LINE (24, 458)-(118, 477), 15, B
  LINE (22, 456)-(120, 479), 15, B


  IF Z = 1 THEN ED = 479 ELSE ED = 240

  FOR Y = 0 TO ED
    XS = 160
    DO
      GET #1, , L
      GET #1, , M
      XE = XS + L
      LINE (XS, Y)-(XE, Y), M
      IF Z = 0 THEN LINE (801 - XS, 479 - Y)-(801 - XE, 479 - Y), M
      IF Z = 1 THEN XS = XE ELSE XS = XE + 1
    LOOP WHILE XE < 640
  NEXT Y
  CLOSE
  LOCATE 16, 1: PRINT "JULIA COMPLETE."

  DO
    K$ = INKEY$
    IF K$ = CHR$(27) THEN GOTO 3
    IF K$ = "P" THEN
      FOR I = 0 TO 14
        PALETTE I + 1, P(I + T)
      NEXT I
      LOCATE 26, 1: PRINT "PALETTE:      ": LOCATE 26, 1: PRINT "PALETTE:"; (T / 15) + 1
      T = T + 15
      IF T = 255 THEN T = 0
    END IF
    IF K$ = "C" THEN EXIT DO
  LOOP

  LOCATE 18, 1: PRINT "CALCULATE..."
  LOCATE 20, 1: PRINT "COORDINATES:"

  X = 0: X0 = A1
  Y = 0: Y0 = B1
 
  DEFSNG M

  DO
    M = X0 + X / SC
    N = Y0 - Y / SC
    FOR I = 0 TO 47
      L(I) = POINT(X + 160 + I, Y)
    NEXT I
    FOR I = 1 TO 47
      L(I + 47) = POINT(X + 160, Y + I)
    NEXT I
    LINE (X + 160, Y)-(X + 160 + 47, Y), 15
    LINE (X + 160, Y)-(X + 160, Y + 47), 15
    LOCATE 21, 2: PRINT "              ": LOCATE 21, 2: PRINT M
    LOCATE 22, 2: PRINT "              ": LOCATE 22, 2: PRINT N
    DO
      K$ = INKEY$
      IF LEN(K$) = 2 THEN EXIT DO
      IF K$ = CHR$(27) THEN GOTO 3
    LOOP
    D$ = RIGHT$(K$, 1)
    OX = X: OY = Y
    IF D$ = CHR$(72) THEN Y = Y - 1
    IF D$ = CHR$(75) THEN X = X - 1
    IF D$ = CHR$(77) THEN X = X + 1
    IF D$ = CHR$(80) THEN Y = Y + 1
    IF Y < 0 THEN Y = 0
    IF Y > 479 THEN Y = 479
    IF X < 0 THEN X = 0
    IF X > 479 THEN X = 479
    FOR I = 0 TO 47
      PSET (OX + 160 + I, OY), L(I)
    NEXT I
    FOR I = 1 TO 47
      PSET (OX + 160, OY + I), L(I + 47)
    NEXT I
  LOOP

3 END SUB

DEFSNG L
SUB EXPGENERATE

  SHARED P() AS SINGLE

  INPUT "ENTER C1 VALUE:"; C1
  INPUT "ENTER C2 VALUE:"; C2
  INPUT "ENTER X-OFFSET:"; A1
  INPUT "ENTER Y-OFFSET:"; B1
  INPUT "ENTER SCALE:"; SC
  INPUT "ENTER MAX. ITTERATIONS:"; MI
  INPUT "ENTER COLOR IGNORE:"; IG
  INPUT "ENTER PALETTE NUMBER:"; PN
  INPUT "ENTER JULIA SET NUMBER FOR FILENAME:"; F

  SCREEN 12

  DIM C(15)

  S = (PN - 1) * 15
  N = 1
  FOR I = S TO S + 14
    PALETTE N, P(I)
    C(N) = P(I)
    LINE (N * 6 + 20, 460)-((N + 1) * 6 + 20, 475), N, BF
    N = N + 1
  NEXT I
 
  D = -1

  LINE (159, 0)-(159, 479), 15
  LINE (0, 278)-(159, 278), 15
  LINE (24, 458)-(118, 477), 15, B
  LINE (22, 456)-(120, 479), 15, B

  LOCATE 1, 1: PRINT "COORDINATES:"
  LOCATE 2, 2: PRINT C1: LOCATE 3, 2: PRINT C2
  LOCATE 5, 1: PRINT "ZOOM OFFSETS:"
  LOCATE 6, 2: PRINT A1: LOCATE 7, 2: PRINT B1
  LOCATE 9, 1: PRINT "SCALE x "; : PRINT USING "####.##"; SC / 160
  LOCATE 10, 1: PRINT "ITTERATIONS:"; MI
  LOCATE 11, 1: PRINT "IGNORE <"; IG
  LOCATE 13, 1: PRINT "CURRENT POSITION:"
  LOCATE 16, 1: PRINT "ITTERATIONS:"

  FOR M = 0 TO 479
    X0 = A1 + M / SC
    FOR N = 0 TO 479
      Y0 = B1 - N / SC
      X = X0
      Y = Y0
      FOR I = 1 TO MI
        X1 = X * X - Y * Y + C1
        Y1 = 2 * X * Y + C2
        X = X1
        Y = Y1
        Z = X * X + Y * Y
        IF Z > 4 THEN EXIT FOR
      NEXT I
      K = 15 / (MI - IG)
      L = ((I - IG) * K)
      IF I < IG THEN L = 0
      PSET (M + 160, N), L
      IF D = 1 THEN
        LOCATE 14, 2: PRINT "          ": LOCATE 14, 2: PRINT M; N
        LOCATE 17, 2: PRINT "     ": LOCATE 17, 2: PRINT I
      END IF
      K$ = INKEY$
      IF K$ = "I" THEN D = -D: LOCATE 14, 2: PRINT "          ": LOCATE 17, 2: PRINT "     "
      IF K$ = CHR$(27) THEN GOTO 2
    NEXT N
  NEXT M

  LOCATE 20, 1: PRINT "JULIA COMPLETE."

  DO
    K$ = INKEY$
    IF K$ = "S" THEN EXIT DO
    IF K$ = CHR$(27) THEN GOTO 2
  LOOP

  LOCATE 22, 1: PRINT "SAVING..."

  F$ = RIGHT$("00" + MID$(STR$(F), 2), 3)
  OPEN "JULIA" + F$ + ".BIN" FOR BINARY AS #1
  FOR I = 1 TO 15
    PUT #1, , C(I)
  NEXT I
  PUT #1, , C1
  PUT #1, , C2
  PUT #1, , A1
  PUT #1, , B1
  PUT #1, , MI
  PUT #1, , IG
  PUT #1, , SC

  DEFINT C, L

  FOR Y = 0 TO 479
    LOCATE 23, 2: PRINT "Y ="; Y
    C = -1
    FOR X = 160 TO 639
      IF C >= 0 THEN
        IF POINT(X, Y) <> C THEN
          PUT #1, , L
          PUT #1, , C
          C = POINT(X, Y)
          L = 0
        END IF
        L = L + 1
      END IF
      IF C = -1 THEN C = POINT(X, Y): L = 1
    NEXT X
    PUT #1, , L
    PUT #1, , C
  NEXT Y
  CLOSE
  LOCATE 22, 1: PRINT "SAVE COMPLETE. "
  LOCATE 23, 1: PRINT "               "

  DO
  LOOP UNTIL INKEY$ = CHR$(27)

2 END SUB

DEFSNG C, L
SUB GENERATE

  SHARED P() AS SINGLE

  INPUT "ENTER C1 VALUE:"; C1
  INPUT "ENTER C2 VALUE:"; C2
  INPUT "ENTER MAX. ITTERATIONS:"; MI
  INPUT "ENTER COLOR IGNORE:"; IG
  INPUT "ENTER PALETTE NUMBER:"; PN
  INPUT "ENTER JULIA SET NUMBER FOR FILENAME:"; F

  SCREEN 12

  DIM C(15)

  S = (PN - 1) * 15
  N = 1
  FOR I = S TO S + 14
    PALETTE N, P(I)
    C(N) = P(I)
    LINE (N * 6 + 20, 460)-((N + 1) * 6 + 20, 475), N, BF
    N = N + 1
  NEXT I

  D = -1

  LINE (159, 0)-(159, 479), 15
  LINE (0, 260)-(159, 260), 15
  LINE (24, 458)-(118, 477), 15, B
  LINE (22, 456)-(120, 479), 15, B

  LOCATE 2, 1: PRINT "COORDINATES:"
  LOCATE 3, 2: PRINT C1: LOCATE 4, 2: PRINT C2
  LOCATE 6, 1: PRINT "ITTERATIONS:"; MI
  LOCATE 8, 1: PRINT "IGNORE <"; IG
  LOCATE 11, 1: PRINT "CURRENT POSITION:"
  LOCATE 14, 1: PRINT "ITTERATIONS:"

  FOR M = 0 TO 239
    X0 = -1.5 + M / 160
    FOR N = 0 TO 479
      Y0 = 1.5 - N / 160
      X = X0
      Y = Y0
      FOR I = 1 TO MI
        X1 = X * X - Y * Y + C1
        Y1 = 2 * X * Y + C2
        X = X1
        Y = Y1
        Z = X * X + Y * Y
        IF Z > 4 THEN EXIT FOR
      NEXT I
      K = 15 / (MI - IG)
      L = ((I - IG) * K)
      IF I < IG THEN L = 0
      PSET (M + 160, N), L
      PSET (639 - M, 479 - N), L
      IF D = 1 THEN
        LOCATE 12, 2: PRINT "          ": LOCATE 12, 2: PRINT M; N
        LOCATE 15, 2: PRINT "     ": LOCATE 15, 2: PRINT I
      END IF
      K$ = INKEY$
      IF K$ = "I" THEN D = -D: LOCATE 12, 2: PRINT "          ": LOCATE 15, 2: PRINT "     "
      IF K$ = CHR$(27) THEN GOTO 1
    NEXT N
  NEXT M

  LOCATE 18, 1: PRINT "JULIA COMPLETE."

  DO
    K$ = INKEY$
    IF K$ = "S" THEN EXIT DO
    IF K$ = CHR$(27) THEN GOTO 1
  LOOP

  LOCATE 20, 1: PRINT "SAVING..."

  F$ = RIGHT$("00" + MID$(STR$(F), 2), 3)
  OPEN "JULIA" + F$ + ".BIN" FOR BINARY AS #1
  FOR I = 1 TO 15
    PUT #1, , C(I)
  NEXT I
  PUT #1, , C1
  PUT #1, , C2
  PUT #1, , MI
  PUT #1, , IG
 
  DEFINT L-M

  FOR Y = 0 TO 240
    LOCATE 21, 2: PRINT "Y ="; Y
    M = 0
    L = 0
    FOR X = 160 TO 639
      IF POINT(X, Y) = L THEN M = M + 1 ELSE PUT #1, , M: PUT #1, , L: L = POINT(X, Y): M = 0
    NEXT X
    PUT #1, , M
    PUT #1, , L
  NEXT Y
  CLOSE
  LOCATE 20, 1: PRINT "SAVE COMPLETE. "
  LOCATE 21, 1: PRINT "               "
  DO
  LOOP UNTIL INKEY$ = CHR$(27)

1 END SUB

DEFSNG L-M
SUB PALETTES

  SHARED P() AS SINGLE

  SCREEN 13

  FOR I = 0 TO 255
    PALETTE I + 1, P(I)
  NEXT I

  A = 1
  C = 1
  FOR I = 0 TO 1
    FOR N = 0 TO 8
      IF A < 18 THEN
        LOCATE (N + 1) * 2, (I * 20) + 1: PRINT A
        FOR X = 0 TO 14
          S = (I * 168) + 32
          LINE (S + X * 5, 4 + (N * 16))-(S + (X + 1) * 5, 16 + (N * 16)), C, BF
          C = C + 1
        NEXT X
      END IF
      A = A + 1
    NEXT N
  NEXT I

  DO
  LOOP UNTIL INKEY$ = CHR$(27)

END SUB
             

SUB SHOWLOC

  SHARED P() AS SINGLE
  DEFINT L-M
  DIM C(60)

  SCREEN 12
  WIDTH 80, 60

  FOR I = 1 TO 14
    PALETTE I, P(195 + I)
  NEXT I
  PALETTE 15, (65536 * 63) + (256 * 63) + 63

  LINE (159, 0)-(159, 479), 15

  LOCATE 1, 1: COLOR 15

  PRINT "LOADING MANDELBROT"
  PRINT "SET...."

  OPEN "JULIAM00.BIN" FOR BINARY AS #1

  FOR Y = 0 TO 240
    XS = 159
    XL = 0
    DO
      GET #1, , L
      GET #1, , M
      XE = XS + L
      M = M - 1: IF M < 0 THEN M = 0
      IF XS > 159 THEN
        LINE (XS, Y)-(XE, Y), M
        LINE (XS, 479 - Y)-(XE, 479 - Y), M
      END IF
      XS = XE + 1
      IF XE = 639 THEN EXIT DO
    LOOP
  NEXT Y
  CLOSE

  LOCATE 1, 1
  PRINT "LOADINT COMPLETE. "
  PRINT "          "
  LOCATE 5, 1: PRINT "TO GET TO MENU"
  LOCATE 6, 1: PRINT "TYPE *."

  LOCATE 12, 1: PRINT "ENTER JULIA NUMBER"
  PRINT "TO LOCATE, OR '0' TO"
  PRINT "TO LOCATE YOUR OWN."

  DO
    FOR I = 18 TO 30
      LOCATE I, 1: PRINT "                   "
    NEXT I
    LOCATE 18, 1
    INPUT N$
    IF N$ = "*" THEN GOTO 4
    N = VAL(MID$(N$, 1, 3))
    IF N = 0 THEN
      LOCATE 18, 1: PRINT "USE ARROW KEYS"
      PRINT "TO MOVE POINTER."
      X = 175: Y = 15
      INC = 2.5 / 480
      XS = -2
      YS = -1.25
      DO
        LOCATE 22, 1: PRINT "               "
        PRINT "               "
        LOCATE 22, 1: PRINT XX: PRINT YY
        C(0) = POINT(X, Y)
        N = 1
        FOR I = X - 7 TO X + 7
          C(N) = POINT(I, Y - 7)
          C(N + 1) = POINT(I, Y + 7)
          N = N + 2
        NEXT I
        FOR I = Y - 7 TO Y + 7
          C(N) = POINT(X - 7, I)
          C(N + 1) = POINT(X + 7, I)
          N = N + 2
        NEXT I
        LINE (X - 7, Y - 7)-(X + 7, Y + 7), 15, B
        PSET (X, Y), 15
        DO
          K$ = INKEY$
          IF K$ > "" THEN EXIT DO
        LOOP
        OX = X: OY = Y
        IF LEN(K$) = 2 THEN
          K = ASC(RIGHT$(K$, 1))
          IF K = 72 THEN Y = Y - 1
          IF K = 75 THEN X = X - 1
          IF K = 77 THEN X = X + 1
          IF K = 80 THEN Y = Y + 1
          IF X > 625 THEN X = 625
          IF X < 175 THEN X = 175
          IF Y > 465 THEN Y = 465
          IF Y < 15 THEN Y = 15
        END IF
        XX = XS + ((X - 160) * INC)
        YY = YS + (Y * INC)
        IF K$ = CHR$(56) THEN GOTO 4
        PSET (OX, OY), C(0)
        N = 1
        FOR I = OX - 7 TO OX + 7
          PSET (I, OY - 7), C(N)
          PSET (I, OY + 7), C(N + 1)
          N = N + 2
        NEXT I
        FOR I = OY - 7 TO OY + 7
          PSET (OX - 7, I), C(N)
          PSET (OX + 7, I), C(N + 1)
          N = N + 2
        NEXT I
      LOOP
    END IF
    IF N > 0 THEN
      F$ = "JULIA" + RIGHT$("00" + MID$(STR$(N), 2), 3)
      LOCATE 20, 1: PRINT "SEARCHING FOR FILE"
      LOCATE 21, 1: PRINT F$ + "..."
      OPEN F$ + ".BIN" FOR BINARY AS #1
      GET #1, , A
      IF EOF(1) THEN
        CLOSE
        BEEP
        LOCATE 23, 1: COLOR 14: PRINT "ERROR!!!  NO FILE"
        COLOR 15
        DO
        LOOP UNTIL INKEY$ = CHR$(27)
        LOCATE 20, 1: PRINT "                   "
        LOCATE 21, 1: PRINT "                   "
        LOCATE 22, 1: PRINT "                   "
        SHELL "DEL " + F$ + ".BIN"
        GOTO 10
      END IF
      FOR I = 1 TO 14
        GET #1, , A
      NEXT I
      GET #1, , C1
      GET #1, , C2
      CLOSE
      LOCATE 24, 1: PRINT "COORDINATES:"
      PRINT "   "; C1
      PRINT "   "; C2
      HS = -2
      VS = 1.25
      ST = 2.5 / 480
      FOR X = 0 TO 480
        HS = HS + ST
        IF HS >= C1 THEN EXIT FOR
      NEXT X
      FOR Y = 0 TO 480
        VS = VS - ST
        IF VS <= C2 THEN EXIT FOR
      NEXT Y
      X = X + 161
      Y = Y + 1
      LINE (X, Y)-(X, Y + 6), 15
      LINE -(X + 6, Y), 15
      LINE -(X, Y), 15
      LINE (X + 3, Y + 4)-(X + 8, Y + 9), 15
      LINE (X + 4, Y + 3)-(X + 9, Y + 8), 15
      LINE (X + 4, Y + 4)-(X + 9, Y + 9), 15
      PAINT (X + 1, Y + 1), 15, 15
      H = (X / 8) + 2
      V = (Y / 8) + 3
      COLOR 15
      LOCATE INT(V), INT(H): PRINT N$; : LOCATE 1, 1
      DO
      LOOP UNTIL INKEY$ = CHR$(27)
    END IF
10 LOOP

4 SCREEN 0
  WIDTH 80, 25

END SUB

