SecondReality/GRAB/FLIC/VFOK.C
2017-09-24 01:45:36 +02:00

221 lines
No EOL
3.4 KiB
C

#include <stdio.h>
char far *vram=(char far *)0xa0000000;
int blocksleft=999;
int wid,hig,pics;
main(int argc,char *argv[])
{
FILE *f1;
int a;
long len,l,ll;
f1=fopen(argv[1],"rb");
if(f1==NULL) return(0);
_asm mov ax,19
_asm int 10h
len=getw(f1);
len+=(long)getw(f1)<<16;
getw(f1);
pics=getw(f1);
wid=getw(f1);
hig=getw(f1);
fseek(f1,0x80L,SEEK_SET);
printf("\n\n\n\n\n\n\n\n\n\n\n");
for(;;)
{
l=ftell(f1);
l+=(long)getw(f1);
l+=(long)getw(f1)<<16;
a=getw(f1);
if(feof(f1)) break;
if(a==0xf1fa)
{
int a;
blocksleft=getw(f1);
for(a=0;a<8;a++) getc(f1);
ll=l;
}
else
{
doblock(f1,(unsigned)a);
fseek(f1,l,SEEK_SET);
blocksleft--;
if(blocksleft==0)
{
fseek(f1,ll,SEEK_SET);
getch();
}
}
}
_asm mov ax,3
_asm int 10h
fclose(f1);
}
int viewpal(void)
{
int a;
unsigned u;
for(a=0;a<256;a++)
{
u=(a>>4)*3+320-48+((a&15)*3+200-48)*320;
vram[u]=a;
vram[u+1]=a;
vram[u+2]=a;
vram[320+u]=a;
vram[320+u+1]=a;
vram[320+u+2]=a;
vram[640+u]=a;
vram[640+u+1]=a;
vram[640+u+2]=a;
}
}
int doblock(FILE *f1,unsigned type)
{
if(type==0x000b)
{
int a,c,d;
c=getc(f1)*256; /* count */
c+=getc(f1);
c*=3;
a=getc(f1)*256; /* first */
a+=getc(f1);
outp(0x3c8,a);
for(a=0;a<c;a++) outp(0x3c9,getc(f1));
viewpal();
}
else if(type==0x0004)
{
int a,c,d;
c=getc(f1)*256; /* count */
c+=getc(f1);
c*=3;
a=getc(f1)*256; /* first */
a+=getc(f1);
outp(0x3c8,a);
for(a=0;a<c;a++) outp(0x3c9,getc(f1)>>2);
viewpal();
}
else if(type==0x000c)
{
int a,b,c,lc,cc,cm,lb,le,lad;
long l;
unsigned int u;
lb=getw(f1);
le=lb+getw(f1);
for(lc=lb;lc<le;lc++)
{
cm=getc(f1);
u=lc*320;
for(cc=0;cc<cm && u<64000;cc++)
{
a=getc(f1);
u+=a;
a=getc(f1);
if(a<0x80)
{
for(c=0;c<a;c++) vram[u++]=getc(f1);
}
else
{
a=256-a;
b=getc(f1);
for(c=0;c<a;c++) vram[u++]=b;
}
}
if(u>64000 || kbhit()) break;
}
u=0;
}
else if(type==0x0007)
{
int a,b,b1,b2,c,lc,cc,cm,lb,le,lad;
int skipcnt,flag=0;
long l;
unsigned int u;
le=getw(f1);
for(lc=lad=0;lc<le;lc++)
{
cm=getw(f1);
while(cm<0)
{
lad=320*-cm;
cm=getw(f1);
}
u=lc*320+lad;
for(cc=0;cc<cm && u<64000;cc++)
{
a=getc(f1);
u+=a;
a=getc(f1);
if(a<0x80)
{
for(c=0;c<a;c++)
{
vram[u++]=getc(f1);
vram[u++]=getc(f1);
}
}
else
{
a=256-a;
b1=getc(f1);
b2=getc(f1);
for(c=0;c<a;c++)
{
vram[u++]=b1;
vram[u++]=b2;
}
}
if(flag) getch();
}
if(u>64000 || kbhit()) break;
}
u=0;
}
else if(type==0x000f)
{
int a,b,c,lc,cc,cm;
long l;
unsigned int u;
for(lc=0;lc<hig;lc++)
{
u=lc*320;
cm=getc(f1);
for(cc=0;cc<cm && u<64000;cc++)
{
a=getc(f1);
if(a<0x80)
{
b=getc(f1);
for(c=0;c<a;c++) vram[u++]=b;
}
else
{
a=256-a;
for(c=0;c<a;c++) vram[u++]=getc(f1);
}
}
if(u>64000 || kbhit()) break;
}
u=0;
/*for(a=0;a<200;a+=2)
{
vram[a*320]=15;
vram[a*320+321]=14;
}
for(a=0;a<320;a+=2)
{
vram[a]=15;
vram[a+201]=14;
}*/
}
else
{
printf("UNKNOWN BLOCK TYPE: %04X\n",type);
getch();
}
}