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

📄 vga.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
📖 第 1 页 / 共 5 页
字号:
        /* 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 + -