|
|
1.1 root 1: static char sccsid[] = "@(#)opset.c 4.1 10/9/80";
2: #
3: /*
4: *
5: * UNIX debugger
6: *
7: * Instruction printing routines.
8: * MACHINE DEPENDENT.
9: */
10:
11: #include "head.h"
12: SCCSID(@(#)opset.c 2.4);
13:
14: STRING errflg;
15: L_INT dot;
16: INT dotinc;
17: L_INT vvar[36];
18:
19:
20: /* instruction printing */
21:
22: /*
23: * Argument access types
24: */
25: #define ACCA (8<<3) /* address only */
26: #define ACCR (1<<3) /* read */
27: #define ACCW (2<<3) /* write */
28: #define ACCM (3<<3) /* modify */
29: #define ACCB (4<<3) /* branch displacement */
30: #define ACCI (5<<3) /* XFC code */
31:
32: /*
33: * Argument data types
34: */
35: #define TYPB 0 /* byte */
36: #define TYPW 1 /* word */
37: #define TYPL 2 /* long */
38: #define TYPQ 3 /* quad */
39: #define TYPF 4 /* floating */
40: #define TYPD 5 /* double floating */
41:
42:
43: TYPE struct optab *OPTAB;
44: struct optab {
45: char *iname;
46: char val;
47: char nargs;
48: char argtype[6];
49: } optab[];
50: #define SYSTAB struct systab
51: SYSTAB {
52: int argc;
53: char *sname;
54: } systab[];
55: STRING regname[];
56: STRING fltimm[];
57: POS type, space, incp;
58:
59: int ioptab[256]; /* index by opcode to optab */
60:
61: mkioptab() {/* set up ioptab */
62: REG OPTAB p=optab; while (p->iname) {ioptab[p->val&LOBYTE]=p-optab; p++;}
63: }
64:
65: extern char *fmtr;
66: extern char *fmtR;
67:
68: printins(fmt,idsp,ins)
69: char fmt;
70: #ifndef vax
71: REG INT ins;
72: #else
73: REG L_INT ins;
74: #endif
75: {
76: short i,b,mode; char **r; char *fmat;
77: struct proct *procp;
78: REG char * ap;
79: REG OPTAB ip;
80: #ifndef vax
81: union { long l; struct { char _2,_3,_0,_1; } b; } d;
82: #else
83: union { long l; struct { char _0,_1,_2,_3; } b; } d;
84: #endif
85: procp = adrtoprocp(dot);
86: if (procp->paddr == dot) {
87: printf("0x%04.4x", ins & 0xffff);
88: oincr = 2;
89: return;
90: }
91:
92: type=DSYM; space=idsp;
93: ins &= LOBYTE;
94: ip=optab+ioptab[ins]; printf("%s\t",ip->iname); incp=1;
95: ap=ip->argtype;
96: for (i=0; i<ip->nargs; i++,ap++) {
97: vvar[i]=0x80000000;
98: if (i!=0) printc(',');
99: top:
100: if (*ap&ACCB) b= 0xAF + ((*ap&7)<<5); /* branch displacement */
101: else {b=bchkget(inkdot(incp),idsp); ++incp;}
102: if (b&0300) {/* not short literal */
103: char *slnptr;
104: int regno;
105: regno = b & 0xF;
106: if (fmt=='i' && regno >= 6 && regno <= 11 &&
107: adrtoregvar(regno, procp) != -1) {
108: slnptr = sl_name;
109: r = &slnptr;
110: }
111: else
112: r= ®name[regno];
113: mode= b >>= 4;
114: mid:
115: switch ((int)mode) {
116: case 4: /* [r] */ printf("[%s]",*r); goto top;
117: case 5: /* r */ printf("%s",*r); break;
118: case 7: /* -(r) */ printc('-');
119: base:
120: case 6: /* (r) */ printf("(%s)",*r); break;
121: case 9: /* *(r)+ */ printc('*');
122: case 8: /* (r)+ */
123: if (r==(regname+0xF)) {/* PC: immediate or absolute */
124: printc('$'); if (b==9) goto abs;
125: mode=((*ap&7)<<1)+0xA; goto mid;
126: }
127: printf("(%s)+",*r); break;
128: case 0xB: printc('*');
129: case 0xA: d.l=bchkget(inkdot(incp),idsp); ++incp;
130: if (d.l&0x80) d.l -= 0x100; fmat=fmtr;
131: disp:
132: vvar[i]=d.l;
133: if (r==(regname+0xF) && b>=0xA) vvar[i] += dot+incp;
134: if (psymoff(vvar[i],r,fmt) && r!=regname+0xF)
135: goto base;
136: break;
137: case 0xD: printc('*');
138: case 0xC: d.l=0;
139: d.b._0 = bchkget(inkdot(incp),idsp); ++incp;
140: d.b._1 = bchkget(inkdot(incp),idsp); ++incp;
141: if (d.l&0x8000) d.l -= 0x10000; fmat=fmtr;
142: goto disp;
143: case 0xF: printc('*');
144: case 0xE:
145: abs:
146: d.b._0 = bchkget(inkdot(incp),idsp); ++incp;
147: d.b._1 = bchkget(inkdot(incp),idsp); ++incp;
148: d.b._2 = bchkget(inkdot(incp),idsp); ++incp;
149: d.b._3 = bchkget(inkdot(incp),idsp); ++incp;
150: fmat=fmtR; goto disp;
151: }
152: } else {/* short literal */
153: vvar[i]=b;
154: if ((*ap&7)==TYPF || (*ap&7)==TYPD)
155: printf("$%s",fltimm[b]);
156: else printf("$%d",b);
157: }
158: }
159: if (ins==0xCF || ins==0xAF || ins==0x8F) {/* CASEx instr */
160: for (i=0; i<=vvar[2]; ++i) {
161: printc(EOR); printf(" %d: ",i+vvar[1]);
162: d.l=get(inkdot(incp+i+i),idsp)&0xFFFF;
163: if (d.l&0x8000) d.l -= 0x10000;
164: psymoff(inkdot(incp)+d.l,type,fmt);
165: }
166: incp += vvar[2]+vvar[2]+2;
167: }
168: oincr=incp;
169: }
170:
171: L_INT inkdot(incr)
172: {
173: L_INT newdot;
174:
175: newdot=dot+incr;
176: return(newdot);
177: }
178:
179: printc(c)
180: char c; {
181: printf("%c", c);
182: }
183:
184: psymoff(v, r, fmt)
185: L_INT v; char fmt, **r; {
186: struct proct *procp;
187: register int diff;
188: if (fmt == 'i') {
189: if (r == regname + 12) { /* parameter */
190: if ((diff = adrtoparam((ADDR) v, adrtoprocp(dot)))
191: != -1) {
192: printf("%s", sl_name);
193: prdiff(diff);
194: return(0);
195: }
196: }
197: if (r == regname + 13) { /* local */
198: if ((diff = adrtolocal((ADDR) -v, adrtoprocp(dot))
199: ) != -1) {
200: printf("%s", sl_name);
201: prdiff(diff);
202: return(0);
203: }
204: }
205: if (v < firstdata) {
206: if ((procp = adrtoprocp((ADDR) v)) != badproc) {
207: prlnoff(procp, v);
208: return(0);
209: }
210: } else {
211: if ((diff = adrtoext((ADDR) v)) != -1) {
212: printf("%s", sl_name);
213: prdiff(diff);
214: return(0);
215: }
216: }
217: }
218: prhex(v);
219: return(1);
220: }
221:
222:
223: prdiff(diff) {
224: if (diff) {
225: printf("+");
226: prhex(diff);
227: }
228: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.