#include #include #include #include #include #include #include #include extern const char *__progname; #include "gl-int.h" /* fbc: 00000-00fff, 4k */ /* tec: 01000-01fff, 4k */ /* bt: 02000-03fff, 8k */ /* fhc: 04000-04fff, 4k */ /* thc: 05000-05fff, 4k */ /* rom: 06000-15fff, 64k */ /* fb: 16000- */ /* alu low 16 bits are ALU table: if fg bit is A, bg bit is B, src bit is C, dst bit is D, then binary ABCD is bit number of bit giving resulting dst bit */ struct cg6fb { unsigned int pad1[1]; /* +4 */ unsigned int mode; /* 4 */ unsigned int clip; /* 8 */ unsigned int pad2[1]; /* +4 */ unsigned int s; /* 16 */ unsigned int draw; /* 20 */ unsigned int blit; /* 24 */ unsigned int font; /* 28 */ unsigned int pad3[24]; /* +96 */ unsigned int x0; /* 128 */ unsigned int y0; /* 132 */ unsigned int z0; /* 136 */ unsigned int color0; /* 140 */ unsigned int x1; /* 144 */ unsigned int y1; /* 148 */ unsigned int z1; /* 152 */ unsigned int color1; /* 156 */ unsigned int x2; /* 160 */ unsigned int y2; /* 164 */ unsigned int z2; /* 168 */ unsigned int color2; /* 172 */ unsigned int x3; /* 176 */ unsigned int y3; /* 180 */ unsigned int z3; /* 184 */ unsigned int color3; /* 188 */ unsigned int offx; /* 192 */ unsigned int offy; /* 196 */ unsigned int pad4[2]; /* +8 */ unsigned int incx; /* 208 */ unsigned int incy; /* 212 */ unsigned int pad5[2]; /* +8 */ unsigned int clipminx; /* 224 */ unsigned int clipminy; /* 228 */ unsigned int pad6[2]; /* +8 */ unsigned int clipmaxx; /* 240 */ unsigned int clipmaxy; /* 244 */ unsigned int pad7[2]; /* +8 */ unsigned int fg; /* 256 */ unsigned int bg; /* 260 */ unsigned int alu; /* 264 */ unsigned int pm; /* 268 */ unsigned int pixelm; /* 272 */ unsigned int pad8[2]; /* +8 */ unsigned int patalign; /* 284 */ unsigned int pattern[8]; /* 288 */ unsigned int pad9[432]; /* +1728 */ unsigned int apointx; /* 2048 */ unsigned int apointy; /* 2052 */ unsigned int apointz; /* 2056 */ unsigned int pad10[1]; /* +4 */ unsigned int rpointx; /* 2064 */ unsigned int rpointy; /* 2068 */ unsigned int rpointz; /* 2072 */ unsigned int pad11[5]; /* +20 */ unsigned int pointr; /* 2096 */ unsigned int pointg; /* 2100 */ unsigned int pointb; /* 2104 */ unsigned int pointa; /* 2108 */ unsigned int alinex; /* 2112 */ unsigned int aliney; /* 2116 */ unsigned int alinez; /* 2120 */ unsigned int pad12[1]; /* +4 */ unsigned int rlinex; /* 2128 */ unsigned int rliney; /* 2132 */ unsigned int rlinez; /* 2136 */ unsigned int pad13[5]; /* +20 */ unsigned int liner; /* 2160 */ unsigned int lineg; /* 2164 */ unsigned int lineb; /* 2168 */ unsigned int linea; /* 2172 */ unsigned int atrix; /* 2176 */ unsigned int atriy; /* 2180 */ unsigned int atriz; /* 2184 */ unsigned int pad14[1]; /* +4 */ unsigned int rtrix; /* 2192 */ unsigned int rtriy; /* 2196 */ unsigned int rtriz; /* 2200 */ unsigned int pad15[5]; /* +20 */ unsigned int trir; /* 2224 */ unsigned int trig; /* 2228 */ unsigned int trib; /* 2232 */ unsigned int tria; /* 2236 */ unsigned int aquadx; /* 2240 */ unsigned int aquady; /* 2244 */ unsigned int aquadz; /* 2248 */ unsigned int pad16[1]; /* +4 */ unsigned int rquadx; /* 2256 */ unsigned int rquady; /* 2260 */ unsigned int rquadz; /* 2264 */ unsigned int pad17[5]; /* +20 */ unsigned int quadr; /* 2288 */ unsigned int quadg; /* 2292 */ unsigned int quadb; /* 2296 */ unsigned int quada; /* 2300 */ unsigned int arectx; /* 2304 */ unsigned int arecty; /* 2308 */ unsigned int arectz; /* 2312 */ unsigned int pad18[1]; /* +4 */ unsigned int rrectx; /* 2320 */ unsigned int rrecty; /* 2324 */ unsigned int rrectz; /* 2328 */ unsigned int pad19[5]; /* +20 */ unsigned int rectr; /* 2352 */ unsigned int rectg; /* 2356 */ unsigned int rectb; /* 2360 */ unsigned int recta; /* 2364 */ } ; struct brooktree { unsigned int addr; unsigned int cmap; unsigned int ctrl; unsigned int omap; } ; static const char *defpath = "/dev/cgsix0"; static int fd; static volatile struct cg6fb *fb; static volatile struct brooktree *bt; static volatile unsigned char *vram; static struct fbcmap oldcm; static unsigned char oldcm_r[256]; static unsigned char oldcm_g[256]; static unsigned char oldcm_b[256]; static int drawbit; #define NOMINAL_AR (NOMINAL_XSIZE/(double)NOMINAL_YSIZE) static void setcmap(int bit) { bt->addr = 0; bt->cmap = 0; bt->cmap = 0; bt->cmap = 0; if (bit == 2) { bt->cmap = 0; bt->cmap = 0; bt->cmap = 0; bt->cmap = 0xff000000; bt->cmap = 0xff000000; bt->cmap = 0xff000000; } else { bt->cmap = 0xff000000; bt->cmap = 0xff000000; bt->cmap = 0xff000000; bt->cmap = 0; bt->cmap = 0; bt->cmap = 0; } bt->cmap = 0xff000000; bt->cmap = 0xff000000; bt->cmap = 0xff000000; } static void savecmap(void) { oldcm.index = 0; oldcm.count = 256; oldcm.red = &oldcm_r[0]; oldcm.green = &oldcm_g[0]; oldcm.blue = &oldcm_b[0]; if (ioctl(fd,FBIOGETCMAP,&oldcm) < 0) { fprintf(stderr,"%s: FBIOGETCMAP: %s\n",__progname,strerror(errno)); exit(1); } } static void restorecmap(void) { oldcm.index = 0; oldcm.count = 256; oldcm.red = &oldcm_r[0]; oldcm.green = &oldcm_g[0]; oldcm.blue = &oldcm_b[0]; ioctl(fd,FBIOPUTCMAP,&oldcm); } static int x_probe(const char *path) { void *mrv; struct fbgattr a; if (! path) path = defpath; fd = open(path,O_RDWR,0); if (fd < 0) return(0); if ( (ioctl(fd,FBIOGATTR,&a) < 0) || (a.fbtype.fb_type != FBTYPE_SUNFAST_COLOR) || (a.fbtype.fb_width != 1152) || (a.fbtype.fb_height != 900) || (a.fbtype.fb_depth != 8) ) { close(fd); return(0); } savecmap(); mrv = mmap(0,0x16000+a.fbtype.fb_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x70000000); if (mrv == MAP_FAILED) { fprintf(stderr,"%s: can't mmap %s: %s\n",__progname,path,strerror(errno)); exit(1); } fb = mrv; bt = (void *)(0x2000+(unsigned char *)mrv); vram = 0x16000 + (unsigned char *)mrv; XMAXSCREEN = 1152; YMAXSCREEN = 900; PIXELSCALE = 1152 / (double)NOMINAL_XSIZE; setcmap(1); drawbit = 2; fb->bg = 0; fb->pixelm = ~0; fb->s = 0; fb->mode = 0x00229540; /* not all bits known */ fb->alu = 0xc0000000 /* GX_PLANE_MASK */ | 0x20000000 /* GX_PIXEL_ONES */ | 0x00800000 /* GX_ATTR_SUPP (?) */ | 0x00000000 /* GX_RAST_BOOL (?) */ | 0x00000000 /* GX_PLOT_PLOT (?) */ | 0x08000000 /* GX_PATTERN_ONES */ | 0x01000000 /* GX_POLYG_OVERLAP */ | 0x0000ff00 /* ALU = set to fg color */ ; /* ALU */ fb->clip = 0; fb->offx = 0; fb->offy = 0; fb->clipminx = 0; fb->clipminy = 0; fb->clipmaxx = 1151; fb->clipmaxy = 899; fb->fg = 0; fb->pm = ~0; fb->arecty = 0; fb->arectx = 0; fb->arecty = 900; fb->arectx = 1152; while ((fb->draw & 0xa0000000) == 0xa0000000) ; while (fb->s & 0x10000000) ; fb->fg = 3; fb->pm = drawbit; return(1); } static void x_shutdown(void) { fb->pm = ~0; fb->offx = 0; fb->offy = 0; fb->clipminx = 0; fb->clipminy = 0; fb->clipmaxx = 1151; fb->clipmaxy = 899; restorecmap(); } static void x_clear(void) { while (fb->s & 0x10000000) ; fb->pm = drawbit | ~3U; fb->fg = 0; fb->arecty = 0; fb->arectx = 0; fb->arecty = 900; fb->arectx = 1152; while ((fb->draw & 0xa0000000) == 0xa0000000) ; while (fb->s & 0x10000000) ; fb->pm = drawbit; fb->fg = 3; } static void x_swap(void) { while (fb->s & 0x10000000) ; setcmap(drawbit); drawbit = (drawbit == 1) ? 2 : 1; fb->pm = drawbit; } static void x_line(int a, int b, int c, int d) { fb->aliney = b; fb->alinex = a; fb->aliney = d; fb->alinex = c; while ((fb->draw & 0xa0000000) == 0xa0000000) ; } static void x_point(int x, int y) { if ((x < 0) || (y < 0) || (x >= 1152) || (y >= 900)) return; vram[(1152*y)+x] |= drawbit; } ODEV odev_cgsix = { "cgsix", "cg6 color display", x_probe, x_probe, x_shutdown, x_clear, x_swap, x_line, x_point };