Metropoli BBS
VIEWER: vga.cpp MODE: TEXT (LATIN1)
//	vga.cpp		03/21/97	v0.93รก
//
//	This file contains the BASE CLASS for all sub-derived SVGA chipsets.
//	class vga does NOT offer any user-alterable settings, by itself.
//
//	The version# of VGA.CPP always reflects the MOST RECENT DATE of any
//	of the constituent svga source codes (S3, CIRRUS, etc.)
//

#define __vgachipset__
#include "vga.h"

//	Required for proper chips.h operation

#include <dos.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

/*
 *	VGA class function definitions
 */


vga::vga( vga_info info )	// Constructor, Initializes "vga.id" with info
{
	id= info;
	num_param=0;	//	Set number of parameters to 0
	param=NULL;	//	Set param pointer to NULL
	status = EXIT_SUCCESS;
}

uchar
vga::shift( uchar in )
{    //	Shift will "remap" data according to S3-801/805's parameters
	switch ( in )	{
		case 0x02:	in = 3;	// 0010 -> 0011
			break;
		case 0x03:	in = 2;	// 0011 -> 0010
			break;
		default:	;		//All other values unaffected
	}
	return in;
}


char *
vga::bitstat( uchar bit )	//	Returns "ENABLE or DISABLE"
{
	return ( bit ? "enable" : "disable" );
//	if ( bit )
//		return "enable";
//	else
//		return "disable";
}


uchar vga::read_SR ( uchar index )	// Read VGA_SR register 'index'
{
	outportb( _SRindex, index );
	return inportb( _SRIO );
}

void vga::write_SR( uchar index, uchar data )	// Write VGA_SR register
{
	outportb( _SRindex, index );
	outportb( _SRIO, data );
}

uchar vga::read_CR ( uchar index )	// Read VGA_CR register 'index'
{
	outportb( _CRindex, index );
	return inportb( _CRIO );
}

void vga::write_CR( uchar index, uchar data )	// Write VGA_CR register
{
	outportb( _CRindex, index );
	outportb( _CRIO, data );
}


uchar	//	Read a single BIT(bit) from VGA IO port index
vga::read_bit ( int port, uchar index, uchar bit )
{
	uchar data;
	outportb( port, index );
	data = inportb( port + 1 );
	return ( data >> bit ) & 0x01;	// Returns 1 or 0
}


uchar
vga::read_bit ( int port, uchar bit )
{
	return ( inportb( port ) >> bit ) & 0x01;
}


void	// Write a single BIT(bit) to VGA IO port, while preserving other bits!
vga::write_bit( int port, uchar index, uchar bit, uchar data )
{
	uchar old_byte, mask = 0x01;

	mask = ~( mask << bit );
	data = data << bit;

	outportb( port, index );
	old_byte = inportb( port + 1 ) & mask;
	outportb( port, index );
	outportb( port + 1, old_byte | data );
}

void
vga::write_bit( int port, uchar bit, uchar data )
{
	uchar old_byte, mask = 0x01;

	mask = ~( mask << bit ); // negate bitfield 0010 0000 -> 1101 1111
	data = data << bit;

	old_byte = inportb( port ) & mask;
	outportb( port, old_byte | data );
}


// returns # of parameters scanned, 0 if unsuccessful
int
vga::parse_param( int index, uchar *parsed ) // Acquire 1 parameter
{
	int temp = 0;
	if ( param[ index ] )
		temp = sscanf( param[ index ], " %u", parsed );

	return temp;	//	0 = unsucessful
}


// Quick function for printing (to string deststr) HEX values XX

void
vga::hexout( ostrstream &deststr, int value )
{
	deststr.setf( ios::hex | ios::uppercase );
	deststr.fill('0');
	deststr.width( 2 );	// Want left-edge blank digits to be '0'
	deststr << value ;
	deststr.unsetf( ios::hex | ios::uppercase );
}


