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

1993/0918/carrera/screen.c (diff list | history)

1993/0916/sys/src/9/carrera/screen.c:42,481993/0918/sys/src/9/carrera/screen.c:42,47 (short | long | prev | next)
1993/0906    
	uchar	crt[0x19]; 
	uchar	graphics[9]; 
	uchar	attribute[0x15]; 
	uchar	special[12]; 
1993/0907    
	struct { 
		uchar viden; 
		uchar sr6; 
1993/0916/sys/src/9/carrera/screen.c:89,1051993/0918/sys/src/9/carrera/screen.c:88,108
1993/0906    
extern	GSubfont	defont0; 
GSubfont		*defont; 
 
static ulong rep(ulong, int); 
                 
struct{ 
	Point	pos; 
	int	bwid; 
}out; 
                 
Lock	screenlock; 
 
GBitmap	gscreen = 
{ 
1993/0918    
	0, 
	0, 
	(1024*(1<<3))/32, 
	3, 
	{ 0, 0, 1024, 768 }, 
	{ 0, 0, 1024, 768 }, 
	0 
}; 
 
GBitmap	vgascreen = 
{ 
1993/0907    
	EISA(0xA0000), 
1993/0906    
	0, 
	(1024*(1<<3))/32, 
1993/0916/sys/src/9/carrera/screen.c:145,2371993/0918/sys/src/9/carrera/screen.c:148,209
1993/0906    
static Point cursor; 
static int h, w; 
extern Cursor arrow; 
1993/0918    
static ulong colormap[256][3]; 
static Rectangle mbb; 
static Rectangle NULLMBB = {10000, 10000, -10000, -10000}; 
static int isscroll; 
1993/0906    
 
1993/0916    
#define IOPORT	((uchar*)0xE0010000) 
                 
static uchar 
inb(int port) 
{ 
	return IOPORT[port^7]; 
} 
                 
static void 
outb(int port, int val) 
{ 
	IOPORT[port^7] = val; 
} 
                 
1993/0906    
void 
gborder(GBitmap *l, Rectangle r, int i, Fcode c) 
{ 
	if(i < 0){ 
		r = inset(r, i); 
		i = -i; 
	} 
	gbitblt(l, r.min, l, Rect(r.min.x, r.min.y, r.max.x, r.min.y+i), c); 
	gbitblt(l, Pt(r.min.x, r.max.y-i), 
		l, Rect(r.min.x, r.max.y-i, r.max.x, r.max.y), c); 
	gbitblt(l, Pt(r.min.x, r.min.y+i), 
		l, Rect(r.min.x, r.min.y+i, r.min.x+i, r.max.y-i), c); 
	gbitblt(l, Pt(r.max.x-i, r.min.y+i), 
		l, Rect(r.max.x-i, r.min.y+i, r.max.x, r.max.y-i), c); 
} 
                 
void 
screenwin(void) 
{ 
	gtexture(&gscreen, gscreen.r, &bgrnd, S); 
	w = defont0.info[' '].width; 
	h = defont0.height; 
1993/0918    
	defont = &defont0;	 
1993/0906    
 
	window.min = Pt(100, 100); 
	window.max = add(window.min, Pt(10+w*120, 10+h*60)); 
1993/0918    
	window.min = Pt(50, 50); 
	window.max = add(window.min, Pt(10+w*100, 10+h*40)); 
1993/0906    
 
	gbitblt(&gscreen, window.min, &gscreen, window, Zero); 
	window = inset(window, 5); 
	cursor = window.min; 
	window.max.y = window.min.y+((window.max.y-window.min.y)/h)*h; 
                 
	hwcurs = 0; 
1993/0918    
 
	mbb = gscreen.r; 
	screenupdate(); 
1993/0906    
} 
 
1993/0908    
void	getvmode(VGAmode *v); 
void	writeregisters(VGAmode *v); 
VGAmode x; 
1993/0918    
/* 
 *  expand 3 and 6 bits of color to 32 
 */ 
static ulong 
x3to32(uchar x) 
{ 
	ulong y; 
1993/0908    
 
1993/0918    
	x = x&7; 
	x= (x<<3)|x; 
	y = (x<<(32-6))|(x<<(32-12))|(x<<(32-18))|(x<<(32-24))|(x<<(32-30)); 
	return y; 
} 
 
1993/0906    
void 
screeninit(void) 
{ 
1993/0907    
	int i, j; 
	uchar *scr; 
1993/0918    
	int i; 
1993/0907    
 
1993/0906    
	setmode(&dfltmode); 
1993/0908    
	getvmode(&x); 
	writeregisters(&x); 
return; 
1993/0906    
	memmove(&arrow, &fatarrow, sizeof(fatarrow)); 
1993/0918    
	for(i = 0; i < 256; i++) 
		setcolor(i, x3to32(i>>5), x3to32(i>>2), x3to32(i<<1)); 
1993/0906    
 
1993/0908    
	scr = (uchar*)EISA(0xC0000); 
1993/0907    
iprint("%lux\n", scr); 
*scr = 0xaa; 
i = *scr; 
iprint("%2.2ux\n", i); 
*scr = 0x55; 
i = *scr; 
iprint("%2.2ux\n", i); 
1993/0918    
	/* allocate a new soft bitmap area */ 
	gscreen.base = xalloc(1024*1024); 
1993/0907    
 
	for(j = 0; j < 768; j++) 
		for(i = 0; i < 1024; i++) 
			*(scr+i+(j*1024)) = i; 
                 
1993/0906    
	/* save space; let bitblt do the conversion work */ 
1993/0907    
	defont = &defont0; 
iprint("gbitblt\n");	 
1993/0906    
	gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, 0); 
1993/0907    
iprint("done\n"); 
1993/0906    
	out.pos.x = MINX; 
	out.pos.y = 0; 
	out.bwid = defont0.info[' '].width; 
 
1993/0918    
	memmove(&arrow, &fatarrow, sizeof(fatarrow)); 
 
1993/0906    
	screenwin(); 
} 
 
1993/0916/sys/src/9/carrera/screen.c:247,2541993/0918/sys/src/9/carrera/screen.c:219,253
1993/0906    
	r = Rpt(Pt(window.min.x, window.max.y-o), window.max); 
	gbitblt(&gscreen, r.min, &gscreen, r, Zero); 
	cursor.y -= o; 
1993/0918    
	isscroll = 1; 
1993/0906    
} 
 
