home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / PCMCGA.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-11  |  5.8 KB  |  214 lines

  1. /*
  2.     pcmcga.c
  3.  
  4.     %  PC MCGA support
  5.  
  6.     5/16/88  by Ted.
  7.  
  8.     OWL 1.1
  9.     Copyright (c) 1988, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      4/14/89 ted     Added palette poking function.
  15.      5/06/89 ted    Added colormap initialization.
  16.      6/15/89 Ted    Added PlotText func.
  17.      7/10/89 ted    Installed new text-plotting approach.
  18.      7/12/89 ted    Added OSTATIC's and '_func' macros.
  19.      8/22/89 ted    Added fontdesc_struct elements to def_font initialization.
  20. */
  21.  
  22. #define DEFDEFCMAPS        /* Define default pc cmap declarations in this file */
  23.  
  24. #include "pcpriv.h"
  25.  
  26. /* Declare and initialize default 256 color color map */
  27. /* Note: initializers are broken up so as not to choke the M5.1 compiler */
  28.  
  29. OGLOBAL ocolmap_struct(256) pcdefmcgamap =    PC_DEF_MCGAMAPINIT0
  30.                                     PC_DEF_MCGAMAPINIT2
  31.                                     PC_DEF_MCGAMAPINIT4
  32.                                     PC_DEF_MCGAMAPINIT6
  33.                                     PC_DEF_MCGAMAPINIT8
  34.                                     PC_DEF_MCGAMAPINITA
  35.                                     PC_DEF_MCGAMAPINITC
  36.                                     PC_DEF_MCGAMAPINITE;
  37.  
  38. OSTATIC pc_setinfo_func        (mcga_setinfo);
  39. OSTATIC attrcols_func        (mcga_attrcols);
  40. OSTATIC void                 DIGPRIV mcga_setfuncs(_arg1(dig_struct *));
  41. OSTATIC void                 DIGPRIV mcga_setcolmap(_arg1(ocolmap_type));
  42. OSTATIC dig_dControl_func    (mcga_dControl);
  43. /* -------------------------------------------------------------------------- */
  44.  
  45. boolean pc_Mode13(digp)
  46.     dig_struct *digp;
  47. {
  48.     return(pc_OpenMCGA(digp, 0x13));
  49. }
  50. /* -------------------------------------------------------------------------- */
  51.  
  52. boolean DIGPRIV pc_OpenMCGA(digp, mode)
  53.     dig_struct *digp;
  54.     int mode;
  55. {
  56.     if (!pc_OpenDIG(digp, mode, mcga_setinfo)) {
  57.         return(FALSE);
  58.     }
  59.     mcga_setfuncs(digp);
  60.     return(TRUE);
  61. }
  62. /* -------------------------------------------------------------------------- */
  63.  
  64. static void DIGPRIV mcga_setfuncs(digp)
  65.     dig_struct *digp;
  66. {
  67.     pc_setgfuncs(digp);        /* Set the standard ptrs & vars for pc graphics */
  68.  
  69.     digp->dControl      = mcga_dControl;
  70. }
  71. /* -------------------------------------------------------------------------- */
  72.  
  73. static dispinfo_struct mcgainfo = {
  74.     {'I','B','M',' ', 'P','C',' ','M', 'C','G','A',' ',
  75.      'G','R','A','P', 'H','I','C','S', 0,0},            /* devname */
  76.     0x13,            /* mode */
  77.     0, 0,            /* xpixperm, ypixperm */
  78.     &pcdatastruc.dmspace, /* dispmap */
  79.     VID_EVGAADDR,    /* dispaddr */
  80.     320,            /* bytewidth */
  81.     0,                /* ileave */
  82.     0,                /* ilsize */
  83.     1,                /* nplanes */
  84.     8,                /* pixbits */
  85.  
  86.     256L,            /* ncolors */
  87.     DTYPE_MAPCOLOR,    /* color type */
  88.     (ocolmap_type) &pcdefmcgamap,    /* defcolmap */
  89.  
  90.     FALSE,            /* hardcursor */
  91.     BO_LSBYTFIRST,    /* byteorder */
  92.     {                /* def_font */
  93.         0,                /* fontid */
  94.         { 8, 8, 0, 0,0,0, 0 },         /* real: width, height, style, etc. */
  95.         { 8, 8, 0, 0,0,0, 0 }         /* req:  width, height, style, etc. */
  96.     }
  97. };
  98. /* -------------------------------------------------------------------------- */
  99.  
  100. static boolean DIGPRIV mcga_setinfo(mode)
  101.     int mode;
  102. {
  103.     int i;
  104.  
  105.     /* Set up the device info structure */
  106.     memmove(&pcdata->info, &mcgainfo, sizeof(dispinfo_struct));
  107.     pc_initdispmap(320, 200);
  108.  
  109.     pcdata->info.mode = mode;
  110.  
  111.     /* Set up attrmap */
  112.     pcdata->attrsize = 8;    /* 8 bit attrmap elements */
  113.     pcdata->xattrmap = (byte *) omalloc(OA_DIGATTRMAP, 256 * sizeof(byte));
  114.     if (pcdata->xattrmap == NULL) {
  115.         return(FALSE);
  116.     }
  117.     /* Set up stuff for font plotter */
  118.     pcdata->attrcols = mcga_attrcols;
  119.     pcdata->plotchar = pc_8bitplotchar;
  120.  
  121.     for (i = 0; i < 256; i++) {
  122.         pcdata->attrmap[i]  = (byte) (i & 0x0F);
  123.         pcdata->xattrmap[i] = (byte) (i >> 4);
  124.     }
  125.     pchdata->xmouscale = 2;
  126.     pchdata->ymouscale = 1;
  127.  
  128.     return(TRUE);
  129. }
  130. /* -------------------------------------------------------------------------- */
  131.  
  132. int mcga_dControl(msg, indata, outdata)
  133.     dig_dcmsg msg;
  134.     VOID *indata;
  135.     VOID *outdata;
  136. {
  137.     setattr_struct *pvs;
  138.  
  139.     switch (msg) {
  140.     case DC_SETATTRCOLS:
  141.         pvs = (setattr_struct *)indata;
  142.  
  143.         pcdata->attrmap[pvs->attr]  = ((byte) (pvs->fg));
  144.         pcdata->xattrmap[pvs->attr] = ((byte) (pvs->bg));
  145.         break;
  146.     case DC_GETATTRFG:
  147.         *((opixval *) outdata) = (opixval)
  148.             pcdata->attrmap[*((byte *)indata)];
  149.         break;
  150.     case DC_GETATTRBG:
  151.         *((opixval *) outdata) = (opixval)
  152.             pcdata->xattrmap[*((byte *)indata)];
  153.         break;
  154.     case DC_SETCOLMAP:
  155.         mcga_setcolmap((ocolmap_type) indata);
  156.         break;
  157.     case DC_GETCOLMAP:
  158.         ocolmap_set((ocolmap_type) outdata, pcdata->colmap);
  159.         break;
  160.     default:
  161.         return(pc_dControl(msg, indata, outdata));
  162.     }
  163.     return(TRUE);
  164. }
  165. /* -------------------------------------------------------------------------- */
  166.  
  167. static unsigned DIGPRIV mcga_attrcols(rattr)
  168.     byte rattr;
  169. /*
  170.     Return a word with foreground pixval in the low byte and background
  171.     pixval in the high byte.
  172. */
  173. {
  174.     union {
  175.         struct { byte bot, top; } dblcol;
  176.         unsigned short x;
  177.     } splitcol;
  178.  
  179.     splitcol.dblcol.bot = pcdata->attrmap[rattr];
  180.     splitcol.dblcol.top = pcdata->xattrmap[rattr];
  181.  
  182.     return((unsigned) splitcol.x);
  183. }
  184. /* -------------------------------------------------------------------------- */
  185.  
  186. static void DIGPRIV mcga_setcolmap(cmap)
  187.     ocolmap_type cmap;
  188. {
  189.     OREGS regs;
  190.     byte *rgbarray, *p, *endp;
  191.  
  192.     if (cmap == NULL) {
  193.         return;
  194.     }
  195. /* Write new vals */
  196.     regs.x.ax = 0x1012;            /* int 10h, funtion 10.12: set block of regs */
  197.     regs.x.bx = (int) cmap->firstpix;        /* start */
  198.     regs.x.cx = (int) cmap->nentries;        /* count */
  199.  
  200.     rgbarray = (byte *)ocolmap_entry(cmap, cmap->firstpix);
  201.     endp = rgbarray + cmap->nentries * 3;
  202.     for (p = rgbarray; p < endp; p++) *p = *p >> 2; /* Scale rgb values for bios */
  203.  
  204.     /* put table address in es:dx */
  205.     regs.a.esdx = rgbarray;        /* dest. table address */
  206.     oakint86es(BIOS_VIDINT, ®s, cmap->nentries * 3);
  207.     for (p = rgbarray; p < endp; p++) *p = (*p << 2)+3; /* Un-scale rgb values again */
  208.  
  209.     /* Copy the info into our colmap copy */
  210.     ocolmap_set(pcdata->colmap, cmap);
  211. }
  212. /* -------------------------------------------------------------------------- */
  213.  
  214.