#include #include #include #include #include #include #include "../gr-sim.h" #include "../tfv_zp.h" #include "sin1024.h" #define MAXDOTS 256 static short gravitybottom; static short gravity=0; static short gravityd=16; static short dot_x[MAXDOTS]; static short dot_y[MAXDOTS]; static short dot_z[MAXDOTS]; static short dot_yadd[MAXDOTS]; static short rotsin=0; static short rotcos=0; static void drawdots(void) { int temp32; unsigned short ball_x,ball_y,shadow_y; unsigned short d,distance,newy; unsigned short ax; short signed_ax; for(d=0;d>16)+9000; if (distance==0) distance=1; // printf("%d\n",distance-9000); temp32=((dot_x[d]*rotcos)+(dot_z[d]*rotsin)); temp32>>=8; temp32=temp32+(temp32>>3); ball_x=(temp32/distance)/8; // printf("%x/%x/8=%x\n",temp32,distance,ball_x); /* center */ ball_x+=20; /* if off end of screen, no need for shadow */ if (ball_x>39) continue; /**********/ /* shadow */ /**********/ shadow_y=0x80000/distance/4; /* center it */ shadow_y+=24; /* if shadow off screen, don't draw */ if (shadow_y>47) continue; /* draw shadow */ color_equals(0); plot( (ball_x),shadow_y); /********/ /* ball */ /********/ dot_yadd[d]+=gravity; newy=dot_y[d]+dot_yadd[d]; temp32=newy; if (temp32&0x8000) temp32|=0xffff0000; if (temp32>=gravitybottom) { //ax=-dot_yadd[d]; temp32=(-dot_yadd[d])*gravityd; ax=temp32&0xffff; signed_ax=ax; ax=signed_ax>>4; dot_yadd[d]=ax; newy+=dot_yadd[d]; } dot_y[d]=newy; /* sign extend */ temp32=newy; if (temp32&0x8000) { temp32|=0xffff0000; } temp32<<=6; newy=temp32/distance/4; /* center */ ball_y=newy+24; /* don't draw if off screen */ if (ball_y>47) continue; /* plot ball */ /* convert from 320x200 to 40x48 */ color_equals(6); plot(ball_x,ball_y); } return; } static short isin(short deg) { return(sin1024[deg&1023]); } static short icos(short deg) { return(sin1024[(deg+256)&1023]); } static short dottaul[1024]; int main(int argc,char **argv) { short dropper; short frame=0; short rota=-1*64; short rot=0,rots=0; short a,b,c,d,i,j=0; short grav,gravd; short f=0; int ch; dropper=22000; grav=3; gravd=13; gravitybottom=8105; for(a=0;a1357 && !(frame&31) && grav>0) grav--; } if(dropper>4000) dropper-=100; //rotsin=0; rotcos=64; rotcos=icos(rot)*64; rotsin=isin(rot)*64; rots+=2; if(frame>1357) { rot+=rota/64; rota--; } else rot=isin(rots); f++; gravity=grav; gravityd=gravd; drawdots(); grsim_update(); /* approximate by 50Hz sleep */ usleep(20000); ch=grsim_input(); if (ch==27) { return 0; } } return 0; }