1993/0918    
void 
mbbrect(Rectangle r) 
{ 
	if (r.min.x < mbb.min.x) 
		mbb.min.x = r.min.x; 
	if (r.min.y < mbb.min.y) 
		mbb.min.y = r.min.y; 
	if (r.max.x > mbb.max.x) 
		mbb.max.x = r.max.x; 
	if (r.max.y > mbb.max.y) 
		mbb.max.y = r.max.y; 
} 
 
void 
mbbpt(Point p) 
{ 
	if (p.x < mbb.min.x) 
		mbb.min.x = p.x; 
	if (p.y < mbb.min.y) 
		mbb.min.y = p.y; 
	if (p.x >= mbb.max.x) 
		mbb.max.x = p.x+1; 
	if (p.y >= mbb.max.y) 
		mbb.max.y = p.y+1; 
} 
 
1993/0906    
static void 
screenputc(char *buf) 
{ 
1993/0916/sys/src/9/carrera/screen.c:276,2861993/0918/sys/src/9/carrera/screen.c:275,285
1993/0906    
	default: 
		if(cursor.x >= window.max.x-w) 
			screenputc("\n"); 
1993/0918    
 
1993/0906    
		cursor = gsubfstring(&gscreen, cursor, &defont0, buf, S); 
	} 
} 
 
