Last active
January 12, 2022 04:46
-
-
Save eparadis/d4a242c8cc149f3583c303efa80532c4 to your computer and use it in GitHub Desktop.
ascii art mandelbrot drawing program in BASIC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10 x1=59 | |
11 y1=21 | |
20 i1=-1.0 | |
21 i2=1.0 | |
22 r1=-2.0 | |
23 r2=1.0 | |
30 s1=(r2-r1)/x1 | |
31 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 | |
71 z1=r3 | |
72 z2=i3 | |
80 for n=0 to 29 | |
90 a=z1*z1 | |
91 b=z2*z2 | |
100 if a+b>4.0 goto 130 | |
110 z2=2*z1*z2+i3 | |
111 z1=a-b+r3 | |
120 next n | |
130 print chr$(62-n); | |
140 next x | |
150 print | |
160 next y | |
170 end |
If you want that cool "decoding the matrix" look, this version cycles through each hex character as it prints. It's way slower, but you can use that time to admire the cool effect.
10 FOR Y=-12 TO 12
20 FOR X=-19 TO 19
30 CA=X*0.0458
40 CB= Y*0.08333
50 A=CA
60 B=CB
70 FOR I=0 TO 15
75 GOSUB 1000
80 T=A*A-B*B+CA
90 B=2*A*B+CB
100 A=T
110 IF (A*A+B*B)>4 THEN GOTO 210
115 PRINT CHR$(8);
120 NEXT I
130 PRINT " ";
140 GOTO 210
210 NEXT X
220 PRINT
230 NEXT Y
900 END
1000 REM print a single hex digit stored in I
1010 IF I>9 THEN J=I+7
1020 IF I<=9 THEN J=I
1030 PRINT CHR$(48+J);
1040 RETURN
A very naive re-implementation of the original version from BASIC into FORTH is:
variable x1
variable y1
variable i1
variable i2
variable i3
variable r1
variable r2
variable r3
variable s1
variable s2
variable z1
variable z2
variable a
variable b
variable n
59 x1 !
21 y1 !
-1e0 i1 f!
1e0 i2 f!
-2e0 r1 f!
1e0 r2 f!
r2 f@ r1 f@ f- x1 @ s>f f/ s1 f! \ L30
i2 f@ i1 f@ f- y1 @ s>f f/ s2 f! \ L31
: mandel
y1 @ 0 do \ L40
i1 f@ s2 f@ i s>f f* f+ i3 f! \ L50
x1 @ 0 do \ L60
r1 f@ s1 f@ i s>f f* f+ r3 f! \ L70
r3 f@ z1 f! \ L71
i3 f@ z2 f! \ L72
0 n !
30 0 do \ L80
z1 f@ fdup f* a f! \ L90
z2 f@ fdup f* b f! \ L91
a f@ b f@ f+ 4e0 f> if leave then \ line 100
2e0 z1 f@ z2 f@ f* f* i3 f@ f+ z2 f! \ L110
a f@ b f@ f- r3 f@ f+ z1 f! \ L111
n @ 1 + n !
loop \ L120
62 n @ - emit \ L130
loop \ L140
cr \ L150
loop \ L160
;
mandel
bye
Note that I had to use 30 instead of 29 in "line 80" aka 30 0 do
to produce the proper output.
>>>>>>=====<<<<<<<<<<<<<<<;;;;;;:::96032:;;;;<<<<==========
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<=======
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974 (.9::::;;<<<<<======
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764 5789999:;;<<<<<====
>>==<<<<<<<<<<<<<;;;;::::996. &2 45335:;<<<<<<===
>>=<<<<<<<<<<<;;;::::::999752 *79:;<<<<<<==
>=<<<<<<<<;;;:599999999886 %78:;;<<<<<<=
><<<<;;;;;:::972456-567763 +9;;<<<<<<<
><;;;;;;::::9875& .3 *9;;;<<<<<<
>;;;;;;::997564' ' 8:;;;<<<<<<
>::988897735/ &89:;;;<<<<<<
>::988897735/ &89:;;;<<<<<<
>;;;;;;::997564' ' 8:;;;<<<<<<
><;;;;;;::::9875& .3 *9;;;<<<<<<
><<<<;;;;;:::972456-567763 +9;;<<<<<<<
>=<<<<<<<<;;;:599999999886 %78:;;<<<<<<=
>>=<<<<<<<<<<<;;;::::::999752 *79:;<<<<<<==
>>==<<<<<<<<<<<<<;;;;::::996. &2 45335:;<<<<<<===
>>>==<<<<<<<<<<<<<<<;;;;;;:98888764 5789999:;;<<<<<====
>>>>===<<<<<<<<<<<<<<<;;;;;;;::9974 (.9::::;;<<<<<======
>>>>>===<<<<<<<<<<<<<<<<;;;;;;;:::873*079::;;;;<<<<<=======
Here's another gist for the refactor of this into something that's more idiomatic FORTH. I'm interested to find a FORTH for my Z80 retrocomputer to compare speed!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
With ANSI color modification:
