Annotation of 3BSD/cmd/adb/opset.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  *
                      4:  *     UNIX debugger
                      5:  *
                      6:  */
                      7: 
                      8: #include "defs.h"
                      9: SCCSID(@(#)opset.c     2.3);
                     10: 
                     11: STRING         errflg;
                     12: L_INT          dot;
                     13: INT            dotinc;
                     14: L_INT          var[];
                     15: 
                     16: 
                     17: /* instruction printing */
                     18: 
                     19: /*
                     20:  * Argument access types
                     21:  */
                     22: #define ACCA   (8<<3)  /* address only */
                     23: #define ACCR   (1<<3)  /* read */
                     24: #define ACCW   (2<<3)  /* write */
                     25: #define ACCM   (3<<3)  /* modify */
                     26: #define ACCB   (4<<3)  /* branch displacement */
                     27: #define ACCI   (5<<3)  /* XFC code */
                     28: 
                     29: /*
                     30:  * Argument data types
                     31:  */
                     32: #define TYPB   0       /* byte */
                     33: #define TYPW   1       /* word */
                     34: #define TYPL   2       /* long */
                     35: #define TYPQ   3       /* quad */
                     36: #define TYPF   4       /* floating */
                     37: #define TYPD   5       /* double floating */
                     38: 
                     39: 
                     40: TYPE   struct optab    *OPTAB;
                     41: struct optab {
                     42:        char *iname;
                     43:        char val;
                     44:        char nargs;
                     45:        char argtype[6];
                     46: } optab[];
                     47: #define SYSTAB struct systab
                     48: SYSTAB {
                     49:        int     argc;
                     50:        char    *sname;
                     51: } systab[];
                     52: STRING regname[];
                     53: STRING fltimm[];
                     54: POS    type, space, incp;
                     55: 
                     56: int ioptab[256]; /* index by opcode to optab */
                     57: 
                     58: mkioptab() {/* set up ioptab */
                     59: REG OPTAB p=optab; while (p->iname) {ioptab[p->val&LOBYTE]=p-optab; p++;}
                     60: }
                     61: 
                     62: extern char *fmtr;
                     63: extern char *fmtR;
                     64: 
                     65: printins(f,idsp,ins)
                     66: #ifndef vax
                     67: REG INT                ins;
                     68: #else
                     69: REG L_INT      ins;
                     70: #endif
                     71: {
                     72:        short i,b,mode; char **r; long d; char *fmat;
                     73:        REG char *      ap;
                     74:        REG OPTAB       ip;
                     75: #ifndef vax
                     76:        struct {char b2,b3,b0,b1;};
                     77: #else
                     78:        struct {char b0,b1,b2,b3;};
                     79: #endif
                     80: 
                     81:        type=DSYM; space=idsp;
                     82:        ins &= LOBYTE;
                     83:        ip=optab+ioptab[ins]; printf("%s%8t",ip->iname); incp=1;
                     84:        ap=ip->argtype;
                     85:        for (i=0; i<ip->nargs; i++,ap++) {
                     86:                var[i]=0x80000000;
                     87:                if (i!=0) printc(',');
                     88:          top:
                     89:                if (*ap&ACCB) b= 0xAF + ((*ap&7)<<5);  /* branch displacement */
                     90:                else {b=bchkget(inkdot(incp),idsp); ++incp;}
                     91:                if (b&0300) {/* not short literal */
                     92:                        r= &regname[b&0xF]; mode= b >>= 4;
                     93:                  mid:
                     94:                        switch ((int)mode) {
                     95:                                case 4: /* [r] */ printf("[%s]",*r); goto top;
                     96:                                case 5: /* r */ printf("%s",*r); break;
                     97:                                case 7: /* -(r) */ printc('-');
                     98:                          base:
                     99:                                case 6: /* (r) */ printf("(%s)",*r); break;
                    100:                                case 9: /* *(r)+ */ printc('*');
                    101:                                case 8: /* (r)+ */
                    102:                                  if (r==(regname+0xF)) {/* PC: immediate or absolute */
                    103:                                        printc('$'); if (b==9) goto abs;
                    104:                                        mode=((*ap&7)<<1)+0xA; goto mid;
                    105:                                  }
                    106:                                  printf("(%s)+",*r); break;
                    107:                                case 0xB: printc('*');
                    108:                                case 0xA: d=bchkget(inkdot(incp),idsp); ++incp;
                    109:                                  if (d&0x80) d -= 0x100; fmat=fmtr;
                    110:                          disp:
                    111:                                  var[i]=d;
                    112:                                  if (r==(regname+0xF) && b>=0xA) var[i] += dot+incp;
                    113:                                  psymoff(var[i],type,"");
                    114:                                  if (r!=regname+0xF) goto base;
                    115:                                  break;
                    116:                                case 0xD: printc('*');
                    117:                                case 0xC: d=0;
                    118:                                        d.b0 = bchkget(inkdot(incp),idsp); ++incp;
                    119:                                        d.b1 = bchkget(inkdot(incp),idsp); ++incp;
                    120:                                        if (d&0x8000) d -= 0x10000; fmat=fmtr;
                    121:                                        goto disp;
                    122:                                case 0xF: printc('*');
                    123:                                case 0xE:
                    124:                          abs:
                    125:                                        d.b0 = bchkget(inkdot(incp),idsp); ++incp;
                    126:                                        d.b1 = bchkget(inkdot(incp),idsp); ++incp;
                    127:                                        d.b2 = bchkget(inkdot(incp),idsp); ++incp;
                    128:                                        d.b3 = bchkget(inkdot(incp),idsp); ++incp;
                    129:                                        fmat=fmtR; goto disp;
                    130:                        }
                    131:                } else {/* short literal */
                    132:                        var[i]=b;
                    133:                        if ((*ap&7)==TYPF || (*ap&7)==TYPD) printf("$%s",fltimm[b]);
                    134:                        else printf("$%r",b);
                    135:                }
                    136:        }
                    137:        if (ins==0xCF || ins==0xAF || ins==0x8F) {/* CASEx instr */
                    138:                for (i=0; i<=var[2]; ++i) {
                    139:                        printc(EOR); printf("    %R:  ",i+var[1]);
                    140:                        d=get(inkdot(incp+i+i),idsp)&0xFFFF;
                    141:                        if (d&0x8000) d -= 0x10000;
                    142:                        psymoff(inkdot(incp)+d,type,"");
                    143:                }
                    144:                incp += var[2]+var[2]+2;
                    145:        }
                    146:        dotinc=incp;
                    147: }

unix.superglobalmegacorp.com

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