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

1999/1005/pc/devvga.c (diff list | history)

1999/0714/sys/src/9/pc/devvga.c:15,301999/1005/sys/src/9/pc/devvga.c:15,24 (short | long | prev | next)
1995/0406    
 
1997/1101    
enum { 
	Qdir, 
	Qvgaiob, 
	Qvgaiow, 
	Qvgaiol, 
	Qvgactl, 
1994/0624    
}; 
 
1997/1101    
static Dirtab vgadir[] = { 
	"vgaiob",	{ Qvgaiob, 0 },		0,	0660, 
	"vgaiow",	{ Qvgaiow, 0 },		0,	0660, 
	"vgaiol",	{ Qvgaiol, 0 },		0,	0660, 
	"vgactl",	{ Qvgactl, 0 },		0,	0660, 
1992/1119    
}; 
1992/0527    
 
1999/0714/sys/src/9/pc/devvga.c:87,961999/1005/sys/src/9/pc/devvga.c:81,88
1997/0327    
static long 
1998/0319    
vgaread(Chan* c, void* a, long n, vlong off) 
1992/0527    
{ 
1997/1101    
	int len, port; 
1999/1005    
	int len; 
1997/1101    
	char *p, *s; 
1993/1116    
	ushort *sp; 
1994/0603    
	ulong *lp; 
1997/1101    
	VGAscr *scr; 
1998/0319    
	ulong offset = off; 
1992/0528    
 
1999/0714/sys/src/9/pc/devvga.c:115,1211999/1005/sys/src/9/pc/devvga.c:107,113
1997/1101    
		if(scr->gscreen) 
			len += snprint(p+len, READSTR-len, "size: %dx%dx%d\n", 
				scr->gscreen->r.max.x, scr->gscreen->r.max.y, 
				1<<scr->gscreen->ldepth); 
1999/1005    
				scr->gscreen->depth); 
1997/1101    
		if(scr->cur) 
			s = scr->cur->name; 
		else 
1999/0714/sys/src/9/pc/devvga.c:129,1611999/1005/sys/src/9/pc/devvga.c:121,126
1997/1101    
 
		return n; 
 
1994/0624    
	case Qvgaiob: 
		port = offset; 
1999/0714    
		checkport(offset, offset+n); 
1997/1101    
		for(p = a; port < offset+n; port++) 
			*p++ = inb(port); 
1992/0528    
		return n; 
1997/1101    
                 
1994/0624    
	case Qvgaiow: 
1997/1101    
		if((n & 0x01) || (offset & 0x01)) 
1993/1116    
			error(Ebadarg); 
1999/0714    
		checkport(offset, offset+n+1); 
1993/1116    
		n /= 2; 
1997/1101    
		sp = a; 
		for(port = offset; port < offset+n; port += 2) 
1993/1116    
			*sp++ = ins(port); 
		return n*2; 
1997/1101    
                 
1994/0624    
	case Qvgaiol: 
1997/1101    
		if((n & 0x03) || (offset & 0x03)) 
1994/0603    
			error(Ebadarg); 
1999/0714    
		checkport(offset, offset+n+3); 
1994/0603    
		n /= 4; 
1997/1101    
		lp = a; 
		for(port = offset; port < offset+n; port += 4) 
1994/0603    
			*lp++ = inl(port); 
		return n*4; 
1997/1101    
                 
	default: 
		error(Egreg); 
		break; 
