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

1997/1101/pc/vgaark2000pv.c (diff list | history)

1997/0327/sys/src/9/pc/vgaark2000pv.c:5,481997/1101/sys/src/9/pc/vgaark2000pv.c:5,50 (short | long | prev | next)
1995/0512    
#include "fns.h" 
#include "../port/error.h" 
 
#include <libg.h> 
1997/1101    
#define	Image	IMAGE 
#include <draw.h> 
#include <memdraw.h> 
1995/0512    
#include "screen.h" 
#include "vga.h" 
 
1995/0516    
extern Bitmap gscreen; 
extern Cursor curcursor; 
1997/1101    
static int 
ark2000pvpageset(VGAscr*, int page) 
{ 
	uchar seq15; 
1995/0516    
 
static Lock ark2000pvlock; 
static ulong storage; 
static Point hotpoint; 
1997/1101    
	seq15 = vgaxi(Seqx, 0x15); 
	vgaxo(Seqx, 0x15, page); 
	vgaxo(Seqx, 0x16, page); 
1995/0516    
 
1997/1101    
	return seq15; 
} 
 
1995/0512    
static void 
1995/0516    
setark2000pvpage(int page) 
1997/1101    
ark2000pvpage(VGAscr* scr, int page) 
1995/0512    
{ 
	vgaxo(Seqx, 0x15, page); 
	vgaxo(Seqx, 0x16, page); 
1997/1101    
	lock(&scr->devlock); 
	ark2000pvpageset(scr, page); 
	unlock(&scr->devlock); 
1995/0512    
} 
 
1995/0516    
static void 
disable(void) 
1997/1101    
ark2000pvdisable(VGAscr*) 
1995/0516    
{ 
	uchar seq20; 
 
1997/0327    
	lock(&ark2000pvlock); 
                 
1995/0516    
	seq20 = vgaxi(Seqx, 0x20) & ~0x08; 
	vgaxo(Seqx, 0x20, seq20); 
1997/0327    
                 
	unlock(&ark2000pvlock); 
1995/0516    
} 
 
static void 
enable(void) 
1997/1101    
ark2000pvenable(VGAscr* scr) 
1995/0516    
{ 
	uchar seq20; 
1997/1101    
	ulong storage; 
1995/0516    
 
1997/0327    
	lock(&ark2000pvlock); 
                 
1995/0516    
	/* 
	 * Disable the cursor then configure for X-Windows style, 
1996/0216    
	 * 32x32 and 4/8-bit colour depth. 
1997/0327/sys/src/9/pc/vgaark2000pv.c:66,711997/1101/sys/src/9/pc/vgaark2000pv.c:68,74
1995/0516    
	storage = (vgaxi(Seqx, 0x10)>>6) & 0x03; 
	storage = (1024*1024)<<storage; 
1996/0216    
	storage -= 256; 
1997/1101    
	scr->storage = storage; 
1996/0216    
	vgaxo(Seqx, 0x25, 0x3F); 
1995/0516    
 
	/* 
1997/0327/sys/src/9/pc/vgaark2000pv.c:72,1111997/1101/sys/src/9/pc/vgaark2000pv.c:75,101
1995/0516    
	 * Enable the cursor. 
	 */ 
	vgaxo(Seqx, 0x20, seq20); 
1997/0327    
                 
	unlock(&ark2000pvlock); 
1995/0516    
} 
 
