Blame


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