Annotation of researchv10no/cmd/adb/11v/opset.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  *
                      4:  *     UNIX debugger
                      5:  *
                      6:  */
                      7: 
                      8: #include "defs.h"
                      9: #include "space.h"
                     10: 
                     11: #undef SINGLE          /* hack */
                     12: 
                     13: /* instruction printing */
                     14: 
                     15: #define        DOUBLE  0
                     16: #define DOUBLW 1
                     17: #define        SINGLE  2
                     18: #define SINGLW 3
                     19: #define        REVERS  4
                     20: #define        BRANCH  5
                     21: #define        NOADDR  6
                     22: #define        DFAULT  7
                     23: #define        TRAP    8
                     24: #define        SYS     9
                     25: #define        SOB     10
                     26: #define JMP    11
                     27: #define JSR    12
                     28: 
                     29: #define        LOBYTE  0377
                     30: 
                     31: 
                     32: typedef        struct optab    *OPTAB;
                     33: struct optab {
                     34:        short   mask;
                     35:        short   val;
                     36:        char    itype;
                     37:        char    *iname;
                     38: } optab[] = {
                     39:        0107777, 0010000, DOUBLE, "mov",
                     40:        0107777, 0020000, DOUBLE, "cmp",
                     41:        0107777, 0030000, DOUBLE, "bit",
                     42:        0107777, 0040000, DOUBLE, "bic",
                     43:        0107777, 0050000, DOUBLE, "bis",
                     44:        0007777, 0060000, DOUBLE, "add",
                     45:        0007777, 0160000, DOUBLE, "su",
                     46:        0100077, 0005000, SINGLE, "clr",
                     47:        0100077, 0005100, SINGLE, "com",
                     48:        0100077, 0005200, SINGLE, "inc",
                     49:        0100077, 0005300, SINGLE, "dec",
                     50:        0100077, 0005400, SINGLE, "neg",
                     51:        0100077, 0005500, SINGLE, "adc",
                     52:        0100077, 0005600, SINGLE, "sbc",
                     53:        0100077, 0005700, SINGLE, "tst",
                     54:        0100077, 0006000, SINGLE, "ror",
                     55:        0100077, 0006100, SINGLE, "rol",
                     56:        0100077, 0006200, SINGLE, "asr",
                     57:        0100077, 0006300, SINGLE, "asl",
                     58:        0000077, 0000100, JMP,    "jmp",
                     59:        0000077, 0000300, SINGLE, "swab",
                     60:        0000077, 0170100, SINGLW, "ldfps",
                     61:        0000077, 0170200, SINGLW, "stfps",
                     62:        0000077, 0170300, SINGLW, "stst",
                     63:        0000077, 0170400, SINGLW, "clrf",
                     64:        0000077, 0170500, SINGLW, "tstf",
                     65:        0000077, 0170600, SINGLW, "absf",
                     66:        0000077, 0170700, SINGLW, "negf",
                     67:        0000077, 0006700, SINGLW, "sxt",
                     68:        0000077, 0006600, SINGLW, "mtpi",
                     69:        0000077, 0106600, SINGLW, "mtpd",
                     70:        0000077, 0006500, SINGLW, "mfpi",
                     71:        0000077, 0106500, SINGLW, "mfpd",
                     72:        0000077, 0106700, SINGLW, "mfps",
                     73:        0000077, 0106400, SINGLW, "mtps",
                     74:        0000777, 0070000, REVERS, "mul",
                     75:        0000777, 0071000, REVERS, "div",
                     76:        0000777, 0072000, REVERS, "ash",
                     77:        0000777, 0073000, REVERS, "ashc",
                     78:        LOBYTE,  0000400, BRANCH, "br",
                     79:        LOBYTE,  0001000, BRANCH, "bne",
                     80:        LOBYTE,  0001400, BRANCH, "beq",
                     81:        LOBYTE,  0002000, BRANCH, "bge",
                     82:        LOBYTE,  0002400, BRANCH, "blt",
                     83:        LOBYTE,  0003000, BRANCH, "bgt",
                     84:        LOBYTE,  0003400, BRANCH, "ble",
                     85:        LOBYTE,  0100000, BRANCH, "bpl",
                     86:        LOBYTE,  0100400, BRANCH, "bmi",
                     87:        LOBYTE,  0101000, BRANCH, "bhi",
                     88:        LOBYTE,  0101400, BRANCH, "blos",
                     89:        LOBYTE,  0102000, BRANCH, "bvc",
                     90:        LOBYTE,  0102400, BRANCH, "bvs",
                     91:        LOBYTE,  0103000, BRANCH, "bcc",
                     92:        LOBYTE,  0103400, BRANCH, "bcs",
                     93:        0000000, 0000000, NOADDR, "halt",
                     94:        0000000, 0000001, NOADDR, "wait",
                     95:        0000000, 0000002, NOADDR, "rti",
                     96:        0000000, 0000003, NOADDR, "bpt",
                     97:        0000000, 0000004, NOADDR, "iot",
                     98:        0000000, 0000005, NOADDR, "reset",
                     99:        LOBYTE,  0171000, REVERS, "mulf",
                    100:        LOBYTE,  0171400, REVERS, "modf",
                    101:        LOBYTE,  0172000, REVERS, "addf",
                    102:        LOBYTE,  0172400, REVERS, "movf",
                    103:        LOBYTE,  0173000, REVERS, "subf",
                    104:        LOBYTE,  0173400, REVERS, "cmpf",
                    105:        LOBYTE,  0174000, DOUBLW, "movf",
                    106:        LOBYTE,  0174400, REVERS, "divf",
                    107:        LOBYTE,  0175000, DOUBLW, "movei",
                    108:        LOBYTE,  0175400, DOUBLW, "movfi",
                    109:        LOBYTE,  0176000, DOUBLW, "movfo",
                    110:        LOBYTE,  0176400, REVERS, "movie",
                    111:        LOBYTE,  0177000, REVERS, "movif",
                    112:        LOBYTE,  0177400, REVERS, "movof",
                    113:        0000000, 0170000, NOADDR, "cfcc",
                    114:        0000000, 0170001, NOADDR, "setf",
                    115:        0000000, 0170002, NOADDR, "seti",
                    116:        0000000, 0170011, NOADDR, "setd",
                    117:        0000000, 0170012, NOADDR, "setl",
                    118:        0000777, 0004000, JSR,    "jsr",
                    119:        0000777, 0074000, DOUBLE, "xor",
                    120:        0000007, 0000200, SINGLE, "rts",
                    121:        0000017, 0000240, DFAULT, "cflg",
                    122:        0000017, 0000260, DFAULT, "sflg",
                    123:        LOBYTE,  0104000, TRAP,   "emt",
                    124: #if NOTDEF
                    125:        LOBYTE,  0104400, SYS,    "sys",
                    126: #else
                    127:        LOBYTE,  0104400, TRAP,   "trap",
                    128: #endif
                    129:        0000077, 0006400, TRAP,   "mark",
                    130:        0000777, 0077000, SOB,    "sob",
                    131:        0000007, 0000230, TRAP,   "spl",
                    132:        0177777, 0000000, DFAULT, "",
                    133: };
                    134: 
                    135: #ifdef NOTDEF
                    136: #define SYSTAB struct systab
                    137: SYSTAB {
                    138:        int     argc;
                    139:        char    *sname;
                    140: } systab[] = {
                    141:        1, "indir",
                    142:        0, "exit",
                    143:        0, "fork",
                    144:        2, "read",
                    145:        2, "write",
                    146:        2, "open",
                    147:        0, "close",
                    148:        0, "wait",
                    149:        2, "creat",
                    150:        2, "link",
                    151:        1, "unlink",
                    152:        2, "exec",
                    153:        1, "chdir",
                    154:        0, "time",
                    155:        3, "mknod",
                    156:        2, "chmod",
                    157:        2, "chown",
                    158:        1, "break",
                    159:        2, "stat",
                    160:        2, "seek",
                    161:        0, "getpid",
                    162:        3, "mount",
                    163:        1, "umount",
                    164:        0, "setuid",
                    165:        0, "getuid",
                    166:        0, "stime",
                    167:        3, "ptrace",
                    168:        0, "alarm",
                    169:        1, "fstat",
                    170:        0, "pause",
                    171:        1, "30",
                    172:        1, "stty",
                    173:        1, "gtty",
                    174:        0, "access",
                    175:        0, "nice",
                    176:        0, "sleep",
                    177:        0, "sync",
                    178:        1, "kill",
                    179:        0, "csw",
                    180:        0, "setpgrp",
                    181:        0, "tell",
                    182:        0, "dup",
                    183:        0, "pipe",
                    184:        1, "times",
                    185:        4, "profil",
                    186:        0, "tiu",
                    187:        0, "setgid",
                    188:        0, "getgid",
                    189:        2, "signal",
                    190:        0, "49",
                    191:        0, "50",
                    192:        0, "51",
                    193:        0, "52",
                    194:        0, "53",
                    195:        0, "54",
                    196:        0, "55",
                    197:        0, "56",
                    198:        0, "57",
                    199:        0, "58",
                    200:        0, "59",
                    201:        0, "60",
                    202:        0, "61",
                    203:        0, "62",
                    204:        0, "63",
                    205: };
                    206: #endif
                    207: 
                    208: char *regname[] = { "r0", "r1", "r2", "r3", "r4", "r5", "sp", "pc"};
                    209: 
                    210: static int type, space, incp;
                    211: 
                    212: printins(idsp)
                    213: {
                    214:        int             byte;
                    215:        register OPTAB  p;
                    216:        register short ins;
                    217: 
                    218:        ins = sget(dot, idsp);
                    219:        type=DATASP; space=idsp; incp=2;
                    220:        for (p=optab;; p++)
                    221:                if ((ins & ~p->mask) == p->val)
                    222:                        break;
                    223:        prints(p->iname);
                    224:        byte=ins&0100000;
                    225:        ins &= p->mask;
                    226:        switch (p->itype) {
                    227: 
                    228:            case JMP:
                    229:                type=INSTSP;
                    230: 
                    231:            case SINGLE:
                    232:                if (byte)
                    233:                        printc('b');
                    234:            case SINGLW:
                    235:                paddr("%8t",ins);
                    236:                break;
                    237: 
                    238:            case REVERS:
                    239:                doubl(ins&077,(ins>>6)&07);
                    240:                break;
                    241: 
                    242:            case JSR:
                    243:                type=INSTSP;
                    244: 
                    245:            case DOUBLE:
                    246:                if (byte)
                    247:                        printc('b');
                    248:            case DOUBLW:
                    249:                doubl(ins>>6,ins);
                    250: 
                    251:            case NOADDR:
                    252:                break;
                    253: 
                    254:            case SOB:
                    255:                paddr("%8t",(ins>>6)&07);
                    256:                branch(",",-(ins&077));
                    257:                break;
                    258: 
                    259:            case BRANCH:
                    260:                branch("%8t",ins);
                    261:                break;
                    262: 
                    263: #if NOTDEF
                    264:            case SYS:
                    265:                BEGIN
                    266:                   INT          indir;
                    267:                   REG INT      w;
                    268:                   printf("%8t%s", systab[ins &= 077].sname);
                    269:                   IF ins==0 ANDF f==0 ANDF idsp!=NSP   /* indir */
                    270:                   THEN w=dot; dot=chkget(inkdot(2),idsp);
                    271:                        prints(" {");
                    272:                        indir=get(dot,DSP);
                    273:                        IF errflg
                    274:                        THEN errflg=0; printc('?');
                    275:                        ELSE printins(1,DSP,indir);
                    276:                        FI
                    277:                        printc('}');
                    278:                        dot=w; incp=4;
                    279:                   ELSE w = systab[ins].argc;
                    280:                        WHILE w-- ANDF idsp!=NSP
                    281:                        DO prints("; ");
                    282:                           psymoff(leng(get(inkdot(incp),idsp)), NSYM, "");
                    283:                           incp += 2;
                    284:                        OD
                    285:                   FI
                    286:                END
                    287:                break;
                    288: #endif
                    289: 
                    290:            case TRAP:
                    291:            case DFAULT:
                    292:            default:
                    293:                printf("%8t%o", ins);
                    294:        }
                    295:        dotinc=incp;
                    296: }
                    297: 
                    298: static
                    299: doubl(a,b)
                    300: {
                    301:        paddr("%8t",a);
                    302:        paddr(",",b);
                    303: }
                    304: 
                    305: static
                    306: branch(s,ins)
                    307: char *s;
                    308: register WORD ins;
                    309: {
                    310:        printf(s);
                    311:        if (ins&0200)
                    312:                ins = (char) ins;               /* sign extend byte */
                    313:        ins = dot + (ins<<1) + 2;
                    314:        psymoff(ins,INSTSP,"");
                    315: }
                    316: 
                    317: static
                    318: paddr(s, a)
                    319: char *s;
                    320: register int a;
                    321: {
                    322:        register int r;
                    323:        register char *rn;
                    324: 
                    325:        var[2]=var[1];
                    326:        r = a&07; a &= 070;
                    327: 
                    328:        printf(s);
                    329:        if (r==7 && a&020) {
                    330:                if (a&010)
                    331:                        printc('*');
                    332:                if (a&040) {
                    333:                        if (space==NOSP)
                    334:                                printc('?');
                    335:                        else {
                    336:                                var[1]=stow(sget(inkdot(incp),space)) + inkdot(incp+2);
                    337:                                chkerr();
                    338:                                var[1] &= 0177777;
                    339:                                psymoff(var[1],(a&010?DATASP:type),"");
                    340:                        }
                    341:                }
                    342:                else {
                    343:                        printc('$');
                    344:                        if (space==NOSP)
                    345:                                printc('?');
                    346:                        else {
                    347:                                var[1]=stow(sget(inkdot(incp), space));
                    348:                                chkerr();
                    349:                                psymoff(var[1], type, "");
                    350:                        }
                    351:                }
                    352:                incp += 2;
                    353:                return;
                    354:        }
                    355:        rn = regname[r];
                    356:        switch (a) {
                    357:            /* r */
                    358:            case 000:
                    359:                prints(rn);
                    360:                return;
                    361: 
                    362:            /* (r) */
                    363:            case 010:
                    364:                printf("(%s)", rn);
                    365:                return;
                    366: 
                    367:            /* *(r)+ */
                    368:            case 030:
                    369:                printc('*');
                    370: 
                    371:            /* (r)+ */
                    372:            case 020:
                    373:                printf("(%s)+", rn);
                    374:                return;
                    375: 
                    376:            /* *-(r) */
                    377:            case 050:
                    378:                printc('*');
                    379: 
                    380:            /* -(r) */
                    381:            case 040:
                    382:                printf("-(%s)", rn);
                    383:                return;
                    384: 
                    385:            /* *x(r) */
                    386:            case 070:
                    387:                printc('*');
                    388: 
                    389:            /* x(r) */
                    390:            case 060:
                    391:                if (space==NOSP)
                    392:                        printc('?');
                    393:                else {
                    394:                        var[1]=stow(sget(inkdot(incp), space));
                    395:                        chkerr();
                    396:                        psymoff(var[1], type, "");
                    397:                }
                    398:                incp += 2;
                    399:                printf("(%s)", rn);
                    400:                return;
                    401:        }
                    402: }
                    403: 
                    404: 
                    405: 

unix.superglobalmegacorp.com

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