From 3b53300ca26f14f13b2b1ea8bec383733b16605c Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 28 Dec 2017 23:27:31 -0500 Subject: [PATCH] mode7: update fixed-point starfield --- gr-sim/Makefile | 10 +- gr-sim/starfield.c | 75 +++++++++--- gr-sim/starfield_fixed.c | 252 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 318 insertions(+), 19 deletions(-) create mode 100644 gr-sim/starfield_fixed.c diff --git a/gr-sim/Makefile b/gr-sim/Makefile index 39814b09..4e00c808 100644 --- a/gr-sim/Makefile +++ b/gr-sim/Makefile @@ -5,7 +5,7 @@ LFLAGS = -lm SDL_LIBS= `sdl-config --libs` SDL_INCLUDE= `sdl-config --cflags` -all: fade fixed_point rainbow sparkle starfield kaleido \ +all: fade fixed_point rainbow sparkle starfield starfield_fixed kaleido \ tfv mode7_demo text tfv_multiply @@ -163,12 +163,18 @@ starfield: starfield.o gr-sim.o starfield.o: starfield.c $(CC) $(CFLAGS) -c starfield.c +starfield_fixed: starfield_fixed.o gr-sim.o + $(CC) $(LFLAGS) $(SDL_LIBS) -o starfield_fixed starfield_fixed.o gr-sim.o + +starfield_fixed.o: starfield_fixed.c + $(CC) $(CFLAGS) -c starfield_fixed.c + gr-sim.o: gr-sim.c gr-sim.h apple2_font.h $(CC) $(CFLAGS) $(SDL_INCLUDE) -c gr-sim.c clean: - rm -f *~ *.o gr-sim rainbow sparkle starfield kaleido \ + rm -f *~ *.o gr-sim rainbow sparkle starfield starfield_fixed kaleido \ tfv text mode7_demo fade fixed_point tfv_multiply diff --git a/gr-sim/starfield.c b/gr-sim/starfield.c index 28b3d647..3fc042e3 100644 --- a/gr-sim/starfield.c +++ b/gr-sim/starfield.c @@ -32,10 +32,12 @@ static void double_to_fixed(double d, struct fixed_type *f) { } +#if 0 static void print_fixed(struct fixed_type *f) { printf("%02X.%02X",f->i,f->f); } +#endif static void fixed_add(struct fixed_type *x, struct fixed_type *y, struct fixed_type *z) { int carry; @@ -66,29 +68,73 @@ static double fixed_to_double(struct fixed_type *f) { static struct star_type stars[NUMSTARS]; +static int random_table[256]; +static int random_pointer=0; + +static void random_star(int i) { + + /* -128 to 128 */ + + /* Should we xor? */ + stars[i].x.i=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + + stars[i].x.f=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + + stars[i].y.i=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + stars[i].y.f=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + +// double_to_fixed( (drand48()-0.5)*spreadx,&stars[i].x); +// double_to_fixed( (drand48()-0.5)*spready,&stars[i].y); + + /* 0.1 to 16 */ + stars[i].z.i=random_table[random_pointer++]/16; + if (random_pointer>255) random_pointer=0; + stars[i].z.f=0x1; + +// double_to_fixed( ((drand48())*spreadz)+0.1,&stars[i].z); +// print_fixed(&stars[i].x); +// printf(","); +// print_fixed(&stars[i].y); +// printf(","); +// print_fixed(&stars[i].z); +// printf("\n"); + + +// double_to_fixed((drand48()-0.5)*spreadx,&stars[i].x); +// double_to_fixed((drand48()-0.5)*spready,&stars[i].y); +// stars[i].z.i=spreadz; + +} + int main(int argc, char **argv) { int ch,i; - int spreadx=256; - int spready=256; +// int spreadx=256; +// int spready=256; int spreadz=16; struct fixed_type speedz; + + + + for(i=0;i<256;i++) { + random_table[i]=rand()%256; + printf("%d\n",random_table[i]); + } double_to_fixed(-0.25,&speedz); grsim_init(); + /* Should NUMSTARS be prime to help with randomness */ + for(i=0;i=40) || (tempy>=40)) { - double_to_fixed((drand48()-0.5)*spreadx, - &stars[i].x); - double_to_fixed((drand48()-0.5)*spready, - &stars[i].y); - stars[i].z.i=spreadz; - + random_star(i); } else { color_equals(stars[i].color); diff --git a/gr-sim/starfield_fixed.c b/gr-sim/starfield_fixed.c new file mode 100644 index 00000000..dbb1d68f --- /dev/null +++ b/gr-sim/starfield_fixed.c @@ -0,0 +1,252 @@ +#include +#include +#include + +#include "gr-sim.h" + +#define NUMSTARS 16 + +struct fixed_type { + char i; + unsigned char f; +}; + + +struct star_type { + struct fixed_type x; + struct fixed_type y; + int z; + int color; +}; + +static void double_to_fixed(double d, struct fixed_type *f) { + + int temp; + + temp=d*256; + + f->i=(temp>>8)&0xff; + + f->f=temp&0xff; + + +} + +#if 0 +static void print_fixed(struct fixed_type *f) { + + printf("%02X.%02X",f->i,f->f); +} +#endif + +#if 0 +static void fixed_add(struct fixed_type *x, struct fixed_type *y, struct fixed_type *z) { + int carry; + short sum; + + sum=(short)(x->f)+(short)(y->f); + + if (sum>=256) carry=1; + else carry=0; + + z->f=sum&0xff; + + z->i=x->i+y->i+carry; +} +#endif + +#if 0 +static double fixed_to_double(struct fixed_type *f) { + + double d; + + d=f->i; + d+=((double)(f->f))/256.0; + +// printf("(%02x.%02x)=%lf\n",f->i,f->f,*d); + + return d; +} +#endif + +static struct star_type stars[NUMSTARS]; + +static int random_table[256]; +static int random_pointer=0; + +static int z_table[256]; + +static void random_star(int i) { + + /* -128 to 128 */ + + /* Should we xor? */ + stars[i].x.i=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + + stars[i].x.f=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + + stars[i].y.i=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + stars[i].y.f=random_table[random_pointer++]; + if (random_pointer>255) random_pointer=0; + +// double_to_fixed( (drand48()-0.5)*spreadx,&stars[i].x); +// double_to_fixed( (drand48()-0.5)*spready,&stars[i].y); + + /* 0 to 63 corresponding to */ + stars[i].z=random_table[random_pointer++]&0x3f; + if (random_pointer>255) random_pointer=0; + if (stars[i].z>58) stars[i].z=0; + +// double_to_fixed( ((drand48())*spreadz)+0.1,&stars[i].z); +// print_fixed(&stars[i].x); +// printf(","); +// print_fixed(&stars[i].y); +// printf(","); +// print_fixed(&stars[i].z); +// printf("\n"); + + +// double_to_fixed((drand48()-0.5)*spreadx,&stars[i].x); +// double_to_fixed((drand48()-0.5)*spready,&stars[i].y); +// stars[i].z.i=spreadz; + +} + +static void fixed_mul(struct fixed_type *x, struct fixed_type *y, struct fixed_type *z) { + + int a,b,c; + + a=((x->i)<<8)+(x->f); + b=((y->i)<<8)+(y->f); + + c=a*b; +// printf("%x %x %x\n",a,b,c); + + c>>=8; + + z->i=(c>>8); + z->f=(c&0xff); +} + + +int main(int argc, char **argv) { + + int ch,i; + +// int spreadx=256; +// int spready=256; +// int spreadz=16; +// struct fixed_type speedz; + + for(i=0;i<256;i++) { + random_table[i]=rand()%256; + printf("%d,",random_table[i]); + } + printf("\n"); + + double g; + struct fixed_type gf; + i=0; + + for(g=16.0;g>0;g-=0.25) { + double_to_fixed(1.0/g,&gf); + printf("%d %.2f: %.2f %2X %2X\n",i,g,1.0/g, + gf.i,gf.f); + z_table[i]=gf.f; + i++; + } + printf("\n"); + + +// double_to_fixed(-0.25,&speedz); + + grsim_init(); + + /* Should NUMSTARS be prime to help with randomness */ + + for(i=0;i=40) || + (dy.i>=40)) { + + random_star(i); + } + else { +// if (stars[i].z>58) { +// printf("EEK! %2X.%2X\n", +// stars[i].z,stars[i].z); +// } + color_equals(stars[i].color); + basic_plot(dx.i,dy.i); + } + + } + + /* Move stars */ + for(i=0;i=64) random_star(i); + } + + grsim_update(); + ch=grsim_input(); + if (ch=='q') exit(0); + usleep(10000); + } + + return 0; +}