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