Metropoli BBS
VIEWER: modes.c MODE: TEXT (ASCII)
/****************************************************************************
*
*						MegaGraph Graphics Library
*
*                   Copyright (C) 1993 Kendall Bennett.
*							All rights reserved.
*
* Filename:		$RCSfile: modes.c $
* Version:		$Revision: 1.2 $
*
* Language:		ANSI C
* Environment:	IBM PC (MS DOS)
*
* Description:	Routine to determine the available video modes for a
*				specified video card, given memory restrictions.
*
* $Id: modes.c 1.2 1993/03/07 04:04:13 kjb Exp $
*
* Revision History:
* -----------------
*
* $Log: modes.c $
* Revision 1.2  1993/03/07  04:04:13  kjb
* Bug fixes.
*
* Revision 1.1  1993/03/03  10:46:00  kjb
* Initial revision
*
****************************************************************************/

#include "drivers.h"

/*--------------------------- Global Variables ----------------------------*/

int		__modeTable[grMAXMODE+1];	/* Internal table of video modes	*/

/*------------------------- Implementation --------------------------------*/

/* Routines in 'detectgr.asm' for returning the list of possible video
 * modes for this adapter and display pages.
 */

char far * _getSuperVGAModes(void);
int _getSuperVGAPages(int mode,int memory,long *pagesize);

PRIVATE int loadVGAModes(int i)
/****************************************************************************
*
* Function:		loadVGAModes
* Parameters:	i	- Index to start loading modes at
* Returns:		Index of next available space in mode table.
*
* Description:	Fills in all of the standard VGA video modes in the mode
*				table.
*
****************************************************************************/
{
	__modeTable[i++] = grEGA_320x200x16;
	__modeTable[i++] = grEGA_640x200x16;
	__modeTable[i++] = grEGA_640x350x16;
	__modeTable[i++] = grVGA_640x400x16;
	__modeTable[i++] = grVGA_640x480x16;
	__modeTable[i++] = grVGA_320x200x256;
	__modeTable[i++] = grVGAX_320x200x256;
	__modeTable[i++] = grVGAX_320x240x256;
	__modeTable[i++] = grVGAX_320x400x256;
	__modeTable[i++] = grVGAX_320x480x256;
	__modeTable[i++] = grVGAX_360x200x256;
	__modeTable[i++] = grVGAX_360x240x256;
	__modeTable[i++] = grVGAX_360x400x256;
	__modeTable[i++] = grVGAX_360x480x256;
	return i;
}

PUBLIC int * MGL_availableModes(int driver,int memory)
/****************************************************************************
*
* Function:		MGL_availableModes
* Parameters:	driver	- Graphics device driver to check.
*				memory	- Amount of memory on video card
*
* Returns:		Returns a pointer to a list of all the video modes that are
*				currently available. This routine can be called before
*				MGL_init() is called to determine the video modes available.
*				The list of video modes is terminated by a -1, but you
*				will have to call MGL_detectGraph() to determine the
*				currently installed video card.
*
****************************************************************************/
{
	int		i;
	long	pagesize;
	char	far *modes;

	switch(driver) {
		case grMCGA:
			__modeTable[0] = grVGA_320x200x256;
			__modeTable[1] = -1;		/* Terminate the table	*/
			memory = 64;
			break;
		case grEGA:
			__modeTable[0] = grEGA_320x200x16;
			__modeTable[1] = grEGA_640x200x16;
			__modeTable[2] = grEGA_640x350x16;
			__modeTable[3] = -1;		/* Terminate the table	*/
			memory = 256;
			break;
		case grVGA:
			i = loadVGAModes(0);
			__modeTable[i] = -1;		/* Terminate the table	*/
			memory = 256;
			break;
		default:
			if (driver >= __FIRST_SVGA && driver <= __LAST_SVGA) {
				/* We have a Super VGA video card. We know that we can use
				 * all of the standard VGA video modes, but we must also
				 * determine what SuperVGA video modes are available. We
				 * obtain this information from the DetectGraph module.
				 */

				i = loadVGAModes(0);

				/* Install all detected SuperVGA modes, filtering
				 * those not supported with the memory installed
				 */

				modes = _getSuperVGAModes();
				if (memory >= 4096)	/* Fix strange memory sizes	*/
					memory = 4096;
				else if (memory >= 3072)
					memory = 3072;
				else if (memory >= 2048)
					memory = 2048;
				else if (memory >= 1024)
					memory = 1024;
				else if (memory >= 512)
					memory = 512;
				else if (memory >= 256)
					memory = 256;

				while (*modes != -1) {
					/* Compute the size of the video page for the mode, and
					 * if we have enough memory for one page then include
					 * it in the mode list
					 */

					if (*modes != 0) {
						if (_getSuperVGAPages(*modes | 0x80,memory,&pagesize) > 0) {
							if ((pagesize / 1024) <= memory)
								__modeTable[i++] = *modes;
							}
						}
					modes++;
					}
				__modeTable[i] = -1;		/* Terminate the table	*/
				}
			else {
				/* No video modes are supported for this adapter */

				__modeTable[0] = -1;		/* Terminate the table	*/
				}
		}
	return __modeTable;
}

PUBLIC int MGL_availablePages(int driver,int memory,int mode)
/****************************************************************************
*
* Function:		MGL_availablePages
* Parameters:	driver	- Graphics device driver to check.
*				memory	- Amount of memory on video card.
*				mode	- Video mode to check
* Returns:		Number of available video pages for the mode, -1 on error.
*
* Description:	Determines the number of available video pages for a
*				specific video mode and driver. This routine assumes that
*				the MGL_detectGraph() routine has already been called
*				to obtain the video device driver ID.
*
*				If the video mode specified is invalid, a -1 is returned.
*
****************************************************************************/
{
	int		*modes;
	long	pagesize;

	/* Get list of available video modes and check that the mode specified
	 * is currently valid
	 */

	modes = MGL_availableModes(driver,memory);

	while (*modes != -1) {
		if (mode == *modes)
			break;
		modes++;
		}
	if (*modes == -1)
		return -1;

	switch(driver) {
		case grMCGA:
			return 1;
		case grEGA:
		case grVGA:
			switch (mode) {
				case grEGA_320x200x16:
					return 8;
				case grEGA_640x200x16:
					return 4;
				case grEGA_640x350x16:
					return 2;
				case grVGA_640x400x16:
					return 2;
				case grVGA_640x480x16:
					return 1;
				case grVGA_320x200x256:
					return 1;
				}
			return -1;
		default:
			if (driver >= __FIRST_SVGA && driver <= __LAST_SVGA) {
				/* We have a Super VGA video card. We simply call the
				 * assembly language routine to compute the number
				 * of video pages.
				 */

				return _getSuperVGAPages(mode,memory,&pagesize);
				}
			else {
				/* No video modes are supported for this adapter */

				return -1;
				}
		}
}
[ RETURN TO DIRECTORY ]