|
|
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= ®name[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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.