home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 201_01 / mono.c < prev    next >
Text File  |  1979-12-31  |  2KB  |  151 lines

  1. /*
  2.  *    monochrome device driver
  3.  */
  4.  
  5. #include "driver.h"
  6.  
  7. #define    VidSeg    0xB0000000    /*  addr of monochrome video RAM    */
  8. #define    Attr    0x0700        /*  video attribute mask        */
  9. #define    Blank    (Attr + ' ')    /*  a blank                */
  10.  
  11. char    row,            /*  current row number            */
  12.     col;            /*  current column number        */
  13.  
  14. long    VidAddr;        /*  -> current display character    */
  15.  
  16.  
  17. Init()
  18.     {
  19.     cls();
  20.  
  21.     ((InitParms *)&ReqHdr)->EndAddr = EndAddr();
  22.     ReqHdr.Status = Done;
  23.     }
  24.  
  25.  
  26. Output()
  27.     {
  28.     InOutParms    *iop;    /*  our pointer        */
  29.     long        ta;    /*  -> transfer addr    */
  30.     int        ctr;    /*  byte count        */
  31.     char        c;
  32.  
  33.     iop = (InOutParms *)&ReqHdr;
  34.     ta = iop->Transfer;
  35.     ctr = iop->Count;
  36.  
  37.     while (ctr--)
  38.         switch (c = PeekB(ta))
  39.             {
  40.             case '\r' :
  41.                 doCR();
  42.                 break;
  43.  
  44.             case '\n' :
  45.                 doLF();
  46.                 break;
  47.  
  48.             case '\b' :
  49.                 doBS();
  50.                 break;
  51.  
  52.             case '\t' :
  53.                 doHT();
  54.                 break;
  55.  
  56.             case 0x1A :
  57.                 cls();
  58.                 break;
  59.  
  60.             default :
  61.                 putone(c);
  62.                 break;
  63.             }
  64.  
  65.     ReqHdr.Status = Done;
  66.     }
  67.  
  68.  
  69. OutVerify()
  70.     {
  71.     Output();
  72.     }
  73.  
  74.  
  75. OutStatus()
  76.     {
  77.     ReqHdr.Status = Done;
  78.     }
  79.  
  80.  
  81. OutFlush()
  82.     {
  83.     ReqHdr.Status = Done;
  84.     }
  85.  
  86.  
  87. static cls()
  88.     {
  89.     SetW(VidSeg, 2000, Blank);    /*  clear the screen  */
  90.  
  91.     row = col = 0;
  92.     VidAddr = VidSeg;
  93.     }
  94.  
  95.  
  96. static ScrollUp()
  97.     {
  98.     CopyW(VidSeg + 160, VidSeg, 1920);    /*  move up  */
  99.  
  100.     SetW(VidSeg + 3840, 80, Blank);        /*  clear last line  */
  101.  
  102.     VidAddr -= 160;
  103.     row = 24;
  104.     }
  105.  
  106.  
  107. static doCR()
  108.     {
  109.     VidAddr -= (col << 1);
  110.     col = 0;
  111.     }
  112.  
  113.  
  114. static doLF()
  115.     {
  116.     VidAddr += 160;
  117.     if (++row > 24)
  118.         ScrollUp();
  119.     }
  120.  
  121.  
  122. static doBS()
  123.     {
  124.     if (col)
  125.         {
  126.         --col;
  127.         VidAddr -= 2;
  128.         }
  129.     }
  130.  
  131.  
  132. static doHT()
  133.     {
  134.     while (col & 7)
  135.         putone(' ');
  136.     }
  137.  
  138.  
  139. static putone(c)
  140.     char    c;
  141.     {
  142.     PokeW(Attr + c, VidAddr);
  143.     VidAddr += 2;
  144.  
  145.     if (++col > 79)
  146.         {
  147.         col = 0;
  148.         doLF();
  149.         }
  150.     }
  151.