home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l351 / 1.ddi / EXAMPLES / FULLSCRN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-26  |  4.7 KB  |  212 lines

  1. /* 
  2. FULLSCRN.C -- package of routines for direct screen writes
  3. */
  4.  
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <stdarg.h>
  8. #include <string.h>
  9. #include <dos.h>
  10.  
  11. #include <phapi.h>
  12.  
  13. #include "fullscrn.h"
  14.  
  15. typedef void far *FP;
  16.  
  17. #define VIDEO               0x10
  18. #define SCROLL_UP           0x06
  19. #define GET_VIDEO_MODE      0x0F
  20.  
  21. static BYTE far *vid_mem;
  22.  
  23. #define SCR(y,x)            (((y) * 160) + ((x) << 1))
  24.  
  25. int video_mode(void)
  26. {
  27.     int mode;
  28.     _asm mov ah, GET_VIDEO_MODE
  29.     _asm int 10h
  30.     _asm xor ah, ah
  31.     _asm mov mode,ax
  32.     return mode;
  33. }
  34.  
  35. unsigned get_vid_mem(void)
  36. {
  37.     int vmode = video_mode();
  38.     unsigned short vid_seg;
  39.  
  40.     if (vmode == 7)
  41.         vid_seg = 0xB000;
  42.     else if ((vmode == 2) || (vmode == 3))
  43.         vid_seg = 0xB800;
  44.     else
  45.         return 0;
  46.  
  47. #ifdef DOSX286
  48.     {
  49.         unsigned short sel;
  50.         /*
  51.             DosMapRealSeg() takes a real-mode paragraph address and
  52.             a count of bytes, and gives back a selector that can be used
  53.             to address the memory from protected mode. Like all PHAPI
  54.             functions, DosMapRealSeg() returns 0 for success, or a
  55.             non-zero error code. Any returned information (such as the
  56.             selector we're interested in) is returned via parameters.
  57.         */
  58.         if (DosMapRealSeg(vid_seg, (long) 25*80*2, &sel) == 0)
  59.             return sel;
  60.         else
  61.             return 0;
  62.     }
  63. #else
  64.         return vid_seg;
  65. #endif
  66.  
  67. }
  68.  
  69. int video_init(void)
  70. {
  71.     return !! (vid_mem = MAKEP(get_vid_mem(), 0));
  72. }
  73.  
  74. #define MAKEWORD(l, h)  (((unsigned char) (l)) | ((unsigned short) (h)) << 8)
  75.  
  76. /* faster and safer version */
  77. void wrt_str(int y, int x, ATTRIB attr, char *p)
  78. {
  79.     unsigned short far *v = (unsigned short far *)(vid_mem + SCR(y, x));
  80.     int ok = 80 - x;
  81.     while (ok && *p)
  82.     {
  83.         *v++ = (unsigned short) MAKEWORD(*p++, attr);
  84.         ok--;
  85.     }
  86. }
  87.  
  88. static char buf[128] = {0};
  89.  
  90. void wrt_printf(int y, int x, ATTRIB attr, char *fmt, ...)
  91. {
  92.     va_list marker;
  93.     va_start(marker, fmt);
  94.     vsprintf(buf, fmt, marker); 
  95.     va_end(marker);
  96.     wrt_str(y, x, attr, buf);
  97. }
  98.  
  99. void wrt_chr(int y, int x, ATTRIB attr, char c)
  100. {
  101.     BYTE far *v = vid_mem + SCR(y, x);
  102.     *v++ = c;
  103.     *v = (BYTE)attr;
  104. }
  105.  
  106. void set_attr(int starty, int startx, int endy, int endx, ATTRIB attr)
  107. {
  108.     int x, y;
  109.     for (y=starty; y<=endy; y++)
  110.     {
  111.         BYTE far *v = vid_mem + SCR(y, startx);
  112.         for (x=startx; x<=endx; x++)
  113.         {
  114.             v++;
  115.             *v++ = (BYTE)attr;
  116.         }
  117.     }
  118. }
  119.  
  120. void fill(int starty, int startx, int endy, int endx, unsigned char c,
  121.     ATTRIB attr)
  122. {
  123.     BYTE far *v = vid_mem;
  124.     int x, y;
  125.     for (y=starty; y<=endy; y++)
  126.         for (x=startx, v=vid_mem+SCR(y, startx); x<=endx; x++)
  127.         {
  128.             *v++ = c;
  129.             *v++ = (BYTE)attr;
  130.         }
  131. }
  132.  
  133. void clear(int starty, int startx, int endy, int endx, ATTRIB attr)
  134. {
  135.     _asm mov ax, 0600h
  136.     _asm mov bh, byte ptr attr
  137.     _asm mov ch, byte ptr starty
  138.     _asm mov cl, byte ptr startx
  139.     _asm mov dh, byte ptr endy
  140.     _asm mov dl, byte ptr endx
  141.     _asm int 10h
  142. }
  143.  
  144. void cls(void)
  145. {
  146.     clear(0, 0, 24, 79, NORMAL);
  147. }
  148.  
  149. static unsigned char brd[2][6] = {
  150.     179, 196, 218, 191, 192, 217,       /* single box chars */
  151.     186, 205, 201, 187, 200, 188        /* double box chars */
  152.     } ;
  153.  
  154. void border(int starty, int startx, int endy, int endx, ATTRIB attr, int dbl)
  155. {
  156.     BYTE far *v;
  157.     char *b;
  158.     register int i;
  159.     
  160.     b = (char *)brd[(dbl-1) & 1];
  161.     
  162.     for (i=starty+1; i<endy; i++)
  163.     {
  164.         wrt_chr(i, startx, attr, *b);
  165.         wrt_chr(i, endx, attr, *b);
  166.     }
  167.     b++;
  168.     for (i=startx+1, v=vid_mem+SCR(starty, startx+1); i<endx; i++)
  169.     {
  170.         *v++ = *b;
  171.         *v++ = (BYTE)attr;
  172.         /* equivalent to wrt_chr(starty, i, attr, *b); */
  173.     }
  174.     for (i=startx+1, v=vid_mem+SCR(endy, startx+1); i<endx; i++)
  175.     {
  176.         *v++ = *b;
  177.         *v++ = (BYTE)attr;
  178.         /* equivalent to wrt_chr(endy, i, attr, *b); */
  179.     }
  180.     b++;
  181.     wrt_chr(starty, startx, attr, *b++);
  182.     wrt_chr(starty, endx, attr, *b++);
  183.     wrt_chr(endy, startx, attr, *b++);
  184.     wrt_chr(endy, endx, attr, *b);
  185. }
  186.  
  187. void cursor(int on)
  188. {
  189.     static int old_curs = 0;
  190.     if (on && old_curs)
  191.     {
  192.         _asm mov cx, old_curs
  193.         _asm mov ah, 1
  194.         _asm int 10h
  195.     }
  196.     else if (! (on || old_curs))
  197.     {
  198.         _asm mov ah, 3
  199.         _asm mov bh, 0
  200.         _asm int 10h
  201.         _asm mov old_curs, cx
  202.         _asm mov cx, 2000h
  203.         _asm mov ah, 1
  204.         _asm int 10h
  205.     }
  206. }
  207.  
  208. void center(int y, ATTRIB attr, char *s)
  209. {
  210.     wrt_str(y, 40 - (strlen(s) >> 1), attr, s);
  211. }
  212.