Category : Files from Magazines
Archive   : CUJ0894.ZIP
Filename : EGAPIXEL.C

 
Output of file : EGAPIXEL.C contained in archive : CUJ0894.ZIP
/******************************************************
* EGAPIXEL.C - this is a hardware-specific function
* to examine and fill EGA/VGA pixels.
*
* for TurboC V2.0
*
* by Anton Treuenfels
* last revision: 04/11/94
*
* references:
* Stevens, Roger T., "Graphics Programming in C",
* M&T Books, 1988
* Wilton, Richard, "PC & PS/2 Video Systems",
* Microsoft Press, 1987
*****************************************************/

#include "usrdef.h"

/*******************************
* Header Section - EGAPIXEL.H *
*******************************/

#ifndef SEEN_EGAPIX
#define SEEN_EGAPIX

/* function prototype */

void egaflood(int, int, Boolean);

#endif

/*****************************
* Code Section - EGAPIXEL.C *
*****************************/

#include
#include
#include

#include "bgigrh.h"
#include "flood.h"
#include "uflood.h"

#define BRDRPIX WHITE
#define BACKPIX LIGHTBLUE
#define FOREPIX BLUE

/* screen dimension */

#define XMAX 639 /* highest supported by BGI */

/* video memory */

#define VBASE 0xa0000000L /* base address */
#define ROWSIZE 80 /* bytes per row */
#define COLMASK 0xfff8 /* column mask */
#define COLSHFT 3 /* column shift */
#define PIXMASK 0x07 /* pixel select */

/* graphics controller */

#define SETGRH(R, V) {outportb(0x3ce, (R)); \
outportb(0x3cf, (V));}

#define COMP 2 /* color compare register */
#define DFLTCMP 0x00

#define MODE 5 /* mode register */
#define DFLTMOD 0x00
#define R1W2 0x06 /* read mode 1, write mode 2 */

#define MASK 8 /* bitmask register */
#define DFLTMSK 0xff

/* pixel masks and pattern */

static Byte pixMask[] = {0x80, 0x40, 0x20, 0x10,
0x08, 0x04, 0x02, 0x01};
static Byte patMask[] = {0xcc, 0xcc, 0x33, 0x33,
0xcc, 0xcc, 0x33, 0x33};

#define PATMASK 0x07 /* pattern select */

/* screen variables */

static int currCol; /* current column */
static int currRow; /* current row */
static int colOffset; /* column offset */
static Byte far *rowPtr; /* row offset */
static Byte far *screenPtr; /* current screen byte */
static Byte rowPattern; /* row fill pattern */

/*****************************************************/

/* initialize current column and row */

static void initcurr(int ypos) {

currCol = ~COLMASK;
currRow = ypos - 1;
}

/* examine one pixel */

static int egapixel(int xpos, int ypos) {

Byte bitmask;

if (ypos != currRow) {
if ((ypos < 0) || (ypos > MaxYPos))
return(FALSE);
currRow = ypos;
rowPtr = (Byte far *)(VBASE + ypos * ROWSIZE);
screenPtr = rowPtr + colOffset;
rowPattern = patMask[ypos & PATMASK];
}

if ((xpos & COLMASK) != currCol) {
if ((xpos < 0) || (xpos > XMAX))
return(FALSE);
currCol = xpos & COLMASK;
colOffset = xpos >> COLSHFT;
screenPtr = rowPtr + colOffset;
}

bitmask = pixMask[xpos & PIXMASK];
if ((*screenPtr & bitmask) != 0)
return(FALSE);

SETGRH(MASK, bitmask);
*screenPtr =
(rowPattern & bitmask) ? FOREPIX : BACKPIX;
return(TRUE);
}

/* execute fill */

