/* view flic */ #include #include #include #include int doframe(FILE *f1); int dochunk(FILE *f1); int doline1(unsigned u,FILE *f1); int doline2(unsigned u,FILE *f1); int saveframe(int frame); char far *vram=(char far *)0xa0000000L; char buf[64000]; char pal[768]; char savebuf[64000]; int lw; struct { long filesize; unsigned magic; /* 0xaf11 */ int frames; int width; int heigth; int RESERVED1; int flags; /*0*/ int speed; long next; /*0*/ long frit; /*0*/ char RESERVED2[102]; } header; struct { long size; unsigned magic; /* 0xf1fa */ int chunks; int RESERVED[4]; } frameheader; struct { long size; unsigned type; } chunkheader; main(int argc,char *argv[]) { FILE *f1; int f; f1=fopen(argv[1],"rb"); if(f1==NULL) return(0); fread(&header,sizeof(header),1,f1); lw=header.heigth; /**/ _asm mov ax,13h _asm int 10h saveframe(-1); for(f=0;f0) { while(b--) vram[u++]=(char)getc(f1); } else { a=getc(f1); while(b++) vram[u++]=(char)a; } } return(0); } int doline2(unsigned u,FILE *f1) { int a,b,c; c=getc(f1); while(c--) { b=(char)getc(f1); if(b<0) { while(b++) vram[u++]=(char)getc(f1); } else { a=getc(f1); while(b--) vram[u++]=(char)a; } } return(0); } int saveframe(int frame) { unsigned u,u0,ua; int a,b,c; static FILE *fo; switch(frame) { case -1 : /* open */ fo=fopen("anim.fca","wb"); break; case -2 : /* close */ putc(254,fo); fclose(fo); break; default : /* save */ if(frame==0) { outp(0x3c7,0); for(a=0;a<768;a++) pal[a]=(char)inp(0x3c9); memset(savebuf,0,64000U); fwrite(pal,1,768U,fo); } { for(u0=u=0;u<64000;u++) { if(vram[u]!=savebuf[u]) { ua=u-u0; while(ua>253) { putc(253,fo); putc(0,fo); ua-=253; } putc(ua,fo); for(a=0;a<255 && (unsigned)a+u<64000;a++) { if(vram[u+a]==savebuf[u+a]) break; } putc(a,fo); for(b=0;b