home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / GRAPHICS / MISC / HGRPCX10.ZIP / EGA.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-13  |  4.9 KB  |  327 lines

  1. /*
  2.  * EGA.C -- A collection of EGA screen manipulation routines, as used
  3.  *          by A2I.
  4.  */
  5.  
  6. /* INCLUDES */
  7.  
  8. #include <stdio.h>
  9. #include <alloc.h>
  10. #include <dir.h>
  11. #include <mem.h>
  12. #include <string.h>
  13.  
  14. #include "ega.h"
  15.  
  16.  
  17.  
  18.  
  19. /* GLOBALS */
  20.  
  21. volatile UBYTE __modereg, __setres , __esetres,
  22.            __readmap, __bitmask, __mapmask;
  23.  
  24.  
  25.  
  26.  
  27. /* FUNCTIONS */
  28.  
  29. void mode(WORD vmode)
  30. {
  31.  _AH = 0;
  32.  _AL = (UBYTE)vmode;
  33.  
  34.  geninterrupt(0x10);
  35. }
  36.  
  37.  
  38.  
  39. void cls(UWORD page)
  40. {
  41.  UWORD addr;
  42.  UBYTE i = 0x01;
  43.  int   __mm = __mapmask;
  44.  
  45.  
  46.  addr = (page&7)*0x2000;
  47.  
  48.  do
  49.   {
  50.   mapmask(i);
  51.   bitmask(0xFF);
  52.   clrgwin(addr, 0x00, 40, 200);
  53.  
  54.   i<<=1;
  55.   } while(i<0x10);
  56.  
  57.  mapmask(__mm);
  58. }
  59.  
  60.  
  61.  
  62. void init_egfx(UBYTE vmode)
  63. {
  64.  __modereg = 0x00;
  65.  __setres  = 0x00;
  66.  __esetres = 0x00;
  67.  __readmap = 0x00;
  68.  __bitmask = 0x00;
  69.  __mapmask = 0x00;
  70.  
  71.  mode(vmode);
  72. }
  73.  
  74.  
  75.  
  76. void save_pcx(const char *fname, UBYTE far *pal)
  77. {
  78.  FILE  *fp;
  79.  UBYTE  ch, old_ch, red, green, blue, color;
  80.  int    i, j, k, add1, add2, number, num_out, line_length, end;
  81.  int    start_line, end_line;
  82.  
  83.  
  84.  if((fp=fopen(fname, "wb"))==NULL)
  85.   {
  86.   printf("\nUnable to open file %s.\n", fname);
  87.   return;
  88.   }
  89.  
  90.  fputc(0x0A, fp);
  91.  fputc(0x05, fp);
  92.  fputc(0x01, fp);
  93.  fputc(0x01, fp);
  94.  
  95.  putw(  0, fp);
  96.  putw(  0, fp);
  97.  putw(319, fp);
  98.  putw(199, fp);
  99.  
  100.  putw(320, fp);
  101.  putw(200, fp);
  102.  
  103.  ch = 0x00;
  104.  
  105.  for(i=0;i<16;i++)
  106.   {
  107.   color = *(pal+i);
  108.   red   = (((color & 0x20)>>5) | ((color & 0x04)>>1)) * 85;
  109.   green = (((color & 0x10)>>4) |  (color & 0x02)    ) * 85;
  110.   blue  = (((color & 0x08)>>3) | ((color & 0x01)<<1)) * 85;
  111.  
  112.   fputc(red  , fp);
  113.   fputc(green, fp);
  114.   fputc(blue , fp);
  115.   }
  116.  
  117.  fputc(0x00, fp);
  118.  fputc(0x04, fp);
  119.  
  120.  start_line  = 0;
  121.  end_line    = 319/8 + 1;
  122.  line_length = end_line;
  123.  end         = start_line + line_length*4 + 1;
  124.  
  125.  putw(line_length, fp);
  126.  
  127.  putw(0x01, fp);
  128.  
  129.  for(i=70;i<128;i++)
  130.   fputc(0x00, fp);
  131.  
  132.  for(k=0;k<199;k++)
  133.   {
  134.   add1 = 40*k;
  135.   number = 1;
  136.   j = 0;
  137.   add2 = start_line;
  138.   old_ch = rd_byte(add1+(add2++), 0);
  139.  
  140.   for(i=add2;i<end;i++)
  141.    {
  142.    if(i==end-1)
  143.     ch = old_ch-1;
  144.    else
  145.     {
  146.     if((add2)==end_line)
  147.      {
  148.      j++;
  149.      add2 = start_line;
  150.      }
  151.     ch = rd_byte(add1 + add2, j);
  152.     }
  153.    if((ch==old_ch) && number < 63)
  154.     number++;
  155.    else
  156.     {
  157.     num_out = ((UBYTE)number | 0xC0);
  158.     if((number != 1) || ((old_ch&0xC0)==0xC0))
  159.      fputc(num_out, fp);
  160.     fputc(old_ch, fp);
  161.     old_ch = ch;
  162.     number = 1;
  163.     }
  164.    add2++;
  165.    }
  166.   }
  167.  fclose(fp);
  168. }
  169.  
  170.  
  171.  
  172. int fload_pcx(int page, const char *file_name)
  173. {
  174.  FILE  *fsave;
  175.  UBYTE  ch, ch1;
  176.  int    line_end, i, j, k, m, pass, x1, y1, x2, y2;
  177.  UBYTE  __bm = __bitmask, __mr = __modereg, __mm = __mapmask;
  178.  UBYTE  __rm = __readmap, __er = __esetres, __sr = __setres;
  179.  
  180.  
  181.  if((fsave = fopen(file_name, "rb")) == NULL)
  182.   return -1;
  183.  
  184.  fseek(fsave, 4L, SEEK_SET);
  185.  
  186.  x1 = getw(fsave);
  187.  y1 = getw(fsave);
  188.  x2 = getw(fsave);
  189.  y2 = getw(fsave);
  190.  
  191.  fseek(fsave, 128L, SEEK_SET);
  192.  
  193.  bitmask(0xFF);  esetres(0);  modereg(0);
  194.  
  195.  for(k=y1; k<y2; k++)
  196.   {
  197.   i = k*40 + (x1>>3);
  198.  
  199.   line_end = k*40 + (x2>>3) + 1;
  200.  
  201.   j = 0;
  202.  
  203.   while(j < 4)
  204.    {
  205.    ch1 = fgetc(fsave);
  206.  
  207.    if((ch1 & 0xC0) != 0xC0)
  208.     {
  209.     wrt_byte(page, i, j, ch1);
  210.  
  211.     i++;
  212.  
  213.     if(i >= line_end)
  214.      {
  215.      j++;
  216.  
  217.      i = k*40 + (x1>>3);
  218.      }
  219.     }
  220.    else
  221.     {
  222.     ch1 &= 0x3F;
  223.     pass = ch1;
  224.     ch   = fgetc(fsave);
  225.  
  226.     for(m=0; m<pass; m++)
  227.      {
  228.      wrt_byte(page, i, j, ch);
  229.  
  230.      i++;
  231.  
  232.      if(i >= line_end)
  233.       {
  234.       j++;
  235.  
  236.       i = k*40 + (x1>>3);
  237.       }
  238.      }
  239.     }
  240.    }
  241.   }
  242.  
  243.  fclose(fsave);
  244.  
  245.  setres( __sr);  esetres(__er);  mapmask(__mm);
  246.  readmap(__rm);  modereg(__mr);  bitmask(__bm);
  247.  
  248.  return 1;
  249. }
  250.  
  251.  
  252.  
  253. void put_pixel(int x, int y, UBYTE color)
  254. {
  255.  ULONG      off;
  256.  UBYTE far *mem_addr;
  257.  int        dummy, mask;
  258.  
  259.  
  260.  off = (LONG)y * 40L + ((LONG)x / 8L);
  261.  
  262.  mem_addr = (UBYTE far *)(0xA0000000L + off);
  263.  
  264.  mask = 0x80 >> (x % 8);
  265.  
  266.  bitmask(mask);
  267.  
  268.  mapmask(0x0F);
  269.  
  270.  dummy = *mem_addr;
  271.  
  272.  *mem_addr = 0;
  273.  
  274.  mapmask(color);
  275.  
  276.  *mem_addr = 0xFF;
  277.  
  278.  mapmask(0x0F);
  279.  
  280.  bitmask(0xFF);
  281. }
  282.  
  283.  
  284. UBYTE rd_byte(ULONG addr, WORD clr_plane)
  285. {
  286.  UBYTE far *mem_addr;
  287.  UBYTE      pixel;
  288.  int        __rm = __readmap, __mr = __modereg;
  289.  
  290.  
  291.  mem_addr = (UBYTE far *)(0xA0000000L + addr);
  292.  
  293.  readmap(clr_plane);
  294.  
  295.  modereg(0);
  296.  
  297.  pixel = *mem_addr;
  298.  
  299.  readmap(__rm);  modereg(__mr);
  300.  
  301.  return pixel;
  302. }
  303.  
  304.  
  305.  
  306. void wrt_byte(UBYTE page, ULONG addr, WORD clr_plane, UBYTE byte)
  307. {
  308.  UBYTE far *mem_addr;
  309.  UBYTE      dummy;
  310.  UBYTE      __mm = __mapmask, __mr = __modereg, __bm = __bitmask;
  311.  
  312.  
  313.  mem_addr = (UBYTE far *)(0xA0000000L + (page&7)*0x02000000L + addr);
  314.  
  315.  modereg(0);
  316.  
  317.  dummy = *mem_addr;
  318.  
  319.  mapmask(0x01 << clr_plane);
  320.  
  321.  bitmask(0xFF);
  322.  
  323.  *mem_addr = byte;
  324.  
  325.  mapmask(__mm);  modereg(__mr);  bitmask(__bm);
  326. }
  327.