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 0c9c620f 2010-03-10 rsc ushort sh;
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 0c9c620f 2010-03-10 rsc u16int sp[2];
209 0c9c620f 2010-03-10 rsc memmove(&sp, &dot, 4);
210 84114f06 2004-04-19 devnull dprint("%C%C", sp[0], sp[1]);
211 84114f06 2004-04-19 devnull endline();
212 84114f06 2004-04-19 devnull dotinc = 4;
213 84114f06 2004-04-19 devnull break;
214 84114f06 2004-04-19 devnull }
215 84114f06 2004-04-19 devnull savdot=dot;
216 84114f06 2004-04-19 devnull while ((i = get2(map, dot, &u2) > 0) && u2) {
217 84114f06 2004-04-19 devnull dot=inkdot(2);
218 84114f06 2004-04-19 devnull dprint("%C", u2);
219 84114f06 2004-04-19 devnull endline();
220 84114f06 2004-04-19 devnull }
221 84114f06 2004-04-19 devnull if (i < 0)
222 84114f06 2004-04-19 devnull error("%r");
223 84114f06 2004-04-19 devnull dotinc = dot-savdot+2;
224 84114f06 2004-04-19 devnull dot=savdot;
225 84114f06 2004-04-19 devnull break;
226 84114f06 2004-04-19 devnull
227 84114f06 2004-04-19 devnull case 's':
228 84114f06 2004-04-19 devnull if (literal) {
229 84114f06 2004-04-19 devnull cp = (uchar*)(void*)&dot;
230 84114f06 2004-04-19 devnull for (i = 0; i < 4; i++)
231 84114f06 2004-04-19 devnull buf[i] = cp[i];
232 84114f06 2004-04-19 devnull buf[i] = 0;
233 84114f06 2004-04-19 devnull dprint("%s", buf);
234 84114f06 2004-04-19 devnull endline();
235 84114f06 2004-04-19 devnull dotinc = 4;
236 84114f06 2004-04-19 devnull break;
237 84114f06 2004-04-19 devnull }
238 84114f06 2004-04-19 devnull savdot = dot;
239 84114f06 2004-04-19 devnull for(;;){
240 84114f06 2004-04-19 devnull i = 0;
241 84114f06 2004-04-19 devnull do{
242 84114f06 2004-04-19 devnull if (get1(map, dot, (uchar*)(void*)&buf[i], 1) < 0)
243 84114f06 2004-04-19 devnull error("%r");
244 84114f06 2004-04-19 devnull dot = inkdot(1);
245 84114f06 2004-04-19 devnull i++;
246 84114f06 2004-04-19 devnull }while(!fullrune(buf, i));
247 84114f06 2004-04-19 devnull if(buf[0] == 0)
248 84114f06 2004-04-19 devnull break;
249 84114f06 2004-04-19 devnull buf[i] = 0;
250 84114f06 2004-04-19 devnull dprint("%s", buf);
251 84114f06 2004-04-19 devnull endline();
252 84114f06 2004-04-19 devnull }
253 84114f06 2004-04-19 devnull dotinc = dot-savdot+1;
254 84114f06 2004-04-19 devnull dot = savdot;
255 84114f06 2004-04-19 devnull break;
256 84114f06 2004-04-19 devnull
257 84114f06 2004-04-19 devnull case 'S':
258 84114f06 2004-04-19 devnull if (literal) {
259 84114f06 2004-04-19 devnull cp = (uchar*) &dot;
260 84114f06 2004-04-19 devnull for (i = 0; i < 4; i++)
261 84114f06 2004-04-19 devnull printesc(cp[i]);
262 84114f06 2004-04-19 devnull endline();
263 84114f06 2004-04-19 devnull dotinc = 4;
264 84114f06 2004-04-19 devnull break;
265 84114f06 2004-04-19 devnull }
266 84114f06 2004-04-19 devnull savdot=dot;
267 84114f06 2004-04-19 devnull while ((i = get1(map, dot, &ch, 1) > 0) && ch) {
268 84114f06 2004-04-19 devnull dot=inkdot(1);
269 84114f06 2004-04-19 devnull printesc(ch);
270 84114f06 2004-04-19 devnull endline();
271 84114f06 2004-04-19 devnull }
272 84114f06 2004-04-19 devnull if (i < 0)
273 84114f06 2004-04-19 devnull error("%r");
274 84114f06 2004-04-19 devnull dotinc = dot-savdot+1;
275 84114f06 2004-04-19 devnull dot=savdot;
276 84114f06 2004-04-19 devnull break;
277 84114f06 2004-04-19 devnull
278 84114f06 2004-04-19 devnull
279 84114f06 2004-04-19 devnull case 'I':
280 84114f06 2004-04-19 devnull case 'i':
281 84114f06 2004-04-19 devnull dotinc = mach->das(map, dot, modifier, buf, sizeof(buf));
282 84114f06 2004-04-19 devnull if (dotinc < 0)
283 84114f06 2004-04-19 devnull error("%r");
284 84114f06 2004-04-19 devnull dprint("%s\n", buf);
285 84114f06 2004-04-19 devnull break;
286 84114f06 2004-04-19 devnull
287 84114f06 2004-04-19 devnull case 'M':
288 84114f06 2004-04-19 devnull dotinc = mach->hexinst(map, dot, buf, sizeof(buf));
289 84114f06 2004-04-19 devnull if (dotinc < 0)
290 84114f06 2004-04-19 devnull error("%r");
291 84114f06 2004-04-19 devnull dprint("%s", buf);
292 84114f06 2004-04-19 devnull if (*fp) {
293 84114f06 2004-04-19 devnull dotinc = 0;
294 84114f06 2004-04-19 devnull dprint("%48t");
295 84114f06 2004-04-19 devnull } else
296 84114f06 2004-04-19 devnull dprint("\n");
297 84114f06 2004-04-19 devnull break;
298 84114f06 2004-04-19 devnull
299 84114f06 2004-04-19 devnull case 'f':
300 84114f06 2004-04-19 devnull /* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */
301 84114f06 2004-04-19 devnull if (literal) {
302 84114f06 2004-04-19 devnull v = mach->swap8((ulong)dot);
303 84114f06 2004-04-19 devnull memmove(buf, &v, mach->szfloat);
304 84114f06 2004-04-19 devnull }else if (get1(map, dot, (uchar*)buf, mach->szfloat) < 0)
305 84114f06 2004-04-19 devnull error("%r");
306 84114f06 2004-04-19 devnull mach->ftoa32(buf, sizeof(buf), (void*) buf);
307 84114f06 2004-04-19 devnull dprint("%s\n", buf);
308 84114f06 2004-04-19 devnull dotinc = mach->szfloat;
309 84114f06 2004-04-19 devnull break;
310 84114f06 2004-04-19 devnull
311 84114f06 2004-04-19 devnull case 'F':
312 84114f06 2004-04-19 devnull /* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */
313 84114f06 2004-04-19 devnull if (literal) {
314 84114f06 2004-04-19 devnull v = mach->swap8(dot);
315 84114f06 2004-04-19 devnull memmove(buf, &v, mach->szdouble);
316 84114f06 2004-04-19 devnull }else if (get1(map, dot, (uchar*)buf, mach->szdouble) < 0)
317 84114f06 2004-04-19 devnull error("%r");
318 84114f06 2004-04-19 devnull mach->ftoa64(buf, sizeof(buf), (void*) buf);
319 84114f06 2004-04-19 devnull dprint("%s\n", buf);
320 84114f06 2004-04-19 devnull dotinc = mach->szdouble;
321 84114f06 2004-04-19 devnull break;
322 84114f06 2004-04-19 devnull
323 84114f06 2004-04-19 devnull case 'n':
324 84114f06 2004-04-19 devnull case 'N':
325 84114f06 2004-04-19 devnull printc('\n');
326 84114f06 2004-04-19 devnull dotinc=0;
327 84114f06 2004-04-19 devnull break;
328 84114f06 2004-04-19 devnull
329 84114f06 2004-04-19 devnull case '"':
330 84114f06 2004-04-19 devnull dotinc=0;
331 84114f06 2004-04-19 devnull while (*fp != '"' && *fp)
332 84114f06 2004-04-19 devnull printc(*fp++);
333 84114f06 2004-04-19 devnull if (*fp)
334 84114f06 2004-04-19 devnull fp++;
335 84114f06 2004-04-19 devnull break;
336 84114f06 2004-04-19 devnull
337 84114f06 2004-04-19 devnull case '^':
338 84114f06 2004-04-19 devnull dot=inkdot(-dotinc*fcount);
339 84114f06 2004-04-19 devnull return(fp);
340 84114f06 2004-04-19 devnull
341 84114f06 2004-04-19 devnull case '+':
342 84114f06 2004-04-19 devnull dot=inkdot((WORD)fcount);
343 84114f06 2004-04-19 devnull return(fp);
344 84114f06 2004-04-19 devnull
345 84114f06 2004-04-19 devnull case '-':
346 84114f06 2004-04-19 devnull dot=inkdot(-(WORD)fcount);
347 84114f06 2004-04-19 devnull return(fp);
348 84114f06 2004-04-19 devnull
349 84114f06 2004-04-19 devnull case 'z':
350 84114f06 2004-04-19 devnull if (findsym(locaddr(dot), CTEXT, &s) >= 0)
351 84114f06 2004-04-19 devnull dprint("%s() ", s.name);
352 84114f06 2004-04-19 devnull printsource(dot);
353 84114f06 2004-04-19 devnull printc(EOR);
354 84114f06 2004-04-19 devnull return fp;
355 84114f06 2004-04-19 devnull
356 84114f06 2004-04-19 devnull default:
357 84114f06 2004-04-19 devnull error("bad modifier");
358 84114f06 2004-04-19 devnull }
359 84114f06 2004-04-19 devnull if (map->seg[0].fd >= 0)
360 84114f06 2004-04-19 devnull dot=inkdot(dotinc);
361 84114f06 2004-04-19 devnull fcount--;
362 84114f06 2004-04-19 devnull endline();
363 84114f06 2004-04-19 devnull }
364 84114f06 2004-04-19 devnull
365 84114f06 2004-04-19 devnull return(fp);
366 84114f06 2004-04-19 devnull }
367 84114f06 2004-04-19 devnull
368 84114f06 2004-04-19 devnull void
369 84114f06 2004-04-19 devnull printesc(int c)
370 84114f06 2004-04-19 devnull {
371 84114f06 2004-04-19 devnull static char hex[] = "0123456789abcdef";
372 84114f06 2004-04-19 devnull
373 84114f06 2004-04-19 devnull if (c < SPC || c >= 0177)
374 84114f06 2004-04-19 devnull dprint("\\x%c%c", hex[(c&0xF0)>>4], hex[c&0xF]);
375 84114f06 2004-04-19 devnull else
376 84114f06 2004-04-19 devnull printc(c);
377 84114f06 2004-04-19 devnull }
378 84114f06 2004-04-19 devnull
379 84114f06 2004-04-19 devnull ADDR
380 84114f06 2004-04-19 devnull inkdot(WORD incr)
381 84114f06 2004-04-19 devnull {
382 84114f06 2004-04-19 devnull ADDR newdot;
383 84114f06 2004-04-19 devnull
384 84114f06 2004-04-19 devnull newdot=dot+incr;
385 84114f06 2004-04-19 devnull if ((incr >= 0 && newdot < dot)
386 84114f06 2004-04-19 devnull || (incr < 0 && newdot > dot))
387 84114f06 2004-04-19 devnull error("address wraparound");
388 84114f06 2004-04-19 devnull return(newdot);
389 84114f06 2004-04-19 devnull }