/*
Barnsley Fern for Nascom Basic
[email protected], [email protected]

Adapted from the ZX Spectrum code to generate the same. The original program
(below) was designed for graphics. The adaptation was designed to run on Grant
Searle's NASCOM ROM Basic 4.7, for text mode (VT100).

VT/ANSI escape sequences are used to move the pointer around, and "." is used
to plot the fern.

Here is the original ZX code:

10 REM Fractal Fern
20 PAPER 7: BORDER 7: BRIGHT 1: INK 4: CLS
30 LET maxpoints=20000: LET x=0: LET y=0
40 FOR n=1 TO maxpoints
50 LET p=RND*100
60 IF p<=1 THEN LET nx=0: LET ny=0.16*y: GO TO 100
70 IF p<=8 THEN LET nx=0.2*x-0.26*y: LET ny=0.23*x+0.22*y+1.6: GO TO 100
80 IF p<=15 THEN LET nx=-0.15*x+0.28*y: LET ny=0.26*x+0.24*y+0.44: GO TO 100
90 LET nx=0.85*x+0.04*y: LET ny=-0.04*x+0.85*y+1.6
100 LET x=nx: LET y=ny
110 PLOT x*17+127,y*17
120 NEXT n

Following is the Nascom Basic code, without line numbers for easier modification,
and with line numbers for easier copy/paste/run.
*/


/* no line numbers */
WIDTH 79
PRINT CHR$(27);"[2J"
MP=800:x=0:y=0
FOR N=1 TO MP
P=RND(1)*80
IF P<=1 THEN NX=0:NY=0.16*Y:GOTO [x=nx]
IF P<=8 THEN NX=0.2*X-0.26*Y:NY=0.23*X+0.22*Y+1.6:GOTO [x=nx]
IF P<=15 THEN NX-0.15*X+0.28*Y:NY=0.26*X+0.24*Y+0.44:GOTO [x=nx]
NX=0.85*X+0.04*Y:NY=-0.04*X+0.85*Y+1.6
X=NX:Y=NY
C=INT(X*8)+34
L=INT(Y*3.8)
SL$=MID$(STR$(L),2)
SC$=MID$(STR$(C),2)
M$=CHR$(27)+"["+SL$+";"+SC$+"H"
PRINT M$;"."
NEXT N

/* with line numbers */
10 WIDTH 79
20 PRINT CHR$(27);"[2J"
30 MP=800:x=0:y=0
40 FOR N=1 TO MP
50 P=RND(1)*80
60 IF P<=1 THEN NX=0:NY=0.16*Y:GOTO 100
70 IF P<=8 THEN NX=0.2*X-0.26*Y:NY=0.23*X+0.22*Y+1.6:GOTO 100
80 IF P<=15 THEN NX=0.15*X+0.28*Y:NY=0.26*X+0.24*Y+0.44:GOTO 100
90 NX=0.85*X+0.04*Y:NY=-0.04*X+0.85*Y+1.6
100 X=NX:Y=NY
110 C=INT(X*8)+34
120 L=INT(Y*3.8)
130 SL$=MID$(STR$(L),2)
140 SC$=MID$(STR$(C),2)
150 M$=CHR$(27)+"["+SL$+";"+SC$+"H"
160 PRINT M$;"."
170 NEXT N