/* Program to model a waving flag */ /* By D.Hedley 11/7/93 */ #include #include #include #include #define MODELAS Float2Fixed(32.0) #define DIST Float2Fixed(30.0) #define DMODELAS Float2Fixed(32.0) #define DDIST Float2Fixed(42.42640687) /* sqrt(DIST*DIST+DIST*DIST) */ #define DAMPING Float2Fixed(1.03125) #define HEIGHT 11 #define WIDTH 13 #define XP (int)((320-((float)WIDTH*Fixed2Float(DIST)/Fixed2Float(XSCALE)))/2) #define YP (43+35) #define XSCALE Float2Fixed(2.75) #define YSCALE Float2Fixed(3.75) #define myabs(a) ((a) < 0 ? -(a) : (a)) typedef long Fixed; typedef struct { Fixed x,y; Fixed xv,yv; } Pos; Pos array1[HEIGHT*WIDTH]; Pos array2[HEIGHT*WIDTH]; Fixed angle[HEIGHT*WIDTH]; Fixed hforce[HEIGHT*(WIDTH-1)]; Fixed vforce[(HEIGHT-1)*WIDTH]; Fixed dforce[(HEIGHT-1)*(WIDTH-1)]; Fixed vdist[(HEIGHT-1)*WIDTH]; Fixed hdist[HEIGHT*(WIDTH-1)]; Fixed ddist[(HEIGHT-1)*(WIDTH-1)]; struct { int x,y; } psn[(HEIGHT-1)*(WIDTH-1)]; #define Int2Fixed(a) (Fixed)((Fixed)(a) << 16) #define Fixed2Int(a) (int)((a) >> 16) #define Float2Fixed(a) ((Fixed)((a) * 65536.0)) #define Fixed2Float(a) ((a) / 65536.0) Pos *newpos = array2; Pos *oldpos = array1; int fps = 0; #define RD 1 #define WT 11 #define BL 21 #define NCOLS Int2Fixed(10) struct { int col1,col2; } colours[] = { {WT,RD},{BL,WT},{BL,BL},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{BL,BL},{WT,BL},{RD,WT}, {RD,WT},{WT,RD},{BL,WT},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{WT,BL},{RD,WT},{WT,RD}, {WT,BL},{RD,WT},{WT,RD},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{RD,WT},{WT,RD},{BL,WT}, {BL,BL},{WT,BL},{RD,WT},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{WT,RD},{BL,WT},{BL,BL}, {WT,WT},{WT,WT},{WT,WT},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{WT,WT},{WT,WT},{WT,WT}, {RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD}, {RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD},{RD,RD}, {WT,WT},{WT,WT},{WT,WT},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{WT,WT},{WT,WT},{WT,WT}, {BL,BL},{WT,BL},{RD,WT},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{WT,RD},{BL,WT},{BL,BL}, {WT,BL},{RD,WT},{WT,RD},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{RD,WT},{WT,RD},{BL,WT}, {RD,WT},{WT,RD},{BL,WT},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{WT,BL},{RD,WT},{WT,RD}, {WT,RD},{BL,WT},{BL,BL},{WT,WT},{RD,RD},{RD,RD},{WT,WT},{BL,BL},{WT,BL},{RD,WT} }; unsigned char pal1[256*3]; unsigned char pal2[256*3]; unsigned char c_pal[256*3]; unsigned char black_pal[256*3]; unsigned char white_pal[256*3]; unsigned char bits_pal[256*3] = { 0,0,0,32,0,0,0,32,0,32,32,0,0,0,32,32, 0,32,0,32,32,32,32,32,48,48,48,63,0,0,0,63, 0,63,63,0,0,0,63,63,0,63,0,63,63,63,63,63, 63,63,63,59,59,59,54,54,54,50,50,50,46,46,46,42, 42,42,38,38,38,33,33,33,29,29,29,25,25,25,21,21, 21,17,17,17,13,13,13,8,8,8,4,4,4,0,0,0, 16,0,0,23,0,0,29,0,0,36,0,0,43,0,0,49, 0,0,56,0,0,63,0,0,63,8,8,63,16,16,63,24, 24,63,32,32,63,39,39,63,47,47,63,55,55,63,63,63, 63,55,55,63,47,47,63,39,39,63,32,32,63,24,24,63, 16,16,63,8,8,63,0,0,57,0,0,51,0,0,45,0, 0,39,0,0,33,0,0,28,0,0,22,0,0,16,0,0, 39,39,63,38,38,63,36,37,63,35,36,63,34,35,63,33, 33,63,32,32,63,31,31,63,30,30,63,28,29,63,27,28, 63,26,27,63,25,25,63,24,24,63,22,23,63,21,22,63, 20,21,63,19,19,63,17,18,63,16,17,63,15,16,63,14, 15,63,13,14,63,12,13,63,11,12,63,9,10,63,8,9, 63,7,8,63,6,7,63,5,6,63,3,4,63,2,3,63, 0,1,63,0,1,61,0,1,59,0,1,57,0,1,55,0, 1,53,0,1,51,0,1,48,0,0,47,0,0,45,0,0, 43,0,0,41,0,0,38,0,0,36,0,0,34,0,0,32, 0,0,30,0,0,28,0,0,26,0,0,24,0,0,22,0, 0,20,0,0,18,0,0,16,0,0,14,0,0,12,0,0, 10,0,0,8,0,0,6,0,0,4,0,0,2,0,0,0, 54,59,63,46,56,63,39,53,63,31,50,63,23,47,63,16, 44,63,8,42,63,0,39,63,0,35,57,0,31,51,0,27, 45,0,23,39,0,19,33,0,16,28,0,12,22,0,9,16, 54,54,63,46,47,63,39,39,63,31,32,63,23,24,63,16, 16,63,8,9,63,0,1,63,0,1,57,0,1,51,0,0, 45,0,0,39,0,0,33,0,0,28,0,0,22,0,0,16, 60,54,63,57,46,63,54,39,63,52,31,63,50,23,63,47, 16,63,45,8,63,42,0,63,38,0,57,32,0,51,29,0, 45,24,0,39,20,0,33,17,0,28,13,0,22,10,0,16, 63,54,63,63,46,63,63,39,63,63,31,63,63,23,63,63, 16,63,63,8,63,63,0,63,56,0,57,50,0,51,45,0, 45,39,0,39,33,0,33,27,0,28,22,0,22,16,0,16, 63,58,55,63,56,52,63,54,49,63,53,47,63,51,44,63, 49,41,63,47,39,63,46,36,63,44,32,63,41,28,63,39, 24,60,37,23,58,35,22,55,34,21,52,32,20,50,31,19, 47,30,18,45,28,17,42,26,16,40,25,15,39,24,14,36, 23,13,34,22,12,32,20,11,29,19,10,27,18,9,23,16, 8,21,15,7,18,14,6,16,12,6,14,11,5,10,8,3, 55,0,0,53,6,0,52,13,0,50,19,0,49,24,0,48, 29,0,47,35,0,45,39,0,44,43,0,32,43,0,19,42, 0,7,42,0,0,41,5,0,40,16,0,40,28,0,40,37, 0,35,41,0,27,42,0,18,42,0,10,43,19,0,46,27, 0,46,33,0,46,41,0,46,46,0,43,46,0,35,46,0, 29,46,0,22,46,0,14,47,0,8,47,0,0,63,63,63 }; extern void SetGraphicsMode(void); extern void draw_filled_triangle(int,int,int,int,int,int,int); extern void SwapScreens(void); extern void SetTextMode(void); extern void SetPalette(unsigned char *); extern void FadePalette(unsigned char *,unsigned char *); extern void DrawText(int, int, char *); extern void BlankScreen(void); extern void Sync(void); extern void StartASM(void); extern void EndASM(void); extern void PutBits(void); extern Fixed FixedAdd(Fixed,Fixed); extern Fixed FixedMul(Fixed,Fixed); extern Fixed FixedDiv(Fixed,Fixed); extern Fixed Distance(int,int); extern unsigned char OKtoblank; extern unsigned long FrameNum; void CalcForces(void) { int i,j,cpos; register Fixed *f,*d; for (j = 0,cpos = 0,f = &hforce[0],d = &hdist[0]; j < HEIGHT; j++,cpos++) for (i = 0; i < WIDTH-1 ; i++,f++,d++,cpos++) { *d = Distance(cpos,cpos+1); if ((*f = -FixedDiv(FixedMul(*d-DIST,MODELAS),DIST)) > 0) *f = 0; } for (j = 0,f = &vforce[0],d = &vdist[0]; j < (HEIGHT-1)*WIDTH; j++,f++,d++) { *d = Distance(j,j+WIDTH); if ((*f = -FixedDiv(FixedMul(*d-DIST,MODELAS),DIST)) > 0) *f = 0; } for (j = 0,cpos = 0, f = &dforce[0],d = &ddist[0]; j 0) *f = 0; } } #define ChangePos(pos) \ { \ if ((newpos[pos].xv = FixedDiv(oldpos[pos].xv+hf, DAMPING))\ > Float2Fixed(25.0))\ newpos[pos].xv = Float2Fixed(25.0); \ if((newpos[pos].yv = FixedDiv(oldpos[pos].yv+vf+Float2Fixed(1.0), DAMPING))\ > Float2Fixed(15.0)) \ newpos[pos].yv = Float2Fixed(15.0); \ newpos[pos].x = oldpos[pos].x + newpos[pos].xv; \ newpos[pos].y = oldpos[pos].y + newpos[pos].yv; \ } #define AddForces(posx1,posy1,posx2,posy2) \ { \ hf += FixedMul(oldpos[(posy1)*WIDTH+(posx1)].x - oldpos[(posy2)*WIDTH+(posx2)].x,\ temp >> 1); \ vf += FixedMul(oldpos[(posy1)*WIDTH+(posx1)].y - oldpos[(posy2)*WIDTH+(posx2)].y,\ temp >> 1); \ } #define CalcHoriz(posx,posy,which) \ { \ temp = FixedDiv(hforce[(posy)*(WIDTH-1)+(posx)], \ hdist[(posy)*(WIDTH-1)+(posx)]);\ AddForces((posx)+which,posy,(posx)+(1-which),(posy)) \ } #define CalcVert(posx,posy,which) \ { \ temp = FixedDiv(vforce[(posy)*WIDTH+(posx)], \ vdist[(posy)*WIDTH+(posx)]);\ AddForces(posx,posy+which,posx,posy+(1-which)) \ } #define CalcDiag(posx,posy,which) \ { \ temp = FixedDiv(dforce[(posy)*(WIDTH-1)+(posx)], \ ddist[(posy)*(WIDTH-1)+(posx)]);\ AddForces((posx)+which,(posy)+which,(posx)+(1-which),(posy)+(1-which)) \ } void CalcPos(void) { Fixed hf,vf,temp; register int i,cpos; int j; /* Top right corner */ hf = vf = 0; CalcHoriz(WIDTH-2,0,1); CalcVert(WIDTH-1,0,0); ChangePos(WIDTH-1); /* Bottom right corner */ hf = vf = 0; CalcHoriz(WIDTH-2,HEIGHT-1,1); CalcVert(WIDTH-1,HEIGHT-2,1); CalcDiag(WIDTH-2,HEIGHT-2,1); ChangePos((WIDTH-1)+WIDTH*(HEIGHT-1)); /* Right edge */ for (i = 1,cpos = WIDTH+WIDTH-1; i < HEIGHT-1; i++,cpos+=WIDTH) { hf = vf = 0; CalcHoriz(WIDTH-2, i, 1); CalcVert(WIDTH-1, i-1, 1); CalcVert(WIDTH-1, i, 0); CalcDiag(WIDTH-2, i-1, 1); ChangePos(cpos); } /* Top edge */ for (i = 1,cpos = 1; i < WIDTH-1; i++,cpos++) { hf = vf = 0; CalcHoriz(i-1, 0, 1); CalcHoriz(i, 0, 0); CalcVert(i, 0, 0); CalcDiag(i, 0, 0); ChangePos(cpos); } /* Middle */ for (j = 1,cpos = 1+WIDTH; j < HEIGHT-1; j++,cpos+=2) for (i = 1; i < WIDTH-1; i++,cpos++) { hf = vf = 0; CalcHoriz(i-1,j,1); CalcHoriz(i,j,0); CalcVert(i,j-1,1); CalcVert(i,j,0); CalcDiag(i-1,j-1,1); CalcDiag(i,j,0); ChangePos(cpos); } /* Bottom edge */ for (i = 1,cpos = (HEIGHT-1)*WIDTH+1; i < WIDTH-1; i++,cpos++) { hf = vf = 0; CalcHoriz(i-1,HEIGHT-1,1); CalcHoriz(i,HEIGHT-1,0); CalcVert(i,HEIGHT-2,1); CalcDiag(i-1,HEIGHT-2,1); ChangePos(cpos); } /* Left edge */ for (j = 1,cpos = WIDTH; j < HEIGHT-1; j++,cpos+=WIDTH) { // if (j == HEIGHT/2) continue; hf = vf = 0; CalcHoriz(0,j,0); CalcVert(0,j,0); CalcVert(0,j-1,1); CalcDiag(0,j,0); ChangePos(cpos); } } void CalcAngle(void) { register int i,j; for (j = 0; j < HEIGHT; j++) for (i = 0; i < WIDTH-1; i++) { if((angle[j*WIDTH+i]=DIST-myabs(newpos[j*WIDTH+i+1].x-newpos[j*WIDTH+i].x)) < 0) angle[j*WIDTH+i] = 0; } } #define x1 psn[cpos].x #define y1 psn[cpos].y #define x2 psn[cpos+1].x #define y2 psn[cpos+1].y #define x3 psn[cpos+WIDTH+1].x #define y3 psn[cpos+WIDTH+1].y #define x4 psn[cpos+WIDTH].x #define y4 psn[cpos+WIDTH].y void DrawFlag(void) { register int j,cpos; int i; for (j = 0; j < HEIGHT*WIDTH; j++) { psn[j].x = XP+Fixed2Int(FixedDiv(newpos[j].x,XSCALE)); psn[j].y = YP+Fixed2Int(FixedDiv(newpos[j].y,YSCALE)); } for (i = WIDTH-2, cpos = WIDTH-2; i >= WIDTH/2; cpos = --i) { for (j = 0; j < HEIGHT-1; j++,cpos += WIDTH) { if (j >= HEIGHT/2) { draw_filled_triangle(x1,y1,x3,y3,x4,y4, colours[i*(HEIGHT-1)+j].col1+Fixed2Int(FixedMul( FixedDiv(angle[cpos+WIDTH],DIST),NCOLS))); draw_filled_triangle(x1,y1,x2,y2,x3,y3, colours[i*(HEIGHT-1)+j].col2+Fixed2Int(FixedMul( FixedDiv(angle[cpos],DIST),NCOLS))); } else { draw_filled_triangle(x4,y4,x2,y2,x3,y3, colours[i*(HEIGHT-1)+j].col1+Fixed2Int(FixedMul( FixedDiv(angle[cpos+WIDTH],DIST),NCOLS))); draw_filled_triangle(x1,y1,x2,y2,x4,y4, colours[i*(HEIGHT-1)+j].col2+Fixed2Int(FixedMul( FixedDiv(angle[cpos],DIST),NCOLS))); } } } for (i = WIDTH/2-1, cpos = WIDTH/2-1; i >= 0; cpos = --i) { for (j = 0; j < HEIGHT-1; j++, cpos += WIDTH) { if (j < HEIGHT/2) { draw_filled_triangle(x1,y1,x3,y3,x4,y4, colours[i*(HEIGHT-1)+j].col1+Fixed2Int(FixedMul( FixedDiv(angle[cpos+WIDTH],DIST),NCOLS))); draw_filled_triangle(x1,y1,x2,y2,x3,y3, colours[i*(HEIGHT-1)+j].col2+Fixed2Int(FixedMul( FixedDiv(angle[cpos],DIST),NCOLS))); } else { draw_filled_triangle(x4,y4,x2,y2,x3,y3, colours[i*(HEIGHT-1)+j].col1+Fixed2Int(FixedMul( FixedDiv(angle[cpos+WIDTH],DIST),NCOLS))); draw_filled_triangle(x1,y1,x2,y2,x4,y4, colours[i*(HEIGHT-1)+j].col2+Fixed2Int(FixedMul( FixedDiv(angle[cpos],DIST),NCOLS))); } } } } #define c(a) (((a) >= 'A' && (a) <= 'Z') ? (a)-'A'+2 : \ ((a) >= '1' && (a) <= '9') ? (a)-'1'+26+2 : \ (a) == '0' ? 35+2 : (a) == '!' ? 36+2 : (a) == ',' ? 37+2 : \ (a) == ':' ? 38+2 : (a) == '-' ? 39+2 : 1) int numlines[]= { 1, 3, 4, 4, 0 }; char t_blank[] = { 0 }; char t_bits[] = { c('B'), c('I'), c('T'), c('S'), 0 }; char t_computer[] = { c('C'), c('O'), c('M'), c('P'), c('U'), c('T'), c('E'), c('R'),0 }; char t_society[]={ c('S'), c('O'), c('C'), c('I'), c('E'), c('T'), c('Y'), 0}; char t_is[] = { c('I'), c('S'), 0 }; char t_proud[] = { c('P'), c('R'), c('O'), c('U'), c('D'), 0 }; char t_to[] = { c('T'), c('O'), 0 }; char t_present[] = { c('P'), c('R'), c('E'), c('S'), c('E'), c('N'), c('T'),0 }; char t_a[] = { c('A'), 0 }; char t_david[] = { c('D'), c('A'), c('V'), c('I'), c('D'), 0 }; char t_hedley[] = { c('H'), c('E'), c('D'), c('L'), c('E'), c('Y'), 0 }; char t_production[] = { c('P'), c('R'), c('O'), c('D'), c('U'), c('C'), c('T'), c('I'), c('O'), c('N'),0 }; char *String[]= { t_blank, t_bits,t_computer,t_society, t_is,t_proud,t_to,t_present, t_a,t_david,t_hedley,t_production, }; char **string = String; int textpos = 0; void DoText(void) { int i,vpos; vpos = 43-20+((240-numlines[textpos]*32)>>1); for (i = 0; i < numlines[textpos]; i++) DrawText((20-(strlen(string[i])<<1))<<1,vpos+32*i,string[i]); } void Update(void) { Pos *temp; static unsigned long c_frame; CalcForces(); CalcPos(); CalcAngle(); while (OKtoblank); DrawFlag(); DoText(); while (FrameNum-c_frame < fps); c_frame = FrameNum; SwapScreens(); temp = oldpos; oldpos = newpos; newpos = temp; } void SetInitialPos(void) { int i,j; Pos *p; for (j = 0; j < HEIGHT; j++) for (i = 0; i < WIDTH; i++) { p = &array1[j*WIDTH+i]; p->x = FixedMul(Int2Fixed(i),DIST); p->y = FixedMul(Int2Fixed(j),DIST); p->xv = p->yv = 0; array2[j*WIDTH+i] = *p; } } void SetInitialPalette(void) { register int i; register int p; p = RD*3; for (i = 10; i >0 ; i--) { pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = i*3+20; p++; pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = 0; p++; pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = 0; p++; } p = BL*3; for (i = 10; i >0 ; i--) { pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = 0; p++; pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = 0; p++; pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = i*3+20; p++; } p = WT*3; for (i = 10; i >0 ; i--) { pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = i*3+20; p++; pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = i*3+20; p++; pal1[p] = pal2[p] = pal1[p+32*3] = pal1[p+64*3] = pal1[p+96*3] = pal1[p+128*3] = pal1[p+160*3] = pal1[p+192*3] = pal1[p+224*3] = i*3+20; p++; } p = 32*3; for (i = 0; i < 32 ; i++,p+=3) pal2[p] = pal2[p+1] = pal2[p+2] = 56; p = 64*3; for (i = 0; i < 32 ; i++,p+=3) pal2[p] = pal2[p+1] = pal2[p+2] = 40; p = 96*3; for (i = 0; i < 32 ; i++,p+=3) pal2[p] = pal2[p+1] = pal2[p+2] = 32; p = 128*3; for (i = 0; i < 32 ; i++,p+=3) pal2[p] = pal2[p+1] = pal2[p+2] = 20; p = 160*3; for (i = 0; i < 32 ; i++,p+=3) pal2[p] = pal2[p+1] = pal2[p+2] = 12; p = 192*3; for (i = 0; i < 32 ; i++,p+=3) { pal2[p] = 55; pal2[p+1] = 44; pal2[p+2] = 0; } p = 224*3; for (i = 0; i < 32*3; i+=3,p+=3) { pal2[p] = pal1[i]>>2; pal2[p+1] = pal1[i+1]>>2; pal2[p+2] = pal1[i+2]>>1; } pal2[224*3+2] = 20; for (i = 0; i < 256*3; i++) white_pal[i] = 63; } #define FADEON 130 #define FADEOFF 70 int main(void) { register int cpos,i; int animate = 0, wind = 0,mag; int j,windstart = 150,animstart = 200; int fadestate,fadecount; srand(1); StartASM(); SetGraphicsMode(); SetPalette(black_pal); Sync(); SetInitialPalette(); memcpy(c_pal,black_pal,sizeof black_pal); SetInitialPos(); Update(); for(;;) { if (animstart > 0) if (--animstart == 0) { animate = 1; fadestate = 0; fadecount = FADEON; } else { if (animstart % 3 == 0) { FadePalette(c_pal,pal1); SetPalette(c_pal); } Sync(); } if (animate) { switch(fadestate) { case 0: /* No fade yet... */ if (--fadecount == 0) { fadestate = 1; fadecount = FADEON; } break; case 1: /* Fade on... */ if (--fadecount == 0) { fadestate = 2; fadecount = FADEOFF; } else { FadePalette(c_pal,pal2); SetPalette(c_pal); } break; case 2: /* Fade off... */ if (--fadecount == 0) if (numlines[textpos+1] > 0) { string += numlines[textpos++]; fadestate = 1; fadecount = FADEON; } else { bits93: memcpy(c_pal,white_pal,sizeof white_pal); OKtoblank = 1; Sync(); while (OKtoblank); OKtoblank = 128; PutBits(); SetPalette(c_pal); Sync(); SwapScreens(); for (j = 0; j < 100; j++) { FadePalette(c_pal,bits_pal); FadePalette(c_pal,bits_pal); SetPalette(c_pal); Sync(); if (inportb(0x60) == 1) goto quit; } for (j = 0; j < 260; j++) Sync(); for (j = 0; j < 50; j++) { FadePalette(c_pal,black_pal); FadePalette(c_pal,black_pal); FadePalette(c_pal,black_pal); FadePalette(c_pal,black_pal); SetPalette(c_pal); Sync(); if (inportb(0x60) == 1) goto quit; } goto quit; } else { FadePalette(c_pal,pal1); SetPalette(c_pal); } } Update(); if (windstart > 0) if (--windstart == 0) wind = 1; } if (animate && wind && random(10) > 3) { mag = random(4); for (j = 0, cpos = 1; j < HEIGHT; j++,cpos++) { for (i = 1; i < WIDTH; i++,cpos++) { Fixed temp; temp = FixedDiv(angle[cpos],DIST); oldpos[cpos].xv += FixedMul(Int2Fixed(mag+random(2)),temp); oldpos[cpos].yv -= Float2Fixed(1.2)+temp; } } } if (inportb(0x60) == 1) { outportb(0x60,1|128); goto bits93; } } quit: EndASM(); SetTextMode(); return 0; }