📄 vga.c
字号:
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 + -