|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: static char sccsid[] = "%Z%%M% %I% %G%";
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;
60: while (p->iname){
61: ioptab[p->val&LOBYTE]=p-optab;
62: p++;
63: }
64: }
65:
66: extern char *fmtr; /* not used */
67: extern char *fmtR; /* not used */
68:
69: printins(f,idsp,ins)
70: #ifndef vax
71: REG INT ins;
72: #else
73: REG L_INT ins;
74: #endif
75: {
76: short argno; /* argument index */
77: short mode; /* mode */
78: char **r; /* register name */
79: long d; /* assembled byte, word, long or float */
80: long snarf();
81: REG char * ap;
82: REG OPTAB ip;
83:
84: type = DSYM;
85: space = idsp;
86: ins &= LOBYTE;
87: ip=optab+ioptab[ins];
88: printf("%s%8t",ip->iname);
89: incp = 1;
90: ap = ip->argtype;
91: for (argno=0; argno<ip->nargs; argno++,ap++) {
92: var[argno] = 0x80000000;
93: if (argno!=0) printc(',');
94: top:
95: if (*ap&ACCB)
96: mode = 0xAF + ((*ap&7)<<5); /* branch displacement */
97: else{
98: mode = bchkget(inkdot(incp),idsp); ++incp;
99: }
100: if (mode & 0300) {/* not short literal */
101: r = ®name[mode&0xF];
102: mode >>= 4;
103: switch ((int)mode) {
104: case 4: /* [r] */
105: printf("[%s]",*r);
106: goto top;
107: case 5: /* r */
108: printf("%s",*r);
109: break;
110: case 6: /* (r) */
111: printf("(%s)",*r);
112: break;
113: case 7: /* -(r) */
114: printf("-(%s)",*r);
115: break;
116: case 9: /* *(r)+ */
117: printc('*');
118: case 8: /* (r)+ */
119: if (r==(regname+0xF)) {
120: printc('$');
121: if (mode==9){ /* PC absolute, always 4 bytes*/
122: d = snarf(4, idsp);
123: goto disp;
124: }
125: switch(*ap&7){
126: case TYPB:
127: d = snarf(1, idsp);
128: goto disp;
129: case TYPW:
130: d = snarf(2, idsp);
131: goto disp;
132: case TYPL:
133: d = snarf(4, idsp);
134: goto disp;
135: case TYPQ:
136: d = snarf(4, idsp);
137: printquad(d, snarf(4, idsp));
138: break;
139: case TYPF:
140: printfloating(TYPF, snarf(4, idsp), 0);
141: break;
142: case TYPD:
143: d = snarf(4, idsp);
144: printfloating(TYPQ, d, snarf(4, idsp));
145: break;
146: } /*end of type switch */
147: /*
148: * here only for TYPQ, TYPf, TYPD
149: * others went to disp
150: */
151: } else { /*it's not PC immediate or abs*/
152: printf("(%s)+",*r);
153: }
154: break;
155: case 0xB: /* byte displacement defferred*/
156: printc('*');
157: case 0xA: /* byte displacement */
158: d = snarf(1, idsp);
159: goto disp;
160: case 0xD: /* word displacement deferred */
161: printc('*');
162: case 0xC: /* word displacement */
163: d = snarf(2, idsp);
164: goto disp;
165: case 0xF: /* long displacement deferred */
166: printc('*');
167: case 0xE: /* long displacement */
168: d = snarf(4, idsp);
169: goto disp;
170: disp:
171: var[argno]=d;
172: if (r==(regname+0xF) && mode>=0xA){
173: /* PC offset addressing */
174: var[argno] += dot+incp;
175: }
176: psymoff(var[argno],type,"");
177: if (r != regname+0xF)
178: printf("(%s)",*r);
179: break;
180: } /* end of the mode switch */
181: } else { /* short literal */
182: var[argno]=mode;
183: if( (*ap&7)==TYPF
184: || (*ap&7)==TYPD)
185: printf("$%s",fltimm[mode]);
186: else
187: printf("$%r",mode);
188: }
189: }
190: if (ins==0xCF || ins==0xAF || ins==0x8F) {/* CASEx instr */
191: for (argno=0; argno<=var[2]; ++argno) {
192: printc(EOR);
193: printf(" %R: ",argno+var[1]);
194: d=get(inkdot(incp+argno+argno),idsp)&0xFFFF;
195: if (d&0x8000) d -= 0x10000;
196: psymoff(inkdot(incp)+d,type,"");
197: }
198: incp += var[2]+var[2]+2;
199: }
200: dotinc=incp;
201: }
202:
203: /*
204: * magic values to mung an offset to a register into
205: * something that psymoff can understand.. all magic
206: */
207: /* 0 1 2 3 4 */
208: static long magic_masks[5] = {0, 0x80, 0x8000, 0, 0};
209: static long magic_compl[5] = {0, 0x100, 0x10000,0, 0};
210:
211: /*
212: * The following code is NO LONGER portable from the PDP 11 to the VAX
213: */
214: long snarf (nbytes, idsp)
215: int nbytes;
216: {
217: register int byteindex;
218: union Long{
219: char long_bytes[4];
220: long long_value;
221: } d;
222:
223: d.long_value = 0;
224: for (byteindex = 0; byteindex < nbytes; byteindex++){
225: d.long_bytes[byteindex] = bchkget(inkdot(incp), idsp);
226: ++incp;
227: }
228: if (d.long_value & magic_masks[nbytes])
229: d.long_value -= magic_compl[nbytes];
230: return(d.long_value);
231: }
232:
233: printfloating(type, word_first, word_last)
234: int type;
235: long word_first;
236: long word_last;
237: {
238: union Double{
239: struct {
240: long word_first;
241: long word_last;
242: } composite;
243: double dvalue;
244: } reconstructed;
245:
246: reconstructed.composite.word_first = word_first;
247: reconstructed.composite.word_last = word_last;
248: printf( "%f", reconstructed.dvalue);
249: }
250:
251: printquad(word_first, word_last)
252: long word_first;
253: long word_last;
254: {
255: union Quad {
256: char quad_bytes[8];
257: long quad_long[2];
258: } reconstructed;
259: int leading_zero = 1;
260: int byteindex;
261: int nibbleindex;
262: register int ch;
263:
264: reconstructed.quad_long[0] = word_first;
265: reconstructed.quad_long[1] = word_last;
266: for (byteindex = 7; byteindex >= 0; --byteindex){
267: for (nibbleindex = 4; nibbleindex >= 0; nibbleindex -= 4){
268: ch = (reconstructed.quad_bytes[byteindex]
269: >> nibbleindex) & 0x0F;
270: if ( ! (leading_zero &= (ch == 0) ) ){
271: if (ch <= 0x09)
272: printc(ch + '0');
273: else
274: printc(ch - 0x0A + 'a');
275: }
276: }
277: }
278: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.