home *** CD-ROM | disk | FTP | other *** search
- /* 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;
- }
-
-