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

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

pc/vgaark2000pv.c on 1995/0512
1995/0512    
#include "u.h" 
#include "../port/lib.h" 
#include "mem.h" 
#include "dat.h" 
#include "fns.h" 
#include "../port/error.h" 
 
1997/1101    
#define	Image	IMAGE 
#include <draw.h> 
#include <memdraw.h> 
1999/0119    
#include <cursor.h> 
1995/0512    
#include "screen.h" 
 
1997/1101    
static int 
ark2000pvpageset(VGAscr*, int page) 
{ 
	uchar seq15; 
1995/0516    
 
1997/1101    
	seq15 = vgaxi(Seqx, 0x15); 
	vgaxo(Seqx, 0x15, page); 
	vgaxo(Seqx, 0x16, page); 
1995/0516    
 
1997/1101    
	return seq15; 
} 
 
1995/0512    
static void 
1997/1101    
ark2000pvpage(VGAscr* scr, int page) 
1995/0512    
{ 
1997/1101    
	lock(&scr->devlock); 
	ark2000pvpageset(scr, page); 
	unlock(&scr->devlock); 
1995/0512    
} 
 
1995/0516    
static void 
1997/1101    
ark2000pvdisable(VGAscr*) 
1995/0516    
{ 
	uchar seq20; 
 
	seq20 = vgaxi(Seqx, 0x20) & ~0x08; 
	vgaxo(Seqx, 0x20, seq20); 
} 
 
static void 
1997/1101    
ark2000pvenable(VGAscr* scr) 
1995/0516    
{ 
	uchar seq20; 
1997/1101    
	ulong storage; 
1995/0516    
 
	/* 
	 * Disable the cursor then configure for X-Windows style, 
1996/0216    
	 * 32x32 and 4/8-bit colour depth. 
1995/0516    
	 * Set cursor colours for 4/8-bit. 
	 */ 
	seq20 = vgaxi(Seqx, 0x20) & ~0x1F; 
	vgaxo(Seqx, 0x20, seq20); 
1996/0216    
	seq20 |= 0x18; 
1995/0516    
 
1999/1005    
	vgaxo(Seqx, 0x26, 0x00); 
	vgaxo(Seqx, 0x27, 0x00); 
	vgaxo(Seqx, 0x28, 0x00); 
	vgaxo(Seqx, 0x29, 0xFF); 
	vgaxo(Seqx, 0x2A, 0xFF); 
	vgaxo(Seqx, 0x2B, 0xFF); 
1995/0516    
 
	/* 
1996/0216    
	 * Cursor storage is a 256 byte or 1Kb block located in the last 
	 * 16Kb of video memory. Crt25 is the index of which block. 
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    
 
	/* 
	 * Enable the cursor. 
	 */ 
	vgaxo(Seqx, 0x20, seq20); 
} 
 
static void 
1997/1101    
ark2000pvload(VGAscr* scr, Cursor* curs) 
1995/0516    
{ 
1997/1101    
	uchar *p, seq10; 
	int opage, x, y; 
1995/0516    
 
	/* 
	 * Is linear addressing turned on? This will determine 
	 * how we access the cursor storage. 
	 */ 
1997/1101    
	seq10 = vgaxi(Seqx, 0x10); 
	opage = 0; 
	p = KADDR(scr->aperture); 
	if(!(seq10 & 0x10)){ 
1998/0116    
		lock(&scr->devlock); 
1997/1101    
		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 
	 * truth table: 
	 *	and xor	colour 
	 *	 0   0	underlying pixel colour 
	 *	 0   1	underlying pixel colour 
	 *	 1   0	background colour 
	 *	 1   1	foreground colour 
1996/0216    
	 * Put the cursor into the top-left of the 32x32 array. 
1995/0516    
	 * The manual doesn't say what the data layout in memory is - 
	 * this worked out by trial and error. 
	 */ 
1996/0216    
	for(y = 0; y < 32; y++){ 
		for(x = 0; x < 32/8; x++){ 
1995/0516    
			if(x < 16/8 && y < 16){ 
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; 
				*p++ = 0x00; 
1995/0516    
			} 
		} 
	} 
 
1997/1101    
	if(!(seq10 & 0x10)){ 
		ark2000pvpageset(scr, opage); 
		unlock(&scr->devlock); 
	} 
 
1995/0516    
	/* 
1997/1101    
	 * Save the cursor hotpoint. 
1995/0516    
	 */ 
1997/1101    
	scr->offset = curs->offset; 
1995/0516    
} 
 
static int 
1997/1101    
ark2000pvmove(VGAscr* scr, Point p) 
1995/0516    
{ 
	int x, xo, y, yo; 
 
	/* 
	 * Mustn't position the cursor offscreen even partially, 
	 * or it might disappear. Therefore, if x or y is -ve, adjust the 
	 * cursor origins instead. 
	 */ 
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; 
1997/1101    
	if((y = p.y+scr->offset.y) < 0){ 
1995/0516    
		yo = -y; 
1995/0822    
		y = 0; 
1995/0516    
	} 
	else 
1995/0822    
		yo = 0; 
1995/0516    
 
	/* 
	 * Load the new values. 
	 */ 
	vgaxo(Seqx, 0x2C, xo); 
	vgaxo(Seqx, 0x2D, yo); 
	vgaxo(Seqx, 0x21, (x>>8) & 0x0F); 
	vgaxo(Seqx, 0x22, x & 0xFF); 
	vgaxo(Seqx, 0x23, (y>>8) & 0x0F); 
	vgaxo(Seqx, 0x24, y & 0xFF); 
 
	return 0; 
} 
 
1997/1101    
VGAdev vgaark2000pvdev = { 
	"ark2000pv", 
1995/0516    
 
	0, 
1997/1101    
	0, 
1995/0512    
	ark2000pvpage, 
	0, 
}; 
 
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)