plan 9 kernel history: overview | file list | diff list

1995/0126/pc/devvga.c (diff list | history)

1995/0117/sys/src/9/pc/devvga.c:18,231995/0126/sys/src/9/pc/devvga.c:18,24 (short | long | prev | next)
1994/0412    
 
1992/1119    
/* imported */ 
1994/0413    
extern	Subfont defont0; 
1995/0126    
extern Cursor curs;			/* barf */ 
1992/1119    
 
/* exported */ 
1994/0413    
Bitmap	gscreen; 
1995/0117/sys/src/9/pc/devvga.c:26,321995/0126/sys/src/9/pc/devvga.c:27,33
1992/1119    
 
1993/1116    
/* vga screen */ 
static	Lock	screenlock; 
static	ulong	colormap[256][3]; 
1995/0126    
static	ulong	colormap[Pcolours][3]; 
1992/1119    
 
1993/1116    
/* cga screen */ 
static	int	cga = 1;		/* true if in cga mode */ 
1995/0117/sys/src/9/pc/devvga.c:48,941995/0126/sys/src/9/pc/devvga.c:49,68
1993/1116    
#define SCREENMEM	(0xA0000 | KZERO) 
#define CGASCREEN	((uchar*)(0xB8000 | KZERO)) 
1992/0527    
 
1993/1116    
/* 
1992/1119    
 *  definitions of known cards 
 */ 
typedef struct Vgacard	Vgacard; 
struct Vgacard 
{ 
	char	*name; 
1993/1116    
	void	(*setpage)(int);	/* routine to page though display memory */ 
1992/1119    
}; 
1995/0126    
static void nopage(int); 
1992/1119    
 
