|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: #include "space.h"
10:
11: #undef SINGLE /* hack */
12:
13: /* instruction printing */
14:
15: #define DOUBLE 0
16: #define DOUBLW 1
17: #define SINGLE 2
18: #define SINGLW 3
19: #define REVERS 4
20: #define BRANCH 5
21: #define NOADDR 6
22: #define DFAULT 7
23: #define TRAP 8
24: #define SYS 9
25: #define SOB 10
26: #define JMP 11
27: #define JSR 12
28:
29: #define LOBYTE 0377
30:
31:
32: typedef struct optab *OPTAB;
33: struct optab {
34: short mask;
35: short val;
36: char itype;
37: char *iname;
38: } optab[] = {
39: 0107777, 0010000, DOUBLE, "mov",
40: 0107777, 0020000, DOUBLE, "cmp",
41: 0107777, 0030000, DOUBLE, "bit",
42: 0107777, 0040000, DOUBLE, "bic",
43: 0107777, 0050000, DOUBLE, "bis",
44: 0007777, 0060000, DOUBLE, "add",
45: 0007777, 0160000, DOUBLE, "su",
46: 0100077, 0005000, SINGLE, "clr",
47: 0100077, 0005100, SINGLE, "com",
48: 0100077, 0005200, SINGLE, "inc",
49: 0100077, 0005300, SINGLE, "dec",
50: 0100077, 0005400, SINGLE, "neg",
51: 0100077, 0005500, SINGLE, "adc",
52: 0100077, 0005600, SINGLE, "sbc",
53: 0100077, 0005700, SINGLE, "tst",
54: 0100077, 0006000, SINGLE, "ror",
55: 0100077, 0006100, SINGLE, "rol",
56: 0100077, 0006200, SINGLE, "asr",
57: 0100077, 0006300, SINGLE, "asl",
58: 0000077, 0000100, JMP, "jmp",
59: 0000077, 0000300, SINGLE, "swab",
60: 0000077, 0170100, SINGLW, "ldfps",
61: 0000077, 0170200, SINGLW, "stfps",
62: 0000077, 0170300, SINGLW, "stst",
63: 0000077, 0170400, SINGLW, "clrf",
64: 0000077, 0170500, SINGLW, "tstf",
65: 0000077, 0170600, SINGLW, "absf",
66: 0000077, 0170700, SINGLW, "negf",
67: 0000077, 0006700, SINGLW, "sxt",
68: 0000077, 0006600, SINGLW, "mtpi",
69: 0000077, 0106600, SINGLW, "mtpd",
70: 0000077, 0006500, SINGLW, "mfpi",
71: 0000077, 0106500, SINGLW, "mfpd",
72: 0000077, 0106700, SINGLW, "mfps",
73: 0000077, 0106400, SINGLW, "mtps",
74: 0000777, 0070000, REVERS, "mul",
75: 0000777, 0071000, REVERS, "div",
76: 0000777, 0072000, REVERS, "ash",
77: 0000777, 0073000, REVERS, "ashc",
78: LOBYTE, 0000400, BRANCH, "br",
79: LOBYTE, 0001000, BRANCH, "bne",
80: LOBYTE, 0001400, BRANCH, "beq",
81: LOBYTE, 0002000, BRANCH, "bge",
82: LOBYTE, 0002400, BRANCH, "blt",
83: LOBYTE, 0003000, BRANCH, "bgt",
84: LOBYTE, 0003400, BRANCH, "ble",
85: LOBYTE, 0100000, BRANCH, "bpl",
86: LOBYTE, 0100400, BRANCH, "bmi",
87: LOBYTE, 0101000, BRANCH, "bhi",
88: LOBYTE, 0101400, BRANCH, "blos",
89: LOBYTE, 0102000, BRANCH, "bvc",
90: LOBYTE, 0102400, BRANCH, "bvs",
91: LOBYTE, 0103000, BRANCH, "bcc",
92: LOBYTE, 0103400, BRANCH, "bcs",
93: 0000000, 0000000, NOADDR, "halt",
94: 0000000, 0000001, NOADDR, "wait",
95: 0000000, 0000002, NOADDR, "rti",
96: 0000000, 0000003, NOADDR, "bpt",
97: 0000000, 0000004, NOADDR, "iot",
98: 0000000, 0000005, NOADDR, "reset",
99: LOBYTE, 0171000, REVERS, "mulf",
100: LOBYTE, 0171400, REVERS, "modf",
101: LOBYTE, 0172000, REVERS, "addf",
102: LOBYTE, 0172400, REVERS, "movf",
103: LOBYTE, 0173000, REVERS, "subf",
104: LOBYTE, 0173400, REVERS, "cmpf",
105: LOBYTE, 0174000, DOUBLW, "movf",
106: LOBYTE, 0174400, REVERS, "divf",
107: LOBYTE, 0175000, DOUBLW, "movei",
108: LOBYTE, 0175400, DOUBLW, "movfi",
109: LOBYTE, 0176000, DOUBLW, "movfo",
110: LOBYTE, 0176400, REVERS, "movie",
111: LOBYTE, 0177000, REVERS, "movif",
112: LOBYTE, 0177400, REVERS, "movof",
113: 0000000, 0170000, NOADDR, "cfcc",
114: 0000000, 0170001, NOADDR, "setf",
115: 0000000, 0170002, NOADDR, "seti",
116: 0000000, 0170011, NOADDR, "setd",
117: 0000000, 0170012, NOADDR, "setl",
118: 0000777, 0004000, JSR, "jsr",
119: 0000777, 0074000, DOUBLE, "xor",
120: 0000007, 0000200, SINGLE, "rts",
121: 0000017, 0000240, DFAULT, "cflg",
122: 0000017, 0000260, DFAULT, "sflg",
123: LOBYTE, 0104000, TRAP, "emt",
124: #if NOTDEF
125: LOBYTE, 0104400, SYS, "sys",
126: #else
127: LOBYTE, 0104400, TRAP, "trap",
128: #endif
129: 0000077, 0006400, TRAP, "mark",
130: 0000777, 0077000, SOB, "sob",
131: 0000007, 0000230, TRAP, "spl",
132: 0177777, 0000000, DFAULT, "",
133: };
134:
135: #ifdef NOTDEF
136: #define SYSTAB struct systab
137: SYSTAB {
138: int argc;
139: char *sname;
140: } systab[] = {
141: 1, "indir",
142: 0, "exit",
143: 0, "fork",
144: 2, "read",
145: 2, "write",
146: 2, "open",
147: 0, "close",
148: 0, "wait",
149: 2, "creat",
150: 2, "link",
151: 1, "unlink",
152: 2, "exec",
153: 1, "chdir",
154: 0, "time",
155: 3, "mknod",
156: 2, "chmod",
157: 2, "chown",
158: 1, "break",
159: 2, "stat",
160: 2, "seek",
161: 0, "getpid",
162: 3, "mount",
163: 1, "umount",
164: 0, "setuid",
165: 0, "getuid",
166: 0, "stime",
167: 3, "ptrace",
168: 0, "alarm",
169: 1, "fstat",
170: 0, "pause",
171: 1, "30",
172: 1, "stty",
173: 1, "gtty",
174: 0, "access",
175: 0, "nice",
176: 0, "sleep",
177: 0, "sync",
178: 1, "kill",
179: 0, "csw",
180: 0, "setpgrp",
181: 0, "tell",
182: 0, "dup",
183: 0, "pipe",
184: 1, "times",
185: 4, "profil",
186: 0, "tiu",
187: 0, "setgid",
188: 0, "getgid",
189: 2, "signal",
190: 0, "49",
191: 0, "50",
192: 0, "51",
193: 0, "52",
194: 0, "53",
195: 0, "54",
196: 0, "55",
197: 0, "56",
198: 0, "57",
199: 0, "58",
200: 0, "59",
201: 0, "60",
202: 0, "61",
203: 0, "62",
204: 0, "63",
205: };
206: #endif
207:
208: char *regname[] = { "r0", "r1", "r2", "r3", "r4", "r5", "sp", "pc"};
209:
210: static int type, space, incp;
211:
212: printins(idsp)
213: {
214: int byte;
215: register OPTAB p;
216: register short ins;
217:
218: ins = sget(dot, idsp);
219: type=DATASP; space=idsp; incp=2;
220: for (p=optab;; p++)
221: if ((ins & ~p->mask) == p->val)
222: break;
223: prints(p->iname);
224: byte=ins&0100000;
225: ins &= p->mask;
226: switch (p->itype) {
227:
228: case JMP:
229: type=INSTSP;
230:
231: case SINGLE:
232: if (byte)
233: printc('b');
234: case SINGLW:
235: paddr("%8t",ins);
236: break;
237:
238: case REVERS:
239: doubl(ins&077,(ins>>6)&07);
240: break;
241:
242: case JSR:
243: type=INSTSP;
244:
245: case DOUBLE:
246: if (byte)
247: printc('b');
248: case DOUBLW:
249: doubl(ins>>6,ins);
250:
251: case NOADDR:
252: break;
253:
254: case SOB:
255: paddr("%8t",(ins>>6)&07);
256: branch(",",-(ins&077));
257: break;
258:
259: case BRANCH:
260: branch("%8t",ins);
261: break;
262:
263: #if NOTDEF
264: case SYS:
265: BEGIN
266: INT indir;
267: REG INT w;
268: printf("%8t%s", systab[ins &= 077].sname);
269: IF ins==0 ANDF f==0 ANDF idsp!=NSP /* indir */
270: THEN w=dot; dot=chkget(inkdot(2),idsp);
271: prints(" {");
272: indir=get(dot,DSP);
273: IF errflg
274: THEN errflg=0; printc('?');
275: ELSE printins(1,DSP,indir);
276: FI
277: printc('}');
278: dot=w; incp=4;
279: ELSE w = systab[ins].argc;
280: WHILE w-- ANDF idsp!=NSP
281: DO prints("; ");
282: psymoff(leng(get(inkdot(incp),idsp)), NSYM, "");
283: incp += 2;
284: OD
285: FI
286: END
287: break;
288: #endif
289:
290: case TRAP:
291: case DFAULT:
292: default:
293: printf("%8t%o", ins);
294: }
295: dotinc=incp;
296: }
297:
298: static
299: doubl(a,b)
300: {
301: paddr("%8t",a);
302: paddr(",",b);
303: }
304:
305: static
306: branch(s,ins)
307: char *s;
308: register WORD ins;
309: {
310: printf(s);
311: if (ins&0200)
312: ins = (char) ins; /* sign extend byte */
313: ins = dot + (ins<<1) + 2;
314: psymoff(ins,INSTSP,"");
315: }
316:
317: static
318: paddr(s, a)
319: char *s;
320: register int a;
321: {
322: register int r;
323: register char *rn;
324:
325: var[2]=var[1];
326: r = a&07; a &= 070;
327:
328: printf(s);
329: if (r==7 && a&020) {
330: if (a&010)
331: printc('*');
332: if (a&040) {
333: if (space==NOSP)
334: printc('?');
335: else {
336: var[1]=stow(sget(inkdot(incp),space)) + inkdot(incp+2);
337: chkerr();
338: var[1] &= 0177777;
339: psymoff(var[1],(a&010?DATASP:type),"");
340: }
341: }
342: else {
343: printc('$');
344: if (space==NOSP)
345: printc('?');
346: else {
347: var[1]=stow(sget(inkdot(incp), space));
348: chkerr();
349: psymoff(var[1], type, "");
350: }
351: }
352: incp += 2;
353: return;
354: }
355: rn = regname[r];
356: switch (a) {
357: /* r */
358: case 000:
359: prints(rn);
360: return;
361:
362: /* (r) */
363: case 010:
364: printf("(%s)", rn);
365: return;
366:
367: /* *(r)+ */
368: case 030:
369: printc('*');
370:
371: /* (r)+ */
372: case 020:
373: printf("(%s)+", rn);
374: return;
375:
376: /* *-(r) */
377: case 050:
378: printc('*');
379:
380: /* -(r) */
381: case 040:
382: printf("-(%s)", rn);
383: return;
384:
385: /* *x(r) */
386: case 070:
387: printc('*');
388:
389: /* x(r) */
390: case 060:
391: if (space==NOSP)
392: printc('?');
393: else {
394: var[1]=stow(sget(inkdot(incp), space));
395: chkerr();
396: psymoff(var[1], type, "");
397: }
398: incp += 2;
399: printf("(%s)", rn);
400: return;
401: }
402: }
403:
404:
405:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.