* include/parrot/interpreter.h:
[parrot.git] / examples / shootout / mandelbrot.pir
blobd37fa7cf59e0c9471d660d12db3f7bbd23958e72
1 #!./parrot -j
2 =head1 NAME
4 examples/shootout/mandelbrot.pir - Print the Mandelbrot set
6 =head1 SYNOPSIS
8     % ./parrot examples/shootout/mandelbrot.pir -j 600 > out.pbm
10 =head1 DESCRIPTION
12 This outputs a pbm file of the Mandelbrot set. Defaults to 200x200.
14 Translated from C code by Greg Buchholz into PIR
15 by Peter Baylies <pbaylies@gmail.com>.
17 The C code is at:
18    The Great Computer Language Shootout
19    http://shootout.alioth.debian.org/
21 =cut
23 .sub 'main' :main
24         .param pmc argv
25 #    int w, h, x, y, bit_num = 0;
26 #    char byte_acc = 0;
27 #    int i, iter = 50;
28 #    double limit = 2.0;
29 #    double Zr, Zi, Cr, Ci, Tr, Ti;
30         .local int    w, h, x, y, bit_num, byte_acc, i, iter
31         .local num    limit, Zr, Zi, Cr, Ci, Tr, Ti
32         .sym int argc
33         bit_num = 0
34         byte_acc = 0
35         iter = 50
36         limit = 2.0
37 #       slight optimization here -- nothing a decent C compiler wouldn't already do :)
38         limit = limit * limit
39         argc = argv
40         w = 200
41         if argc <= 1 goto noarg
42 #       w = atoi(argv[1]);
43         $S0 = argv[1]
44         w = $S0
45 #       h = w
46 noarg:  h = w
47 #       printf("P4\n%d %d\n",w,h);
48         print "P4\n"
49         print w
50         print " "
51         print h
52         print "\n"
53         y = 0
54 YREDO:
55         x = 0
56 XREDO:
57 #       Zr = 0.0; Zi = 0.0;
58         Zr = 0.0
59         Zi = 0.0
60 #       Cr = (2*(double)x/w - 1.5);
61         Cr = x
62         Cr /= w
63         Cr *= 2 
64         Cr -= 1.5
65 #       Ci=(2*(double)y/h - 1);
66         Ci = y
67         Ci /= h
68         Ci *= 2
69         Ci -= 1
71         i = 0
72 IREDO:
73 #       Tr = Zr*Zr - Zi*Zi + Cr;
74         $N1 = Zr * Zr
75         $N2 = Zi * Zi
76         Tr = $N1 - $N2
77         Tr += Cr
78 #       Ti = 2*Zr*Zi + Ci;
79         Ti = 2
80         Ti *= Zr
81         Ti *= Zi
82         Ti += Ci
83 #       Zr = Tr; Zi = Ti;
84         Zr = Tr
85         Zi = Ti
86 #       if (Zr*Zr+Zi*Zi > limit*limit) break;
87         $N1 = Zr * Zr
88         $N2 = Zi * Zi
89         $N1 += $N2
90         if $N1 > limit goto IBRK
91         inc i
92         if i < iter goto IREDO
93 IBRK:   
94         byte_acc <<= 1
95         if $N1 <= limit goto SLA
96         byte_acc |= 0
97         goto SLE
98 SLA:    byte_acc |= 1
99 SLE:    inc bit_num
100         if bit_num != 8 goto NTST1
101 PRINT:  chr $S1, byte_acc
102         print $S1
103         byte_acc = 0
104         bit_num = 0
105         goto NTSTE
106 NTST1:  $I1 = w
107         dec $I1
108         goto NTSTE
109         if x != $I1 goto NTSTE
110         $I1 = w
111         $I1 %= 8
112         $I1 = 8 - $I1
113         byte_acc <<= $I1
114         goto PRINT
115 NTSTE:
116         inc x
117         if x < w goto XREDO
119         inc y
120         if y < h goto YREDO
121         end
122 .end
124 # Local Variables:
125 #   mode: pir
126 #   fill-column: 100
127 # End:
128 # vim: expandtab shiftwidth=4: