📄 vga.c
字号:
/* clear screen and switch to it */ fwrite("\e[H\e[J", 6, 1, stderr); fflush(stderr); if (svgalib_vc != vts.v_active) { startup_vc = vts.v_active; ioctl(__svgalib_tty_fd, VT_ACTIVATE, svgalib_vc); __svgalib_waitvtactive(); } } else {error: if (__svgalib_tty_fd > 2) close(__svgalib_tty_fd); __svgalib_tty_fd = - 1; printf("Not running in a graphics capable console,\n" "and unable to find one.\n"); }}void __svgalib_get_perm(void){ static int done = 0; /* Only do this once. */ if (done) return; done = 1; /* Get I/O permissions for VGA registers. */ /* If IOPERM is set, assume permissions have already been obtained */ /* by a calling (exec-ing) process, e.g. ioperm(1). */ if (CHIPSET != FBDEV && getenv("IOPERM") == NULL)#ifdef __alpha__ if (ioperm(0x0000, 0x10000, 1)) { printf("svgalib: Cannot get I/O permissions.\n"); exit(1); }#else if (ioperm(0x3b4, 0x3df - 0x3b4 + 1, 1)) { printf("svgalib: Cannot get I/O permissions.\n"); exit(1); }#endif /* Open /dev/mem (also needs supervisor rights; ioperm(1) can be */ /* used together with a special group that has r/w access on */ /* /dev/mem to facilitate this). */ open_mem(); __svgalib_open_devconsole(); /* color or monochrome text emulation? */ if (CHIPSET != EGA && CHIPSET != FBDEV && !__svgalib_novga) color_text = port_in(MIS_R) & 0x01; else color_text = 1; /* EGA is assumed color */ /* chose registers for color/monochrome emulation */ if (color_text) { __svgalib_CRT_I = CRT_IC; __svgalib_CRT_D = CRT_DC; __svgalib_IS1_R = IS1_RC; } else { __svgalib_CRT_I = CRT_IM; __svgalib_CRT_D = CRT_DM; __svgalib_IS1_R = IS1_RM; }}void __svgalib_delay(void){ int i; for (i = 0; i < 10; i++);}/* The Xfree server uses a slow copy, may help us too ... */#if defined(CONFIG_ALPHA_JENSEN)extern unsigned long vga_readl(unsigned long base, unsigned long off);extern void vga_writel(unsigned long b, unsigned long base, unsigned long off);static void slowcpy_from_sm(unsigned char *dest, unsigned char *src, unsigned bytes){ long i; if (((long) dest & 7) || ((long) src & 7) || bytes & 7) { printf("svgalib: unaligned slowcpy()!\n"); exit(1); } for (i = 0; i < bytes; i++) { *(dest + i) = (*(unsigned long *) (src + (i << 7)) >> ((i & 0x03) * 8)) & 0xffUL; }}static void slowcpy_to_sm(unsigned char *dest, unsigned char *src, unsigned bytes){ long i; if (((long) dest & 7) || ((long) src & 7) || bytes & 7) { printf("svgalib: unaligned slowcpy()!\n"); exit(1); } for (i = 0; i < bytes; i++) { *(unsigned long *) (dest + (i << 7)) = (*(unsigned char *) (src + i)) * 0x01010101UL; }}#elsestatic void slowcpy(unsigned char *dest, unsigned char *src, unsigned bytes){#ifdef __alpha__ if (((long) dest & 7) || ((long) src & 7) || bytes & 7) { printf("svgalib: unaligned slowcpy()!\n"); exit(1); } while (bytes > 0) { *(long *) dest = *(long *) src; dest += 8; src += 8; bytes -= 8; }#else while (bytes-- > 0) *(dest++) = *(src++);#endif}#endif#define TEXT_SIZE 65536static void restore_text(void){ __svgalib_outseq(0x02,0x01); #ifdef __alpha__ port_out(0x06, GRA_I); port_out(0x00, GRA_D);#endif#ifdef BACKGROUND if (-1 == mprotect(text_buf1,TEXT_SIZE*2,PROT_READ|PROT_WRITE)) { printf("svgalib: Memory protect error\n"); exit(-1); }#endif#if defined(CONFIG_ALPHA_JENSEN) slowcpy_to_sm(SM, text_buf1, TEXT_SIZE);#else slowcpy(GM, text_buf1, TEXT_SIZE);#endif __svgalib_outseq(0x02,0x02);#if defined(CONFIG_ALPHA_JENSEN) slowcpy_to_sm(SM, text_buf2, TEXT_SIZE);#else slowcpy(GM, text_buf2, TEXT_SIZE);#endif#ifdef BACKGROUND if (-1 == mprotect(text_buf1,TEXT_SIZE*2,PROT_READ)) { printf("svgalib: Memory protect error\n"); exit(1); }#endif};static void save_text(void){#ifndef BACKGROUND text_buf1 = malloc(TEXT_SIZE * 2);#endif#ifdef BACKGROUND text_buf1 = valloc(TEXT_SIZE * 2); #endif text_buf2 = text_buf1 + TEXT_SIZE; port_out(0x04, GRA_I); port_out(0x00, GRA_D);#ifdef __alpha__ port_out(0x06, GRA_I); port_out(0x00, GRA_D);#endif#if defined(CONFIG_ALPHA_JENSEN) slowcpy_from_sm(text_buf1, SM, TEXT_SIZE);#else slowcpy(text_buf1, GM, TEXT_SIZE);#endif /* save font data in plane 3 */ port_out(0x04, GRA_I); port_out(0x01, GRA_D);#if defined(CONFIG_ALPHA_JENSEN) slowcpy_from_sm(text_buf2, SM, TEXT_SIZE);#else slowcpy(text_buf2, GM, TEXT_SIZE);#endif#ifdef BACKGROUND /* Let's protect font. */ /* Read only */ if (-1 == mprotect(text_buf1,TEXT_SIZE*2,PROT_READ)) { printf("svgalib: Memory protect error\n"); exit(-1); }#endif};int __svgalib_saveregs(unsigned char *regs){ int i; if (__svgalib_chipset == EGA || __svgalib_novga) { /* Special case: Don't save standard VGA registers. */ return chipset_saveregs(regs); } /* save VGA registers */ for (i = 0; i < CRT_C; i++) { regs[CRT + i] = __svgalib_incrtc(i); } for (i = 0; i < ATT_C; i++) { port_in(__svgalib_IS1_R); __svgalib_delay(); port_out(i, ATT_IW); __svgalib_delay(); regs[ATT + i] = port_in(ATT_R); __svgalib_delay(); } for (i = 0; i < GRA_C; i++) { port_out(i, GRA_I); regs[GRA + i] = port_in(GRA_D); } for (i = 0; i < SEQ_C; i++) { port_out(i, SEQ_I); regs[SEQ + i] = port_in(SEQ_D); } regs[MIS] = __svgalib_inmisc(); i = chipset_saveregs(regs); /* save chipset-specific registers */ /* i : additional registers */ if (!SCREENON) { /* We turned off the screen */ port_in(__svgalib_IS1_R); __svgalib_delay(); port_out(0x20, ATT_IW); } return CRT_C + ATT_C + GRA_C + SEQ_C + 1 + i;}int __svgalib_setregs(const unsigned char *regs){ int i; if(__svgalib_novga) return 1; if (__svgalib_chipset == EGA) { /* Enable graphics register modification */ port_out(0x00, GRA_E0); port_out(0x01, GRA_E1); } /* update misc output register */ __svgalib_outmisc(regs[MIS]); /* synchronous reset on */ __svgalib_outseq(0x00,0x01); /* write sequencer registers */ __svgalib_outseq(0x01,regs[SEQ + 1] | 0x20); port_out(1, SEQ_I); port_out(regs[SEQ + 1] | 0x20, SEQ_D); for (i = 2; i < SEQ_C; i++) { __svgalib_outseq(i,regs[SEQ + i]); } /* synchronous reset off */ __svgalib_outseq(0x00,0x03); if (__svgalib_chipset != EGA) { /* deprotect CRT registers 0-7 */ __svgalib_outcrtc(0x11,__svgalib_incrtc(0x11)&0x7f); } /* write CRT registers */ for (i = 0; i < CRT_C; i++) { __svgalib_outcrtc(i,regs[CRT + i]); } /* write graphics controller registers */ for (i = 0; i < GRA_C; i++) { port_out(i, GRA_I); port_out(regs[GRA + i], GRA_D); } /* write attribute controller registers */ for (i = 0; i < ATT_C; i++) { port_in(__svgalib_IS1_R); /* reset flip-flop */ __svgalib_delay(); port_out(i, ATT_IW); __svgalib_delay(); port_out(regs[ATT + i], ATT_IW); __svgalib_delay(); } return 0;}/* We invoke the old interrupt handler after setting text mode *//* We catch all signals that cause an exit by default (aka almost all) */static char sig2catch[] ={SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGIOT, SIGBUS, SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, SIGXCPU, SIGXFSZ, SIGVTALRM,/* SIGPROF ,*/ SIGPWR};static struct sigaction old_signal_handler[sizeof(sig2catch)];struct vt_mode __svgalib_oldvtmode;static void restoretextmode(void){ /* handle unexpected interrupts - restore text mode and exit */ keyboard_close(); /* Restore a setting screwed by keyboard_close (if opened in graphicsmode) */ set_texttermio(); if (CM != TEXT) vga_setmode(TEXT); if (!__svgalib_screenon) vga_screenon(); if (__svgalib_tty_fd >= 0) { if (!__svgalib_secondary) { ioctl(__svgalib_tty_fd, KDSETMODE, KD_TEXT); ioctl(__svgalib_tty_fd, VT_SETMODE, &__svgalib_oldvtmode); } } if((__svgalib_textprog&3)==3){ pid_t child; if((child=fork())==0){ execv(__svgalib_TextProg,__svgalib_TextProg_argv); } else { waitpid(child,NULL,0); }; };}static void idle_accel(void) { /* wait for the accel to finish, we assume one of the both interfaces suffices */ if (vga_ext_set(VGA_EXT_AVAILABLE, VGA_AVAIL_ACCEL) & ACCELFLAG_SYNC) vga_accel(ACCEL_SYNC); else if (vga_getmodeinfo(CM)->haveblit & HAVE_BLITWAIT) vga_blitwait();}static void signal_handler(int v){ int i; /* If we have accelerated functions, possibly wait for the * blitter to finish. I hope the PutBitmap functions disable * interrupts while writing data to the screen, otherwise * this will cause an infinite loop. */ idle_accel(); restoretextmode(); printf("svgalib: Signal %d: %s received%s.\n", v, strsignal(v), (v == SIGINT) ? " (ctrl-c pressed)" : ""); for (i = 0; i < sizeof(sig2catch); i++) if (sig2catch[i] == v) { sigaction(v, old_signal_handler + i, NULL); raise(v); break; } if (i >= sizeof(sig2catch)) { printf("svgalib: Aieeee! Illegal call to signal_handler, raising segfault.\n"); raise(SIGSEGV); }}int __svgalib_getchipset(void){ readconfigfile(); /* Make sure the config file is read. *//* Unlike the others, the FBDev test needs to be before __svgalib_get_perm() */#ifdef INCLUDE_FBDEV_DRIVER_TEST if (CHIPSET == UNDEFINED && __svgalib_fbdev_driverspecs.test()) { CHIPSET = FBDEV; __svgalib_setpage = __svgalib_driverspecs->__svgalib_setpage; __svgalib_setrdpage = __svgalib_driverspecs->__svgalib_setrdpage; __svgalib_setwrpage = __svgalib_driverspecs->__svgalib_setwrpage; }#endif __svgalib_get_perm(); if (CHIPSET == UNDEFINED) { CHIPSET = VGA; /* Protect against recursion */#ifdef INCLUDE_NV3_DRIVER_TEST if (__svgalib_nv3_driverspecs.test()) CHIPSET = NV3; else#endif#ifdef INCLUDE_G400_DRIVER_TEST if (__svgalib_g400_driverspecs.test()) CHIPSET = G400; else#endif#ifdef INCLUDE_R128_DRIVER_TEST if (__svgalib_r128_driverspecs.test()) CHIPSET = R128; else#endif#ifdef INCLUDE_BANSHEE_DRIVER_TEST if (__svgalib_banshee_driverspecs.test()) CHIPSET = BANSHEE; else#endif#ifdef INCLUDE_SIS_DRIVER_TEST if (__svgalib_sis_driverspecs.test()) CHIPSET = SIS; else#endif#ifdef INCLUDE_I740_DRIVER_TEST if (__svgalib_i740_driverspecs.test()) CHIPSET = I740; else#endif#ifdef INCLUDE_LAGUNA_DRIVER_TEST if (__svgalib_laguna_driverspecs.test()) CHIPSET = LAGUNA; else#endif#ifdef INCLUDE_RAGE_DRIVER_TEST if (__svgalib_rage_driverspecs.test()) CHIPSET = RAGE; else#endif#ifdef INCLUDE_MX_DRIVER_TEST if (__svgalib_mx_driverspecs.test()) CHIPSET = MX; else#endif#ifdef INCLUDE_SAVAGE_DRIVER_TEST if (__svgalib_savage_driverspecs.test()) CHIPSET = SAVAGE; else#endif#ifdef INCLUDE_NEO_DRIVER_TEST if (__svgalib_neo_driverspecs.test()) CHIPSET = NEOMAGIC; else#endif#ifdef INCLUDE_CHIPS_DRIVER_TEST if (__svgalib_chips_driverspecs.test()) CHIPSET = CHIPS; else#endif#ifdef INCLUDE_MACH64_DRIVER_TEST if (__svgalib_mach64_driverspecs.test()) CHIPSET = MACH64; else#endif#ifdef INCLUDE_MACH32_DRIVER_TEST if (__svgalib_mach32_driverspecs.test()) CHIPSET = MACH32; else#endif#ifdef INCLUDE_EGA_DRIVER_TEST if (__svgalib_ega_driverspecs.test()) CHIPSET = EGA; else#endif#ifdef INCLUDE_ET6000_DRIVER_TEST /* DS */ if (__svgalib_et6000_driverspecs.test()) /* This must be before */ CHIPSET = ET6000; /* ET4000 or the card */ else /* will be called et4k */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -