home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / c / c_tutor / c_1 / mono < prev    next >
Encoding:
Text File  |  1992-11-14  |  2.9 KB  |  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.