📄 init.c
字号:
*/voidInitOutput(pScreenInfo, argc, argv) ScreenInfo *pScreenInfo; int argc; char **argv;{ int i; FILE *in; static int firstTime = 1; static int numScreens; static ScreenTableRec *FoundScreens[MAXSCREENS]; ScreenTableRec *s;#ifdef hpux char *dispaddr, *getenv();#endif struct stat statbuf; char minornumber[10]; /* * test for data alignment restriction of this cpu. If this cpu * doesn't allow long-word writes on an odd address, then we assume * that it requires quad-word alignment. This reduces our headaches * to only two cases - 68020s (no restrictions) and others (e.g. * 68010 and Spectrum). */ { int *test; char foo[8]; static struct sigvec timeout_vec = { sigbusHandler, 0, 0 }; struct sigvec old_vec; test = (int *) ((int)foo | 3) + 1; /* generate an odd address */ XHP_QUADALIGN = 0;#ifdef hp300#define sigvector sigvec#endif#if defined(hp9000s300) || defined(hp300) /* check for 310 */ sigvector(SIGBUS, &timeout_vec, &old_vec); if(!setjmp(env)) *test = 1; /* generate a bus error on 68010s or Spectrums */ sigvector(SIGBUS, &old_vec, 0);#else /* need word align on 800 */ XHP_QUADALIGN = 1;#endif /* hp9000s300 */ } iomapBase = (unsigned char *) IOMAP_BASE;#ifdef hpux if (dispaddr = getenv("SB_DISPLAY_ADDR")) iomapBase = (unsigned char *) strtol(dispaddr, (char **)NULL, 0);#endif pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER; pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT; pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD; pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER; pScreenInfo->numPixmapFormats = NUMFORMATS; for (i=0; i< NUMFORMATS; i++) pScreenInfo->formats[i] = formats[i]; if (firstTime) { firstTime = 0; (void) sprintf(xscreens, "%s/X%sscreens", LIBDIR, display); if (NULL == (in = fopen (xscreens, "r"))) { perror(xscreens); ErrorF("Can't open screen configuration file, defaulting to %s.\n", DefaultScreen); ConfigFile=FALSE; } else ConfigFile=TRUE; numScreens = 0; for (i = 0; i<MAXSCREENS && ((!ConfigFile) ? TRUE : ! feof(in) ); i++) { char *argv[MAXARG]; int argc; if (!ConfigFile) argv[0] = DefaultScreen; else { while (!(argc = ReadLine(in, argv))) /* handle blank lines */ ; if (argc == -1) /* eof */ break; if (argc < 0) { ErrorF("InitOutput: %s: line %d: Too many fields.\n", xscreens, i+1); goto fatal_error; } /* for compatibility with R2 screens tables */ if (argc == 3) { if ((strcmp (argv[0], "topcat") == 0) || (strcmp (argv[0], "Topcat") == 0)) { argv[0] = argv[2]; argc = 1; } else { ErrorF ("InitOutput: %s, line %d: unsupported display type \"%s\".\n", xscreens, i+1, argv[0]); goto fatal_error; } } if ( argc != 1 ) { ErrorF("InitOutput: %s: line %d: Wrong number of fields.\n", xscreens, i+1); goto fatal_error; } } if ((s = FindScreen(argv[0])) == NULL) { ErrorF("InitOutput: %s: line %d: Unknown screen %s.\n", xscreens, i+1, argv[0]); goto fatal_error; } /* munge new structure to match old argv structures */ /* BOGOSITY ALERT argv and argc are munged for subsequent calls */ argv[2] = argv[0]; argv[0] = s->productNickname; if (stat(argv[2], &statbuf) < 0) { ErrorF("InitOutput: %s: could not stat %s.\n",argv[0],argv[2]); goto fatal_error; }#ifdef hpux (void) sprintf(minornumber, "%x", minor(statbuf.st_rdev));#else (void) sprintf(minornumber, "%d", minor(statbuf.st_rdev));#endif argv[3] = minornumber; argc = 4; if (!(s->InfoScreen)(numScreens, argv, argc)) { ErrorF("InitOutput: %s: line %d: Couldn't find this screen %s.\n", xscreens, i+1, argv[0]); goto fatal_error; } FoundScreens[numScreens++] = s; if (!ConfigFile) break; } if (ConfigFile) fclose(in); } for (i=0; i<numScreens; i++) { s = FoundScreens[i]; if (AddScreen(s->InitScreen, argc, argv) < 0) { ErrorF("InitOutput: Couldn't add a screen.\n"); exit (1); } } return; fatal_error: fclose(in); ErrorF("InitOutput: Couldn't initialize screens.\n"); exit(1);}static intReadLine(in, argv) FILE *in; char **argv;{ int argc; static char line[MAXSTRING]; char *s; int state; if (NULL == fgets(line, MAXSTRING, in)) return(-1); for (state = argc = 0, s = line; argc < MAXARG; s++) { switch ( *s ) { case '#': case '\n': *s = '\0'; case '\0': return (argc); case ' ': case '\t': state = 0; *s = '\0'; break; default: if ( state == 0 ) { state = 1; argv[argc++] = s; } break; } } return(-2);}#define STUPID_MOBERLY -1/* Declare the ScreenInfo(), ScreenInit() and ScreenClose() functions here. */extern Bool mobScreenInfo(), mobScreenInit();extern Bool gbxScreenInfo(), gbxScreenInit();extern Bool topcatScreenInfo(), topcatScreenInit();extern Bool mrtopcatScreenInfo(), mrtopcatScreenInit();extern Bool catseyeScreenInfo(), catseyeScreenInit();extern Bool renScreenInfo(), renScreenInit();extern Bool orenScreenInfo(), orenScreenInit();extern Bool davinciScreenInfo(), davinciScreenInit();extern Bool oDavinciScreenInit();extern Bool hyperScreenInfo(), hyperScreenInit();/* * Table of known frame buffers */static ScreenTableRec screenTable[] = { {"98633", "moberly", mobScreenInfo, mobScreenInit}, {"98700", "gatorbox", gbxScreenInfo, gbxScreenInit}, {"98547", "topcat", topcatScreenInfo, topcatScreenInit}, {"98543", "mrtopcat", mrtopcatScreenInfo, mrtopcatScreenInit}, {"98550", "catseye", topcatScreenInfo, topcatScreenInit}, {"98720", "renaissance", renScreenInfo, renScreenInit}, {"98720", "orenaissance", orenScreenInfo, orenScreenInit}, {"98730", "davinci", davinciScreenInfo, davinciScreenInit}, {"98730", "odavinci", davinciScreenInfo, oDavinciScreenInit}, {"a1096a", "hyperion", hyperScreenInfo, hyperScreenInit}, {(char *) NULL, (char *) NULL, (Bool (*)()) NULL, (Bool (*)()) NULL}};static ScreenTableRec *FindScreen(devname) char *devname;{ ScreenTableRec *s; int fd, gcid;#ifdef hpux int gcon;#endif char name[40]; static struct stat buf; struct hp_grfreg *ce; if ((fd = open(devname, O_RDWR)) < 0) { perror(devname); ErrorF("FindScreen couldn't open %s \n", devname); return (NULL); }#ifdef hpux if (ioctl(fd, GCON, &gcon) < 0 || ioctl(fd, GCID, &gcid) < 0) gcid = STUPID_MOBERLY;#else { struct grfinfo gi; if (ioctl(fd, GRFIOCGINFO, &gi) < 0 || ioctl(fd, GRFIOCON, 0) < 0) gcid = STUPID_MOBERLY; else gcid = gi.gd_id; }#endif fstat(fd, &buf); switch (gcid) { case GCID_GATORBOX: strcpy(name, "gatorbox"); break; case GCID_TOPCAT:#ifdef hpux ce = (struct hp_grfreg *) iomapBase; if (ioctl(fd, GCMAP, &ce) < 0) { perror("GCMAP:"); ErrorF("FindScreen: Error getting address of %s\n", devname); close (fd); return (NULL); }#else { u_char *Addr = (u_char *) 0; if (ioctl (fd, GRFIOCMAP, &Addr) < 0) { (void) ioctl (fd, GRFIOCOFF, 0); perror("GRFIOCMAP:"); ErrorF("FindScreen: Error getting address of %s\n", devname); close (fd); return (NULL); } ce = (struct hp_grfreg *) Addr; }#endif if (ce->gr_id2 >= ID2_LCC) strcpy(name, "catseye"); else if (ce->gr_bits) strcpy(name, "mrtopcat"); else strcpy(name, "topcat");#ifdef hpux if (ioctl(fd, GCUNMAP, &ce) < 0) { perror("GCUNMAP:"); ErrorF("FindScreen: Error freeing temp storage %s\n", devname); close (fd); return (NULL); } #else if (ioctl(fd, GRFIOCUNMAP, &ce) < 0) { perror("GRFIOCUNMAP:"); ErrorF("FindScreen: Error freeing temp storage %s\n", devname); close (fd); return (NULL); }#endif break; case GCID_RENAISSANCE: if ((minor(buf.st_rdev)) & 0x000003) strcpy(name, "orenaissance"); else strcpy(name, "renaissance"); break; case GCID_FIREEYE: strcpy(name, "catseye"); break; case GCID_HYPERION: strcpy(name, "hyperion"); break; case GCID_DAVINCI: if ((minor(buf.st_rdev)) & 0x000003) strcpy(name, "odavinci"); else strcpy(name, "davinci"); break; case STUPID_MOBERLY: strcpy(name, "moberly"); break; default: ErrorF("FindScreen: unknown screen type %s \n", devname); return (NULL); } close (fd); for (s = screenTable; s->productNumber != NULL; s++) { if (strcmp(s->productNumber, name) == 0 || strcmp(s->productNickname, name) == 0) return (s); } return (NULL);}#ifdef hpuxunsigned char *FrameBufferBase(size) long int size;{ unsigned char *base = iomapBase; /* Round size to a 4K page */ size = (size + 4095) & 0xfffff000; iomapBase += size; return ( base );}#endif/* * DDX - specific abort routine. Called by AbortServer(). */voidAbortDDX(){}/* Called by GiveUp(). */voidddxGiveUp(){}intddxProcessArgument (argc, argv, i) int argc; char *argv[]; int i;{ if (strcmp (argv[i], "-tcbd") == 0) { TopcatBrainDamage++; return 1; } if (strcmp (argv[i], "-catseyeMono") == 0) { catseyeMono++; return 1; } return 0;}voidddxUseMsg(){ ErrorF("-tcbd run in topcat braindamage mode\n"); ErrorF("-catseyeMono run 2bit deep catseyes in Monochrome\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -