/*
Mandelbrot Set for Nascom Basic
[email protected], [email protected]

Mandelbrot in NASCOM Basic, adapted from the RC2014 example code. A few test
versions are also included below, with varied results.

Original RC2014 version:

10 MAXITER=20
20 LET C$=" .,'~!^:;[/<&?oxOX#  "
30 FOR Y=-39 TO 39
40 FOR X=-39 TO 39
50 CREAL=X/20
70 CIMAG=Y/20
80 ZREAL = CREAL
90 ZIMAG = CIMAG
95 COUNT = 1
100 ZM = ZREAL*ZREAL
105 ZN = ZIMAG*ZIMAG
107 ZL = ZM+ZN
110 IF ZL>4 THEN GOTO 170
120 ZR2=ZM-ZN+CREAL
130 ZIMAG=ZREAL*ZIMAG*2+CIMAG
140 ZREAL=ZR2
150 COUNT=COUNT+1
160 IF COUNT<MAXITER THEN GOTO 100
170 PRINT MID$(C$,1+COUNT,1);
180 NEXT X
185 PRINT ""
190 NEXT Y
200 END

*/


/ * Simplified and made to work for NASCOM Rom Basic 4.7 */

MA=20
LET C$=" .,'~!^:;[/<&?oxOX#  "
FOR Y=-39 TO 39
FOR X=-39 TO 39
CR=X/20:CI=Y/20
ZR=CR:ZI=CI:CN=1
ZM=ZR*ZR:ZN=ZI*ZI:ZL=ZM+ZN
IF ZL>4 THEN GOTO [MID]
ZB=ZM-ZN+CR:ZI=ZR*ZI*2+CI
ZR=ZB:CN=CN+1
IF CN<MA THEN GOTO [ZM=ZR*ZR]
PRINT MID$(C$,1+CN,1);
NEXT X
PRINT
NEXT Y


1 MA=20
2 LET C$=" .,'~!^:;[/<&?oxOX#  "
3 FOR Y=-39 TO 39
4 FOR X=-39 TO 39
5 CR=X/20:CI=Y/20
6 ZR=CR:ZI=CI:CN=1
7 ZM=ZR*ZR:ZN=ZI*ZI:ZL=ZM+ZN
8 IF ZL>4 THEN GOTO 12
9 ZB=ZM-ZN+CR:ZI=ZR*ZI*2+CI
10 ZR=ZB:CN=CN+1
11 IF CN<MA THEN GOTO 7
12 PRINT MID$(C$,1+CN,1);
13 NEXT X
14 PRINT
15 NEXT Y



/* test */
MA=20
FOR Y=-39 TO 39
FOR X=-39 TO 39
CR=X/20:CI=Y/20
ZR=CR:ZI=CI:CN=1
ZM=ZR*ZR:ZN=ZI*ZI:ZL=ZM+ZN
IF ZL>4 THEN GOTO [PRINT CHR]
ZB=ZM-ZN+CR:ZI=ZR*ZI*2+CI
ZR=ZB:CN=CN+1
IF CN<MA THEN GOTO [ZM=ZR*ZR]
PC=31+CN
IF PC=51 THEN PC=32
PRINT CHR$(PC);
NEXT X
PRINT
NEXT Y

2 MA=20
4 FOR Y=-39 TO 39
6 FOR X=-39 TO 39
8 CR=X/20:CI=Y/20
10 ZR=CR:ZI=CI:CN=1
12 ZM=ZR*ZR:ZN=ZI*ZI:ZL=ZM+ZN
14 IF ZL>4 THEN GOTO 22
16 ZB=ZM-ZN+CR:ZI=ZR*ZI*2+CI
18 ZR=ZB:CN=CN+1
20 IF CN<MA THEN GOTO 12
22 PC=31+CN
24 IF PC=51 THEN PC=32
26 PRINT CHR$(PC);
28 NEXT X
30 PRINT
32 NEXT Y


----

/* variable input */

MA=20
D=20
INPUT "MA [20]";MA
INPUT "D [20]";D
LET C$=" .,'~!^:;[/<&?oxOX#  "
FOR Y=-39 TO 39
FOR X=-39 TO 39
CR=X/D:CI=Y/D
ZR=CR:ZI=CI:CN=1
ZM=ZR*ZR:ZN=ZI*ZI:ZL=ZM+ZN
IF ZL>4 THEN GOTO [MID]
ZB=ZM-ZN+CR:ZI=ZR*ZI*2+CI
ZR=ZB:CN=CN+1
IF CN<MA THEN GOTO [ZM=ZR*ZR]
PRINT MID$(C$,1+CN,1);
NEXT X
PRINT
NEXT Y

1 MA=20
2 D=20
3 INPUT "MA [20]";MA
4 INPUT "D [20]";D
5 C$=" .,'~!^:;[/<&?oxOX#  "
6 FOR Y=-39 TO 39
7 FOR X=-39 TO 39
8 CR=X/D:CI=Y/D
9 ZR=CR:ZI=CI:CN=1
10 ZM=ZR*ZR:ZN=ZI*ZI:ZL=ZM+ZN
11 IF ZL>4 THEN GOTO 15
12 ZB=ZM-ZN+CR:ZI=ZR*ZI*2+CI
13 ZR=ZB:CN=CN+1
14 IF CN<MA THEN GOTO 10
15 PRINT MID$(C$,1+CN,1);
16 NEXT X
17 PRINT
18 NEXT Y





----

/* PDP version, from Rosetta Code
https://rosettacode.org/wiki/Mandelbrot_set#OS.2F8_BASIC

10 X1=59\Y1=21
20 I1=-1.0\I2=1.0\R1=-2.0\R2=1.0
30 S1=(R2-R1)/X1\S2=(I2-I1)/Y1
40 FOR Y=0 TO Y1
50 I3=I1+S2*Y
60 FOR X=0 TO X1
70 R3=R1+S1*X\Z1=R3\Z2=I3
80 FOR N=0 TO 30
90 A=Z1*Z1\B=Z2*Z2
100 IF A+B>4.0 GOTO 130
110 Z2=2*Z1*Z2+I3\Z1=A-B+R3
120 NEXT N
130 PRINT CHR$(62-N);
140 NEXT X
150 PRINT
160 NEXT Y
170 END

*/


/* modified for Nascom */

10 X1=59:Y1=21
20 I1=-1.0:I2=1.0:R1=-2.0:R2=1.0
30 S1=(R2-R1)/X1:S2=(I2-I1)/Y1
40 FOR Y=0 TO Y1
50 I3=I1+S2*Y
60 FOR X=0 TO X1
70 R3=R1+S1*X:Z1=R3:Z2=I3
80 FOR N=0 TO 30
90 A=Z1*Z1:B=Z2*Z2
100 IF A+B>4.0 GOTO 130
110 Z2=2*Z1*Z2+I3:Z1=A-B+R3
120 NEXT N
130 PRINT CHR$(62-N);
140 NEXT X
150 PRINT
160 NEXT Y
170 END