Category : Printer + Display Graphics
Archive   : $$$PCX.ZIP
Filename : VGR.C

 
Output of file : VGR.C contained in archive : $$$PCX.ZIP

/* 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;
}