home *** CD-ROM | disk | FTP | other *** search
/ Rat's Nest 1 / ratsnest1.iso / prgmming / c / pcxx.c < prev    next >
C/C++ Source or Header  |  1996-08-12  |  2KB  |  117 lines

  1. /* PCX SHOW.. NOT THE FASTEST, BUT
  2.    WORKING ONE.. */
  3.  
  4. #include <stdio.h>
  5. #include <dos.h>
  6. #include <conio.h>
  7.  
  8. typedef struct {
  9.           unsigned char
  10.                manufact,
  11.                version,
  12.                encoding,
  13.                bpp;
  14.           unsigned int
  15.                xmin,ymin,
  16.                xmax,ymax,
  17.                hres,vres;
  18.           unsigned char pal[48];
  19.           unsigned char
  20.                reser,
  21.                planes;
  22.           unsigned int
  23.                bpl,
  24.                palt;
  25.           unsigned char filler[58];
  26.         } pcxhdr;
  27.  
  28. pcxhdr hdr;
  29. unsigned int width,depth;
  30. unsigned int bytes;
  31. unsigned char pal[768];
  32. unsigned char c;
  33. FILE *fp;
  34.  
  35. void rpcxl(unsigned int ofs)
  36. {
  37.  unsigned char c,run;
  38.  int n;
  39.  unsigned int w;
  40.  n=0;
  41.  while(n<bytes)
  42.   {
  43.    fread(&c,1,1,fp);
  44.  
  45.    if((c & 192) == 192)
  46.     {
  47.      run = c & 63;
  48.      fread(&c,1,1,fp);
  49.      n = n + run;
  50.      for(w=0;w<run;w++)
  51.       {
  52.        pokeb(0xA000,ofs+w,c);
  53.       }
  54.      ofs += w;
  55.     } else
  56.     {
  57.      n++;
  58.      pokeb(0xA000,ofs,c);
  59.      ofs++;
  60.     }
  61.  
  62.   }
  63. }
  64.  
  65. void pcx(const char *fn)
  66. {
  67.  int i;
  68.  
  69.  fp = fopen(fn,"rb");
  70.  fread(&hdr,1,128,fp);
  71.  
  72.  fseek(fp,-769L,SEEK_END);
  73.  fread(&c,1,1,fp);
  74.  fread(pal,1,768,fp);
  75.  fseek(fp,128,SEEK_SET);
  76.  
  77.  width = hdr.xmax - hdr.xmin;
  78.  depth = hdr.ymax - hdr.ymin;
  79.  bytes = hdr.bpl;
  80.  
  81.  for(i=0;i<768;i++)
  82.     pal[i] >>= 2;
  83.  asm mov al,0
  84.  asm mov dx,0x3c8
  85.  asm out dx,al
  86.  asm inc dx
  87.  for(i=0;i<768;i++)
  88.      asm out dx,al
  89.  
  90.  for(i=0;i<depth-1;i++)
  91.      rpcxl(i*320);
  92.  
  93.  asm mov al,0
  94.  asm mov dx,0x3c8
  95.  asm out dx,al
  96.  asm inc dx
  97.  for(i=0;i<768;i++)
  98.   {_AL = pal[i];
  99.    asm out dx,al
  100.   }
  101.  
  102.  getch();
  103. }
  104.  
  105. void main(void)
  106. {
  107.  asm mov ax,0x13
  108.  asm int 0x10
  109.  
  110.  pcx("lstorus.pcx");
  111.  pcx("lstorus.pcx");
  112.  pcx("lstorus.pcx");
  113.  pcx("lstorus.pcx");
  114.  
  115.  asm mov ax,0x3
  116.  asm int 0x10
  117. }