Commit | Line | Data |
---|---|---|
d94e2462 M |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | ||
10 | STRING errflg; | |
11 | L_INT dot; | |
12 | INT dotinc; | |
13 | L_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 | ||
33 | TYPE struct optab *OPTAB; | |
34 | struct 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 | |
131 | SYSTAB { | |
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 | ||
201 | STRING regname[] { "r0", "r1", "r2", "r3", "r4", "r5", "sp", "pc"}; | |
202 | ||
203 | POS type, space, incp; | |
204 | ||
205 | printins(f,idsp,ins) | |
206 | REG 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 | ||
286 | doubl(a,b) | |
287 | { | |
288 | paddr("%8t",a); paddr(",",b); | |
289 | } | |
290 | ||
291 | branch(s,ins) | |
292 | STRING s; | |
293 | REG 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 | ||
301 | paddr(s, a) | |
302 | STRING s; | |
303 | REG 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 |