home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prof_c / 12sbuf / sb_show.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  2.3 KB  |  98 lines

  1. /*
  2.  *    sb_show -- copy the screen buffer to display memory
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <dos.h>
  7. #include <memory.h>
  8. #include <local\sbuf.h>
  9. #include <local\video.h>
  10.  
  11. #define    MDA_SEG    0xB000
  12. #define    CGA_SEG    0xB800
  13. #define NBYTES    (2 * SB_COLS)
  14.  
  15. /* macro to synchronize with vertical retrace period */
  16. #define VSTAT    0x3DA
  17. #define VRBIT    8
  18. #define VSYNC    while ((inp(VSTAT) & VRBIT) == VRBIT); \
  19.         while ((inp(VSTAT) & VRBIT) != VRBIT)
  20.  
  21. extern struct BUFFER Sbuf;
  22. extern union CELL Scrnbuf[SB_ROWS][SB_COLS];
  23.  
  24. int
  25. sb_show(pg)
  26. short pg;
  27. {
  28.     register short r, c;
  29.     short n;
  30.     short count, ncols;
  31.     unsigned int src_os, dest_os;
  32.     struct SREGS segregs;
  33.  
  34.     if ((Sbuf.flags & SB_DIRECT) == SB_DIRECT) {
  35.         /* use the direct-screen interface */
  36.         segread(&segregs);
  37.  
  38.         /* determine extent of changes */
  39.         n = 0;
  40.         for (r = 0; r < SB_ROWS; ++r)
  41.             if (Sbuf.lcol[r] <= Sbuf.rcol[r])
  42.                 ++n;
  43.         src_os = dest_os = 0;
  44.         if (n <= 2)
  45.             /* copy only rows that contain changes */
  46.             for (r = 0; r < SB_ROWS; ++r) {
  47.                 if (Sbuf.lcol[r] <= Sbuf.rcol[r]) {
  48.                     /* copy blocks during vertical retrace */
  49.                     VSYNC;
  50.                     movedata(segregs.ds,
  51.                         (unsigned)&Scrnbuf[0][0] + src_os,
  52.                         CGA_SEG, dest_os, NBYTES);
  53.                     Sbuf.lcol[r] = SB_COLS;
  54.                     Sbuf.rcol[r] = 0;
  55.                 }
  56.                 src_os += SB_COLS;
  57.                 dest_os += NBYTES;
  58.             }
  59.         else {
  60.             /* copy the entire buffer */
  61.             count = 3 * NBYTES;
  62.             ncols = 3 * SB_COLS;
  63.             for (r = 0; r < SB_ROWS - 1; r += 3) {
  64.                 VSYNC;
  65.                 movedata(segregs.ds, (unsigned)&Scrnbuf[0][0]
  66.                     + src_os, CGA_SEG, dest_os, count);
  67.                 src_os += ncols;
  68.                 dest_os += count;
  69.             }
  70.             VSYNC;
  71.             movedata(segregs.ds, (unsigned)&Scrnbuf[0][0] + src_os,
  72.                 CGA_SEG, dest_os, NBYTES);
  73.             for (r = 0; r < SB_ROWS; ++r) {
  74.                 Sbuf.lcol[r] = SB_COLS;
  75.                 Sbuf.rcol[r] = 0;
  76.             }
  77.         }
  78.     }
  79.     else
  80.         /* use the BIOS video interface */
  81.         for (r = 0; r < SB_ROWS; ++r)
  82.             /* copy only changed portions of lines */
  83.             if (Sbuf.lcol[r] < SB_COLS && Sbuf.rcol[r] > 0) {
  84.                 for (c = Sbuf.lcol[r]; c <= Sbuf.rcol[r]; ++c) {
  85.                     putcur(r, c, pg);
  86.                     writeca(Scrnbuf[r][c].b.ch,
  87.                         Scrnbuf[r][c].b.attr, 1, pg);
  88.                 }
  89.                 Sbuf.lcol[r] = SB_COLS;
  90.                 Sbuf.rcol[r] = 0;
  91.             }
  92.  
  93.     /* the display now matches the buffer -- clear flag bit */
  94.     Sbuf.flags &= ~SB_DELTA;
  95.  
  96.     return SB_OK;
  97. }
  98.