mirror of
https://github.com/cc65/cc65.git
synced 2025-01-26 02:30:17 +00:00
Added the new mandelbrot sample
git-svn-id: svn://svn.cc65.org/cc65/trunk@3228 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
4233f92e9a
commit
3403d6730f
@ -2,6 +2,7 @@ ascii
|
||||
fire
|
||||
gunzip65
|
||||
hello
|
||||
mandelbrot
|
||||
mousedemo
|
||||
nachtm
|
||||
plasma
|
||||
|
@ -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 $@ $^
|
||||
|
@ -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.
|
||||
|
131
samples/mandelbrot.c
Normal file
131
samples/mandelbrot.c
Normal file
@ -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;
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user