static void 
load(Cursor *c) 
1997/1101    
ark2000pvload(VGAscr* scr, Cursor* curs) 
1995/0516    
{ 
1996/0216    
	uchar *p; 
1995/0516    
	int x, y; 
1997/1101    
	uchar *p, seq10; 
	int opage, x, y; 
1995/0516    
 
	/* 
	 * Lock the display memory so we can update the 
	 * cursor bitmap if necessary. 
	 * If it's the same as the last cursor we loaded, 
	 * just make sure it's enabled. 
	 */ 
	lock(&ark2000pvlock); 
	if(memcmp(c, &curcursor, sizeof(Cursor)) == 0){ 
1996/0216    
		vgaxo(Seqx, 0x20, vgaxi(Seqx, 0x20)|0x08); 
1995/0516    
		unlock(&ark2000pvlock); 
		return; 
	} 
	memmove(&curcursor, c, sizeof(Cursor)); 
                 
	/* 
	 * Is linear addressing turned on? This will determine 
	 * how we access the cursor storage. 
	 */ 
	if(vgaxi(Seqx, 0x10) & 0x10) 
		p = ((uchar*)gscreen.base) + storage; 
	else { 
		setark2000pvpage(storage>>16); 
		p = ((uchar*)gscreen.base) + (storage & 0xFFFF); 
1997/1101    
	seq10 = vgaxi(Seqx, 0x10); 
	opage = 0; 
	p = KADDR(scr->aperture); 
	if(!(seq10 & 0x10)){ 
		opage = ark2000pvpageset(scr, scr->storage>>16); 
		p += (scr->storage & 0xFFFF); 
1995/0516    
	} 
1997/1101    
	else 
		p += scr->storage; 
1995/0516    
 
	/* 
	 * The cursor is set in X11 mode which gives the following 
1997/0327/sys/src/9/pc/vgaark2000pv.c:122,1291997/1101/sys/src/9/pc/vgaark2000pv.c:112,119
1996/0216    
	for(y = 0; y < 32; y++){ 
		for(x = 0; x < 32/8; x++){ 
1995/0516    
			if(x < 16/8 && y < 16){ 
				*p++ = c->clr[2*y + x]|c->set[2*y + x]; 
				*p++ = c->set[2*y + x]; 
1997/1101    
				*p++ = curs->clr[2*y + x]|curs->set[2*y + x]; 
				*p++ = curs->set[2*y + x]; 
1995/0516    
			} 
			else { 
1995/0808    
				*p++ = 0x00; 
1997/0327/sys/src/9/pc/vgaark2000pv.c:132,1651997/1101/sys/src/9/pc/vgaark2000pv.c:122,155
1995/0516    
		} 
	} 
 
1997/1101    
	if(!(seq10 & 0x10)){ 
		ark2000pvpageset(scr, opage); 
		unlock(&scr->devlock); 
	} 
 
1995/0516    
	/* 
	 * Set the cursor hotpoint and enable the cursor. 
1997/1101    
	 * Save the cursor hotpoint. 
1995/0516    
	 */ 
	hotpoint = c->offset; 
                 
	unlock(&ark2000pvlock); 
1997/1101    
	scr->offset = curs->offset; 
1995/0516    
} 
 
static int 
move(Point p) 
1997/1101    
ark2000pvmove(VGAscr* scr, Point p) 
1995/0516    
{ 
	int x, xo, y, yo; 
 
	if(canlock(&ark2000pvlock) == 0) 
		return 1; 
                 
	/* 
	 * Mustn't position the cursor offscreen even partially, 
	 * or it might disappear. Therefore, if x or y is -ve, adjust the 
	 * cursor origins instead. 
	 */ 
	if((x = p.x+hotpoint.x) < 0){ 
1997/1101    
	if((x = p.x+scr->offset.x) < 0){ 
1995/0516    
		xo = -x; 
1995/0822    
		x = 0; 
1995/0516    
	} 
	else 
1995/0822    
		xo = 0; 
1995/0516    
	if((y = p.y+hotpoint.y) < 0){ 
1997/1101    
	if((y = p.y+scr->offset.y) < 0){ 
1995/0516    
		yo = -y; 
1995/0822    
		y = 0; 
1995/0516    
	} 
1997/0327/sys/src/9/pc/vgaark2000pv.c:176,2131997/1101/sys/src/9/pc/vgaark2000pv.c:166,188
1995/0516    
	vgaxo(Seqx, 0x23, (y>>8) & 0x0F); 
	vgaxo(Seqx, 0x24, y & 0xFF); 
 
	unlock(&ark2000pvlock); 
	return 0; 
} 
 
1996/0215    
static Hwgc ark2000pvhwgc = { 
1995/0516    
	"ark2000pvhwgc", 
	enable, 
	load, 
	move, 
	disable, 
1997/1101    
VGAdev vgaark2000pvdev = { 
	"ark2000pv", 
1995/0516    
 
	0, 
}; 
                 
static void 
ark2000pvpage(int page) 
{ 
1997/0327    
	lock(&ark2000pvlock); 
	setark2000pvpage(page); 
	unlock(&ark2000pvlock); 
1995/0516    
} 
                 
1995/0512    
static Vgac ark2000pv = { 
	"ark2000pv", 
1997/1101    
	0, 
1995/0512    
	ark2000pvpage, 
                 
	0, 
}; 
 
void 
vgaark2000pvlink(void) 
{ 
	addvgaclink(&ark2000pv); 
1995/0516    
	addhwgclink(&ark2000pvhwgc); 
1995/0512    
} 
1997/1101    
VGAcur vgaark2000pvcur = { 
	"ark2000pvhwgc", 
 
	ark2000pvenable, 
	ark2000pvdisable, 
	ark2000pvload, 
	ark2000pvmove, 
}; 


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