www.pudn.com > pcx_c.zip > VGR.C


/*	VGR.c    -  Routines that access the BIOS or are otherwise 
	            related to video, but not board specific. 
*/ 
 
 
#define ALLOCATE 
#include "lib.h" 
#include "vgr.h" 
 
 
/*	VGR_GET_BOARD 
 
	Partly by Dan Laurence,  
	from MicroEMACS, IBMPC.C, page 5  
	Hercules test by Larry Fogg,  
	from MicroC, jan-feb '88, page 26. 
 
	It's difficult for me to test this... 
	My ATI EGA Wonder is basically either a 
	HERC or EGA board... Besides that, there's 
	no perfect algorithm available for this  
	problem... 
*/ 
 
int vgr_get_board() 
{ 
	int i; 
	REGS r; 
 
	/* Check for MONO */ 
	sysint( 0x11, &r, &r ); 
	if ( ( (r.ax >> 4) & 0x03 ) == 0x03 ) 
	{  for ( i=0; i < 0x1000; i++ ) 
	      if ( inportb( 0x3ba ) & 0x80 ) 
	         return TYPE_HERC; 
	   return TYPE_MDA; 
	}; 
 
	/* Check for EGA 
	*/ 
	r.ax = 0x1200; 
	r.bx = 0xff10; 
	sysint( 0x10, &r, &r ); 
	if ( !(r.bx & (~0x0103)) )    /* might be EGA...   */ 
	   return TYPE_EGA; 
	else return TYPE_CGA; /* should be CGA, but...  */ 
} 
 
 
int vgr_mode( mode ) 
unsigned char mode; 
{ 
	REGS r; 
 
	r.ax = mode; 
	sysint( 0x10, &r, &r ); 
 
	return OK; 
} 
 
 
/*	adapted from jan/feb microcornucopia, page 85 
	by Gary Entsminger. Gary's ref: Bresenham's algorithm, 
	from Advanced Turbo C by Herbert Schildt. 
*/ 
 
void vgr_line( x1, y1, x2, y2, color ) 
int x1, x2, y1, y2, color; 
{ 
	int t, distance, xerr, yerr, dx, dy, ix, iy; 
 
	ix = (dx = x2-x1) < 0 ? (dx = -dx, -1) : !!dx; 
	iy = (dy = y2-y1) < 0 ? (dy = -dy, -1) : !!dy; 
 
	distance = dx > dy ? dx : dy; 
 
	xerr = yerr = 0; 
	for ( t = -2; t < distance; t++ ) 
	{  VGR_SET( x1, y1, color ); 
 
	   xerr += dx; 
	   yerr += dy; 
 
	   if ( xerr > distance ) 
	   {  xerr -= distance; 
	      x1   += ix; 
	   }; 
 
	   if ( yerr > distance ) 
	   {  yerr -= distance; 
	      y1   += iy; 
	   }; 
	}; 
} 
 
 
void vgr_rectangle( x1, y1, x2, y2, color ) 
int x1, x2, y1, y2, color; 
{ 
	vgr_line( x1, y1, x1, y2, color ); 
	vgr_line( x1, y2, x2, y2, color ); 
	vgr_line( x2, y2, x2, y1, color ); 
	vgr_line( x2, y1, x1, y1, color ); 
} 
 
 
void vgr_point( x2, y2, color ) 
int x2, y2, color; 
{ 
	static int x1=0, y1=0; 
 
	if ( color != -1 ) 
	   vgr_line( x1, y1, x2, y2, color ); 
 
	x1 = x2; 
	y1 = y2; 
	return; 
}