home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Education Master 1994 (4th Edition)
/
EDUCATIONS_MASTER_4TH_EDITION.bin
/
files
/
progng_c
/
pcxc
/
vgr.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-04-17
|
2KB
|
120 lines
/* 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;
}