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

 
Output of file : HERC.C contained in archive : $$$PCX.ZIP
/* HERC.c - Video routines specific to the Hercules board.
*/

#include "lib.h"
#include "vgr.h"

#define REG_INDEX 0x3b4
#define REG_DATA 0x3b5
#define REG_MODE 0x3b8
#define REG_STATUS 0x3ba
#define REG_CONFIG 0x3bf

int herc_mode();
int herc_write_row();
int herc_init();
int herc_set_page();
int herc_clear();
int herc_clr_point();
int herc_set_point();
int herc_xor_point();
int herc_get_point();
int herc_null();
int movmem();
int peekb();
int pokeb();


static int herc_page = 0;
static int (*herc_func[])() =
{ herc_init, herc_clear, herc_set_point, herc_clr_point,
herc_xor_point, herc_get_point,herc_write_row, herc_null,
herc_null, herc_mode, movmem, peekb, pokeb,
herc_set_page, herc_null };


static unsigned char far * far *herc_column[2];


static int herc_null()
{
return ERROR; /* do nothing */
}


int herc_set_page( page )
int page;
{
outportb( REG_MODE, (herc_page = !!page) ? 0x8a : 0x0a );
return OK;

}


int herc_clear()
{
setmem( (herc_page ? BASE_HERC1 : BASE_HERC0), 0x8000, 0 );
return OK;
}


int herc_write_row( row, prow, nbytes )
unsigned int nbytes, row;
char *prow;
{
movmem( prow, herc_column[herc_page][row], nbytes );
return OK;
}


int herc_init()
{
unsigned int i,j;
void *malloc();

VGR_HRES = 720;
VGR_VRES = 348;
VGR_NBPL = 90;
VGR_NCOLORS = 2;

if ( !herc_column[0] )
herc_column[0] = CASTUCFPP malloc( sizeof(uchar far *) * VGR_VRES );
if ( !herc_column[0] )
return ERROR;

if ( !herc_column[1] )
herc_column[1] = CASTUCFPP malloc( sizeof(uchar far *) * VGR_VRES );

if ( !herc_column[1] )
{ allocf( herc_column[0] );
return ERROR;
};

for ( i = 0; i < VGR_VRES; i++ )
{ j = 0x2000 * (i & 0x03) + VGR_NBPL * (i >> 2);
herc_column[0][i] = CASTUCFP BASE_HERC0 + j;
herc_column[1][i] = CASTUCFP BASE_HERC1 + j;
};

movmem( herc_func, vgr_func, sizeof(vgr_func) );
return OK;
}


int herc_set_point( x, y )
unsigned int x, y;
{
herc_column[herc_page][y][x>>3] |= (x >> 3);
}


int herc_clr_point( x, y )
unsigned int x, y;
{
herc_column[herc_page][y][x>>3] &= ~(x >> 3);
}


int herc_get_point( x, y )
unsigned int x, y;
{
return !!(herc_column[herc_page][y][x>>3] & (x >> 3));
}


int herc_xor_point( x, y )
unsigned int x, y;
{
herc_column[herc_page][y][x>>3] ^= (x >> 3);
}


int herc_mode( mode )
int mode;
{
int i;
static char setup[2][12] = {
{ 0x35,0x2d,0x2e,0x07,0x5b,0x02,0x57,0x57,0x02,0x03,0x00,0x00 },
{ 0x61,0x50,0x52,0x0f,0x19,0x06,0x19,0x19,0x02,0x0d,0x0b,0x0c }
};

if ( mode == MODE_TEXT0 )
{ outportb( REG_CONFIG, 0 );
outportb( REG_MODE, 0 );
for ( i=0; i < 12; i++ )
{ outportb( REG_INDEX, i );
outportb( REG_DATA, setup[1][i] );
};
outportb( REG_MODE, 0x28 );
vgr_mode(3); /* the cursor is missing if I don't do this... */
return OK;
};

if ( mode == MODE_APA1 )
{ outportb( REG_CONFIG, 3 );
outportb( REG_MODE, 2 );
for ( i=0; i < 12; i++ )
{ outportb( REG_INDEX, i );
outportb( REG_DATA, setup[0][i] );
};
setmem( BASE_HERC0, 0x8000, 0 );
setmem( BASE_HERC1, 0x8000, 0 );
herc_set_page( 1 );
return OK;
};

return ERROR;
}



  3 Responses to “Category : Printer + Display Graphics
Archive   : $$$PCX.ZIP
Filename : HERC.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/