void egaflood(int xpos, int ypos, Boolean fastfill) {

abspoint(&xpos, &ypos);
initcurr(ypos);
SETGRH(COMP, BRDRPIX);
SETGRH(MODE, R1W2);
if (fastfill)
(void)flood(xpos, ypos, egapixel);
else
(void)uflood(xpos, ypos, egapixel);
SETGRH(MASK, DFLTMSK);
SETGRH(MODE, DFLTMOD);
SETGRH(COMP, DFLTCMP);
}
/******************************************************
* EGAPIXEL.C - this is a hardware-specific function
* to examine and fill EGA/VGA pixels.
*
* for TurboC V2.0
*
* by Anton Treuenfels
* last revision: 04/11/94
*
* references:
* Stevens, Roger T., "Graphics Programming in C",
* M&T Books, 1988
* Wilton, Richard, "PC & PS/2 Video Systems",
* Microsoft Press, 1987
*****************************************************/

#include "usrdef.h"

/*******************************
* Header Section - EGAPIXEL.H *
*******************************/

#ifndef SEEN_EGAPIX
#define SEEN_EGAPIX

/* function prototype */

void egaflood(int, int, Boolean);

#endif

/*****************************
* Code Section - EGAPIXEL.C *
*****************************/

#include
#include
#include

#include "bgigrh.h"
#include "flood.h"
#include "uflood.h"

#define BRDRPIX WHITE
#define BACKPIX LIGHTBLUE
#define FOREPIX BLUE

/* screen dimension */

#define XMAX 639 /* highest supported by BGI */

/* video memory */

#define VBASE 0xa0000000L /* base address */
#define ROWSIZE 80 /* bytes per row */
#define COLMASK 0xfff8 /* column mask */
#define COLSHFT 3 /* column shift */
#define PIXMASK 0x07 /* pixel select */

/* graphics controller */

#define SETGRH(R, V) {outportb(0x3ce, (R)); \
outportb(0x3cf, (V));}

#define COMP 2 /* color compare register */
#define DFLTCMP 0x00

#define MODE 5 /* mode register */
#define DFLTMOD 0x00
#define R1W2 0x06 /* read mode 1, write mode 2 */

#define MASK 8 /* bitmask register */
#define DFLTMSK 0xff

/* pixel masks and pattern */

static Byte pixMask[] = {0x80, 0x40, 0x20, 0x10,
0x08, 0x04, 0x02, 0x01};
static Byte patMask[] = {0xcc, 0xcc, 0x33, 0x33,
0xcc, 0xcc, 0x33, 0x33};

#define PATMASK 0x07 /* pattern select */

/* screen variables */

static int currCol; /* current column */
static int currRow; /* current row */
static int colOffset; /* column offset */
static Byte far *rowPtr; /* row offset */
static Byte far *screenPtr; /* current screen byte */
static Byte rowPattern; /* row fill pattern */

/*****************************************************/

/* initialize current column and row */

static void initcurr(int ypos) {

currCol = ~COLMASK;
currRow = ypos - 1;
}

/* examine one pixel */

static int egapixel(int xpos, int ypos) {

Byte bitmask;

if (ypos != currRow) {
if ((ypos < 0) || (ypos > MaxYPos))
return(FALSE);
currRow = ypos;
rowPtr = (Byte far *)(VBASE + ypos * ROWSIZE);
screenPtr = rowPtr + colOffset;
rowPattern = patMask[ypos & PATMASK];
}

if ((xpos & COLMASK) != currCol) {
if ((xpos < 0) || (xpos > XMAX))
return(FALSE);
currCol = xpos & COLMASK;
colOffset = xpos >> COLSHFT;
screenPtr = rowPtr + colOffset;
}

bitmask = pixMask[xpos & PIXMASK];
if ((*screenPtr & bitmask) != 0)
return(FALSE);

SETGRH(MASK, bitmask);
*screenPtr =
(rowPattern & bitmask) ? FOREPIX : BACKPIX;
return(TRUE);
}

/* execute fill */

void egaflood(int xpos, int ypos, Boolean fastfill) {

abspoint(&xpos, &ypos);
initcurr(ypos);
SETGRH(COMP, BRDRPIX);
SETGRH(MODE, R1W2);
if (fastfill)
(void)flood(xpos, ypos, egapixel);
else
(void)uflood(xpos, ypos, egapixel);
SETGRH(MASK, DFLTMSK);
SETGRH(MODE, DFLTMOD);
SETGRH(COMP, DFLTCMP);
}


  3 Responses to “Category : Files from Magazines
Archive   : CUJ0894.ZIP
Filename : EGAPIXEL.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/