Annotation of researchv10no/cmd/pico/pmet.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <signal.h>
                      3: #include "pico.h"
                      4: #define NMBUF  2048
                      5: 
                      6: #define        mlong(a)        (mword((a)>>16), mword(a))
                      7: #define        mword(a)        (mbyte((a)>>8), mbyte(a))
                      8: #define        mbyte(a)        (mbufp==&mbuf[NMBUF] && mflush(), *mbufp++=(a))
                      9: /* versions of the above allowing moving checks out of the loop */
                     10: #define        mcheck(n)       (mbufp>=&mbuf[NMBUF-n] && mflush())
                     11: #define        mulong(a)       (muword((a)>>16), muword(a))
                     12: #define        muword(a)       (mubyte((a)>>8), mubyte(a))
                     13: #define        mubyte(a)       (*mbufp++=a)
                     14: #define        mcmd(a)         ((mbufp-mbuf)&1 && (*mbufp++=0), mword(a))
                     15: #define        mflush()        ((mbufp-mbuf)&1 && (*mbufp++=0),write(om_fd, mbuf, (mbufp-mbuf)*sizeof mbuf[0]),mbufp=mbuf)
                     16: 
                     17: #define        MOVP1           0x0052
                     18: #define        MOVP2           0x0053
                     19: #define        SETCLL          0x3061  /* l:color */
                     20: #define        WPIXEL          0x006d  /*  */
                     21: #define        CMAP            0x0051  /* b:index, b:red, b:grn, b:blu */
                     22: #define        WRMSKL          0x3023  /* l:mask */
                     23: #define        CMAPOL          0x301a  /* 8b:2 nibble-sized entries */
                     24: #define CMSEL          0x3015
                     25: #define CMLDM          0x3013
                     26: #define CMCOPY         0x3016
                     27: #define CMACT          0x3000
                     28: #define RGBA           0xe
                     29: #define RGB            0xd
                     30: #define A              0x1
                     31: #define R              0x2
                     32: #define G              0x4
                     33: #define B              0x8
                     34: 
                     35: extern short   CURSCRATCH, CUROLD;
                     36: extern struct  SRC src[MANY];
                     37: extern int     DEF_LL, DEF_NL;
                     38: extern void    onquit();
                     39: 
                     40: int om_fd;
                     41: 
                     42: om_open(dev)
                     43: {      char buf[16];
                     44:        unsigned char mbuf[16], *mbufp=mbuf;
                     45:        extern char metheus;
                     46: 
                     47:        sprintf(buf, "/dev/om%d", dev);
                     48:        if ((om_fd = open(buf, 2)) == -1)
                     49:        {       perror("om_open");
                     50:                metheus = 0;
                     51:                return 0;
                     52:        }
                     53: #if 1
                     54:        signal(SIGINT, SIG_IGN);        /* don't mess up the device */
                     55:        metinitcmap();
                     56:        muword(WRMSKL);                 /* enable all 4 bitplanes */
                     57:        mubyte(255); mubyte(255);
                     58:        mubyte(255); mubyte(255);
                     59:        muword(CMAPOL);                 /* clear the overlaymap   */
                     60:        muword(0); muword(0);
                     61:        muword(0); muword(0);
                     62:        write(om_fd, (char *)mbuf, 16);
                     63:        signal(SIGINT, onquit);
                     64: #endif
                     65:        return 1;
                     66: }
                     67: 
                     68: om_close()
                     69: {
                     70:        close(om_fd);
                     71: }
                     72: 
                     73: metputitall(k)
                     74: {      struct SRC *from = &src[k];
                     75:        register unsigned char *pr, *pg, *pb;
                     76:        register int i; int offset, delta;
                     77:        int sx = from->sx;
                     78:        int ex = from->ex;
                     79:        int sy = from->sy;
                     80:        int ey = from->ey;
                     81:        int chunk; if ((ex-sx)&1) ex++;
                     82: 
                     83:        signal(SIGINT, SIG_IGN);        /* don't mess up the device */
                     84:        merect(sx, sy, ex, ey);
                     85:        offset = sy*DEF_LL + sx;
                     86:        delta  = DEF_LL - ex + sx;
                     87:        chunk = (ex-sx)+delta;
                     88: 
                     89:        pr = from->pixred+offset;
                     90:        switch (from->nchan)
                     91:        {       case 1: setbank(RGBA);
                     92:                        for (i = sy; i < ey; i++, pr += chunk)
                     93:                                write(om_fd, pr, ex-sx);
                     94:                        break;
                     95:                case 3: setbank(R);
                     96:                        for (i = sy; i < ey; i++, pr += chunk)
                     97:                                write(om_fd, pr, ex-sx);
                     98:                        setbank(G); pg = from->pixgrn+offset;
                     99:                        for (i = sy; i < ey; i++, pg += chunk)
                    100:                                write(om_fd, pg, ex-sx);
                    101:                        setbank(B); pb = from->pixblu+offset;
                    102:                        for (i = sy; i < ey; i++, pb += chunk)
                    103:                                write(om_fd, pb, ex-sx);
                    104:                        break;
                    105:                default:
                    106:                        fprintf(stderr, "undefined number of channels\n");
                    107:                        break;
                    108:        }
                    109:        signal(SIGINT, onquit);
                    110: }
                    111: 
                    112: metgetitall(from)
                    113:        struct SRC *from;
                    114: {
                    115:        register unsigned char *pr, *pg, *pb;
                    116:        register int i; int offset, delta;
                    117:        int sx = from->sx;
                    118:        int ex = from->ex;
                    119:        int sy = from->sy;
                    120:        int ey = from->ey;
                    121:        int chunk; if ((ex-sx)&1) ex++;
                    122: 
                    123:        signal(SIGINT, SIG_IGN);        /* don't mess up the device */
                    124:        merect(sx, sy, ex, ey);
                    125:        offset = sy*DEF_LL + sx;
                    126:        delta  = DEF_LL - ex + sx;
                    127:        chunk = (ex-sx)+delta;
                    128: 
                    129:        if (from == Old)
                    130:                fprintf(stderr, "reading screen...");
                    131: 
                    132:        pr = from->pixred+offset;
                    133:        switch (from->nchan)
                    134:        {       case 1: setbank(RGBA);
                    135:                        for (i = sy; i < ey; i++, pr += chunk)
                    136:                                read(om_fd, pr, ex-sx);
                    137:                        break;
                    138:                case 3: setbank(R);
                    139:                        for (i = sy; i < ey; i++, pr += chunk)
                    140:                                read(om_fd, pr, ex-sx);
                    141:                        setbank(G); pg = from->pixgrn+offset;
                    142:                        for (i = sy; i < ey; i++, pg += chunk)
                    143:                                read(om_fd, pg, ex-sx);
                    144:                        setbank(B); pb = from->pixblu+offset;
                    145:                        for (i = sy; i < ey; i++, pb += chunk)
                    146:                                read(om_fd, pb, ex-sx);
                    147:                        break;
                    148:                default:
                    149:                        fprintf(stderr, "undefined number of channels\n");
                    150:                        break;
                    151:        }
                    152:        signal(SIGINT, onquit);
                    153:        RESIDENT;
                    154: }
                    155: 
                    156: metlyank(x, y)
                    157: {      register int i;
                    158:        register unsigned char *pr, *pg, *pb;
                    159:        extern char faster;
                    160:        int from=Old->sx, to=Old->ex;
                    161: 
                    162:        if (y <= Old->sy || y > Old->ey) return 1;
                    163: 
                    164:        if (!faster)
                    165:        {       metyank(x, y);
                    166:                return;
                    167:        } else
                    168:        {       if (x > from)
                    169:                        return;
                    170:        }
                    171:        if ((to-from)&1) to++;
                    172:        i = x+DEF_LL*(y-1);
                    173:        signal(SIGINT, SIG_IGN);        /* don't mess up the device */
                    174:        merect(from, y-1, to, y);
                    175: 
                    176:        pr = scratchred+i;
                    177:        switch (Old->nchan)
                    178:        {       case 1: setbank(RGBA); write(om_fd, pr, to-from);
                    179:                        break;
                    180:                case 3: pg = scratchgrn+i;
                    181:                        pb = scratchblu+i;
                    182:                        setbank(R); write(om_fd, pr, to-from);
                    183:                        setbank(G); write(om_fd, pg, to-from);
                    184:                        setbank(B); write(om_fd, pb, to-from);
                    185:                        break;
                    186:        }
                    187:        signal(SIGINT, onquit);
                    188:        return 1;
                    189: }
                    190: 
                    191: metyank(x, y)
                    192: {      register int i = DEF_LL*y+x;
                    193:        unsigned char *pg, *pb;
                    194:        unsigned char *pr = scratchred+i;
                    195: 
                    196:        signal(SIGINT, SIG_IGN);        /* don't mess up the device */
                    197:        merect(x, y, x, y);
                    198:        switch (Old->nchan)
                    199:        {       case 1: setbank(RGBA); write(om_fd, pr, 1);
                    200:                        break;
                    201:                case 3: pg = scratchgrn+i;
                    202:                        pb = scratchblu+i;
                    203:                        setbank(R); write(om_fd, pr, 1);
                    204:                        setbank(G); write(om_fd, pg, 1);
                    205:                        setbank(B); write(om_fd, pb, 1);
                    206:                        break;
                    207:        }
                    208:        signal(SIGINT, onquit);
                    209:        return 1;
                    210: }
                    211: 
                    212: unsigned char Rmap[256], Gmap[256], Bmap[256];
                    213: 
                    214: metinitcmap()
                    215: {      int i;
                    216: 
                    217:        for (i = 0; i < 256; i++)
                    218:                Rmap[i] = Gmap[i] = Bmap[i] = (unsigned char) i;
                    219:        
                    220: }
                    221: 
                    222: metredcmap(i, z)
                    223: {      int j = i%256;
                    224:        int k = z%256;
                    225: 
                    226:        Rmap[j] = k;
                    227:        if (j == 255) dometcmap();
                    228:        return k;
                    229: }
                    230: 
                    231: metgrncmap(i, z)
                    232: {      int j = i%256;
                    233:        int k = z%256;
                    234: 
                    235:        Gmap[j] = k;
                    236:        if (j == 255) dometcmap();
                    237:        return k;
                    238: }
                    239: 
                    240: metblucmap(i, z)
                    241: {      int j = i%256;
                    242:        int k = z%256;
                    243: 
                    244:        Bmap[j] = k;
                    245:        if (j == 255) dometcmap();
                    246:        return k;
                    247: }
                    248: 
                    249: dometcmap()
                    250: {      unsigned char mbuf[2048], *mbufp=mbuf;
                    251:        unsigned char cmap[256*3], *m;
                    252:        int i;
                    253: 
                    254:        signal(SIGINT, SIG_IGN);        /* don't mess up the device */
                    255: 
                    256:        for (i = 0; i < 256; i++)
                    257:        {       cmap[3*i]   = Rmap[i];
                    258:                cmap[3*i+1] = Gmap[i];
                    259:                cmap[3*i+2] = Bmap[i];
                    260:        }
                    261:        m = cmap;
                    262:        mcmd(CMSEL); mbyte(0);                  /* write in cmap buffer 0 */
                    263:        mcmd(CMLDM);mword(0);mword(256);        /* load 256 entries at loc. 0 */
                    264:        for(i=0;i!=256*3;i++) mbyte(*m++);      /* data */
                    265:        mcmd(CMCOPY); mbyte(0); mbyte(0);       /* copy 256 entries to rest */
                    266:        mword(0); mword(256); mword(256*15);
                    267:        mcmd(CMACT);                            /* make current buffer active */
                    268:        mflush();
                    269: 
                    270:        signal(SIGINT, onquit);
                    271: }
                    272: 
                    273: metgetcmap(i, r,g,b)
                    274: {      int h = 0, k = 0;
                    275: 
                    276:        if (r) { h++; k += Rmap[i]; }
                    277:        if (g) { h++; k += Gmap[i]; }
                    278:        if (b) { h++; k += Bmap[i]; }
                    279:        if (h > 1) k /= h;
                    280: 
                    281:        return k;
                    282: }
                    283: 
                    284: merect(x0, y0, x1, y1)
                    285: {
                    286:        unsigned char mbuf[16], *mbufp=mbuf;
                    287: 
                    288:        muword(MOVP1); muword(x0);   muword(y0);
                    289:        muword(MOVP2); muword(x1-1); muword(y1-1);
                    290:        write(om_fd, (char *)mbuf, 12);
                    291: }
                    292: 
                    293: #define        WRBANK  0x003d
                    294: #define        WRR     0x006f
                    295: 
                    296: setbank(bank)
                    297:        unsigned char bank;
                    298: {
                    299:        unsigned char mbuf[8], *mbufp=mbuf;
                    300: 
                    301:        muword(WRBANK);
                    302:        mubyte(bank); mubyte(0);
                    303:        muword(WRR);            /* write 1 byte/pixel rectangle */
                    304:        write(om_fd, (char *)mbuf, 6);
                    305: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.