⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vgaclgd542x.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "u.h"#include "../port/lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "io.h"#include "../port/error.h"#define	Image	IMAGE#include <draw.h>#include <memdraw.h>#include <cursor.h>#include "screen.h"static intclgd542xpageset(VGAscr*, int page){	uchar gr09;	int opage;		if(vgaxi(Seqx, 0x07) & 0xF0)		page = 0;	gr09 = vgaxi(Grx, 0x09);	if(vgaxi(Grx, 0x0B) & 0x20){		vgaxo(Grx, 0x09, page<<2);		opage = gr09>>2;	}	else{		vgaxo(Grx, 0x09, page<<4);		opage = gr09>>4;	}	return opage;}static voidclgd542xpage(VGAscr* scr, int page){	lock(&scr->devlock);	clgd542xpageset(scr, page);	unlock(&scr->devlock);}static voidclgd542xlinear(VGAscr* scr, int, int){	vgalinearpciid(scr, 0x1013, 0);}static voidclgd542xdisable(VGAscr*){	uchar sr12;	sr12 = vgaxi(Seqx, 0x12);	vgaxo(Seqx, 0x12, sr12 & ~0x01);}static voidclgd542xenable(VGAscr* scr){	uchar sr12;	int mem, x; 	/*	 * Disable the cursor.	 */	sr12 = vgaxi(Seqx, 0x12);	vgaxo(Seqx, 0x12, sr12 & ~0x01);	/*	 * Cursor colours.	 * Can't call setcolor here as cursor is already locked.	 */	vgaxo(Seqx, 0x12, sr12|0x02);	vgao(PaddrW, 0x00);	vgao(Pdata, Pwhite);	vgao(Pdata, Pwhite);	vgao(Pdata, Pwhite);	vgao(PaddrW, 0x0F);	vgao(Pdata, Pblack);	vgao(Pdata, Pblack);	vgao(Pdata, Pblack);	vgaxo(Seqx, 0x12, sr12);	mem = 0;	switch(vgaxi(Crtx, 0x27) & ~0x03){	case 0x88:				/* CL-GD5420 */	case 0x8C:				/* CL-GD5422 */	case 0x94:				/* CL-GD5424 */	case 0x80:				/* CL-GD5425 */	case 0x90:				/* CL-GD5426 */	case 0x98:				/* CL-GD5427 */	case 0x9C:				/* CL-GD5429 */		/*		 * The BIOS leaves the memory size in Seq0A, bits 4 and 3.		 * See Technical Reference Manual Appendix E1, Section 1.3.2.		 *		 * The storage area for the 64x64 cursors is the last 16Kb of		 * display memory.		 */		mem = (vgaxi(Seqx, 0x0A)>>3) & 0x03;		break;	case 0xA0:				/* CL-GD5430 */	case 0xA8:				/* CL-GD5434 */	case 0xAC:				/* CL-GD5436 */	case 0xB8:				/* CL-GD5446 */	case 0x30:				/* CL-GD7543 */		/*		 * Attempt to intuit the memory size from the DRAM control		 * register. Minimum is 512KB.		 * If DRAM bank switching is on then there's double.		 */		x = vgaxi(Seqx, 0x0F);		mem = (x>>3) & 0x03;		if(x & 0x80)			mem++;		break;	case 0xBC:				/* CL-GD5480 */		mem = 2;			/* 1024 = 256<<2 */		x = vgaxi(Seqx, 0x0F);		if((x & 0x18) == 0x18){			mem <<= 1;		/* 2048 = 256<<3 */			if(x & 0x80)				mem <<= 2;	/* 2048 = 256<<4 */		}		if(vgaxi(Seqx, 0x17) & 0x80)			mem <<= 1;		break;	default:				/* uh, ah dunno */		break;	}	scr->storage = ((256<<mem)-16)*1024;	/*	 * Set the current cursor to index 0	 * and turn the 64x64 cursor on.	 */	vgaxo(Seqx, 0x13, 0);	vgaxo(Seqx, 0x12, sr12|0x05);}static voidclgd542xinitcursor(VGAscr* scr, int xo, int yo, int index){	uchar *p, seq07;	uint p0, p1;	int opage, x, y;	/*	 * Is linear addressing turned on? This will determine	 * how we access the cursor storage.	 */	seq07 = vgaxi(Seqx, 0x07);	opage = 0;	p = scr->vaddr;	if(!(seq07 & 0xF0)){		lock(&scr->devlock);		opage = clgd542xpageset(scr, scr->storage>>16);		p += (scr->storage & 0xFFFF);	}	else		p += scr->storage;	p += index*1024;	for(y = yo; y < 16; y++){		p0 = scr->set[2*y];		p1 = scr->set[2*y+1];		if(xo){			p0 = (p0<<xo)|(p1>>(8-xo));			p1 <<= xo;		}		*p++ = p0;		*p++ = p1;		for(x = 16; x < 64; x += 8)			*p++ = 0x00;		p0 = scr->clr[2*y]|scr->set[2*y];		p1 = scr->clr[2*y+1]|scr->set[2*y+1];		if(xo){			p0 = (p0<<xo)|(p1>>(8-xo));			p1 <<= xo;		}		*p++ = p0;		*p++ = p1;		for(x = 16; x < 64; x += 8)			*p++ = 0x00;	}	while(y < 64+yo){		for(x = 0; x < 64; x += 8){			*p++ = 0x00;			*p++ = 0x00;		}		y++;	}	if(!(seq07 & 0xF0)){		clgd542xpageset(scr, opage);		unlock(&scr->devlock);	}}static voidclgd542xload(VGAscr* scr, Cursor* curs){	uchar sr12;	/*	 * Disable the cursor.	 */	sr12 = vgaxi(Seqx, 0x12);	vgaxo(Seqx, 0x12, sr12 & ~0x01);	memmove(&scr->Cursor, curs, sizeof(Cursor));	clgd542xinitcursor(scr, 0, 0, 0);	/*	 * Enable the cursor.	 */	vgaxo(Seqx, 0x13, 0);	vgaxo(Seqx, 0x12, sr12|0x05);}static intclgd542xmove(VGAscr* scr, Point p){	int index, x, xo, y, yo;	index = 0;	if((x = p.x+scr->offset.x) < 0){		xo = -x;		x = 0;	}	else		xo = 0;	if((y = p.y+scr->offset.y) < 0){		yo = -y;		y = 0;	}	else		yo = 0;	if(xo || yo){		clgd542xinitcursor(scr, xo, yo, 1);		index = 1;	}	vgaxo(Seqx, 0x13, index<<2);		vgaxo(Seqx, 0x10|((x & 0x07)<<5), (x>>3) & 0xFF);	vgaxo(Seqx, 0x11|((y & 0x07)<<5), (y>>3) & 0xFF);	return 0;}VGAdev vgaclgd542xdev = {	"clgd542x",	0,	0,	clgd542xpage,	clgd542xlinear,};VGAcur vgaclgd542xcur = {	"clgd542xhwgc",	clgd542xenable,	clgd542xdisable,	clgd542xload,	clgd542xmove,};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -