home *** CD-ROM | disk | FTP | other *** search
/ World of Graphics / WOGRAPH.BIN / 439.TEST16.C < prev    next >
C/C++ Source or Header  |  1993-03-07  |  9KB  |  329 lines

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