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

  1. /*
  2.     pcdisp.c
  3.  
  4.     % PC device interface display functions common to all modes.
  5.  
  6.     4/24/89  by Ted.
  7.  
  8.     OWL 1.1
  9.     Copyright (c) 1989 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      4/26/89 ted    Moved attrmap out of info struct into pcdata.
  15.      8/01/89 ted    Moved pc_init/restoremode from pcmode.c.
  16. */
  17.  
  18. #include "pcpriv.h"
  19.  
  20. OSTATIC void DIGPRIV pc_restoremode(_arg1(void));
  21. /* -------------------------------------------------------------------------- */
  22.  
  23. int pc_dControl(msg, indata, outdata)
  24.     dig_dcmsg msg;
  25.     VOID *indata;
  26.     VOID *outdata;
  27. {
  28.     setattr_struct *pvs;
  29.     ptarg_struct *pta;
  30.     OREGS regs;
  31.  
  32.     switch (msg) {
  33.     case DC_GETINFO:
  34.         *((dispinfo_struct **)(outdata)) = &pcdata->info;
  35.         break;
  36.     case DC_INITMODE:
  37.         pc_initmode();
  38.         break;
  39.     case DC_RESTOREMODE:
  40.         pc_restoremode();
  41.         break;
  42.     case DC_SETATTRCOLS:
  43.         pvs = (setattr_struct *)indata;
  44.  
  45.         pcdata->attrmap[pvs->attr] =  ((byte) (pvs->fg)) & 0x0F;
  46.         pcdata->attrmap[pvs->attr] |= ((byte) (pvs->bg)) << 4;
  47.         break;
  48.     case DC_GETATTRFG:
  49.         *((opixval *) outdata) = (opixval)
  50.             (pcdata->attrmap[*((byte *)indata)] & 0x0F);
  51.         break;
  52.     case DC_GETATTRBG:
  53.         *((opixval *) outdata) = (opixval)
  54.             (pcdata->attrmap[*((byte *)indata)] >> 4);
  55.         break;
  56.     case DC_SETCOLMAP:
  57.     case DC_GETCOLMAP:
  58.     case DC_CLAIMCOLOR:
  59.     case DC_RELEASECOLOR:
  60.         break;
  61.     case DC_OPENFONT:
  62.           memmove((VOID *)(ofont_type)outdata, (VOID *)&pcdata->info.def_font,
  63.                 sizeof(struct ofont_struct));
  64.           memmove((VOID *)(&((ofont_type)outdata)->req), (VOID *)indata,
  65.                 sizeof(fontreq_struct));
  66.         break;
  67.     case DC_READCHARATTR:
  68.         pta = (ptarg_struct *)indata;
  69.         memset(pta->charbuf, ' ',  pta->slen);
  70.         memset(pta->attrbuf, 0x07, pta->slen);
  71.         break;
  72.     case DC_CACHE:
  73.         if (pchdata->ismouse) {
  74.             regs.x.ax = BMOU_HIDE;
  75.             oakint86(BIOS_MOUSEINT, ®s);
  76.         }
  77.         break;
  78.     case DC_FLUSH:
  79.         if (pchdata->ismouse) {
  80.             regs.x.ax = BMOU_SHOW;
  81.             oakint86(BIOS_MOUSEINT, ®s);
  82.         }
  83.         break;
  84.     }
  85.     return(TRUE);
  86. }
  87. /* -------------------------------------------------------------------------- */
  88.  
  89. unsigned short DIGPRIV pc_wordcolor(color)
  90.     opixval color;
  91. /*
  92.     Return a 16 bit value which can be repeated to clear a region to the
  93.     given color. (Only used for one-plane pixmaps.)
  94. */
  95. {
  96.     unsigned short colword;
  97.     struct { byte bot, top; } dblcol;
  98.     static unsigned short cols4[4] = { 0x0000, 0x5555, 0xAAAA, 0xFFFF };
  99.  
  100.     switch (pc_pixbits()) {
  101.     case 16:    /* text mode */
  102.         dblcol.bot = ' ';
  103.         /* put color val in bgcolor slot, and invert it for fgcolor slot */
  104.         dblcol.top = (byte)color & 0x07;
  105.         dblcol.top = (dblcol.top ^ 0x07) | (dblcol.top << 4);
  106.         return(*((unsigned short *)&dblcol));
  107.     case 2:
  108.         colword = cols4[(byte)color & 0x03];
  109.         return(colword);
  110.     case 1:
  111.         if (pc_nplanes() <= 1) {    /* one-plane / 2-color display mode */
  112.             if ((byte)color & 1) {
  113.                 colword = 0xFFFF;
  114.             }
  115.             else {
  116.                 colword = 0x0000;
  117.             }
  118.             return(colword);
  119.         }
  120.         /* else no break; EGA/VGA clear requires the real color to write thru */
  121.     default:
  122.     case 8:
  123.         dblcol.bot = (byte)color;
  124.         dblcol.top = dblcol.bot;
  125.         return(*((unsigned short *)&dblcol));
  126.     }
  127. }
  128. /* -------------------------------------------------------------------------- */
  129.  
  130. void DIGPRIV pc_bgetcursorpos(rowp, colp)
  131.     int *rowp;
  132.     int *colp;
  133. {
  134.     OREGS regs;
  135.     
  136.     regs.h.ah = VIDINT_GETC;
  137.     regs.h.bh = TEXT_RPAGE;
  138.     oakint86(BIOS_VIDINT, ®s);
  139.  
  140.     *colp = (int)regs.h.dl;        /* get global cursor col */
  141.     *rowp = (int)regs.h.dh;        /* get global cursor row */
  142. }
  143. /* -------------------------------------------------------------------------- */
  144.  
  145. unsigned pc_dDummy()
  146. {
  147.     return(0);
  148. }
  149. /* -------------------------------------------------------------------------- */
  150.  
  151. void DIGPRIV pc_initmode()
  152. /*
  153.     Init the display video mode.
  154. */
  155. {
  156.     if (pcdata->oldmode != pcdata->info.mode) {
  157.         pc_SetMode(pcdata->info.mode);
  158.     }
  159.     /* Make sure cursor gets turned off if necessary */
  160.     switch (pcdata->info.mode) {
  161.     case 0x00:
  162.     case 0x01:
  163.     case 0x02:
  164.     case 0x03:
  165.     case 0x07:
  166.     case PCMODE_EGA43:
  167.     case PCMODE_VGA50:
  168.         pcdata->curctype = CURSOR_NONE;
  169.         pc_bsetcursortype(CURSOR_NONE, pcdata->fontlines);
  170.         break;
  171.     }
  172. }
  173. /* -------------------------------------------------------------------------- */
  174.  
  175. static void DIGPRIV pc_restoremode()
  176. {
  177.     if (pcdata->oldmode != pcdata->info.mode) {
  178.         pc_SetMode(pcdata->oldmode);
  179.         pc_bsetcursorpos(0, 0);
  180.     }
  181.     else {    /* If not changing modes or clearing screen, restore cursor pos */
  182.         pc_bsetcursorpos(pcdata->oldcursx, pcdata->oldcursy);
  183.     }
  184.     switch (pcdata->oldmode) {
  185.     case 0x00:
  186.     case 0x01:
  187.     case 0x02:
  188.     case 0x03:
  189.     case 0x07:
  190.     case PCMODE_EGA43:
  191.     case PCMODE_VGA50:
  192.         pc_bsetcursortype(CURSOR_NORMAL,
  193.                             (opcoord)((pcdata->oldmode == 0x07) ? 14 : 8));
  194.         break;
  195.     }
  196. }
  197. /* -------------------------------------------------------------------------- */
  198.  
  199.