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

📄 vga.c

📁 基于组件方式开发操作系统的OSKIT源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    if (saved_modeX)	vga_setmodeX();    restorepalette(graph_red, graph_green, graph_blue);    if (CM == G320x200x256 && VMEM <= 65536) {	memcpy(GM, graph_buf, 65536);    } else if (MODEX || CM == G800x600x16 || (STDVGAMODE(CM) && CM != G320x200x256)) {	int setresetreg, planereg;	/* disable Set/Reset Register */	port_out(0x01, GRA_I);	setresetreg = inb(GRA_D);	port_out(0x00, GRA_D);	outb(SEQ_I, 0x02);	planereg = inb(SEQ_D);	for (i = 0; i < 4; i++) {	    /* restore plane i */	    port_out(0x02, SEQ_I);	    port_out(1 << i, SEQ_D);	    memcpy(GM, graph_buf + i * GRAPH_SIZE, GRAPH_SIZE);	}	outb(GRA_I, 0x01);	outb(GRA_D, setresetreg);	outb(SEQ_I, 0x02);	outb(SEQ_D, planereg);    } else if (CI.colors == 16) {	int page, size, rbytes;	unsigned char *rp;	int setresetreg, planereg;	/* disable Set/Reset Register */	port_out(0x01, GRA_I);	if (CHIPSET == EGA)	    setresetreg = 0;	else	    setresetreg = inb(GRA_D);	port_out(0x00, GRA_D);	port_out(0x02, SEQ_I);	if (CHIPSET == EGA)	    planereg = 0;	else	    planereg = inb(SEQ_D);	size = VMEM;	rp = graph_buf;	for (page = 0; size > 0; ++page) {	    vga_setpage(page);	    rbytes = (size > GRAPH_SIZE) ? GRAPH_SIZE : size;	    for (i = 0; i < 4; i++) {		/* save plane i */		port_out(0x02, SEQ_I);		port_out(1 << i, SEQ_D);		memcpy(GM, rp, rbytes);		rp += rbytes;	    }	    size -= rbytes;	}	outb(GRA_I, 0x01);	outb(GRA_D, setresetreg);	outb(SEQ_I, 0x02);	outb(SEQ_D, planereg);    } else {/*              vga_modeinfo *modeinfo; */	int size;	int page;	size = VMEM;#ifdef DEBUG	printf("Restoring %dK of video memory.\n", (size + 2) / 1024);#endif	page = 0;	while (size >= 65536) {	    vga_setpage(page);	    memcpy(GM, graph_buf + page * 65536, 65536);	    size -= 65536;	    page++;	}	if (size > 0) {	    vga_setpage(page);	    memcpy(GM, graph_buf + page * 65536, size);	}    }    if (saved_logicalwidth != CI.xbytes)	vga_setlogicalwidth(saved_logicalwidth);    if (saved_page != 0)	vga_setpage(saved_page);    if (saved_displaystart != 0)	vga_setdisplaystart(saved_displaystart);    vga_screenon();    free(graph_buf);}int vga_getch(void){    char c;    if (CM == TEXT)	return -1;    while ((read(__svgalib_tty_fd, &c, 1) < 0) && (errno == EINTR));    return c;}#ifdef BACKGROUNDint __svgalib_flip_status(void){ return(flip);}#endif/* I have kept the slightly funny 'flip' terminology. */void __svgalib_flipaway(void){    /* Leaving console. */    flip_mode = CM;#ifndef SVGA_AOUT    __joystick_flip_vc(0);#endif    if (CM != TEXT) {	/* wait for any blitter operation to finish */	idle_accel();	/* Save state and go to textmode. */	savestate();	flip = 1;	vga_setmode(TEXT);	flip = 0;#ifdef BACKGROUND/* Let's put bg screen to right place */#if BACKGROUND == 1        if (__svgalib_currentpage<0) __svgalib_currentpage=0;        __svgalib_map_virtual_screen(__svgalib_currentpage);#endif#if BACKGROUND == 2        __svgalib_graph_mem=graph_buf+(GRAPH_SIZE*__svgalib_currentpage);#endif	__svgalib_oktowrite=0; /* screen is fliped, not __svgalib_oktowrite. */#endif    }}#ifndef BACKGROUNDstatic void __svgalib_flipback(void)#endif#ifdef BACKGROUNDvoid __svgalib_flipback(void)#endif{#ifdef BACKGROUND int tmp_page=__svgalib_currentpage;#endif    /* Entering console. */    /* Hmmm... and how about unlocking anything someone else locked? */#ifndef SVGA_AOUT    __joystick_flip_vc(1);#endif    chipset_unlock();    if (flip_mode != TEXT) {	/* Restore graphics mode and state. */#ifdef BACKGROUND	__svgalib_oktowrite=1;#endif	flip = 1;	vga_setmode(flip_mode);	flip = 0;#ifdef BACKGROUND#if BACKGROUND == 1        __svgalib_map_virtual_screen(1000000);	#endif#if BACKGROUND == 2        __svgalib_graph_mem=__svgalib_graph_mem_orginal;#endif#endif		restorestate();#ifdef BACKGROUND /* Has to make sure right page is on. */        vga_setpage(tmp_page);	vga_setcolor(COL);#endif       }}int vga_flip(void){#ifdef BACKGROUND int tmp_page=__svgalib_currentpage;#endif        if (CM != TEXT) {		/* save state and go to textmode */	savestate();	flip_mode = CM;	flip = 1;	vga_setmode(TEXT);	flip = 0;#ifdef BACKGROUND/* Lets put bg screen to right place */#if BACKGROUND == 1        if (__svgalib_currentpage<0) __svgalib_currentpage=0;        __svgalib_map_virtual_screen(__svgalib_currentpage);#endif#if BACKGROUND == 2        __svgalib_graph_mem=graph_buf+(GRAPH_SIZE*__svgalib_currentpage);;#endif	__svgalib_oktowrite=0; /* screen is fliped, not __svgalib_oktowrite. */#endif    } else {			/* restore graphics mode and state */#ifdef BACKGROUND        __svgalib_oktowrite=1;	/* Probably here too ...  */	chipset_unlock();#endif	flip = 1;	vga_setmode(flip_mode);	flip = 0;#ifdef BACKGROUND#if BACKGROUND == 1        __svgalib_map_virtual_screen(1000000);	#endif#if BACKGROUND == 2        __svgalib_graph_mem=__svgalib_graph_mem_orginal;#endif#endif		restorestate();#ifdef BACKGROUND /* Has to make sure right page is on. */        vga_setpage(tmp_page);	vga_setcolor(COL);#endif    }    return 0;}int vga_setflipchar(int c)/* This function is obsolete. Retained for VGAlib compatibility. */{    __svgalib_flipchar = c;    return 0;}#endif /* NOTYET */void vga_setlogicalwidth(int w){    __svgalib_driverspecs->setlogicalwidth(w);    currentlogicalwidth = w;}void vga_setdisplaystart(int a){    currentdisplaystart = a;    if (CHIPSET != VGA && CHIPSET != EGA)	if (MODEX || CI.colors == 16) {	    /* We are currently using a Mode X-like mode on a */	    /* SVGA card, use the standard VGA function */	    /* that works properly for Mode X. */	    /* Same goes for 16 color modes. */	    __svgalib_vga_driverspecs.setdisplaystart(a);	    return;	}    /* Call the regular display start function for the chipset */    __svgalib_driverspecs->setdisplaystart(a);}void vga_bitblt(int srcaddr, int destaddr, int w, int h, int pitch){    __svgalib_driverspecs->bitblt(srcaddr, destaddr, w, h, pitch);}void vga_imageblt(void *srcaddr, int destaddr, int w, int h, int pitch){    __svgalib_driverspecs->imageblt(srcaddr, destaddr, w, h, pitch);}void vga_fillblt(int destaddr, int w, int h, int pitch, int c){    __svgalib_driverspecs->fillblt(destaddr, w, h, pitch, c);}void vga_hlinelistblt(int ymin, int n, int *xmin, int *xmax, int pitch,		      int c){    __svgalib_driverspecs->hlinelistblt(ymin, n, xmin, xmax, pitch, c);}void vga_blitwait(void){    __svgalib_driverspecs->bltwait();}int vga_ext_set(unsigned what,...){    va_list params;    register int retval = 0;    switch(what) {	case VGA_EXT_AVAILABLE:	    /* Does this use of the arglist corrupt non-AVAIL_ACCEL ext_set? */	    va_start(params, what);	    switch (va_arg(params, int)) {		case VGA_AVAIL_ACCEL:		if (__svgalib_driverspecs->accelspecs != NULL)		    retval = __svgalib_driverspecs->accelspecs->operations;		break;	    case VGA_AVAIL_ROP:		if (__svgalib_driverspecs->accelspecs != NULL)		    retval = __svgalib_driverspecs->accelspecs->ropOperations;		break;	    case VGA_AVAIL_TRANSPARENCY:		if (__svgalib_driverspecs->accelspecs != NULL)		    retval = __svgalib_driverspecs->accelspecs->transparencyOperations;		break;	    case VGA_AVAIL_ROPMODES:		if (__svgalib_driverspecs->accelspecs != NULL)		    retval = __svgalib_driverspecs->accelspecs->ropModes;		break;	    case VGA_AVAIL_TRANSMODES:		if (__svgalib_driverspecs->accelspecs != NULL)		    retval = __svgalib_driverspecs->accelspecs->transparencyModes;		break;	    case VGA_AVAIL_SET:		retval = (1 << VGA_EXT_PAGE_OFFSET) |			 (1 << VGA_EXT_FONT_SIZE);	/* These are handled by us */		break;	    }	    va_end(params);	    break;	case VGA_EXT_PAGE_OFFSET:	    /* Does this use of the arglist corrupt it? */	    va_start(params, what);	    retval = vga_page_offset;	    vga_page_offset = va_arg(params, int);	    va_end(params);	    return retval;	case VGA_EXT_FONT_SIZE:	    va_start(params, what);	    what = va_arg(params, unsigned int);	    va_end(params);	    if (!what)		return FONT_SIZE;	    retval = fontbufsize;	    fontbufsize = what;	    return retval;    }    if ((CM != TEXT) && (MODEFLAGS & HAVE_EXT_SET)) {	va_start(params, what);	retval |= __svgalib_driverspecs->ext_set(what, params);	va_end(params);    }    return retval;}#ifndef OSKITint vga_getmousetype(void){    readconfigfile();    return mouse_type | mouse_modem_ctl;}#endif /* !OSKIT */int vga_getmonitortype(void){				/* obsolete */    int i;    readconfigfile();    for (i = 1; i <= MON1024_72; i++)	if (__svgalib_horizsync.max < __svgalib_maxhsync[i])	    return i - 1;    return MON1024_72;}#ifndef OSKITvoid vga_setmousesupport(int s){    mouse_support = s;}#endif /* !OSKIT */#ifdef BACKGROUNDunsigned char *__svgalib_give_graph_red(void){ return(graph_red);}unsigned char *__svgalib_give_graph_green(void){ return(graph_green);}unsigned char *__svgalib_give_graph_blue(void){ return(graph_blue);}#endifint vga_oktowrite(void){    return __svgalib_oktowrite;}int vga_init(void){    int retval = 0;#ifndef OSKIT    __svgalib_open_devconsole();    if (__svgalib_tty_fd < 0) {	/* Return with error code. */	/* Since the configuration file hasnt been read yet, security will	   only be set to 1 if it has been compiled into the program */	retval = -1;    } else {#endif /* !OSKIT */        readconfigfile();        vga_hasmode(TEXT); /* Force driver message and initialization. */#ifndef OSKIT    }    /* Michael: I assume this is a misunderstanding, when svgalib was developed,       there were no saved uids, thus setting effective uid sufficed... */    if ( __svgalib_security_revokeallprivs == 1 ) {	setuid(getuid());  	setgid(getgid());    }    seteuid(getuid());    setegid(getgid());#endif /* !OSKIT */    return retval;}#ifdef NOTYET#ifdef __alpha__#define vuip	volatile unsigned int *extern void sethae(unsigned long hae);static struct hae hae;int iopl(int level){    return 0;}unsigned long vga_readb(unsigned long base, unsigned long off){    unsigned long result, shift;#if !defined(CONFIG_ALPHA_JENSEN)    unsigned long msb;#endif    shift = (off & 0x3) * 8;#if !defined(CONFIG_ALPHA_JENSEN)    if (off >= (1UL << 24)) {	msb = off & 0xf8000000;	off -= msb;	if (msb && msb != hae.cache) {	    sethae(msb);	}    }#endif    result = *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_BYTE);    result >>= shift;    return 0xffUL & result;}unsigned long vga_readw(unsigned long base, unsigned long off){    unsigned long result, shift;#if !defined(CONFIG_ALPHA_JENSEN)    unsigned long msb;#endif    shift = (off & 0x3) * 8;#if !defined(CONFIG_ALPHA_JENSEN)    if (off >= (1UL << 24)) {	msb = off & 0xf8000000;	off -= msb;	if (msb && msb != hae.cache) {	    sethae(msb);	}    }#endif    result = *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_WORD);    result >>= shift;    return 0xffffUL & result;}#if defined(CONFIG_ALPHA_JENSEN)unsigned long vga_readl(unsigned long base, unsigned long off){    unsigned long result;    result = *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_LONG);    return 0xffffffffUL & result;}#endifvoid vga_writeb(unsigned char b, unsigned long base, unsigned long off){#if !defined(CONFIG_ALPHA_JENSEN)    unsigned long msb;    unsigned int w;    if (off >= (1UL << 24)) {	msb = off & 0xf8000000;	off -= msb;	if (msb && msb != hae.cache) {	    sethae(msb);	}    }  asm("insbl %2,%1,%0": "r="(w):"ri"(off & 0x3), "r"(b));    *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_BYTE) = w;#else    *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_BYTE) = b * 0x01010101;#endif}void vga_writew(unsigned short b, unsigned long base, unsigned long off){#if !defined(CONFIG_ALPHA_JENSEN)    unsigned long msb;    unsigned int w;    if (off >= (1UL << 24)) {	msb = off & 0xf8000000;	off -= msb;	if (msb && msb != hae.cache) {	    sethae(msb);	}    }  asm("inswl %2,%1,%0": "r="(w):"ri"(off & 0x3), "r"(b));    *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_WORD) = w;#else    *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_WORD) = b * 0x00010001;#endif}#if defined(CONFIG_ALPHA_JENSEN)void vga_writel(unsigned long b, unsigned long base, unsigned long off){    *(vuip) ((off << MEM_SHIFT) + base + MEM_TYPE_LONG) = b;}#endif#endif#endif /* !NOTYET */

⌨️ 快捷键说明

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