home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 January / pcwk_01_1999.iso / Tajnepp / MCLK093 / MCLK.CPP < prev    next >
C/C++ Source or Header  |  1997-05-04  |  6KB  |  190 lines

  1. /*    mclk.cpp                            v0.90ß        07/28/96
  2.  *
  3.  *    1)    the chips.lib, which acts as an interface to the actual chip-
  4.  *        registers...
  5.  *
  6.  *        The first call in the program is to _detect(), which returns a
  7.  *        pointer to a structure called "vga" (which is actually "cirrus"
  8.  *        or "s3", depending on what my _detect() routine finds.
  9.  *
  10.  *    2)    this program...which acts like a front-end (user-interface)
  11.  *        so we've got a command-line interface, sorry it's still a bit
  12.  *        rough around the edges
  13.  *
  14.  *    Notes... compiled with Turbo C++ 3 (DOS), LARGE memory model,
  15.  *    ...you must DISABLE <debug info in .OBJ>, if you recompile
  16.  *        (it's under Options -> Compiler -> Advanced Code Generation
  17.  *
  18.  *    v0.82 - added multiple command parsing, a "/X" command denotes the
  19.  *        function to activate, while the following non-slashed parameters
  20.  *        (eg. MCLK /X y z) are passed on the selectd MCLK function.
  21.  *
  22.  *    v0.83 - added _info readout, so ::_info only returns information about
  23.  *        installed RAM (EDO/burst/1-cycle), with S3-86x/96x/Trio chipsets
  24.  *
  25.  *    v0.85 - modified program-code to use C++ streams instead of <stdio.h>
  26.  *        still have some more routines to clean-up.
  27.  *        added '/F' option to (f)orce user (override auto-detection)
  28.  *
  29.  *    07/28 Removed some unused (sloppy) code
  30.  *
  31.  *    If used, "/F" must be the FIRST command-line parameter...
  32.  */
  33.  
  34.  
  35. #define DEBUG    0
  36. #define PARAM_SIZE    30
  37.  
  38. #include "vga.h"
  39. #include <iostream.h>
  40. #include <stdlib.h>
  41. #include <stdio.h>
  42.  
  43. extern int _argc;        //    Command-line parameters
  44. extern char **_argv;
  45.  
  46.  
  47. void
  48. main( void )
  49. {
  50.     vga_info chipset;    //    Temp var for holding vga chipsetID
  51.     detect *find_vga = new detect;    //    Finds vga-card
  52.     message msg;        //    Another temp var for holding text messages
  53.     int i, op, switches = 0;    //    Stratch integers
  54.         //    "switches" = # of NON-parameter related arguments
  55.     int n, copied, index;    //    temp Return variable for sscanf
  56.     char *param[ PARAM_SIZE ];    //    Parameter table
  57.  
  58.     vga *hardware = NULL;
  59.  
  60.  
  61.     // Following code checks for manual videochipset selection "/F" or "F"
  62.     // MCLK /F or MCLK /f or MCLK F or MCLK f
  63.  
  64. //    cout << "argv[ 1 ]= " << _argv[ 1 ] << "_argc = " << _argc;
  65.  
  66.     if ( _argc > 1 && _argv[ 1 ] )    {
  67.         if ( !strcmpi( _argv[ 1 ], "/F" ) || !strcmpi( _argv[ 1 ], "F" ) ){
  68.             // override autodetection
  69.             switch( _argc )    {
  70.                 case 2:    msg = find_vga->_help();
  71.                     cout << msg.text ;
  72.                 // Display help about manually selecting video chipset
  73.                     exit( EXIT_SUCCESS );
  74.                     break;
  75.                 case 3:    msg = find_vga->_help( atoi( _argv[ 2 ] ) );
  76.                     cout << msg.text ;
  77.                     exit( EXIT_SUCCESS );
  78.                     break;
  79.                 default:    hardware = find_vga->_find(
  80.                         atoi( _argv[ 3 ] ), atoi( _argv[ 2 ] ) );
  81.                     // _find( chipset, family );
  82.                     i = 4;    // Skip "/F %1 %2"
  83.             }
  84.         }
  85.     }
  86.  
  87.     if ( hardware == NULL )    {
  88.         hardware = find_vga->_find();
  89.         i = 1;
  90.     }
  91.         //    Chipset specific object, all calls through here
  92.  
  93.  
  94.     cout << "\nVideo card MCLK utility v0.90ß 07/28/96, chips_lib ";
  95.     cout << hardware->version() << "\nFAMILY= ";
  96.  
  97.     chipset = hardware->get_info();
  98.     cout << chipset.make << " ... CHIP= " << chipset.chipset;
  99.     cout << " ... REVISION= " << chipset.revision << "\n";
  100.     msg = hardware->_info();        // Get any specific chipset
  101.     cout << msg.text << "\n\n";
  102.  
  103.     if ( strcmpi( chipset.make, "vga" ) == 0 )    {
  104.         cerr << "\nError, could not detect installed chipset.";
  105.         cerr << "\n...(are you running in windowed DOS-box?)";
  106.         cerr << "\ntry the '/F' command-line option";
  107.          if ( find_vga != NULL )
  108.             delete find_vga;
  109.          if ( hardware != NULL )
  110.              delete hardware;
  111.         exit( EXIT_FAILURE );
  112.     }
  113.  
  114.     //    The following few lines prepare a "parameter table", which is
  115.     //    needed by my "vga" class.
  116.  
  117. /*    hardware->num_param = _argc - 2 - switches;    // Prepare parameter table
  118.     if ( hardware->num_param < 0 )
  119.         hardware->num_param = 0;
  120.     hardware->param = param;
  121.     paramcpy ( hardware->param, _argv + 2 + switches, 2 - switches );
  122.         // Copy first set of useable parameters to hardware->v_argv */
  123.  
  124.     // i == first active command parameter
  125.     // (i not necessarily ==0, eg. "/F" used)
  126.  
  127.     do    {    // Keep on scanning command-line parameters until none left
  128.  
  129.     n = 0;    // Reset n, just incase sscanf() never executed
  130. //    cout << "_argv[" << i << "] = " << _argv[ i ] << '\n';
  131.     if ( _argv[ i ] && _argv[ i ][ 0 ] == '/' )
  132.         n = sscanf( _argv[ i ] + 1 , " %d", &op );
  133.     else if ( _argv[ i ] && i == 1 )    // For 1st param only, no '/' needed
  134.         n = sscanf( _argv[ i ], " %d", &op );
  135.  
  136.     if ( n==0 )    {  //  If user invoked MCLK with no parameters,
  137.         // Then display menu of options for given video chipset
  138.         msg = hardware->get_settings();    //    get video card settings
  139.         cout << "Adjustable settings:\n" << msg.text ;    // display them
  140.         msg = hardware->get_vgahelp();    //    get video help
  141.         cout << "\n" << msg.text;    // Display general help information
  142.           if ( find_vga != NULL )
  143.             delete find_vga;
  144.          if ( hardware != NULL )
  145.              delete hardware;
  146.         exit( EXIT_SUCCESS );
  147.     }
  148.  
  149.     ++i;
  150.  
  151.     copied = 0;
  152.     while ( i < _argc && _argv[ i ] && _argv[ i ][ 0 ] != '/' )
  153.         param[ copied++ ] = _argv[ i++ ];
  154.  
  155.     hardware->num_param = copied;    // # of parameters loaded into table
  156.     hardware->param = param;    //    Set-up vga-table's pointer to param
  157.  
  158.     if ( op > _MAXOPTIONS )    {
  159.         cerr << "\nInvalid FXN" << op << " choice.  ";
  160.         cerr << "Valid choices are 0 through " << _MAXOPTIONS;
  161.           if ( find_vga != NULL )
  162.             delete find_vga;
  163.          if ( hardware != NULL )
  164.              delete hardware;
  165.         exit( EXIT_FAILURE );
  166.     }
  167.  
  168.     if ( hardware->num_param > 0 )
  169.         hardware->go( op , _SET );    // >1 param(s), run _SET
  170.     else
  171.         hardware->go( op , _HELP );    // not enough params, run _HELP
  172.  
  173.     cout << hardware->msg.text << "\n";    // display return-message
  174.  
  175.     if ( hardware->status == EXIT_FAILURE )    {
  176.         cout << "\nERROR, operation" << op << " failed!";
  177.          if ( find_vga != NULL )
  178.             delete find_vga;
  179.          if ( hardware != NULL )
  180.              delete hardware;
  181.         exit( hardware->status );
  182.     }
  183.  
  184.     }    while ( i < _argc );
  185.  
  186.      if ( find_vga != NULL )
  187.         delete find_vga;
  188.      if ( hardware != NULL )
  189.          delete hardware;
  190. }