Annotation of researchv10no/cmd/adb/g/mkoptab.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: 
                      3: #include "Xoptab.h"
                      4: 
                      5: #include "Xoptab.c"
                      6: 
                      7: #define        swab
                      8: 
                      9: main()
                     10: {
                     11:        register struct optab *op;
                     12: 
                     13:        for (op = optab; op->opname; op++) {
                     14:                if (op->size == BWL)
                     15:                        putbwl(op);
                     16:                else
                     17:                        putopt(op);
                     18:        }
                     19: }
                     20: 
                     21: putbwl(op)
                     22: register struct optab *op;
                     23: {
                     24:        char *orig;
                     25:        char new[20];
                     26: 
                     27:        orig = op->opname;
                     28:        op->opname = new;
                     29:        sprintf(new, "%s.b", orig);
                     30:        /* size field in opcode == 0 */
                     31:        op->size = B;
                     32:        putopt(op);
                     33:        sprintf(new, "%s.w", orig);
                     34:        op->opcode |= 0100;     /* size == 01 */
                     35:        op->size = W;
                     36:        putopt(op);
                     37:        sprintf(new, "%s.l", orig);
                     38:        op->opcode &=~ 0100;
                     39:        op->opcode |= 0200;     /* size == 03 */
                     40:        op->size = L;
                     41:        putopt(op);
                     42: }
                     43: 
                     44: /*
                     45:  * struct optab {
                     46:  *     unsigned short opcode;
                     47:  *     unsigned short mask;
                     48:  *     unsigned short op2;
                     49:  *     unsigned short mk2;
                     50:  *     char    *opname;
                     51:  *     char    flags;
                     52:  *     char    nrand;
                     53:  *     short   rand[MAXRAND];
                     54:  * };
                     55:  */
                     56: 
                     57: putopt(op)
                     58: register struct optab *op;
                     59: {
                     60:        register int n;
                     61:        long mask;
                     62:        char *mkrand();
                     63:        long mkmask();
                     64: 
                     65:        printf("{ ");
                     66:        printf("0x%04x, ", swab(op->opcode));   /* opcode */
                     67:        mask = mkmask(op);
                     68:        printf("0x%04x, ", swab((int)mask&0xffff));     /* mask */
                     69:        if ((((int)mask & 0xffff) & op->opcode) != op->opcode)
                     70:                fprintf(stderr, "awful mask %s\n", op->opname);
                     71:        if ((op->iflag & I2W) == 0)
                     72:                printf("0x0000, 0x0000, ");     /* op2 mk2 */
                     73:        else {
                     74:                mask = (mask >> 16) & 0xffff;
                     75:                printf("0x%04x, ", swab(op->op2code));  /* op2 */
                     76:                printf("0x%04x, ", swab((int)mask));    /* mk2 */
                     77:                if (((int)mask & op->op2code) != op->op2code)
                     78:                        fprintf(stderr, "awful 2mask %s\n", op->opname);
                     79:        }
                     80:        printf("\"%s\", ", op->opname); /* name */
                     81:        switch (op->size) {
                     82:        case B:
                     83:                printf("B");
                     84:                break;
                     85: 
                     86:        case W:
                     87:                printf("W");
                     88:                break;
                     89: 
                     90:        case L:
                     91:                printf("L");
                     92:                break;
                     93: 
                     94:        default:
                     95:                fprintf(stderr, "bad size %s\n", op->opname);
                     96:                printf("GOK ");
                     97:        case 0:
                     98:                printf("NZ");
                     99:                break;
                    100:        }
                    101:        if (op->iflag & I2W)
                    102:                printf("|I2W");
                    103:        printf(", ");                   /* flags */
                    104:        n = nrand(op);
                    105:        printf("%d", n);                /* nrand */
                    106:        if (n > 0)
                    107:                printf(", %s", mkrand(op->addr1, op->a1disp));
                    108:        if (n > 1)
                    109:                printf(", %s", mkrand(op->addr2, op->a2disp));
                    110:        if (n > 2)
                    111:                printf(", %s", mkrand(op->addr3, op->a3disp));
                    112:        if (n > 3)
                    113:                printf(", %s", mkrand(op->addr4, op->a4disp));
                    114:        printf(" },\n");
                    115: }
                    116: 
                    117: static long opmask[] = {
                    118:        0,              /* DIG  0   ignore this address */
                    119:        0x0000003f,     /* DEA  1   E.A. to low order 6 bits */
                    120:        0x00000007,     /* DRG  2   register to low order 3 bits */
                    121:        0x00000e00,     /* DRGL 3   register to bits 11-9 */
                    122:        0x000000ff,     /* DBR  4   branch offset (short) */
                    123:        0x000000ff,     /* DMQ  5   move-quick 8-bit value */
                    124:        0x00000e00,     /* DAQ  6   add-quick 3-bit value in 11-9 */
                    125:        0,              /* DIM  7   Immediate value, according to size */
                    126:        0x00000fc0,     /* DEAM 8   E.A. to bits 11-6 as in move */
                    127:        0,              /* DBCC 9   branch address as in "dbcc" */
                    128:        0,              /* DIMH 10  Immediate forced to be 1 word */
                    129:        0x00070000,     /* D2L  11  register to bits 0-2 of next word */
                    130:        0x70000000,     /* D2H  12  register to bits 12-14 of next word */
                    131:        0x001f0000,     /* DBL  13  qty in bits 0-5 of next word */
                    132:        0x07c00000,     /* DBH  14  qty in bits 6-11 of next word */
                    133:        0,              /* DCR  15  control reg a bit combination in 0-11 */
                    134: };
                    135: 
                    136: long
                    137: mkmask(op)
                    138: register struct optab *op;
                    139: {
                    140:        register long x;
                    141: 
                    142:        x = opmask[op->a1disp]|opmask[op->a2disp]|opmask[op->a3disp]|opmask[op->a4disp];
                    143:        return (~x);
                    144: }
                    145: 
                    146: int
                    147: nrand(op)
                    148: register struct optab *op;
                    149: {
                    150: 
                    151:        if (op->addr1 == 0)
                    152:                return (0);
                    153:        if (op->addr2 == 0)
                    154:                return (1);
                    155:        if (op->addr3 == 0)
                    156:                return (2);
                    157:        if (op->addr4 == 0)
                    158:                return (3);
                    159:        return (4);
                    160: }
                    161: 
                    162: char *
                    163: mkrand(addr, disp)
                    164: int addr, disp;
                    165: {
                    166:        char *regmode();
                    167: 
                    168:        switch (addr) {
                    169:        case AIMM+O:
                    170:                return ("DIM|AONE");
                    171: 
                    172:        case AREG+C:
                    173:                return ("DSREG|C");
                    174: 
                    175:        case AREG+SR:
                    176:                return ("DSREG|SR");
                    177: 
                    178:        case AREG+U:
                    179:                return ("DSREG|U");
                    180:        }
                    181:        switch (disp) {
                    182:        case DIG:
                    183:                fprintf(stderr, "unaccounted DIG\n");
                    184:                return ("DIG");
                    185: 
                    186:        case DEA:
                    187:                return ("DEA");
                    188: 
                    189:        case DRG:
                    190:                return (regmode(addr, "DRG"));
                    191: 
                    192:        case DRGL:
                    193:                return (regmode(addr, "DRGL"));
                    194: 
                    195:        case DBR:
                    196:                return ("DBR");
                    197: 
                    198:        case DMQ:
                    199:                return ("DMQ");
                    200: 
                    201:        case DAQ:
                    202:                return ("DAQ");
                    203: 
                    204:        case DIM:
                    205:                switch (addr) {
                    206:                case AIMM:
                    207:                        return ("DIM");
                    208: 
                    209:                case AIMM+O:
                    210:                        return ("DIM|AONE");
                    211: 
                    212:                case AIMM+H:
                    213:                        return ("DIM|AWORD");
                    214:                }
                    215:                fprintf(stderr, "unknown DIM\n");            
                    216:                return ("GOK DIM");
                    217: 
                    218:        case DEAM:
                    219:                return ("DEAM");
                    220: 
                    221:        case DBCC:
                    222:                return ("DBCC");
                    223: 
                    224:        case DIMH:
                    225:                return ("DIM|AWORD");
                    226: 
                    227:        case D2L:
                    228:                return (regmode(addr, "D2L"));
                    229: 
                    230:        case D2H:
                    231:                return (regmode(addr, "D2H"));
                    232: 
                    233:        case DBL:
                    234:                return ("DBL");
                    235: 
                    236:        case DBH:
                    237:                return ("DBH");
                    238: 
                    239:        case DCR:
                    240:                return ("DCR");
                    241: 
                    242:        default:
                    243:                fprintf(stderr, "GOK rand\n");
                    244:                return ("GOK");
                    245:        }
                    246: }
                    247: 
                    248: #ifndef swab
                    249: int
                    250: swab(s)
                    251: int s;
                    252: {
                    253: 
                    254:        return (((s >> 8) & 0xff) | ((s << 8) & 0xff00));
                    255: }
                    256: #endif
                    257: 
                    258: char *
                    259: regmode(addr, rb)
                    260: int addr;
                    261: char *rb;
                    262: {
                    263:        static char buf[10];
                    264:        char *mod;
                    265: 
                    266:        if (addr == ADEC)
                    267:                mod = "ADEC";
                    268:        else if (addr == AINC)
                    269:                mod = "AINC";
                    270:        else if (addr == AREG + A)
                    271:                mod = "AAREG";
                    272:        else if (addr == AREG + D)
                    273:                mod = "ADREG";
                    274:        else {
                    275:                fprintf(stderr, "awful regmode\n");
                    276:                mod = "GOK";
                    277:        }
                    278:        sprintf(buf, "%s|%s", rb, mod);
                    279:        return (buf);
                    280: }

unix.superglobalmegacorp.com

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