[comp.sys.ibm.pc] technical question on EGA and TSR's

jchvr@ihlpg.ATT.COM (Schipaanboord) (06/18/88)

I have written a TSR that comes up beatifully provided that you are either
in textmode or in graphics on a CGa monitor. However when i pop up while
in graphics on my EGA equipped system then all works well execpt that when
I return from my TSR the screen is blank. If the program I was running before
the TSR interuppted it has a repaint possibility then this will restore it
nicely, but most graphics programs do not bother.

QUESTION what do I need to do in order to restore the graphics on a EGA screen
See below on everything I do and that DOES work for CGA type graphics:
I use pushscreen() tosave the state and try with popscreen() to restore it.
In between I use all kinds of standard DOS int10 functions to set textmodes
move cursors etc.

As soon as I solve this problem I will be able to post the TSr with sources
to the world, without this bug soved I do not feel like it. I have also
noticed that other professional TSR's have this problem, but it must be
solvable I hope.


#include	"va.h"

#if MSDOS & LATTICE

#define	CDCGA	0			/* color graphics card		*/
#define	CDMONO	1			/* monochrome text card		*/

/* getboard:	Determine which type of display board is attached.
		Current known types include:

		CDMONO	Monochrome graphics adapter
		CDCGA	Color Graphics Adapter
		CDEGA	Extended graphics Adapter
*/

/* getboard:	Detect the current display adapter
		if MONO		set to MONO
		   CGA		set to CGA
		   EGA		set to CGA
*/

	int boardSEG;	/* Segment of screen memory */
static	int mode;	/* mode of screen image */
static	int xcursor;	/* xcoord. of cursor */
static	int ycursor;	/* ycoord. of cursor */
static	int page;	/* display page nr */
static	int curch;	/* cursor h value */
static	int curcl;	/* cursor l value */
static	byte screen[16384];	/* old screen */
static	byte lowmem[30];	/* 0000:0449h 30 bytes video stuff */

int getboard()
{	union REGS rg;

	int type;	/* board type to return */

	type = CDCGA;
	int86(0x11, &rg, &rg);
	if ((((rg.x.ax >> 4) & 3) == 3))
		type = CDMONO;

	switch (type) {
		case CDCGA:
			boardSEG = 0xb800;
			break;
		case CDMONO:
			boardSEG = 0xb000;
			break;
	}
}/*getboard*/

getpage()
{	union REGS rg;

	rg.h.ah = 0xf;
	int86(0x10,&rg,&rg);	/* get current display page and mode */
	page = rg.h.bh;
	mode = rg.h.al;
}/*getpage*/

putpage()
{	union REGS rg;

	/* check mode only if diff then set */
	rg.h.ah = 0xf;
	int86(0x10,&rg,&rg);
	if (rg.h.al == mode) {
		/* nothing */
	} else {
		rg.h.ah = 0;
		rg.h.al = mode;
		int86(0x10,&rg,&rg);	/* set mode */
	}

	/* set display page if different */
	rg.h.ah = 0xf;
	int86(0x10,&rg,&rg);
	if (rg.h.bh == page) {
		/* nothing */
	} else {	
		rg.h.ah = 0x5;
		rg.h.al = page;
		int86(0x10,&rg,&rg);	/* set active page */
	}
}/*putpage*/

putcursor()
{	union REGS rg;

	rg.h.ah = 0x1;
	rg.h.ch = curch;
	rg.h.cl = curcl;
	int86(0x10,&rg,&rg);	/* set cursor size */

	rg.h.ah = 0x2;
	rg.h.bh = page;
	rg.h.dh = ycursor;
	rg.h.dl = xcursor;
	int86(0x10,&rg,&rg);	/* set cursor position */
}/*putcursor*/

getcursor()
{	union REGS rg;

	rg.h.ah = 0x3;
	rg.h.bh = page;
	int86(0x10,&rg,&rg);	/* get cursor position and size */
	curch = rg.h.ch;
	curcl = rg.h.cl;
	xcursor = rg.h.dl;
	ycursor = rg.h.dh;
}/*getcursor*/

/* getlowmem*/
getlowmem()
{
	peek(0,0x449,lowmem,30);
}/*getlowmem*/

/* putlowmem */
putlowmem()
{
	poke(0,0x449,lowmem,30);
}/*putlowmem*/

/* copy current screen into screen[] */
pushscreen()
{/*	struct SREGS segregs;	*/

	getlowmem();
	getboard();
/*	segread(&segregs);	*/
/*	movedata(boardSEG,0,segregs.ds,screen,16384);	*/
	peek(boardSEG,0,screen,16384);

	getpage();	/* get display page and mode */
	getcursor();
}/*getscreen*/

/* fill current screen with contents of screen[] */
popscreen()
{/*	struct	SREGS	segregs;	*/

	putpage();	/* put display page and mode */
	putcursor();	

/*	segread(&segregs);	*/
/*	movedata(segregs.ds,screen,boardSEG,0,16384);	*/
	poke(boardSEG,0,screen,16384);
	putlowmem();
}/*putscreen*/
#endif