]> git.sur5r.net Git - cc65/commitdiff
Added the new mandelbrot sample
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 8 Oct 2004 20:10:58 +0000 (20:10 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 8 Oct 2004 20:10:58 +0000 (20:10 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3228 b7a2c559-68d2-44c3-8de9-860c34a00d81

samples/.cvsignore
samples/Makefile
samples/README
samples/mandelbrot.c [new file with mode: 0644]

index 3746fbe0bd8e0684205382ff307660bd33d06ff6..cbeb999b9486f04eca762f72c7c015ac13c19b20 100644 (file)
@@ -2,6 +2,7 @@ ascii
 fire
 gunzip65
 hello
+mandelbrot
 mousedemo
 nachtm
 plasma
index f8fc0ffe7bf00c6098ec4a2423a45db92fcb3621..7ab37976c5ba28205d759d4679adf1ff1672655f 100644 (file)
@@ -49,11 +49,14 @@ gunzip65:           $(CRT0) gunzip65.o $(CLIB)
 hello:                 $(CRT0) hello.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
 
+mandelbrot:            $(CRT0) mandelbrot.o $(CLIB)
+       @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
+
 mousedemo:             $(CRT0) mousedemo.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
 
 nachtm:                $(CRT0) nachtm.o $(CLIB)
-       @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
+       @$(LD) -t $(SYS) -m $(basename $@).map -Ln $(basename $@).lbl -o $@ $^
 
 plasma:                $(CRT0) plasma.o $(CLIB)
        @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
index caa4645a7829b65b868c91cbdc8545e462a7fd5a..3a1c150b359b394545dc5bcc9f7a868e618bedc8 100644 (file)
@@ -46,6 +46,14 @@ Description: A nice "Hello world" type program that uses the conio
 Platforms:     Runs on all platforms that support conio, which means:
                Apple ][, Atari, C16, C64, C128, CBM510, CBM610, PET, Plus/4
 
+-----------------------------------------------------------------------------
+Name:           mandelbrot
+Description:   A mandelbrot demo using integer arithmetic. The demo was 
+                written by groepaz/hitmen and converted to cc65 using TGI 
+                graphics by Stephan Haubenthal.
+Platforms:     All systems with TGI support. You may have to change the
+                driver/resolution definition in the source.
+
 -----------------------------------------------------------------------------
 Name:           mousedemo
 Description:   Shows how to use the mouse.
diff --git a/samples/mandelbrot.c b/samples/mandelbrot.c
new file mode 100644 (file)
index 0000000..056f372
--- /dev/null
@@ -0,0 +1,131 @@
+/*****************************************************************************
+ * mandelbrot sample program for cc65.                                       *
+ *                                                                           *
+ * (w)2002 by groepaz/hitmen, TGI support by Stefan Haubenthal               *
+ *****************************************************************************/
+
+
+
+#include <stdlib.h>
+#include <time.h>
+#include <conio.h>
+#include <tgi.h>
+
+
+
+/* Graphics definitions */
+#define GRAPHMODE       TGI_MODE_320_200_2
+#define SCREEN_X        (tgi_getmaxx()+1)
+#define SCREEN_Y        (tgi_getmaxy()+1)
+#define MAXCOL          (tgi_getmaxcolor()+1)
+
+#define maxiterations   32
+#define fpshift         (10)
+#define tofp(_x)        ((_x)<<fpshift)
+#define fromfp(_x)      ((_x)>>fpshift)
+#define fpabs(_x)       (abs(_x))
+
+#define mulfp(_a,_b)    ((((signed long)_a)*(_b))>>fpshift)
+#define divfp(_a,_b)    ((((signed long)_a)<<fpshift)/(_b))
+
+/* Use static local variables for speed */
+#pragma staticlocals (1);
+
+
+
+void mandelbrot (signed short x1, signed short y1, signed short x2,
+                signed short y2)
+{
+    register unsigned char count;
+    register signed short r, r1, i;
+    register signed short xs, ys, xx, yy;
+    register signed short x, y;
+
+    /* calc stepwidth */
+    xs = ((x2 - x1) / (SCREEN_X));
+    ys = ((y2 - y1) / (SCREEN_Y));
+
+    yy = y1;
+    for (y = 0; y < (SCREEN_Y); y++) {
+       yy += ys;
+       xx = x1;
+       for (x = 0; x < (SCREEN_X); x++) {
+           xx += xs;
+           /* do iterations */
+           r = 0;
+           i = 0;
+           for (count = 0; (count < maxiterations) &&
+                (fpabs (r) < tofp (2)) && (fpabs (i) < tofp (2));
+                ++count) {
+               r1 = (mulfp (r, r) - mulfp (i, i)) + xx;
+               /* i = (mulfp(mulfp(r,i),tofp(2)))+yy; */
+               i = (((signed long) r * i) >> (fpshift - 1)) + yy;
+               r = r1;
+           }
+           if (count == maxiterations) {
+               tgi_setcolor (0);
+           } else {
+               if (MAXCOL == 2)
+                   tgi_setcolor (1);
+               else
+                   tgi_setcolor (count % MAXCOL);
+           }
+           /* set pixel */
+           tgi_setpixel (x, y);
+       }
+    }
+}
+
+int main (void)
+{
+    clock_t t;
+    unsigned long sec;
+    unsigned sec10;
+    unsigned char err;
+
+    clrscr ();
+
+    /* Load the graphics driver */                       
+    cprintf ("initializing... mompls\r\n");
+    tgi_load (GRAPHMODE);
+    err = tgi_geterror ();
+    if (err  != TGI_ERR_OK) {
+       cprintf ("Error #%d initializing graphics.\r\n%s\r\n",
+                err, tgi_geterrormsg (err));
+       exit (EXIT_FAILURE);
+    };
+    cprintf ("ok.\n\r");
+
+    /* Initialize graphics */
+    tgi_init ();
+    tgi_clear ();
+
+    t = clock ();
+
+    /* calc mandelbrot set */
+    mandelbrot (tofp (-2), tofp (-2), tofp (2), tofp (2));
+
+    t = clock () - t;
+
+    /* Fetch the character from the keyboard buffer and discard it */
+    (void) cgetc ();
+
+    /* shut down gfx mode and return to textmode */
+    tgi_done ();
+
+    /* Calculate stats */
+    sec = (t * 10) / CLK_TCK;
+    sec10 = sec % 10;
+    sec /= 10;
+
+    /* Output stats */
+    cprintf ("time  : %lu.%us\n\r", sec, sec10);
+
+    /* Wait for a key, then end */
+    cputs ("Press any key when done...\n\r");
+    (void) cgetc ();
+
+    /* Done */
+    return EXIT_SUCCESS;
+
+}