message
vga::get_vgahelp( void )
{
	INITMSG( msg.text );

	msgout<<"**** If you're running MCLK from Windows 3.x or Windows95, "<<
		"\n**** you must do so from a FULL-SCREEN DOS box!" <<
		"\n\nFor a list of supported chipsets\n\t" << _argv[ 0 ] <<
		" /F\n\nUsage : MCLK.EXE /0 aa /1 bb /2 cc " <<
		".. \n\n\t...where 0, 1 & 2 represent menu option(s) " <<
		"0 - 5\n\t...and aa, bb, cc, etc. are parameters." <<
		"\n\t   (some functions require several parameters)" ;
	msgout << ends ;	// Terminate string!
	return msg;
}


//	This next function is the "command-center."  The main program, MCLK.CPP,
//	access all SVGA functions (settings) through this go() function.
void
vga::go( int fxn, int cmd )	// cmd = _SET, _GET, _QUERY
{
	status= EXIT_SUCCESS;
	msg.text[ 0 ] = NULL; // 0.90 to fix text-redundancy during execution
	msg.temp[ 0 ] = NULL; // 0.90 of multiple commands
	INITMSG( msg.text );
		// Initialize msgout to first char in text-buffer

	if ( num_param == 0 )	// If there are no parameters, default to HELP
		cmd = _HELP;

	switch ( cmd )	{
		case _HELP:	case _SET:	case _GET:	case _QUERY:
			switch( fxn )	{
				case 0:	_mclk( cmd );
					break;
				case 1:	_fxn1( cmd );
					break;
				case 2:	_fxn2( cmd );
					break;
				case 3:	_fxn3( cmd );
					break;
				case 4:	_fxn4( cmd );
					break;
				case 5:	_fxn5( cmd );
					break;
				default:
					msgout << "_fxn" << fxn << " not defined" << ends;
					status= EXIT_FAILURE;
			}
			break;
		default:
			msgout << "vga::go( " << cmd << " ) unrecognized cmd" <<
				ends;
			status= EXIT_FAILURE;
	}
}


message	//	Returns a struct message, with what available SVGA settings
vga::get_settings( void )
{
	message settings;
	ostrstream stgout( settings.text, sizeof( settings.text ) );

	_mclk( _QUERY );
	stgout << msg.text ;
	_fxn1( _QUERY );
	stgout << msg.text ;
	_fxn2( _QUERY );
	stgout << msg.text ;
	_fxn3( _QUERY );
	stgout << msg.text ;
	_fxn4( _QUERY );
	stgout << msg.text ;
	_fxn5( _QUERY );
	stgout << msg.text << ends;
	return settings;
}


void
vga::_fxn1( int cmd )
{
	INITMSG( msg.text );
	msgout << "1  function NOT available.\n" << ends;
	status = EXIT_FAILURE;
}


void
vga::_fxn2( int cmd )
{
	INITMSG( msg.text );
	msgout << "2  function NOT available.\n" << ends ;
	status = EXIT_FAILURE;
}


void
vga::_fxn3( int cmd )
{
	INITMSG( msg.text );
	msgout << "3  function NOT available.\n" << ends;
	status = EXIT_FAILURE;
}


void
vga::_fxn4( int cmd )
{
	INITMSG( msg.text );
	msgout << "4  function NOT available.\n" << ends;
	status = EXIT_FAILURE;
}


void
vga::_fxn5( int cmd )
{
	INITMSG( msg.text );
	msgout << "5  function NOT available.\n" << ends;
	status = EXIT_FAILURE;
}


void
vga::_mclk( int cmd )
{
	INITMSG( msg.text );
	msgout << "0  MCLK function NOT available.\n" << ends;
	status = EXIT_FAILURE;
}


message
vga::_info( void )
{
	INITMSG( msg.text );
	msgout << "(No chipset specific information available.)" << ends;
	status = EXIT_FAILURE;
	return msg;
}
[ RETURN TO DIRECTORY ]