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

📄 vgavesa.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"#include "ureg.h"#define	Image	IMAGE#include <draw.h>#include <memdraw.h>#include <cursor.h>#include "screen.h"#define WORD(p) ((p)[0] | ((p)[1]<<8))#define LONG(p) ((p)[0] | ((p)[1]<<8) | ((p)[2]<<16) | ((p)[3]<<24))#define PWORD(p, v) (p)[0] = (v); (p)[1] = (v)>>8#define PLONG(p, v) (p)[0] = (v); (p)[1] = (v)>>8; (p)[2] = (v)>>16; (p)[3] = (v)>>24extern void realmode(Ureg*);static uchar*vbesetup(Ureg *u, int ax){	ulong pa;		pa = PADDR(RMBUF);	memset(u, 0, sizeof *u);	u->ax = ax;	u->es = (pa>>4)&0xF000;	u->di = pa&0xFFFF;	return (void*)RMBUF;}static voidvbecall(Ureg *u){	u->trap = 0x10;	realmode(u);	if((u->ax&0xFFFF) != 0x004F)		error("vesa bios error");}static voidvbecheck(void){	Ureg u;	uchar *p;	p = vbesetup(&u, 0x4F00);	strcpy((char*)p, "VBE2");	vbecall(&u);	if(memcmp((char*)p, "VESA", 4) != 0)		error("bad vesa signature");	if(p[5] < 2)		error("bad vesa version");}static intvbegetmode(void){	Ureg u;	vbesetup(&u, 0x4F03);	vbecall(&u);	return u.bx;}static uchar*vbemodeinfo(int mode){	uchar *p;	Ureg u;	p = vbesetup(&u, 0x4F01);	u.cx = mode;	vbecall(&u);	return p;}static voidvesalinear(VGAscr* scr, int, int){	int i, mode, size;	uchar *p;	ulong paddr;	Pcidev *pci;	vbecheck();	mode = vbegetmode();	/* bochs loses the top bits - cannot use this	if((mode&(1<<14)) == 0)		error("not in linear graphics mode");	*/	mode &= 0x3FFF;	p = vbemodeinfo(mode);	if(!(WORD(p+0) & (1<<4)))		error("not in VESA graphics mode");	if(!(WORD(p+0) & (1<<7)))		error("not in linear graphics mode");	paddr = LONG(p+40);	size = WORD(p+20)*WORD(p+16);	size = PGROUND(size);	/*	 * figure out max size of memory so that we have	 * enough if the screen is resized.	 */	pci = nil;	while((pci = pcimatch(pci, 0, 0)) != nil){		if(pci->ccrb != 3)			continue;		for(i=0; i<nelem(pci->mem); i++)			if(paddr == (pci->mem[i].bar&~0x0F)){				if(pci->mem[i].size > size)					size = pci->mem[i].size;				goto havesize;			}	}	/* no pci - heuristic guess */	if(size < 4*1024*1024)		size = 4*1024*1024;	else		size = ROUND(size, 1024*1024);havesize:	vgalinearaddr(scr, paddr, size);}VGAdev vgavesadev = {	"vesa",	0,	0,	0,	vesalinear,	0,	0,	0,	0,	0,};

⌨️ 快捷键说明

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