|
|
1.1 root 1: /*
2: *
3: * UNIX debugger
4: *
5: */
6:
7: #include "defs.h"
8: #include "optab.h"
9:
10: STRING errflg;
11: L_INT dot;
12: INT dotinc;
13: L_INT var[];
14:
15:
16: /* instruction printing */
17:
18: POS type, space, incp;
19:
20: OPTAB ioptab[256]; /* index by opcode to optab */
21:
22: mkioptab() {/* set up ioptab */
23: REG OPTAB p=optab;
24: while (p->iname){
25: ioptab[p->val&LOBYTE]=p;
26: p++;
27: }
28: }
29:
30: printins(idsp,ins)
31: REG L_INT ins;
32: {
33: short argno; /* argument index */
34: REG mode; /* mode */
35: REG r; /* register name */
36: REG d; /* assembled byte, word, long or float */
37: long snarf();
38: REG char * ap;
39: REG OPTAB ip;
40:
41: type = DSYM;
42: space = idsp;
43: ins = byte(ins);
44: if((ip=ioptab[ins]) == (OPTAB)0) {
45: printf("?%2x%8t", ins);
46: dotinc = 1;
47: return;
48: }
49: printf("%s%8t",ip->iname);
50: incp = 1;
51: ap = ip->argtype;
52: for (argno=0; argno<ip->nargs; argno++,ap++) {
53: var[argno] = 0x80000000;
54: if (argno!=0) printc(',');
55: top:
56: if (*ap&ACCB)
57: mode = 0xAF + ((*ap&7)<<5); /* branch displacement */
58: else{
59: mode = bchkget(inkdot(incp),idsp); ++incp;
60: }
61: r = mode&0xF;
62: mode >>= 4;
63: switch ((int)mode) {
64: case 0:
65: case 1:
66: case 2:
67: case 3:
68: /* short literal */
69: printc('$');
70: d = mode<<4|r;
71: goto immed;
72: case 4: /* [r] */
73: printf("[%s]",regname[r]);
74: goto top;
75: case 5: /* r */
76: printf("%s",regname[r]);
77: break;
78: case 6: /* (r) */
79: printf("(%s)",regname[r]);
80: break;
81: case 7: /* -(r) */
82: printf("-(%s)",regname[r]);
83: break;
84: case 9: /* *(r)+ */
85: printc('*');
86: case 8: /* (r)+ */
87: if(r==0xF || mode==8 && (r==8 || r==9)) {
88: printc('$');
89: d = snarf((r&03)+1, idsp);
90: } else { /*it's not PC immediate or abs*/
91: printf("(%s)+",regname[r]);
92: break;
93: }
94: immed:
95: if(ins == KCALL && d>=0 && d<SYSSIZ) {
96: if(systab[d])
97: printf(systab[d]);
98: else
99: printf("%R", d);
100: break;
101: }
102: goto disp;
103: case 0xB: /* byte displacement deferred */
104: case 0xD: /* word displacement deferred */
105: case 0xF: /* long displacement deferred */
106: printc('*');
107: case 0xA: /* byte displacement */
108: case 0xC: /* word displacement */
109: case 0xE: /* long displacement */
110: d = snarf(1<<((mode>>1&03)-1), idsp);
111: if (r==0xF) { /* PC offset addressing */
112: d += dot+incp;
113: psymoff(d,type,"");
114: var[argno]=d;
115: break;
116: }
117: disp:
118: if(d>=0 && d<maxoff)
119: printf("%R", d);
120: else
121: psymoff(d,type,"");
122: if (mode>=0xA)
123: printf("(%s)",regname[r]);
124: var[argno]=d;
125: break;
126: } /* end of the mode switch */
127: }
128: if (ins==CASEL) {
129: if(inkdot(incp)&01) /* align */
130: incp++;
131: for (argno=0; argno<=var[2]; ++argno) {
132: printc(EOR);
133: printf(" %R: ",argno+var[1]);
134: d=shorten(get(inkdot(incp+argno+argno),idsp));
135: if (d&0x8000) d -= 0x10000;
136: psymoff(inkdot(incp)+d,type,"");
137: }
138: incp += var[2]+var[2]+2;
139: }
140: dotinc=incp;
141: }
142:
143: long snarf (nbytes, idsp)
144: {
145: register long value;
146:
147: value = chkget(inkdot(incp), idsp);
148: incp += nbytes;
149: return(value>>(4-nbytes)*8);
150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.