1994/1117    
static void	nopage(int); 
static void	cirruspage(int); 
1994/1201    
extern void	et4000page(int); 
1994/0803    
extern void	s3page(int); 
1995/0126    
static Vgac vga = { 
	"vga", 
	nopage, 
1993/1116    
 
1993/0106    
Vgacard vgachips[] = 
1992/1119    
{ 
1994/1103    
	{ "vga", nopage, }, 
1994/0630    
	{ "clgd542x", cirruspage, }, 
1994/0909    
	{ "et4000", et4000page, }, 
1994/1103    
	{ "s3", s3page, }, 
1994/0630    
	{ 0, 0, }, 
1992/1119    
}; 
                 
1994/0630    
Vgacard	*vgacard = &vgachips[0];	/* current vga card */ 
1992/1119    
                 
1994/0624    
extern Hwgc bt485hwgc; 
1994/1201    
extern Hwgc et4000hwgc; 
1994/0803    
extern Hwgc s3hwgc; 
extern Hwgc tvp3020hwgc; 
1994/0624    
                 
static Hwgc *hwcursor[] = { 
	&bt485hwgc, 
1994/1201    
	&et4000hwgc, 
1994/0803    
	&s3hwgc, 
	&tvp3020hwgc, 
1994/0624    
	0, 
}; 
 
1994/0803    
Hwgc *hwgc; 
1994/0624    
extern Cursor curs;		/* barf */ 
1995/0126    
static Vgac *vgactlr = &vga;			/* available VGA ctlrs */ 
static Vgac *vgac;				/* current VGA ctlr */ 
static Hwgc *hwgctlr;				/* available HWGC's */ 
Hwgc *hwgc;					/* current HWGC */ 
 
1994/0930    
static char interlaced[2]; 
1994/0624    
 
1994/0415    
/* 
1995/0117/sys/src/9/pc/devvga.c:203,2141995/0126/sys/src/9/pc/devvga.c:177,193
1992/1119    
	char cbuf[64]; 
1993/1116    
	ushort *sp; 
1994/0603    
	ulong *lp; 
1995/0126    
	Vgac *vgacp; 
1992/0528    
 
1992/0527    
	switch(c->qid.path&~CHDIR){ 
	case Qdir: 
		return devdirread(c, buf, n, vgadir, Nvga, devgen); 
1994/0624    
	case Qvgactl: 
		port = sprint(cbuf, "type: %s\n", vgacard->name); 
1995/0126    
		if(vgac == 0) 
			vgacp = &vga; 
		else 
			vgacp = vgac; 
		port = sprint(cbuf, "type: %s\n", vgacp->name); 
1994/0930    
		port += sprint(cbuf+port, "size: %dx%dx%d%s\n", 
			gscreen.r.max.x, gscreen.r.max.y, 
			1<<gscreen.ldepth, interlaced); 
1995/0117/sys/src/9/pc/devvga.c:253,2601995/0126/sys/src/9/pc/devvga.c:232,241
1994/0624    
static void 
vgactl(char *arg) 
{ 
	int i, x, y, z; 
1995/0126    
	int x, y, z; 
1994/0624    
	char *cp, *field[3]; 
1995/0126    
	Hwgc *hwgcp; 
	Vgac *vgacp; 
1994/0624    
 
1995/0117    
	if(getfields(arg, field, 3, " ") != 2) 
1994/0624    
		error(Ebadarg); 
1995/0117/sys/src/9/pc/devvga.c:269,2811995/0126/sys/src/9/pc/devvga.c:250,262
1994/0624    
			return; 
		} 
 
		for(i = 0; hwcursor[i]; i++){ 
			if(strcmp(field[1], hwcursor[i]->name) == 0){ 
1995/0126    
		for(hwgcp = hwgctlr; hwgcp; hwgcp = hwgcp->link){ 
			if(strcmp(field[1], hwgcp->name) == 0){ 
1994/0624    
				if(hwgc) 
					(*hwgc->disable)(); 
				else 
					cursoroff(1); 
				hwgc = hwcursor[i]; 
1995/0126    
				hwgc = hwgcp; 
1994/0624    
				(*hwgc->enable)(); 
				setcursor(&curs); 
				cursoron(1); 
1995/0117/sys/src/9/pc/devvga.c:284,2921995/0126/sys/src/9/pc/devvga.c:265,273
1994/0624    
		} 
	} 
	else if(strcmp(field[0], "type") == 0){ 
		for(i = 0; vgachips[i].name; i++){ 
			if(strcmp(field[1], vgachips[i].name) == 0){ 
				vgacard = &vgachips[i]; 
1995/0126    
		for(vgacp = vgactlr; vgacp; vgacp = vgacp->link){ 
			if(strcmp(field[1], vgacp->name) == 0){ 
				vgac = vgacp; 
1994/0624    
				return; 
			} 
		} 
1995/0117/sys/src/9/pc/devvga.c:577,5971995/0126/sys/src/9/pc/devvga.c:558,575
1994/1119    
 
1994/0624    
	vgao(MiscW, vga->misc); 
 
	for(i = 1; i < NSeqx; i++){ 
1994/0412    
		if(i == 1) 
1994/0624    
			continue; 
1995/0126    
	for(i = 2; i < sizeof(vga->sequencer); i++) 
1994/0624    
		vgaxo(Seqx, i, vga->sequencer[i]); 
	} 
1994/1119    
	vgaxo(Seqx, 0x00, seq00); 
1994/0412    
 
1994/0624    
	vgaxo(Crtx, 0x11, vga->crt[0x11] & ~0x80); 
	for(i = 0; i < NCrtx; i++) 
1995/0126    
	for(i = 0; i < sizeof(vga->crt); i++) 
1994/0624    
		vgaxo(Crtx, i, vga->crt[i]); 
1994/0412    
 
1994/0624    
	for(i = 0; i < NGrax; i++) 
1995/0126    
	for(i = 0; i < sizeof(vga->graphics); i++) 
1994/0624    
		vgaxo(Grx, i, vga->graphics[i]); 
1994/0412    
 
1994/0624    
	for(i = 0; i < NAttrx; i++) 
1995/0126    
	for(i = 0; i < sizeof(vga->attribute); i++) 
1994/0624    
		vgaxo(Attrx, i, vga->attribute[i]); 
1994/0412    
 
1994/1119    
	vgaxo(Seqx, 0x01, seq01); 
1995/0117/sys/src/9/pc/devvga.c:648,6541995/0126/sys/src/9/pc/devvga.c:626,632
1993/1116    
	gscreen.r.max = Pt(maxx, maxy); 
	gscreen.clipr = gscreen.r; 
1994/0412    
	for(i = 0; i < gscreen.width*BY2WD*maxy; i += Footprint){ 
		vgacard->setpage(i>>Footshift); 
1995/0126    
		vgac->page(i>>Footshift); 
1994/0415    
		memset(gscreen.base, 0xff, Footprint); 
1994/0412    
	} 
1993/1116    
 
1995/0117/sys/src/9/pc/devvga.c:685,6911995/0126/sys/src/9/pc/devvga.c:663,669
1994/0416    
	/* default color map (has to be outside the lock) */ 
1993/1116    
	switch(ldepth){ 
	case 3: 
		for(i = 0; i < 256; i++) 
1995/0126    
		for(i = 0; i < Pcolours; i++) 
1994/0528    
			setcolor(i, xnto32(i>>5, 3), xnto32(i>>2, 3), xnto32(i, 2)); 
1994/0507    
		setcolor(0x55, xnto32(0x15, 6), xnto32(0x15, 6), xnto32(0x15, 6)); 
		setcolor(0xaa, xnto32(0x2a, 6), xnto32(0x2a, 6), xnto32(0x2a, 6)); 
1995/0117/sys/src/9/pc/devvga.c:734,7401995/0126/sys/src/9/pc/devvga.c:712,718
1994/0412    
	diff = 0; 
	if(q >= e){ 
		pg = ++*page; 
		vgacard->setpage(pg); 
1995/0126    
		vgac->page(pg); 
1994/0412    
		q -= Footprint; 
		diff -= Footprint; 
	} 
1995/0117/sys/src/9/pc/devvga.c:755,7611995/0126/sys/src/9/pc/devvga.c:733,739
1994/0412    
	diff = 0; 
	if(q >= e){ 
		pg = ++*page; 
		vgacard->setpage(pg); 
1995/0126    
		vgac->page(pg); 
1994/0412    
		q -= Footprint; 
		diff -= Footprint; 
	} 
1995/0117/sys/src/9/pc/devvga.c:765,7711995/0126/sys/src/9/pc/devvga.c:743,749
1994/0412    
	if(rem < len){ 
		memmove(q, data, rem); 
		pg = ++*page; 
		vgacard->setpage(pg); 
1995/0126    
		vgac->page(pg); 
1994/0412    
		q -= Footprint; 
		diff -= Footprint; 
		memmove(q+rem, data+rem, len-rem); 
1995/0117/sys/src/9/pc/devvga.c:803,8091995/0126/sys/src/9/pc/devvga.c:781,787
1994/0412    
 
	off = q - (uchar*)gscreen.base; 
	page = off>>Footshift; 
	vgacard->setpage(page); 
1995/0126    
	vgac->page(page); 
1994/0412    
	q = ((uchar*)gscreen.base) + (off&(Footprint-1)); 
 
	sw = gscreen.width*sizeof(ulong); 
1995/0117/sys/src/9/pc/devvga.c:890,8961995/0126/sys/src/9/pc/devvga.c:868,874
1994/0412    
	diff = 0; 
	if(q >= e){ 
		pg = ++*page; 
		vgacard->setpage(pg); 
1995/0126    
		vgac->page(pg); 
1994/0412    
		q -= Footprint; 
		diff -= Footprint; 
	} 
1995/0117/sys/src/9/pc/devvga.c:911,9171995/0126/sys/src/9/pc/devvga.c:889,895
1994/0412    
	diff = 0; 
	if(q >= e){ 
		pg = ++*page; 
		vgacard->setpage(pg); 
1995/0126    
		vgac->page(pg); 
1994/0412    
		q -= Footprint; 
		diff -= Footprint; 
	} 
1995/0117/sys/src/9/pc/devvga.c:921,9271995/0126/sys/src/9/pc/devvga.c:899,905
1994/0412    
	if(rem < len){ 
		memmove(data, q, rem); 
		pg = ++*page; 
		vgacard->setpage(pg); 
1995/0126    
		vgac->page(pg); 
1994/0412    
		q -= Footprint; 
		diff -= Footprint; 
		memmove(data+rem, q+rem, len-rem); 
1995/0117/sys/src/9/pc/devvga.c:960,9661995/0126/sys/src/9/pc/devvga.c:938,944
1994/0412    
 
	off = q - (uchar*)gscreen.base; 
	page = off>>Footshift; 
1993/1116    
	vgacard->setpage(page); 
1995/0126    
	vgac->page(page); 
1994/0412    
	q = ((uchar*)gscreen.base) + (off&(Footprint-1)); 
 
	sw = gscreen.width*sizeof(ulong); 
1995/0117/sys/src/9/pc/devvga.c:1074,10821995/0126/sys/src/9/pc/devvga.c:1052,1057
1993/1116    
} 
 
1992/1119    
/* 
1994/0507    
 *  expand n bits of color to 32 
1992/1119    
 */ 
1993/1116    
/* 
1992/1119    
 *  paging routines for different cards 
 */ 
static void 
1995/0117/sys/src/9/pc/devvga.c:1227,12441995/0126/sys/src/9/pc/devvga.c:1202,1219
1993/1230    
 
	switch(gscreen.ldepth){ 
	default: 
		x = 0xf; 
1995/0126    
		x = 0xF; 
1993/1230    
		break; 
	case 3: 
		x = 0xff; 
1995/0126    
		x = 0xFF; 
1993/1230    
		break; 
	} 
	p &= x; 
	p ^= x; 
1994/0729    
	lock(&palettelock); 
1992/1119    
	*pr = colormap[p][0]; 
	*pg = colormap[p][1]; 
	*pb = colormap[p][2]; 
1995/0126    
	*pr = colormap[p][Pred]; 
	*pg = colormap[p][Pgreen]; 
	*pb = colormap[p][Pblue]; 
1994/0729    
	unlock(&palettelock); 
1992/1119    
} 
 
1995/0117/sys/src/9/pc/devvga.c:1249,12701995/0126/sys/src/9/pc/devvga.c:1224,1245
1993/1230    
 
	switch(gscreen.ldepth){ 
	default: 
		x = 0xf; 
1995/0126    
		x = 0xF; 
1993/1230    
		break; 
	case 3: 
		x = 0xff; 
1995/0126    
		x = 0xFF; 
1993/1230    
		break; 
	} 
	p &= x; 
	p ^= x; 
1994/0729    
	lock(&palettelock); 
1992/1119    
	colormap[p][0] = r; 
	colormap[p][1] = g; 
	colormap[p][2] = b; 
1994/0624    
	vgao(DACWx, p); 
	vgao(DACData, r>>(32-6)); 
	vgao(DACData, g>>(32-6)); 
	vgao(DACData, b>>(32-6)); 
1995/0126    
	colormap[p][Pred] = r; 
	colormap[p][Pgreen] = g; 
	colormap[p][Pblue] = b; 
	vgao(PaddrW, p); 
	vgao(Pdata, r>>(32-6)); 
	vgao(Pdata, g>>(32-6)); 
	vgao(Pdata, b>>(32-6)); 
1994/0729    
	unlock(&palettelock); 
1992/1119    
	return ~0; 
1994/0414    
} 
1995/0117/sys/src/9/pc/devvga.c:1460,14631995/0126/sys/src/9/pc/devvga.c:1435,1452
1994/0414    
		cursoron(0); 
	cursor.frozen = 0; 
	unlock(&cursor); 
1995/0126    
} 
 
void 
addhwgclink(Hwgc *hwgcp) 
{ 
	hwgcp->link = hwgctlr; 
	hwgctlr = hwgcp; 
} 
 
void 
addvgaclink(Vgac *vgacp) 
{ 
	vgacp->link = vgactlr; 
	vgactlr = vgacp; 
1992/1119    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)