home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / VILE327.ZIP / VILE327.TAR / vile3.27 / z309.c < prev   
C/C++ Source or Header  |  1992-12-14  |  8KB  |  375 lines

  1. /*
  2.  * The routines in this file provide support for the Zenith Z-100 PC
  3.  * family.  It goes directly to the graphics RAM to do screen output. 
  4.  * It compiles into nothing if not a Zenith driver.
  5.  *
  6.  * $Log: z309.c,v $
  7.  * Revision 1.3  1992/07/01  17:00:31  foxharp
  8.  * scwrite arg changes
  9.  *
  10.  * Revision 1.2  1991/08/07  12:35:07  pgf
  11.  * added RCS log messages
  12.  *
  13.  * revision 1.1
  14.  * date: 1990/09/21 10:26:29;
  15.  * initial vile RCS revision
  16.  */
  17.  
  18. #define    termdef    1            /* don't define "term" external */
  19.  
  20. #include        <stdio.h>
  21. #include    "estruct.h"
  22. #include        "edef.h"
  23.  
  24. #if     Z309
  25.  
  26. /* set NROW to 25 for 25-line interlaced mode */
  27. #define NROW    50                      /* Screen size.                 */
  28. #define NCOL    80                      /* Edit if you want to.         */
  29. #define    MARGIN    8            /* size of minimim margin and    */
  30. #define    SCRSIZ    64            /* scroll size for extended lines */
  31. #define    NPAUSE    200            /* # times thru update to pause */
  32. #define BEL     0x07                    /* BEL character.               */
  33. #define ESC     0x1B                    /* ESC character.               */
  34. #define    SPACE    32            /* space character        */
  35.  
  36. #define    SCADC    0xb8000000L        /* CGA address of screen RAM    */
  37. #define    SCADM    0xb0000000L        /* MONO address of screen RAM    */
  38.  
  39. #define    CDMONO    0            /* monochrome text card        */
  40. #define    CDCGA50    1            /* 50-line color graphics card    */
  41. #define CDCGI25 2            /* 25-line interlaced CGA text    */
  42. #define CDCGA25 3            /* 25-line color graphics card    */
  43. #define    CDSENSE    9            /* detect the card type        */
  44.  
  45. int dtype = CDCGA50;            /* current display type        */
  46. long scadd;                /* address of screen ram    */
  47. int *scptr[NROW];            /* pointer to screen lines    */
  48. int sline[NCOL];            /* screen line image        */
  49. extern union REGS rg;            /* cpu register for use of DOS calls */
  50.  
  51. extern  int     ttopen();               /* Forward references.          */
  52. extern  int     ttgetc();
  53. extern  int     ttputc();
  54. extern  int     ttflush();
  55. extern  int     ttclose();
  56. extern  int     z309move();
  57. extern  int     z309eeol();
  58. extern  int     z309eeop();
  59. extern  int     z309beep();
  60. extern  int     z309open();
  61. extern    int    z309rev();
  62. extern    int    z309cres();
  63. extern    int    z309close();
  64. extern    int    z309putc();
  65. extern    int    z309kopen();
  66. extern    int    z309kclose();
  67.  
  68. #if    COLOR
  69. extern    int    z309fcol();
  70. extern    int    z309bcol();
  71.  
  72. int    cfcolor = -1;        /* current forground color */
  73. int    cbcolor = -1;        /* current background color */
  74. int    ctrans[] =        /* ansi to z309 color translation table */
  75.     {0, 4, 2, 6, 1, 5, 3, 7};
  76. #endif
  77.  
  78. /*
  79.  * Standard terminal interface dispatch table. Most of the fields point into
  80.  * "termio" code.
  81.  */
  82. TERM    term    = {
  83.     NROW-1,
  84.         NROW-1,
  85.         NCOL,
  86.         NCOL,
  87.     MARGIN,
  88.     SCRSIZ,
  89.     NPAUSE,
  90.         z309open,
  91.         z309close,
  92.     z309kopen,
  93.     z309kclose,
  94.         ttgetc,
  95.     z309putc,
  96.         ttflush,
  97.         z309move,
  98.         z309eeol,
  99.         z309eeop,
  100.         z309beep,
  101.     z309rev,
  102.     z309cres
  103. #if    COLOR
  104.     , z309fcol,
  105.     z309bcol
  106. #endif
  107. };
  108.  
  109. extern union REGS rg;
  110.  
  111. #if    COLOR
  112. z309fcol(color)        /* set the current output color */
  113.  
  114. int color;    /* color to set */
  115.  
  116. {
  117.     cfcolor = ctrans[color];
  118. }
  119.  
  120. z309bcol(color)        /* set the current background color */
  121.  
  122. int color;    /* color to set */
  123.  
  124. {
  125.         cbcolor = ctrans[color];
  126. }
  127. #endif
  128. z309move(row, col)
  129. {
  130.     rg.h.ah = 2;        /* set cursor position function code */
  131.     rg.h.dl = col;
  132.     rg.h.dh = row;
  133.     rg.h.bh = 0;        /* set screen page number */
  134.     int86(0x10, &rg, &rg);
  135. }
  136.  
  137. z309eeol()    /* erase to the end of the line */
  138.  
  139. {
  140.     int attr;    /* attribute byte mask to place in RAM */
  141.     int *lnptr;    /* pointer to the destination line */
  142.     int i;
  143.     int ccol;    /* current column cursor lives */
  144.     int crow;    /*       row    */
  145.  
  146.     /* find the current cursor position */
  147.     rg.h.ah = 3;        /* read cursor position function code */
  148.     rg.h.bh = 0;        /* current video page */
  149.     int86(0x10, &rg, &rg);
  150.     ccol = rg.h.dl;        /* record current column */
  151.     crow = rg.h.dh;        /* and row */
  152.  
  153.     /* build the attribute byte and setup the screen pointer */
  154. #if    COLOR
  155.     if (dtype != CDMONO)
  156.         attr = (((cbcolor & 15) << 4) | (cfcolor & 15)) << 8;
  157.     else
  158.         attr = 0x0700;
  159. #else
  160.     attr = 0x0700;
  161. #endif
  162.     lnptr = &sline[0];
  163.     for (i=0; i < term.t_ncol; i++)
  164.         *lnptr++ = SPACE | attr;
  165.  
  166. #if 0    /* Heath/Zenith builds flicker-less CGAs */
  167.     if (flickcode) {
  168.         /* wait for vertical retrace to be off */
  169.         while ((inp(0x3da) & 8))
  170.             ;
  171.     
  172.         /* and to be back on */
  173.         while ((inp(0x3da) & 8) == 0)
  174.             ;
  175.     }
  176. #endif
  177.  
  178.     /* and send the string out */
  179.     movmem(&sline[0], scptr[crow]+ccol, (term.t_ncol-ccol)*2);
  180.  
  181. }
  182.  
  183. z309putc(ch)    /* put a character at the current position in the
  184.            current colors */
  185.  
  186. int ch;
  187.  
  188. {
  189.     rg.h.ah = 14;        /* write char to screen with current attrs */
  190.     rg.h.al = ch;
  191. #if    COLOR
  192.     if (dtype != CDMONO)
  193.         rg.h.bl = cfcolor;
  194.     else
  195.         rg.h.bl = 0x07;
  196. #else
  197.     rg.h.bl = 0x07;
  198. #endif
  199.     int86(0x10, &rg, &rg);
  200. }
  201.  
  202. z309eeop()
  203. {
  204.     int attr;        /* attribute to fill screen with */
  205.  
  206.     rg.h.ah = 6;        /* scroll page up function code */
  207.     rg.h.al = 0;        /* # lines to scroll (clear it) */
  208.     rg.x.cx = 0;        /* upper left corner of scroll */
  209. /*HERE*/    rg.x.dx = 0x184f;    /* lower right corner of scroll */
  210. #if    COLOR
  211.     if (dtype != CDMONO)
  212.         attr = ((ctrans[gbcolor] & 15) << 4) | (ctrans[gfcolor] & 15);
  213.     else
  214.         attr = 0;
  215. #else
  216.     attr = 0;
  217. #endif
  218.     rg.h.bh = attr;
  219.     int86(0x10, &rg, &rg);
  220. }
  221.  
  222. z309rev(state)        /* change reverse video state */
  223.  
  224. int state;    /* TRUE = reverse, FALSE = normal */
  225.  
  226. {
  227.     /* This never gets used under the z309-PC driver */
  228. }
  229.  
  230. z309cres(res)    /* change screen resolution */
  231.  
  232. char *res;    /* resolution to change to */
  233.  
  234. {
  235.     if (strcmp(res, "CGA50") == 0) {
  236.         scinit(CDCGA50);
  237.         return(TRUE);
  238.     } else if (strcmp(res, "MONO") == 0) {
  239.         scinit(CDMONO);
  240.         return(TRUE);
  241.     } else
  242.         return(FALSE);
  243. }
  244.  
  245. z309beep()
  246. {
  247. #if    MWC86
  248.     putcnb(BEL);
  249. #else
  250.     bdos(6, BEL, 0);
  251. #endif
  252. }
  253.  
  254. z309open()
  255. {
  256.     scinit(CDSENSE);
  257.     revexist = TRUE;
  258.         ttopen();
  259. }
  260.  
  261. z309close()
  262.  
  263. {
  264.     rg.h.ah = 101;
  265.     rg.h.al = 1;    /* 25-line interlace mode */
  266.     int86(0x10, &rg, &rg); 
  267. #if    COLOR
  268.     z309fcol(7);
  269.     z309bcol(0);
  270. #endif
  271.     ttclose();
  272. }
  273.  
  274. z309kopen()    /* open the keyboard */
  275.  
  276. {
  277. }
  278.  
  279. z309kclose()    /* close the keyboard */
  280.  
  281. {
  282. }
  283.  
  284. scinit(type)    /* initialize the screen head pointers */
  285.  
  286. int type;    /* type of adapter to init for */
  287.  
  288. {
  289.     union {
  290.         long laddr;    /* long form of address */
  291.         int *paddr;    /* pointer form of address */
  292.     } addr;
  293.     int i;
  294.  
  295.     /* if asked...find out what display is connected */
  296.     int86(0x11, &rg, &rg);
  297.     dtype = CDCGA50;
  298.     scadd = SCADC;
  299.     strcpy(sres, "CGA50");
  300.     if ((((rg.x.ax >> 4) & 11) == 3) || type == CDMONO) {
  301.         strcpy(sres, "MONO");
  302.         dtype = CDMONO;
  303.         scadd = SCADM;
  304.     }
  305.     else {
  306.         rg.h.ah = 101;
  307. /* set al = 1 for 25-line interlace mode */        
  308.         rg.h.al = 2;    /* 50-line interlace mode */
  309.         int86(0x10, &rg, &rg); 
  310.     }
  311.  
  312.     /* initialize the screen pointer array */
  313.     for (i = 0; i < NROW; i++) {
  314.         addr.laddr = scadd + (long)(NCOL * i * 2);
  315.         scptr[i] = addr.paddr;
  316.     }
  317. }
  318.  
  319. scwrite(row, col, nchar, outstr, forg, bacg)    /* write a line out*/
  320.  
  321. int row, col, nchar;    /* row,col of screen to place nchars of outstr on */
  322. char *outstr;    /* string to write out (must be term.t_ncol long) */
  323. int forg;    /* forground color of string to write */
  324. int bacg;    /* background color */
  325.  
  326. {
  327.     int attr;    /* attribute byte mask to place in RAM */
  328.     int *lnptr;    /* pointer to the destination line */
  329.     int i;
  330.  
  331.     /* build the attribute byte and setup the screen pointer */
  332. #if    COLOR
  333.     if (dtype != CDMONO)
  334.         attr = (((ctrans[bacg] & 15) << 4) | (ctrans[forg] & 15)) << 8;
  335.     else
  336.         attr = (((bacg & 15) << 4) | (forg & 15)) << 8;
  337. #else
  338.     attr = (((bacg & 15) << 4) | (forg & 15)) << 8;
  339. #endif
  340.     lnptr = &sline[0];
  341.     for (i=0; i<nchar; i++)
  342.         *lnptr++ = (outstr[i] & 255) | attr;
  343.  
  344. #if 0    /* Heath/Zenith builds flicker-less CGAs */
  345.     if (flickcode) {
  346.         /* wait for vertical retrace to be off */
  347.         while ((inp(0x3da) & 8))
  348.             ;
  349.     
  350.         /* and to be back on */
  351.         while ((inp(0x3da) & 8) == 0)
  352.             ;
  353.     }
  354. #endif    
  355.  
  356.     /* and send the string out */
  357.     movmem(&sline[0], scptr[row]+col,term.t_ncol*2);
  358. }
  359.  
  360. #if    FLABEL
  361. fnclabel(f, n)        /* label a function key */
  362.  
  363. int f,n;    /* default flag, numeric argument [unused] */
  364.  
  365. {
  366.     /* on machines with no function keys...don't bother */
  367.     return(TRUE);
  368. }
  369. #endif
  370. #else
  371. z309hello()
  372. {
  373. }
  374. #endif
  375.