#ifdef USEME 
void 
screenputs(char *s, int n) 
{ 
1993/0916/sys/src/9/carrera/screen.c:288,2941993/0918/sys/src/9/carrera/screen.c:287,293
1993/0906    
	Rune r; 
	char buf[4]; 
 
	if((getstatus() & IEC) == 0) { 
1993/0918    
	if((getstatus() & IE) == 0) { 
1993/0906    
		/* don't deadlock trying to print in interrupt */ 
		if(!canlock(&screenlock)) 
			return;	 
1993/0916/sys/src/9/carrera/screen.c:296,3021993/0918/sys/src/9/carrera/screen.c:295,302
1993/0906    
	else 
		lock(&screenlock); 
 
	while(n > 0){ 
1993/0918    
	mbbpt(cursor); 
	while(n > 0) { 
1993/0906    
		i = chartorune(&r, s); 
		if(i == 0){ 
			s++; 
1993/0916/sys/src/9/carrera/screen.c:309,3601993/0918/sys/src/9/carrera/screen.c:309,346
1993/0906    
		s += i; 
		screenputc(buf); 
	} 
1993/0918    
	if(isscroll) { 
		mbb = window; 
		isscroll = 0; 
	} 
	else 
		mbbpt(Pt(cursor.x, cursor.y+h)); 
 
	screenupdate(); 
1993/0906    
	unlock(&screenlock); 
} 
#endif 
 
/* replicate (from top) value in v (n bits) until it fills a ulong */ 
static ulong 
rep(ulong v, int n) 
{ 
	int o; 
	ulong rv; 
                 
	rv = 0; 
	for(o = 32 - n; o >= 0; o -= n) 
		rv |= (v << o); 
	return rv; 
} 
                 
void 
getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb) 
{ 
	ulong ans; 
                 
	/* 
	 * The gnot says 0 is white (max intensity) 
	 */ 
	if(gscreen.ldepth == 0){ 
		if(p == 0) 
				ans = ~0; 
		else 
				ans = 0; 
	}else{ 
		switch(p){ 
		case 0:		ans = ~0;		break; 
		case 1:		ans = 0xAAAAAAAA;	break; 
		case 2:		ans = 0x55555555;	break; 
		default:	ans = 0;		break; 
		} 
	} 
	*pr = *pg = *pb = ans; 
1993/0918    
	p &= (1<<(1<<gscreen.ldepth))-1; 
	*pr = colormap[p][0]; 
	*pg = colormap[p][1]; 
	*pb = colormap[p][2]; 
1993/0906    
} 
 
int 
setcolor(ulong p, ulong r, ulong g, ulong b) 
{ 
	USED(p, r, g, b); 
	return 0;	/* can't change mono screen colormap */ 
1993/0918    
	p &= (1<<(1<<gscreen.ldepth))-1; 
	colormap[p][0] = r; 
	colormap[p][1] = g; 
	colormap[p][2] = b; 
	EISAOUTB(CMWX, 255-p); 
	EISAOUTB(CM, r>>(32-6)); 
	EISAOUTB(CM, g>>(32-6)); 
	EISAOUTB(CM, b>>(32-6)); 
	return ~0; 
1993/0906    
} 
 
void 
1993/0916/sys/src/9/carrera/screen.c:384,4011993/0918/sys/src/9/carrera/screen.c:370,375
1993/0906    
} 
 
void 
mbbrect(Rectangle r) 
{ 
	USED(r); 
} 
                 
void 
mbbpt(Point p) 
{ 
	USED(p); 
} 
                 
void 
srout(int reg, int val) 
{ 
	EISAOUTB(SRX, reg); 
1993/0916/sys/src/9/carrera/screen.c:490,4951993/0918/sys/src/9/carrera/screen.c:464,470
1993/0907    
 
	EISAOUTB(0x3C6, 0xFF);	/* pel mask */ 
	EISAOUTB(0x3C8, 0x00);	/* pel write address */ 
1993/0918    
 
1993/0907    
	EISAOUTB(0x3bf, 0x03);	/* hercules compatibility reg */ 
	EISAOUTB(0x3d8, 0xa0);	/* display mode control register */ 
 
1993/0916/sys/src/9/carrera/screen.c:512,6091993/0918/sys/src/9/carrera/screen.c:487,551
1993/0906    
	srout(1, v->sequencer[1]); 
1993/0908    
} 
 
uchar 
grin(ushort i) 
{ 
	EISAOUTB(GRX, i); 
	return EISAINB(GR); 
} 
1993/0918    
#define swiz(s)	(s<<24)|((s>>8)&0xff00)|((s<<8)&0xff0000)|(s>>24) 
1993/0908    
 
uchar 
arin(ushort i) 
1993/0918    
void 
twizzle(uchar *f, uchar *t) 
1993/0908    
{ 
	uchar junk; 
	junk = EISAINB(0x3DA); 
	USED(junk); 
	EISAOUTB(ARW, i | 0x20); 
	return EISAINB(ARR); 
} 
1993/0918    
	ulong in1, in2; 
1993/0908    
 
uchar 
crin(ushort i) { 
	EISAOUTB(CRX, i); 
	return EISAINB(CR); 
1993/0918    
	in1 = *(ulong*)f; 
	in2 = *(ulong*)(f+4); 
	*(ulong*)t = swiz(in2); 
	*(ulong*)(t+4) = swiz(in1); 
1993/0908    
} 
 
void 
getvmode(VGAmode *v) 
1993/0918    
screenupdate(void) 
1993/0908    
{ 
	int i; 
1993/0918    
	uchar *sp, *hp, *edisp; 
	int i, y, len, off, page, inc; 
	Rectangle r; 
1993/0908    
 
	v->general[0] = EISAINB(EMISCR);	/* misc output */ 
	v->general[1] = EISAINB(EFCR);	/* feature control */ 
	for(i = 0; i < sizeof(v->sequencer); i++) 
		v->sequencer[i] = srin(i); 
	for(i = 0; i < sizeof(v->crt); i++)  
		v->crt[i] = crin(i); 
	for(i = 0; i < sizeof(v->graphics); i++)  
		v->graphics[i] = grin(i); 
	for(i = 0; i < sizeof(v->attribute); i++) 
		v->attribute[i] = arin(i); 
1993/0918    
	r = mbb; 
	mbb = NULLMBB; 
1993/0908    
 
	v->tseng.viden = EISAINB(0x3c3); 
	v->tseng.sr6  = srin(6); 
	v->tseng.sr7  = srin(7); 
	v->tseng.ar16 = arin(0x16); 
	v->tseng.ar17 = arin(0x17); 
	v->tseng.crt31= crin(0x31); 
	v->tseng.crt32= crin(0x32); 
	v->tseng.crt33= crin(0x33); 
	v->tseng.crt34= crin(0x34); 
	v->tseng.crt35= crin(0x35); 
	v->tseng.crt36= crin(0x36); 
	v->tseng.crt37= crin(0x37); 
} 
1993/0918    
	if(Dy(r) < 0) 
		return; 
1993/0908    
 
void 
writeregisters(VGAmode *v) 
{ 
	int i; 
1993/0918    
	if(r.min.x < 0) 
		r.min.x = 0; 
	if(r.min.y < 0) 
		r.min.y = 0; 
	if(r.max.x > gscreen.r.max.x) 
		r.max.x = gscreen.r.max.x; 
	if(r.max.y > gscreen.r.max.y) 
		r.max.y = gscreen.r.max.y; 
1993/0908    
 
	print("\t/* general */\n\t"); 
	for (i=0; i<sizeof(v->general); i++) 
		print("0x%.2x, ", v->general[i]); 
	print("\n\t/* sequence */\n\t"); 
	for (i=0; i<sizeof(v->sequencer); i++) { 
		if (i>0 && i%8 == 0) 
			print("\n\t"); 
		print("0x%.2x, ", v->sequencer[i]); 
	} 
	print("\n\t/* crt */\n\t"); 
	for (i=0; i<sizeof(v->crt); i++) { 
		if (i>0 && i%8 == 0) 
			print("\n\t"); 
		print("0x%.2x, ", v->crt[i]); 
	} 
	print("\n\t/* graphics */\n\t"); 
	for (i=0; i<sizeof(v->graphics); i++) { 
		if (i>0 && i%8 == 0) 
			print("\n\t"); 
		print("0x%.2x, ", v->graphics[i]); 
	} 
	print("\n\t/* attribute */\n\t"); 
	for (i=0; i<sizeof(v->attribute); i++) { 
		if (i>0 && i%8 == 0) 
			print("\n\t"); 
		print("0x%.2x, ", v->attribute[i]); 
	} 
	print("\n"); 
	print("\t/* special */\n"); 
1993/0918    
	r.min.x &= ~7; 
	len = r.max.x - r.min.x; 
	len = (len+7)&~7; 
	if(len <= 0) 
		return; 
1993/0908    
 
	for (i=0; i<12; i++) { 
		if (i%8 == 0) 
			print("\n\t"); 
		print("0x%.2x, ", ((uchar*)(&v->tseng))[i]); 
1993/0918    
	inc = gscreen.width*4; 
	off = r.min.y * inc + r.min.x; 
	sp = ((uchar*)gscreen.base) + off; 
 
	page = off>>16; 
	off &= (1<<16)-1; 
	hp = edisp = 0; 
	for(y = r.min.y; y < r.max.y; y++){ 
		if(hp >= edisp){ 
			hp = ((uchar*)vgascreen.base) + off; 
			edisp = ((uchar*)vgascreen.base) + 64*1024; 
			EISAOUTB(0x3cd, (page<<4) | page); 
			off = r.min.x; 
			page++; 
		} 
		for(i = 0; i < len; i += 8) 
			twizzle(sp+i, hp+i); 
		hp += inc; 
		sp += inc; 
1993/0908    
	} 
	print("\n"); 
1993/0906    
} 


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