]> git.sur5r.net Git - cc65/blob - test/ref/mandel.c
atari5200: add screensize function
[cc65] / test / ref / mandel.c
1 /*
2   !!DESCRIPTION!! mandelbrot test program
3   !!ORIGIN!!      testsuite
4   !!LICENCE!!     Public Domain
5   !!AUTHOR!!      Groepaz/Hitmen
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 static unsigned short SCREEN_X;
12 static unsigned char  SCREEN_Y;
13
14 #define MAXCOL     8
15
16 #define maxiterations 16
17
18 #define fpshift (12)
19
20 #define tofp(_x)        ((_x)<<fpshift)
21 #define fromfp(_x)      ((_x)>>fpshift)
22 #define fpabs(_x)       (abs(_x))
23
24 #define mulfp(_a,_b)    ((((signed long)_a)*(_b))>>fpshift)
25 #define divfp(_a,_b)    ((((signed long)_a)<<fpshift)/(_b))
26
27 unsigned char dither[MAXCOL]={" .*o+0%#"};
28
29 void mandelbrot(signed short x1,signed short y1,signed short x2,signed short y2)
30 {
31 register signed short  r,r1,i;
32 register unsigned char count;
33 register signed short xs,ys,xx,yy;
34 register signed short x;
35 register unsigned char y;
36
37         /* calc stepwidth */
38         xs=((x2-x1)/(SCREEN_X));
39         ys=((y2-y1)/(SCREEN_Y));
40
41         yy=y1;
42         for(y = 0; y < (SCREEN_Y); ++y)
43         {
44                 yy+=ys; xx=x1;
45                 for(x = 0; x < (SCREEN_X); ++x)
46                 {
47                     xx+=xs;
48                     /* do iterations */
49                     r=0;i=0;
50                     for(count=0;(count<maxiterations)&&
51                                 (fpabs(r)<tofp(2))&&
52                                 (fpabs(i)<tofp(2))
53                                 ;++count)
54                     {
55                             r1 = (mulfp(r,r)-mulfp(i,i))+xx;
56                             /* i = (mulfp(mulfp(r,i),tofp(2)))+yy; */
57                             i = (((signed long)r*i)>>(fpshift-1))+yy;
58                             r=r1;
59                     }
60                     if(count==maxiterations)
61                     {
62                             printf(" ");
63                     }
64                     else
65                     {
66                             printf("%c",dither[(count%MAXCOL)]);
67                     }
68                 }
69                     printf("\n");
70         }
71 }
72
73 int main (void)
74 {
75     SCREEN_X = 80;
76     SCREEN_Y = 40;
77
78     /* calc mandelbrot set */
79     mandelbrot(tofp(-2),tofp(-2),tofp(2),tofp(2));
80
81     /* Done */
82     return 0;
83 }
84