Blob


1 /*
2 *
3 * debugger
4 *
5 */
7 #include "defs.h"
8 #include "fns.h"
10 void
11 scanform(long icount, int prt, char *ifp, Map *map, int literal)
12 {
13 char *fp;
14 char c;
15 int fcount;
16 ADDR savdot;
17 int firstpass;
19 firstpass = 1;
20 while (icount) {
21 fp=ifp;
22 savdot=dot;
23 /*now loop over format*/
24 while (*fp) {
25 if (!isdigit((uchar)*fp))
26 fcount = 1;
27 else {
28 fcount = 0;
29 while (isdigit((uchar)(c = *fp++))) {
30 fcount *= 10;
31 fcount += c-'0';
32 }
33 fp--;
34 }
35 if (*fp==0)
36 break;
37 fp=exform(fcount,prt,fp,map,literal,firstpass);
38 firstpass = 0;
39 }
40 dotinc=dot-savdot;
41 dot=savdot;
42 if (--icount)
43 dot=inkdot(dotinc);
44 }
45 }
47 char *
48 exform(int fcount, int prt, char *ifp, Map *map, int literal, int firstpass)
49 {
50 /* execute single format item `fcount' times
51 * sets `dotinc' and moves `dot'
52 * returns address of next format item
53 */
54 vlong v;
55 WORD w;
56 ulong savdot;
57 u16int u2;
58 u32int u4;
59 u64int u8;
60 char *fp;
61 char c, modifier;
62 int i;
63 ushort sh;
64 uchar ch, *cp;
65 Symbol s;
66 char buf[512];
67 extern int printcol;
69 fp = 0;
70 while (fcount > 0) {
71 fp = ifp;
72 c = *fp;
73 modifier = *fp++;
74 if (firstpass) {
75 firstpass = 0;
76 if (!literal && (c == 'i' || c == 'I' || c == 'M')
77 && (dot & (mach->pcquant-1))) {
78 dprint("warning: instruction not aligned");
79 printc('\n');
80 }
81 if (prt && modifier != 'a' && modifier != 'A') {
82 symoff(buf, 512, dot, CANY);
83 dprint("%s%c%16t", buf, map==symmap? '?':'/');
84 }
85 }
86 if (printcol==0 && modifier != 'a' && modifier != 'A')
87 dprint("\t\t");
88 switch(modifier) {
90 case SPC:
91 case TB:
92 dotinc = 0;
93 break;
95 case 't':
96 case 'T':
97 dprint("%*t", fcount);
98 dotinc = 0;
99 return(fp);
101 case 'a':
102 symoff(buf, sizeof(buf), dot, CANY);
103 dprint("%s%c%16t", buf, map==symmap? '?':'/');
104 dotinc = 0;
105 break;
107 case 'A':
108 dprint("%#lux%10t", dot);
109 dotinc = 0;
110 break;
112 case 'p':
113 if (get4(map, dot, &u4) < 0)
114 error("%r");
115 w = u4;
116 symoff(buf, sizeof(buf), w, CANY);
117 dprint("%s%16t", buf);
118 dotinc = mach->szaddr;
119 break;
121 case 'u':
122 case 'd':
123 case 'x':
124 case 'o':
125 case 'q':
126 if (literal)
127 u2 = (ushort) dot;
128 else if (get2(map, dot, &u2) < 0)
129 error("%r");
130 w = u2;
131 dotinc = 2;
132 if (c == 'u')
133 dprint("%-8lud", w);
134 else if (c == 'x')
135 dprint("%-8#lux", w);
136 else if (c == 'd')
137 dprint("%-8ld", w);
138 else if (c == 'o')
139 dprint("%-8#luo", w);
140 else if (c == 'q')
141 dprint("%-8#lo", w);
142 break;
144 case 'U':
145 case 'D':
146 case 'X':
147 case 'O':
148 case 'Q':
149 if (literal)
150 u4 = (long) dot;
151 else if (get4(map, dot, &u4) < 0)
152 error("%r");
153 dotinc = 4;
154 if (c == 'U')
155 dprint("%-16lud", u4);
156 else if (c == 'X')
157 dprint("%-16#lux", u4);
158 else if (c == 'D')
159 dprint("%-16ld", u4);
160 else if (c == 'O')
161 dprint("%-#16luo", u4);
162 else if (c == 'Q')
163 dprint("%-#16lo", u4);
164 break;
165 case 'Z':
166 case 'V':
167 case 'Y':
168 if (literal)
169 v = dot;
170 else if (get8(map, dot, &u8) < 0)
171 error("%r");
172 dotinc = 8;
173 if (c == 'Y')
174 dprint("%-20#llux", u8);
175 else if (c == 'V')
176 dprint("%-20lld", u8);
177 else if (c == 'Z')
178 dprint("%-20llud", u8);
179 break;
180 case 'B':
181 case 'b':
182 case 'c':
183 case 'C':
184 if (literal)
185 ch = (uchar) dot;
186 else if (get1(map, dot, &ch, 1) < 0)
187 error("%r");
188 if (modifier == 'C')
189 printesc(ch);
190 else if (modifier == 'B' || modifier == 'b')
191 dprint("%-8#lux", (long) ch);
192 else
193 printc(ch);
194 dotinc = 1;
195 break;
197 case 'r':
198 if (literal)
199 sh = (ushort) dot;
200 else if (get2(map, dot, &sh) < 0)
201 error("%r");
202 dprint("%C", sh);
203 dotinc = 2;
204 break;
206 case 'R':
207 if (literal) {
208 u16int sp[2];
209 memmove(&sp, &dot, 4);
210 dprint("%C%C", sp[0], sp[1]);
211 endline();
212 dotinc = 4;
213 break;
215 savdot=dot;
216 while ((i = get2(map, dot, &u2) > 0) && u2) {
217 dot=inkdot(2);
218 dprint("%C", u2);
219 endline();
221 if (i < 0)
222 error("%r");
223 dotinc = dot-savdot+2;
224 dot=savdot;
225 break;
227 case 's':
228 if (literal) {
229 cp = (uchar*)(void*)&dot;
230 for (i = 0; i < 4; i++)
231 buf[i] = cp[i];
232 buf[i] = 0;
233 dprint("%s", buf);
234 endline();
235 dotinc = 4;
236 break;
238 savdot = dot;
239 for(;;){
240 i = 0;
241 do{
242 if (get1(map, dot, (uchar*)(void*)&buf[i], 1) < 0)
243 error("%r");
244 dot = inkdot(1);
245 i++;
246 }while(!fullrune(buf, i));
247 if(buf[0] == 0)
248 break;
249 buf[i] = 0;
250 dprint("%s", buf);
251 endline();
253 dotinc = dot-savdot+1;
254 dot = savdot;
255 break;
257 case 'S':
258 if (literal) {
259 cp = (uchar*) &dot;
260 for (i = 0; i < 4; i++)
261 printesc(cp[i]);
262 endline();
263 dotinc = 4;
264 break;
266 savdot=dot;
267 while ((i = get1(map, dot, &ch, 1) > 0) && ch) {
268 dot=inkdot(1);
269 printesc(ch);
270 endline();
272 if (i < 0)
273 error("%r");
274 dotinc = dot-savdot+1;
275 dot=savdot;
276 break;
279 case 'I':
280 case 'i':
281 dotinc = mach->das(map, dot, modifier, buf, sizeof(buf));
282 if (dotinc < 0)
283 error("%r");
284 dprint("%s\n", buf);
285 break;
287 case 'M':
288 dotinc = mach->hexinst(map, dot, buf, sizeof(buf));
289 if (dotinc < 0)
290 error("%r");
291 dprint("%s", buf);
292 if (*fp) {
293 dotinc = 0;
294 dprint("%48t");
295 } else
296 dprint("\n");
297 break;
299 case 'f':
300 /* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */
301 if (literal) {
302 v = mach->swap8((ulong)dot);
303 memmove(buf, &v, mach->szfloat);
304 }else if (get1(map, dot, (uchar*)buf, mach->szfloat) < 0)
305 error("%r");
306 mach->ftoa32(buf, sizeof(buf), (void*) buf);
307 dprint("%s\n", buf);
308 dotinc = mach->szfloat;
309 break;
311 case 'F':
312 /* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */
313 if (literal) {
314 v = mach->swap8(dot);
315 memmove(buf, &v, mach->szdouble);
316 }else if (get1(map, dot, (uchar*)buf, mach->szdouble) < 0)
317 error("%r");
318 mach->ftoa64(buf, sizeof(buf), (void*) buf);
319 dprint("%s\n", buf);
320 dotinc = mach->szdouble;
321 break;
323 case 'n':
324 case 'N':
325 printc('\n');
326 dotinc=0;
327 break;
329 case '"':
330 dotinc=0;
331 while (*fp != '"' && *fp)
332 printc(*fp++);
333 if (*fp)
334 fp++;
335 break;
337 case '^':
338 dot=inkdot(-dotinc*fcount);
339 return(fp);
341 case '+':
342 dot=inkdot((WORD)fcount);
343 return(fp);
345 case '-':
346 dot=inkdot(-(WORD)fcount);
347 return(fp);
349 case 'z':
350 if (findsym(locaddr(dot), CTEXT, &s) >= 0)
351 dprint("%s() ", s.name);
352 printsource(dot);
353 printc(EOR);
354 return fp;
356 default:
357 error("bad modifier");
359 if (map->seg[0].fd >= 0)
360 dot=inkdot(dotinc);
361 fcount--;
362 endline();
365 return(fp);
368 void
369 printesc(int c)
371 static char hex[] = "0123456789abcdef";
373 if (c < SPC || c >= 0177)
374 dprint("\\x%c%c", hex[(c&0xF0)>>4], hex[c&0xF]);
375 else
376 printc(c);
379 ADDR
380 inkdot(WORD incr)
382 ADDR newdot;
384 newdot=dot+incr;
385 if ((incr >= 0 && newdot < dot)
386 || (incr < 0 && newdot > dot))
387 error("address wraparound");
388 return(newdot);