1999/0714/sys/src/9/pc/devvga.c:168,1801999/1005/sys/src/9/pc/devvga.c:133,147
1997/1101    
vgactl(char* a) 
1994/0624    
{ 
1997/1101    
	int align, i, n, size, x, y, z; 
	char *field[4], *p; 
1999/1005    
	char *chanstr, *field[6], *p; 
	ulong chan; 
1997/1101    
	VGAscr *scr; 
	extern VGAdev *vgadev[]; 
	extern VGAcur *vgacur[]; 
1999/1005    
	Rectangle r; 
1994/0624    
 
1997/1101    
	n = parsefields(a, field, 4, " "); 
1995/0406    
	if(n < 2) 
1999/1005    
	n = parsefields(a, field, nelem(field), " "); 
	if(n < 1) 
1994/0624    
		error(Ebadarg); 
 
1997/1101    
	scr = &vgascreen[0]; 
1999/0714/sys/src/9/pc/devvga.c:181,1861999/1005/sys/src/9/pc/devvga.c:148,158
1997/1101    
	if(strcmp(field[0], "hwgc") == 0){ 
1995/0406    
		if(n < 2) 
			error(Ebadarg); 
1999/1005    
 
		/* BUG: drawinit should become a different message rather than piggybacking */ 
		if(scr && scr->dev && scr->dev->drawinit) 
			scr->dev->drawinit(scr); 
 
1994/0624    
		if(strcmp(field[1], "off") == 0){ 
1997/1101    
			lock(&cursor); 
			if(scr->cur){ 
1999/0714/sys/src/9/pc/devvga.c:221,2271999/1005/sys/src/9/pc/devvga.c:193,199
1994/0624    
		} 
	} 
	else if(strcmp(field[0], "size") == 0){ 
1995/0406    
		if(n < 2) 
1999/1005    
		if(n < 3) 
1995/0406    
			error(Ebadarg); 
1997/1101    
		x = strtoul(field[1], &p, 0); 
1995/0206    
		if(x == 0 || x > 2048) 
1999/0714/sys/src/9/pc/devvga.c:235,2571999/1005/sys/src/9/pc/devvga.c:207,273
1997/1101    
		if(*p) 
			p++; 
1994/0624    
 
1997/1101    
		switch(strtoul(p, &p, 0)){ 
1995/0206    
		case 8: 
1997/1101    
			z = 3; 
			break; 
1999/1005    
		z = strtoul(p, &p, 0); 
1997/1101    
 
1995/0206    
		default: 
1995/0207    
			z = 0; 
1994/0624    
			error(Ebadarg); 
1995/0206    
		} 
1999/1005    
		chanstr = field[2]; 
		if((chan = strtochan(chanstr)) == 0) 
			error("bad channel"); 
1994/0624    
 
1999/1005    
		if(chantodepth(chan) != z) 
			error("depth, channel do not match"); 
 
1995/0206    
		cursoroff(1); 
1997/1101    
		if(screensize(x, y, z)) 
1999/1005    
		deletescreenimage(); 
		if(screensize(x, y, z, chan)) 
1997/1101    
			error(Egreg); 
		vgascreenwin(scr); 
1994/0624    
		cursoron(1); 
		return; 
	} 
1999/1005    
	else if(strcmp(field[0], "actualsize") == 0){ 
		if(scr->gscreen == nil) 
			error("set the screen size first"); 
 
		if(n < 2) 
			error(Ebadarg); 
		x = strtoul(field[1], &p, 0); 
		if(x == 0 || x > 2048) 
			error(Ebadarg); 
		if(*p) 
			p++; 
 
		y = strtoul(p, nil, 0); 
		if(y == 0 || y > 2048) 
			error(Ebadarg); 
 
		if(x > scr->gscreen->r.max.x || y > scr->gscreen->r.max.y) 
			error("physical screen bigger than virtual"); 
 
		r = Rect(0,0,x,y); 
		if(!eqrect(r, scr->gscreen->r)){ 
			if(scr->cur == nil || scr->cur->doespanning == 0) 
				error("virtual screen not supported"); 
		} 
 
		physgscreenr = r; 
		return; 
	} 
	else if(strcmp(field[0], "palettedepth") == 0){ 
		if(n < 2) 
			error(Ebadarg); 
 
		x = strtoul(field[1], &p, 0); 
		if(x != 8 && x != 6) 
			error(Ebadarg); 
 
		scr->palettedepth = x; 
		return; 
	} 
	else if(strcmp(field[0], "drawinit") == 0){ 
		if(scr && scr->dev && scr->dev->drawinit) 
			scr->dev->drawinit(scr); 
		return; 
	} 
1995/0406    
	else if(strcmp(field[0], "linear") == 0){ 
		if(n < 2) 
			error(Ebadarg); 
1999/0714/sys/src/9/pc/devvga.c:265,2701999/1005/sys/src/9/pc/devvga.c:281,304
1995/0406    
			error("not enough free address space"); 
		return; 
	} 
1999/1005    
/*	else if(strcmp(field[0], "memset") == 0){ 
		if(n < 4) 
			error(Ebadarg); 
		memset((void*)strtoul(field[1], 0, 0), atoi(field[2]), atoi(field[3])); 
		return; 
	} 
*/ 
	else if(strcmp(field[0], "blank") == 0){ 
		if(n < 2) 
			error(Ebadarg); 
		drawblankscreen(atoi(field[1])); 
		return; 
	} 
	else if(strcmp(field[0], "hwacceloff") == 0){ 
		scr->fill = nil; 
		scr->scroll = nil; 
		return; 
	} 
1995/0406    
 
1994/0624    
	error(Ebadarg); 
} 
1999/0714/sys/src/9/pc/devvga.c:272,2811999/1005/sys/src/9/pc/devvga.c:306,312
1997/0327    
static long 
1998/0319    
vgawrite(Chan* c, void* a, long n, vlong off) 
1992/0527    
{ 
1994/0624    
	int port; 
1997/1101    
	char *p; 
1993/1116    
	ushort *sp; 
1994/0603    
	ulong *lp; 
1998/0319    
	ulong offset = off; 
1992/0528    
 
1997/1101    
	switch(c->qid.path & ~CHDIR){ 
1999/0714/sys/src/9/pc/devvga.c:297,3291999/1005/sys/src/9/pc/devvga.c:328,333
1997/1101    
		poperror(); 
		free(p); 
1992/0603    
		return n; 
1997/1101    
                 
1994/0624    
	case Qvgaiob: 
1997/1101    
		p = a; 
1999/0714    
		checkport(offset, offset+n); 
1997/1101    
		for(port = offset; port < offset+n; port++) 
			outb(port, *p++); 
1992/0604    
		return n; 
1997/1101    
                 
1994/0624    
	case Qvgaiow: 
1993/1116    
		if((n & 01) || (offset & 01)) 
			error(Ebadarg); 
1999/0714    
		checkport(offset, offset+n+1); 
1993/1116    
		n /= 2; 
1997/1101    
		sp = a; 
		for(port = offset; port < offset+n; port += 2) 
1993/1116    
			outs(port, *sp++); 
		return n*2; 
1997/1101    
                 
1994/0624    
	case Qvgaiol: 
1997/1101    
		if((n & 0x03) || (offset & 0x03)) 
1994/0603    
			error(Ebadarg); 
1999/0714    
		checkport(offset, offset+n+3); 
1994/0603    
		n /= 4; 
1997/1101    
		lp = a; 
		for(port = offset; port < offset+n; port += 4) 
1994/0603    
			outl(port, *lp++); 
		return n*4; 
1997/1101    
 
	default: 
		error(Egreg); 


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