Annotation of 43BSD/old/sdb/opset.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)opset.c 4.2 10/27/82";
                      3: #endif lint
                      4: /*
                      5:  *     UNIX debugger
                      6:  *     Instruction printing routines.
                      7:  *     MACHINE DEPENDENT
                      8:  */
                      9: 
                     10: #ifdef ADB
                     11: #include "defs.h"
                     12: #endif ADB
                     13: #ifdef SDB
                     14: #include "head.h"
                     15: #endif SDB
                     16: 
                     17: L_INT          dot;
                     18: INT            dotinc;
                     19: L_INT          insoutvar[36];
                     20: #ifdef ADB
                     21: L_INT          var[36];
                     22: #endif ADB
                     23: 
                     24: #undef INSTTAB
                     25: #include "instrs.h"
                     26: 
                     27: STRING regname[];
                     28: STRING fltimm[];
                     29: POS    type, space, incp;
                     30: /*
                     31:  *     Definitions for registers and for operand classes
                     32:  */
                     33: char   *insregname();  /* how to print a register */
                     34: 
                     35: #define        R_PC            0xF
                     36: 
                     37: #define        OC_IMM0         0x0
                     38: #define        OC_IMM1         0x1
                     39: #define        OC_IMM2         0x2
                     40: #define        OC_IMM3         0x3
                     41: #define        OC_INDEX        0x4
                     42: #define        OC_REG          0x5
                     43: #define        OC_DREG         0x6
                     44: #define        OC_ADREG        0x7
                     45: #define        OC_AIREG        0x8
                     46: #define        OC_DAIREG       0x9
                     47: 
                     48: #define        OC_BDISP        0xA
                     49: #define        OC_DBDISP       0xB
                     50: #define        OC_WDISP        0xC
                     51: #define        OC_DWDISP       0xD
                     52: #define        OC_LDISP        0xE
                     53: #define        OC_DLDISP       0xF
                     54: 
                     55: #define        OC_SHIFT        4
                     56: #define        OC_CONS(oc,reg) (((oc & 0xF) << OC_SHIFT) | (reg & 0xF))
                     57: #define        OC_AMEXT(x)     (((x) >> OC_SHIFT) & 0xF)
                     58: #define        OC_REGEXT(x)    ((x) & 0xF)
                     59: 
                     60: /*
                     61:  *     Definitions for large numbers
                     62:  */
                     63: #include "asnumber.h"
                     64: typedef        struct  as_number       *numberp;
                     65: numberp snarf();
                     66: numberp snarfreloc();
                     67: /*
                     68:  *     Definitions for special instructions
                     69:  */
                     70: #define        CASEB   0x8F
                     71: #define        CASEW   0xAF
                     72: #define        CASEL   0xCF
                     73: /*
                     74:  *     Definitions for converting TYP's into numbers, booleans, etc.
                     75:  *     These are shared with the assembler.
                     76:  */
                     77: extern int     ty_NORELOC[];
                     78: extern int     ty_float[];
                     79: extern int     ty_nbyte[];
                     80: extern int     ty_nlg[];
                     81: extern char    *ty_string[];
                     82: 
                     83: short ioptab[3][256];  /* two level index by opcode into insttab */
                     84: 
                     85: int mapescbyte(byte)
                     86:        u_char  byte;
                     87: {
                     88:        switch(byte){
                     89:        default:        return(0);
                     90:        case ESCD:      return(1);
                     91:        case ESCF:      return(2);
                     92:        }
                     93: }
                     94: 
                     95: mkioptab()
                     96: {
                     97:        REG     struct insttab *p;
                     98:                int     mapchar;
                     99: 
                    100:        for(p = insttab; p->iname; p++){
                    101:                mapchar = mapescbyte(p->eopcode);
                    102:                if (ioptab[mapchar][p->popcode])
                    103:                        continue;
                    104:                ioptab[mapchar][p->popcode] = p - insttab;
                    105:        }
                    106: }
                    107: 
                    108: u_char snarfuchar();
                    109: /*
                    110:  *     Global variables for communicating with the minions and printins
                    111:  */
                    112: static int     idsp;
                    113: static short   argno;          /* which argument one is working on */
                    114: static char    insoutfmt[2];   /* how to format the relocated symbols */
                    115: #ifdef SDB
                    116: static struct  proct   *procp;
                    117: #endif SDB
                    118: 
                    119: static savevar(val)
                    120:        long    val;
                    121: {
                    122:        var[argno] = val;
                    123:        insoutvar[argno] = val;
                    124: }
                    125: 
                    126: printins(fmt, Idsp, ins)
                    127:        char    fmt;
                    128: #ifndef vax
                    129:        u_char  ins;
                    130: #else
                    131:        u_char  ins;
                    132: #endif
                    133:        int     Idsp;
                    134: {
                    135:                u_char  mode;           /* mode */
                    136:                u_char  ins2;
                    137:                char    *indexreg;      /* print of which register indexes */
                    138:                char    *indexed;       /* we indexed */
                    139:                char    *operandout();
                    140:        REG     u_char  *ap;
                    141:        REG     struct insttab *ip;
                    142:                u_char  optype;
                    143:                int     mapchar;
                    144: 
                    145:        idsp = Idsp;
                    146:        type = DSYM;
                    147:        space = idsp;
                    148: #ifdef SDB
                    149:        procp = adrtoprocp(dot);
                    150:        if (procp->paddr == dot){
                    151:                printf("0x%04.4x", ins);
                    152:                incp = 2;
                    153:                goto ret;
                    154:        }
                    155: #endif SDB
                    156: 
                    157: #ifdef ADB
                    158:        insoutfmt[0] = 0;
                    159: #endif ADB
                    160: #ifdef SDB
                    161:        insoutfmt[0] = fmt;
                    162: #endif SDB
                    163: 
                    164:        incp = 1;
                    165:        if ((mapchar = mapescbyte(ins)) != 0){
                    166:                ins2 = snarfuchar();
                    167:                if (ioptab[mapchar][ins2] == 0){
                    168:                        /*
                    169:                         *      Oops; not a defined instruction;
                    170:                         *      back over this escape byte.
                    171:                         */
                    172:                        incp -= 1;
                    173:                        mapchar = 0;
                    174:                } else {
                    175:                        ins = ins2;
                    176:                }
                    177:        }
                    178:        if (ioptab[mapchar][ins] == 0){
                    179:                printf("<undefined operator byte>: %x", ins);
                    180:                goto ret;
                    181:        }
                    182:        ip = &insttab[ioptab[mapchar][ins]];
                    183:        printf("%s\t", ip->iname);
                    184: 
                    185:        for (ap = ip->argtype, argno = 0; argno < ip->nargs; argno++, ap++) {
                    186:                savevar(0x80000000);    /* an illegal symbol */
                    187:                optype = *ap;
                    188:                if (argno != 0)
                    189:                        printc(',');
                    190:                indexreg = 0;
                    191:                indexed = 0;
                    192:                do{
                    193:                        if (A_ACCEXT(optype) & ACCB){
                    194:                                switch(A_TYPEXT(optype)){
                    195:                                case TYPB:
                    196:                                        mode = OC_CONS(OC_BDISP, R_PC);
                    197:                                        break;
                    198:                                case TYPW:
                    199:                                        mode = OC_CONS(OC_WDISP, R_PC);
                    200:                                        break;
                    201:                                }
                    202:                        } else {
                    203:                                mode = snarfuchar();
                    204:                        }
                    205:                        indexreg = operandout(mode, optype);
                    206:                        if (indexed)
                    207:                                printf("[%s]", indexed);
                    208:                        indexed = indexreg;
                    209:                } while(indexed);
                    210:        }
                    211:        if (mapchar == 0){
                    212:                switch(ins){
                    213:                case CASEB:
                    214:                case CASEW:
                    215:                case CASEL:
                    216:                        casebody(insoutvar[1], insoutvar[2]);
                    217:                        break;
                    218:                default:
                    219:                        break;
                    220:                }
                    221:        }
                    222:    ret: ;
                    223: 
                    224: #ifdef SDB
                    225:        oincr = incp;
                    226: #endif SDB
                    227: #ifdef ADB
                    228:        dotinc = incp;
                    229: #endif ADB
                    230: }
                    231: 
                    232: casebody(base, limit)
                    233:        long    base;
                    234:        long    limit;
                    235: {
                    236:        int     i;
                    237:        POS     baseincp;
                    238:        POS     advincp;
                    239:        struct  as_number       *valuep;
                    240: #define        OSIZE (sizeof(short))
                    241:        argno = 0;
                    242:        baseincp = incp;
                    243:        for (i = 0; i <= limit; i++) {
                    244:                printc(EOR);
                    245: #ifdef SDB
                    246:                printf("    %d:  ", i + base);
                    247: #endif SDB
                    248: #ifdef ADB
                    249:                printf("    %R:  ", i + base);
                    250: #endif ADB
                    251:                valuep = snarfreloc(OSIZE, 0);
                    252:                advincp = incp;
                    253:                incp = baseincp;
                    254:                dispaddress(valuep, OC_CONS(OC_WDISP, R_PC));
                    255:                incp = advincp;
                    256:        }
                    257: }
                    258: 
                    259: /*
                    260:  *     magic values to mung an offset to a register into
                    261:  *     something that psymoff can understand.. all magic
                    262:  */
                    263:                              /* 0      1       2       3       4 */
                    264: static long magic_masks[5] =   {0,     0x80,   0x8000, 0,      0};     
                    265: static long magic_compl[5] =   {0,     0x100,  0x10000,0,      0};
                    266: /*
                    267:  *     Snarf up some bytes, and put in the magic relocation flags
                    268:  */
                    269: numberp snarfreloc(nbytes)
                    270:        int     nbytes;
                    271: {
                    272:        numberp back;
                    273:        back = snarf(nbytes);
                    274:        if (back->num_ulong[0] & magic_masks[nbytes])
                    275:                back->num_ulong[0] -= magic_compl[nbytes];
                    276:        return(back);
                    277: }
                    278: /*
                    279:  *     The following code is NOT portable from the PDP 11 to the VAX
                    280:  *     because of the byte ordering problem.
                    281:  */
                    282: numberp snarf(nbytes)
                    283:        int     nbytes;
                    284: {
                    285:        REG     int     i;
                    286: 
                    287:        static  struct  as_number       backnumber;
                    288:        static  struct  as_number       znumber;        /* init'ed to 0 */
                    289: 
                    290:        backnumber = znumber;
                    291:        for (i = 0; i < nbytes; i++)
                    292:                backnumber.num_uchar[i] = snarfuchar();
                    293:        return(&backnumber);
                    294: }
                    295: /*
                    296:  *     Read one single character, and advance the dot
                    297:  */
                    298: u_char snarfuchar()
                    299: {
                    300:        u_char  back;
                    301:        /*
                    302:         *      assert: bchkget and inkdot don't have side effects
                    303:         */
                    304:        back = (u_char)bchkget(inkdot(incp), idsp);
                    305:        incp += 1;
                    306:        return(back);
                    307: }
                    308: /*
                    309:  *     normal operand; return non zero pointer to register
                    310:  *     name if this is an index instruction.
                    311:  */
                    312: char *operandout(mode, optype)
                    313:        u_char  mode;
                    314:        u_char  optype;
                    315: {
                    316:        char    *r;
                    317:        int     regnumber;
                    318:        int     nbytes;
                    319: 
                    320:        regnumber = OC_REGEXT(mode);
                    321:        r = insregname(regnumber);
                    322:        switch (OC_AMEXT(mode)){
                    323:        case OC_IMM0:
                    324:        case OC_IMM1:
                    325:        case OC_IMM2:
                    326:        case OC_IMM3:
                    327:                shortliteral(mode, optype);
                    328:                return(0);
                    329:        case OC_INDEX:
                    330:                return(r);              /* will be printed later */
                    331:        case OC_REG:
                    332:                printf("%s", r);
                    333:                return(0);
                    334:        case OC_DREG:
                    335:                printf("(%s)", r);
                    336:                return(0);
                    337:        case OC_ADREG:
                    338:                printf("-(%s)", r);
                    339:                return(0);
                    340:        case OC_DAIREG:
                    341:                printc('*');
                    342:        case OC_AIREG:
                    343:                if (regnumber == R_PC){
                    344:                        pcimmediate(mode, optype);
                    345:                } else {
                    346:                        printf("(%s)+", r);
                    347:                }
                    348:                return(0);
                    349:        case OC_DBDISP:
                    350:                printc('*');
                    351:        case OC_BDISP:
                    352:                nbytes = 1;
                    353:                break;
                    354:        case OC_DWDISP:
                    355:                printc('*');
                    356:        case OC_WDISP:
                    357:                nbytes = 2;
                    358:                break;
                    359:        case OC_DLDISP:
                    360:                printc('*');
                    361:        case OC_LDISP:
                    362:                nbytes = 4;
                    363:                break;
                    364:        }
                    365:        dispaddress(snarfreloc(nbytes), mode);
                    366:        return(0);
                    367: }
                    368: 
                    369: dispaddress(valuep, mode)
                    370:        numberp valuep;
                    371:        u_char  mode;
                    372: {
                    373:        int     regnumber = OC_REGEXT(mode);
                    374: 
                    375:        switch(OC_AMEXT(mode)){
                    376:        case OC_BDISP:
                    377:        case OC_DBDISP:
                    378:        case OC_WDISP:
                    379:        case OC_DWDISP:
                    380:        case OC_LDISP:
                    381:        case OC_DLDISP:
                    382:                if (regnumber == R_PC){
                    383:                        /* PC offset addressing */
                    384:                        valuep->num_ulong[0] += inkdot(incp);
                    385:                }
                    386:        }
                    387: #ifdef ADB
                    388:        psymoff(valuep->num_ulong[0], type, &insoutfmt[0]);
                    389:        if (regnumber != R_PC){         /* } */
                    390: #endif ADB
                    391: #ifdef SDB
                    392:        if(psymoff(valuep->num_ulong[0], regnumber, &insoutfmt[0])
                    393:           && (regnumber != R_PC)){
                    394: #endif SDB
                    395:                printf("(%s)", insregname(regnumber));
                    396:        }
                    397:        savevar((long)valuep->num_ulong[0]);
                    398: }
                    399: /*
                    400:  *     get a register name
                    401:  */
                    402: char *insregname(regnumber)
                    403:        int     regnumber;
                    404: {
                    405:        char    *r;
                    406:        r = regname[regnumber];
                    407: #ifdef SDB
                    408:        if (   (insoutfmt[0] == 'i')
                    409:            && (regnumber >= 6)
                    410:            && (regnumber <= 11)
                    411:            && (adrtoregvar(regnumber, procp) != -1)) {
                    412:                r = sl_name;
                    413:        }
                    414: #endif SDB
                    415:        return(r);
                    416: }
                    417: /*
                    418:  *     print out a short literal
                    419:  */
                    420: shortliteral(mode, optype)
                    421:        u_char  mode;
                    422:        u_char  optype;
                    423: {
                    424:        savevar((long)mode);
                    425:        switch(A_TYPEXT(optype)){
                    426:        case TYPF:
                    427:        case TYPD:
                    428:        case TYPG:
                    429:        case TYPH:
                    430:                printf("$%s", fltimm[mode]);
                    431:                break;
                    432:        default:
                    433: #ifdef ADB
                    434:                printf("$%r", mode);
                    435: #endif ADB
                    436: #ifdef SDB
                    437:                printf("$%d", mode);
                    438: #endif SDB
                    439:                break;
                    440:        }
                    441: }
                    442: 
                    443: pcimmediate(mode, optype)
                    444:        u_char  mode;
                    445:        u_char  optype;
                    446: {
                    447:        int     nbytes;
                    448: 
                    449:        printc('$');
                    450:        if (mode == OC_DAIREG){ /* PC absolute, always 4 bytes*/
                    451:                dispaddress(snarfreloc(4), mode);
                    452:                return;
                    453:        }
                    454:        nbytes = ty_nbyte[A_TYPEXT(optype)];
                    455:        if (! ty_NORELOC[A_TYPEXT(optype)]){
                    456:                dispaddress(snarfreloc(nbytes), mode);
                    457:                return;
                    458:        }
                    459:        bignumprint(nbytes, optype);
                    460: }
                    461: 
                    462: bignumprint(nbytes, optype)
                    463:        int     nbytes;
                    464:        u_char  optype;
                    465: {
                    466:        numberp valuep;
                    467:        int     leading_zero = 1;
                    468:        REG     int     bindex;
                    469:        REG     int     nindex;
                    470:        REG     int     ch;
                    471: 
                    472:        valuep = snarf(nbytes);
                    473:        switch(A_TYPEXT(optype)){
                    474:        case TYPF:      
                    475:                printf("0f%f", valuep->num_num.numFf_float.Ff_value);
                    476:                break;
                    477:        case TYPD:
                    478:                printf("0d%f", valuep->num_num.numFd_float.Fd_value);
                    479:                break;
                    480:        case TYPG:
                    481:                printf("0g::"); goto qprint;
                    482:        case TYPH:
                    483:                printf("0h::"); goto qprint;
                    484:        case TYPQ:
                    485:        case TYPO:
                    486:        qprint:
                    487:                for (bindex = nbytes - 1; bindex >= 0; --bindex){
                    488:                        for (nindex = 4; nindex >= 0; nindex -= 4){
                    489:                                ch = (valuep->num_uchar[bindex] >> nindex);
                    490:                                ch &= 0x0F;
                    491:                                if ( ! (leading_zero &= (ch == 0) ) ){
                    492:                                        if (ch <= 0x09)
                    493:                                                printc(ch + '0');
                    494:                                        else
                    495:                                                printc(ch - 0x0A + 'a');
                    496:                                }
                    497:                        }
                    498:                }
                    499:                break;
                    500:        }
                    501: }
                    502: #ifdef SDB
                    503: 
                    504: L_INT inkdot(incr)
                    505:        int     incr;
                    506: {
                    507:        L_INT           newdot;
                    508: 
                    509:        newdot = dot + incr;
                    510:        return(newdot);
                    511: }
                    512: 
                    513: printc(c)
                    514:        char c;
                    515: {
                    516:        printf("%c", c);
                    517: }
                    518: 
                    519: psymoff(v, regnumber, fmt)
                    520:        L_INT   v;
                    521:        char    *fmt;
                    522: {
                    523:        struct  proct   *procp;
                    524:        REG     int diff;
                    525:        if (fmt[0] == 'i') {
                    526:                switch(regnumber){
                    527:                case 12:        /* parameter */
                    528:                        if ((diff = adrtoparam((ADDR) v, adrtoprocp(dot)))
                    529:                                        != -1) {
                    530:                                printf("%s", sl_name);
                    531:                                prdiff(diff);
                    532:                                return(0);
                    533:                        }
                    534:                        break;
                    535:                case 13:        /* local */
                    536:                        if ((diff = adrtolocal((ADDR) -v, adrtoprocp(dot))
                    537:                                        ) != -1) {
                    538:                                printf("%s", sl_name);
                    539:                                prdiff(diff);
                    540:                                return(0);
                    541:                        }
                    542:                        break;
                    543:                default:
                    544:                        break;
                    545:                }
                    546:                if (v < firstdata) {
                    547:                        if ((procp = adrtoprocp((ADDR) v)) != badproc) {
                    548:                                prlnoff(procp, v);
                    549:                                return(0);
                    550:                        }
                    551:                } else {
                    552:                        if ((diff = adrtoext((ADDR) v)) != -1) {
                    553:                                printf("%s", sl_name);
                    554:                                prdiff(diff);
                    555:                                return(0);
                    556:                        }
                    557:                }
                    558:        }
                    559:        prhex(v);
                    560:        return(1);
                    561: }
                    562: 
                    563: prdiff(diff)
                    564: {
                    565:        if (diff) {
                    566:                printf("+");
                    567:                prhex(diff);
                    568:        }
                    569: }
                    570: 
                    571: #endif SDB

unix.superglobalmegacorp.com

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