home *** CD-ROM | disk | FTP | other *** search
/ World of Graphics / WOGRAPH.BIN / 442.TEST16M.C < prev    next >
C/C++ Source or Header  |  1993-03-07  |  8KB  |  331 lines

  1. /****************************************************************************
  2. *
  3. *                           SuperVGA Test Library
  4. *
  5. *                   Copyright (C) 1993 Kendall Bennett.
  6. *                            All rights reserved.
  7. *
  8. * Filename:        $RCSfile: test16m.c $
  9. * Version:        $Revision: 1.2 $
  10. *
  11. * Language:        ANSI C
  12. * Environment:    IBM PC (MSDOS)
  13. *
  14. * Description:    Simple program to test the operation of the SuperVGA
  15. *                bank switching code and page flipping code for the
  16. *                16 million color SuperVGA video modes.
  17. *
  18. *                MUST be compiled in the large model.
  19. *
  20. * $Id: test16m.c 1.2 1993/03/07 04:06:11 kjb Exp $
  21. *
  22. * Revision History:
  23. * -----------------
  24. *
  25. * $Log: test16m.c $
  26. * Revision 1.2  1993/03/07  04:06:11  kjb
  27. * Bug fixes.
  28. *
  29. * Revision 1.1  1993/03/03  10:30:34  kjb
  30. * Initial revision
  31. *
  32. ****************************************************************************/
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #include <dos.h>
  38. #include <conio.h>
  39. #include "svga16m.h"
  40.  
  41. /*---------------------------- Global Variables ---------------------------*/
  42.  
  43. int        x,y;
  44. uint    maxcolor = 0x7FFF,defcolor = 0x7FFF;
  45. int        driver = grDETECT,chipID,memory,dac,mode;
  46.  
  47. extern char *version;
  48.  
  49. void parseArguments(int argc,char *argv[]);
  50.  
  51. /*----------------------------- Implementation ----------------------------*/
  52.  
  53. void writeText(int x,int y,uchar *str)
  54. /****************************************************************************
  55. *
  56. * Function:        writeText
  57. * Parameters:    x,y        - Position to begin drawing string at
  58. *                str        - String to draw
  59. *
  60. * Description:    Draws a string using the BIOS 8x16 video font by plotting
  61. *                each pixel in the characters individually. This should
  62. *                work for all video modes.
  63. *
  64. ****************************************************************************/
  65. {
  66.     uchar            byte;
  67.     int                i,j,k,length,ch;
  68.     uchar            far *_font;
  69.     struct REGPACK    regs;
  70.  
  71.     regs.r_ax = 0x1130;
  72.     regs.r_bx = 0x0600;
  73.     intr(0x10,®s);
  74.     _font = FP(regs.r_es,regs.r_bp);
  75.  
  76.     length = strlen(str);
  77.     for (k = 0; k < length; k++) {
  78.         ch = str[k];
  79.         for (j = 0; j < 16; j++) {
  80.             byte = *(_font + ch * 16 + j);
  81.             for (i = 0; i < 8; i++) {
  82.                 if ((byte & 0x80) != 0)
  83.                     putPixel(x+i,y+j,defcolor);
  84.                 byte <<= 1;
  85.                 }
  86.             }
  87.         x += 8;
  88.         }
  89. }
  90.  
  91. ulong rgbColor(uint r,uint g,uint b)
  92. /****************************************************************************
  93. *
  94. * Function:        rgbColor
  95. *
  96. * Returns:        Value representing the color. The value is converted from
  97. *                24 bit RGB space into the appropriate color for the
  98. *                video mode.
  99. *
  100. ****************************************************************************/
  101. {
  102.     return ((long)r << 16) | ((long)g << 8) | b;
  103. }
  104.  
  105. void moireTest(void)
  106. /****************************************************************************
  107. *
  108. * Function:        moireTest
  109. *
  110. * Description:    Draws a simple Moire pattern on the display screen using
  111. *                lines, and waits for a key press.
  112. *
  113. ****************************************************************************/
  114. {
  115.     uchar    buf[80];
  116.     int        i;
  117.     uint    value;
  118.  
  119.     clear();
  120.     for (i = 0; i < maxx; i++) {
  121.         line(maxx/2,maxy/2,i,0,rgbColor(((i*255L)/maxx),0,0));
  122.         line(maxx/2,maxy/2,i,maxy,rgbColor(0,((i*255L)/maxx),0));
  123.         }
  124.     for (i = 0; i < maxy; i++) {
  125.         value = (i*255L)/maxy;
  126.         line(maxx/2,maxy/2,0,i,rgbColor(value,0,255 - value));
  127.         line(maxx/2,maxy/2,maxx,i,rgbColor(0,255 - value,value));
  128.         }
  129.  
  130.     if (maxx != 319) {
  131.         x = 80;
  132.         y = 80;
  133.         writeText(x,y,"Bank switching test");    y += 32;
  134.         sprintf(buf,"Video mode: %s",MGL_modeName(mode));
  135.         writeText(x,y,buf);    y += 16;
  136.         sprintf(buf,"Maximum x: %d, Maximum y: %d, BytesPerLine %d, Pages: %d",
  137.             maxx,maxy,bytesperline,maxpage+1);
  138.         writeText(x,y,buf);    y += 32;
  139.         writeText(x,y,"You should see a colorful Moire pattern on the screen");
  140.         y += 16;
  141.         }
  142.     else {
  143.         x = 40;
  144.         y = 40;
  145.         }
  146.     writeText(x,y,"Press any key to continue");
  147.     y += 32;
  148.     getch();
  149. }
  150.  
  151. void pageFlipTest(void)
  152. /****************************************************************************
  153. *
  154. * Function:        pageFlipTest
  155. *
  156. * Description:    Animates a line on the display using page flipping if
  157. *                page flipping is active.
  158. *
  159. ****************************************************************************/
  160. {
  161.     int        i,j,istep,jstep,apage,vpage;
  162.     char    buf[80];
  163.     long    color;
  164.  
  165.     if (maxpage != 0) {
  166.         vpage = 0;
  167.         apage = 1;
  168.         setActivePage(apage);
  169.         setVisualPage(vpage);
  170.         i = 0;
  171.         j = maxy;
  172.         istep = 2;
  173.         jstep = -2;
  174.         color = 0x00FFFFFF;
  175.         while (!kbhit()) {
  176.             setActivePage(apage);
  177.             clear();
  178.             sprintf(buf,"Page %d of %d", vpage+1, maxpage+1);
  179.             if (maxx == 319) {
  180.                 writeText(0,80,"Page flipping - should be no flicker");
  181.                 writeText(0,100,buf);
  182.                 }
  183.             else {
  184.                 writeText(80,80,"Page flipping - should be no flicker");
  185.                 writeText(80,100,buf);
  186.                 }
  187.             line(i,0,maxx-i,maxy,color);
  188.             line(0,maxy-j,maxx,j,color);
  189.             vpage = ++vpage % (maxpage+1);
  190.             setVisualPage(vpage);
  191.             apage = ++apage % (maxpage+1);
  192.             i += istep;
  193.             if (i > maxx) {
  194.                 i = maxx-2;
  195.                 istep = -2;
  196.                 }
  197.             if (i < 0)    i = istep = 2;
  198.             j += jstep;
  199.             if (j > maxy) {
  200.                 j = maxy-2;
  201.                 jstep = -2;
  202.                 }
  203.             if (j < 0)    j = jstep = 2;
  204.             }
  205.         getch();                /* Swallow keypress */
  206.         }
  207. }
  208.  
  209. void testingComplete(void)
  210. /****************************************************************************
  211. *
  212. * Function:        testingComplete
  213. *
  214. * Description:    Clears the first display page and puts up a message.
  215. *
  216. ****************************************************************************/
  217. {
  218.     setActivePage(0);
  219.     setVisualPage(0);
  220.     clear();
  221.  
  222.     if (maxx == 319) {
  223.         writeText(0,40,"Testing complete");
  224.         writeText(0,60,"press any key to return to text mode");
  225.         }
  226.     else
  227.         writeText(80,80,"Testing complete - press any key to return to text mode");
  228.     getch();
  229. }
  230.  
  231. void main(int argc,char *argv[])
  232. {
  233.     int        i,choice,maxmenu,result;
  234.     int        menu[20];
  235.     char    buf[80];
  236.  
  237.     parseArguments(argc,argv);
  238.     initSuperVGA(&driver,&chipID,&memory,&dac);
  239.  
  240.     i = 0;
  241.     mode = -1;
  242.     while (modeList[i] != -1) {
  243.         switch(modeList[i]) {
  244.             case grSVGA_320x200x16m:
  245.             case grSVGA_640x350x16m:
  246.             case grSVGA_640x400x16m:
  247.             case grSVGA_640x480x16m:
  248.             case grSVGA_800x600x16m:
  249.             case grSVGA_1024x768x16m:
  250.             case grSVGA_1280x1024x16m:
  251.                 mode = modeList[i];        /* Found a valid mode    */
  252.                 break;
  253.             }
  254.         if (mode != -1)
  255.             break;
  256.         i++;
  257.         }
  258.     if (mode == -1) {
  259.         printf("\n\nNo available video modes\n");
  260.         exit(1);
  261.         }
  262.  
  263.     while (true) {
  264.         clrscr();
  265.         printf("16 million color SuperVGA Test Program (Version %s)\n\n",
  266.             version);
  267.         printf("Video Card: %s ",MGL_driverName(driver));
  268.         if (driver > grSVGA && MGL_chipsetName(driver,chipID))
  269.             printf("(%s)",MGL_chipsetName(driver,chipID));
  270.         printf("\n");
  271.         printf("Memory:     %dk\n",memory);
  272.         printf("Video DAC:  %s\n",MGL_dacName(dac));
  273.         printf("\n");
  274.         printf("Separate read/write banks: %s\n", twobanks ? "Yes" : "No");
  275.         printf("Extended page flipping:    %s\n", extendedflipping ? "Yes" : "No");
  276.         printf("\n");
  277.         printf("Which video mode to test:\n\n");
  278.  
  279.         i = maxmenu = 0;
  280.         while (modeList[i] != -1) {
  281.             /* Filter out the SuperVGA 16 million color video modes */
  282.  
  283.             switch (modeList[i]) {
  284.                 case grSVGA_320x200x16m:
  285.                 case grSVGA_640x350x16m:
  286.                 case grSVGA_640x400x16m:
  287.                 case grSVGA_640x480x16m:
  288.                 case grSVGA_800x600x16m:
  289.                 case grSVGA_1024x768x16m:
  290.                 case grSVGA_1280x1024x16m:
  291.                     printf("    [%2d] - %s (%d page)\n",maxmenu,
  292.                         MGL_modeName(modeList[i]),
  293.                         MGL_availablePages(driver,memory,modeList[i]));
  294.                     menu[maxmenu++] = modeList[i];
  295.                     break;
  296.                 }
  297.             i++;
  298.             }
  299.         printf("    [ Q] - Quit\n\n");
  300.         printf("Choice: ");
  301.  
  302.         gets(buf);
  303.         if (buf[0] == 'q' || buf[0] == 'Q')
  304.             break;
  305.  
  306.         choice = atoi(buf);
  307.         if (0 <= choice && choice < maxmenu) {
  308.             result = setSuperVGAMode(mode = menu[choice]);
  309.             if (result == -1) {
  310.                 printf("\n");
  311.                 printf("ERROR: Invalid video mode for driver!\n");
  312.                 printf("       Please report this discrepancy...\n");
  313.                 exit(1);
  314.                 }
  315.             if (!result) {
  316.                 printf("\n");
  317.                 printf("ERROR: Video mode did not set correctly!\n");
  318.                 printf("       Please report this discrepancy...\n");
  319.                 printf("\nPress any key to continue...\n");
  320.                 getch();
  321.                 }
  322.             else {
  323.                 moireTest();
  324.                 pageFlipTest();
  325.                 testingComplete();
  326.                 restoreMode();
  327.                 }
  328.             }
  329.         }
  330. }
  331.