[DOCS]
[parrot.git] / examples / pir / mandel.pir
blob04ca45def6c851347b3351562f3357e2fe26de47
1 # Copyright (C) 2005-2008, The Perl Foundation.
2 # $Id$
4 =head1 NAME
6 examples/pir/mandel.pir - Print the Mandelbrot set
8 =head1 SYNOPSIS
10     % ./parrot examples/pir/mandel.pir
12 =head1 DESCRIPTION
14 This prints an ASCII-art representation of the Mandelbrot set.
16 Translated from C code by Glenn Rhoads into Parrot assembler
17 by Leon Brocard <acme@astray.com>.
18 Translated from PASM to PIR by Bernhard Schmalhofer.
20 The C code is:
22     main() {
23         int x, y, k;
24         char *b = " .:,;!/>)|&IH%*#";
25         float r, i, z, Z, t, c, C;
26         for (y=30; puts(""), C = y*0.1 - 1.5, y--;) {
27             for (x=0; c = x*0.04 - 2, z=0, Z=0, x++ < 75;) {
28                 for (r=c, i=C, k=0; t = z*z - Z*Z + r, Z = 2*z*Z + i, z=t, k<112; k++)
29                     if (z*z + Z*Z > 10) break;
30                 printf ("%c", b[k%16]);
31             }
32         }
33     }
35 =cut
37 .sub 'main' :main
39         .local string b
40         .local int    x, y, k
41         .local num    r, i, z, Z, t, c, C
43         b = " .:,;!/>)|&IH%*#"
44         y = 30
46 YREDO:  #  C = y*0.1 - 1.5
47         C = y * 0.1
48         C -= 1.5
50         x = 0
52 XREDO:  # c = x*0.04 - 2
53         c = x * 0.04
54         c -= 2
55         z = 0
56         Z = 0
58         r = c
59         i = C
61         k = 0
63 KREDO:  # t = z*z - Z*Z + r
64         $N1 = z * z
65         $N2 = Z * Z
66         t = $N1 - $N2
67         t += r
69         # Z = 2*z*Z + i
70         Z = 2 * Z
71         Z = z * Z
72         Z += i
74         # z = t
75         z = t
77         # if (z*z + Z*Z > 10) break;
78         $N1 = z * z
79         $N2 = Z * Z
80         $N1 += $N2
81         if $N1 > 10 goto PRINT
83         inc k
84         if k < 112 goto KREDO
86 PRINT:  $I1 = k % 16
87         $S1 = substr b, $I1, 1
88         print $S1
90         inc x
91         if x < 75 goto XREDO
93         print "\n"
94         dec y
95         if y > 0 goto YREDO
96 .end
98 # Local Variables:
99 #   mode: pir
100 #   fill-column: 100
101 # End:
102 # vim: expandtab shiftwidth=4 ft=pir: