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