home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / grafik / pmod01 / source / video.c < prev   
Encoding:
C/C++ Source or Header  |  1994-03-10  |  4.1 KB  |  183 lines

  1. /****************************************************************************
  2. *
  3. *                          Protected Mode Library
  4. *
  5. *                   Copyright (C) 1994 SciTech Software.
  6. *                            All rights reserved.
  7. *
  8. * Filename:        $RCSfile: video.c $
  9. * Version:        $Revision: 1.1 $
  10. *
  11. * Language:        ANSI C
  12. * Environment:    any
  13. *
  14. * Description:  Test program to check the ability to generate real mode
  15. *               interrupts and to be able to obtain direct access to the
  16. *                video memory from protected mode. Compile and link with
  17. *                the appropriate command line for your DOS extender.
  18. *
  19. *                Functions tested:    PMODE_getBIOSPointer()
  20. *                                    PMODE_mapLinearPointer()
  21. *                                    PMODE_freeLinearPointer()
  22. *                                    PMODE_int86()
  23. *
  24. * $Id: video.c 1.1 1994/03/10 09:05:43 kjb release $
  25. *
  26. ****************************************************************************/
  27.  
  28. #include <stdlib.h>
  29. #include <stdio.h>
  30. #include <conio.h>
  31. #include "pmode.h"
  32.  
  33. /* Pointer to video memory */
  34.  
  35. void *bios = NULL;
  36. unsigned char *video_memory = NULL;
  37.  
  38. /* Routine to return the current video mode number */
  39.  
  40. int getVideoMode(void)
  41. {
  42.     return PMODE_getByte(bios, 0x49);
  43. }
  44.  
  45. /* Routine to set a specified video mode */
  46.  
  47. void setVideoMode(int mode)
  48. {
  49.     RMREGS r;
  50.  
  51.     r.x.ax = mode;
  52.     PMODE_int86(0x10, &r, &r);
  53. }
  54.  
  55. /* Routine to return a pointer to the video memory area */
  56.  
  57. unsigned char *getVideoMemPointer(void)
  58. {
  59.     if (getVideoMode() == 0x7)
  60.         return PMODE_mapLinearPointer(0xB0000, 0xFFFF);
  61.     else return PMODE_mapLinearPointer(0xB8000, 0xFFFF);
  62. }
  63.  
  64. /* Routine to clear a rectangular region on the display by calling the
  65.  * video BIOS.
  66.  */
  67.  
  68. void clear(int startx, int starty, int endx, int endy, unsigned char attr)
  69. {
  70.     RMREGS r;
  71.  
  72.     r.x.ax = 0x0600;
  73.     r.h.bh = attr;
  74.     r.h.cl = startx;
  75.     r.h.ch = starty;
  76.     r.h.dl = endx;
  77.     r.h.dh = endy;
  78.     PMODE_int86(0x10, &r, &r);
  79. }
  80.  
  81. /* Routine to fill a rectangular region on the display using direct
  82.  * video writes.
  83.  */
  84.  
  85. #define SCREEN(x,y)    (video_memory + ((y) * 160) + ((x) << 1))
  86.  
  87. void fill(int startx, int starty, int endx, int endy, unsigned char c,
  88.     unsigned char attr)
  89. {
  90.     unsigned char *v;
  91.     int    x,y;
  92.  
  93.     for (y = starty; y <= endy; y++) {
  94.         v = SCREEN(startx,y);
  95.         for (x = startx; x <= endx; x++) {
  96.             *v++ = c;
  97.             *v++ = attr;
  98.             }
  99.         }
  100. }
  101.  
  102. /* Routine to display a single character using direct video writes */
  103.  
  104. void writeChar(int x, int y, unsigned char c, unsigned char attr)
  105. {
  106.     unsigned char *v = SCREEN(x,y);
  107.     *v++ = c;
  108.     *v = attr;
  109. }
  110.  
  111. /* Routine to draw a border around a rectangular area using direct video
  112.  * writes.
  113.  */
  114.  
  115. static unsigned char border_chars[] = {
  116.     186, 205, 201, 187, 200, 188        /* double box chars */
  117.     };
  118.  
  119. void border(int startx, int starty, int endx, int endy, unsigned char attr)
  120. {
  121.     unsigned char     *v,*b;
  122.     int                i;
  123.  
  124.     b = border_chars;
  125.     
  126.     for (i = starty+1; i < endy; i++) {
  127.         writeChar(startx, i, *b, attr);
  128.         writeChar(endx, i, *b, attr);
  129.         }
  130.     b++;
  131.     for (i = startx+1, v = SCREEN(startx+1, starty); i < endx; i++) {
  132.         *v++ = *b;
  133.         *v++ = attr;
  134.         }
  135.     for (i = startx+1, v = SCREEN(startx+1, endy); i < endx; i++) {
  136.         *v++ = *b;
  137.         *v++ = attr;
  138.         }
  139.     b++;
  140.     writeChar(startx, starty, *b++, attr);
  141.     writeChar(endx, starty, *b++, attr);
  142.     writeChar(startx, endy, *b++, attr);
  143.     writeChar(endx, endy, *b++, attr);
  144. }
  145.  
  146. void main(void)
  147. {
  148.     printf("Program running in ");
  149.     switch (_PMODE_modeType) {
  150.         case PMODE_realMode:
  151.             printf("real mode.\n\n");
  152.             break;
  153.         case PMODE_286:
  154.             printf("16 bit protected mode.\n\n");
  155.             break;
  156.         case PMODE_386:
  157.             printf("32 bit protected mode.\n\n");
  158.             break;
  159.         }
  160.  
  161.     printf("Hit any key to start 80x25 text mode and perform some direct video output.\n");
  162.     getch();
  163.  
  164.     setVideoMode(0x3);
  165.  
  166.     if ((bios = PMODE_getBIOSPointer()) == NULL) {
  167.         printf("Could not obtain pointer to BIOS data area!!\n");
  168.         exit(1);
  169.         }
  170.  
  171.     if ((video_memory = getVideoMemPointer()) == NULL) {
  172.         printf("Could not obtain pointer to video memory!!\n");
  173.         exit(1);
  174.         }
  175.  
  176.     fill(0, 0, 79, 24, 176, 0x1E);
  177.     border(0, 0, 79, 24, 0x1F);
  178.     getch();
  179.     clear(0, 0, 79, 24, 0x7);
  180.  
  181.     PMODE_freeLinearPointer(video_memory);
  182. }
  183.