Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@eparadis
Last active January 12, 2022 04:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eparadis/d4a242c8cc149f3583c303efa80532c4 to your computer and use it in GitHub Desktop.
Save eparadis/d4a242c8cc149f3583c303efa80532c4 to your computer and use it in GitHub Desktop.
ascii art mandelbrot drawing program in BASIC
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
@eparadis
Copy link
Author

eparadis commented Jan 12, 2022

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