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