Mercurial > hg > Members > kono > os9 > sbc09
comparison src/trace.c @ 64:41f14f365b34
add trace command
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 26 Jul 2018 19:55:29 +0900 |
parents | 7c6dc25c2b05 |
children | 1ff0a1fdd5d7 |
comparison
equal
deleted
inserted
replaced
63:1887f7098f15 | 64:41f14f365b34 |
---|---|
66 BPTR breakpoint = 0; | 66 BPTR breakpoint = 0; |
67 int bpskip = 0; | 67 int bpskip = 0; |
68 int trskip = 0; | 68 int trskip = 0; |
69 int stkskip = 0; | 69 int stkskip = 0; |
70 | 70 |
71 int getterm(char *buf, char** next) { | |
72 int value = 0; | |
73 while (*buf==' ') buf++; | |
74 if (*buf=='x') { value = xreg; buf++; *next = buf ; | |
75 } else if (*buf=='y') { value = yreg; buf++; *next = buf; | |
76 } else if (*buf=='u') { value = ureg; buf++; *next = buf; | |
77 } else if (*buf=='s') { value = sreg; buf++; *next = buf; | |
78 } else if (*buf=='p') { value = pcreg; buf++; *next = buf; | |
79 } else if (*buf=='d') { value = (*areg<<8)+*breg; buf++; *next = buf; | |
80 } else if (*buf=='a') { value = *areg; buf++; *next = buf; | |
81 } else if (*buf=='b') { value = *breg; buf++; *next = buf; | |
82 } else value = strtol(buf,next,0); | |
83 return value; | |
84 } | |
85 | |
71 int getarg(char *buf, char** next) { | 86 int getarg(char *buf, char** next) { |
72 int value = strtol(buf,next,0); | 87 int value = 0; |
73 for(;next;) { | 88 char *b = buf; |
89 if (next==0) next = &b; | |
90 value=getterm(*next,next); | |
91 for(;**next;) { | |
74 if ( **next == '+' ) { | 92 if ( **next == '+' ) { |
75 value += strtol(*next+1,next,0); | 93 value += getterm(*next+1,next); |
76 } else if ( **next == '*' ) { | 94 } else if ( **next == '*' ) { |
77 value *= strtol(*next+1,next,0); | 95 value *= getterm(*next+1,next); |
78 } else if ( **next == '/' ) { | 96 } else if ( **next == '/' ) { |
79 value /= strtol(*next+1,next,0); | 97 value /= getterm(*next+1,next); |
80 } else if ( **next == '-' ) { | 98 } else if ( **next == '-' ) { |
81 value -= strtol(*next+1,next,0); | 99 value -= getterm(*next+1,next); |
82 } else if ( **next == '&' ) { | 100 } else if ( **next == '&' ) { |
83 value &= strtol(*next+1,next,0); | 101 value &= getterm(*next+1,next); |
84 } else if ( **next == '|' ) { | 102 } else if ( **next == '|' ) { |
85 value |= strtol(*next+1,next,0); | 103 value |= getterm(*next+1,next); |
104 } else if ( **next == '(' ) { | |
105 value = getarg(*next+1,next); | |
106 if(**next==')') *next=*next+1; | |
86 } else break; | 107 } else break; |
87 } | 108 } |
88 return value; | 109 return value; |
89 } | 110 } |
90 | 111 |
91 void printhelp(void) | 112 void printhelp(void) |
92 { | 113 { |
93 printf( | 114 printf( |
115 "use 0x for hex inputs\n" | |
94 " s [count] one step trace\n" | 116 " s [count] one step trace\n" |
95 " n step over\n" | 117 " n step over\n" |
96 " f finish this call (until stack pop)\n" | 118 " f finish this call (until stack pop)\n" |
97 " b [adr] set break point (on current physical addreaa)\n" | 119 " b [adr] set break point (on current physical addreaa)\n" |
98 " B break point list\n" | 120 " B break point list\n" |
99 " d [n] delte break point list\n" | 121 " d [n] delte break point list\n" |
100 " c [count] continue;\n" | 122 " c [count] continue;\n" |
123 " p data print\n" | |
101 " x [adr] [count] dump\n" | 124 " x [adr] [count] dump\n" |
102 #ifdef USE_MMU | |
103 " xp page [adr] dump physical memory\n" | |
104 #endif | |
105 " xi [adr] [count] disassemble\n" | 125 " xi [adr] [count] disassemble\n" |
126 #ifdef USE_MMU | |
127 " x [p page] [offset] [count] dump physical memory\n" | |
128 " xi [p page] [offset] [count] disassemble\n" | |
129 #endif | |
106 " 0 file disk drive 0 image\n" | 130 " 0 file disk drive 0 image\n" |
107 " 1 file disk drive 1 image\n" | 131 " 1 file disk drive 1 image\n" |
108 " L file start log to file\n" | 132 " L file start log to file\n" |
109 " S file set input file\n" | 133 " S file set input file\n" |
110 " X exit\n" | 134 " X exit\n" |
176 restart: | 200 restart: |
177 printf("v09>"); | 201 printf("v09>"); |
178 fgets(s, sizeof(s)-1, stdin); | 202 fgets(s, sizeof(s)-1, stdin); |
179 s[strlen(s)-1] = 0; // chop | 203 s[strlen(s)-1] = 0; // chop |
180 switch (s[0]) { | 204 switch (s[0]) { |
205 case 'p': { | |
206 int d = getarg(s+1,0); | |
207 printf("0x%x %d '%c'\n",d,d,(d<' '||d>0x7f)?' ':d); | |
208 goto restart; | |
209 } | |
181 case 'n': // step over | 210 case 'n': // step over |
182 if (nexti()) { | 211 if (nexti()) { |
183 bpskip = -1; | 212 bpskip = -1; |
184 break; | 213 break; |
185 } | 214 } |
242 break; | 271 break; |
243 /* | 272 /* |
244 * we should have disassembler for a mmu page | 273 * we should have disassembler for a mmu page |
245 */ | 274 */ |
246 case 'x': // dump | 275 case 'x': // dump |
247 { char *next = s+1; | 276 { char d = 0; |
248 if (s[1]=='i') next=s+2; | 277 char p = 0; |
249 else if (s[1]=='p') { | 278 char *next = s+1; |
250 next = s+2; | 279 int len = 32; |
280 int adr = pcreg; | |
281 if (*next=='i') { next++; d='i'; | |
282 } | |
283 if (*next=='p') { | |
284 p = 'p'; | |
285 next++; | |
251 if (next[0]) { | 286 if (next[0]) { |
252 page = getarg(next,&next); | 287 page = getarg(next,&next); |
253 } | 288 } |
254 } | 289 } |
255 if (next[0]) { | 290 if (next[0]) { |
256 int adr = getarg(next,&next); | 291 adr = getarg(next,&next); |
257 int len = 32; | 292 #ifdef USE_MMU |
293 adr -= adr &0xf; | |
294 if (p=='p') adr -= adr&0x1fff; | |
295 #endif | |
258 if (next[0]) { | 296 if (next[0]) { |
259 len = getarg(next,&next); | 297 len = getarg(next,&next); |
260 } | 298 } |
261 if (s[1]=='i') { | 299 } |
262 Word end = adr + len; | 300 for(; len > 0 ; len-=16,adr+=16) { |
263 while(adr < end) { | 301 Byte *phyadr = 0; |
264 #ifdef USE_MMU | 302 #ifdef USE_MMU |
265 Byte *phyadr = mem0(phymem,adr,mmu); | 303 if (p=='p') { |
304 phyadr = phymem + (page * 0x2000 + adr); | |
266 prog = (char*)phyadr - adr ; | 305 prog = (char*)phyadr - adr ; |
267 if (phyadr > phymem+memsize) goto restart; | 306 } else { |
268 #endif | 307 phyadr = mem0(phymem,adr,mmu); |
269 int len = adr+16<end? 16 : end-adr -1 ; | 308 prog = (char*)phyadr - adr ; |
270 adr = disasm(adr,adr+len); | 309 } |
271 } | 310 if (phyadr > phymem+memsize) goto restart; |
272 } else { | 311 #else |
273 #ifdef USE_MMU | 312 phyadr = mem+adr; |
274 for(int i=0; len > 0 ; i+=16, len-=16) { | 313 if (phyadr > mem+0xffff) goto restart; |
275 if (s[1]=='p') { | 314 #endif |
276 int phy = page * 0x2000 + adr + i; | 315 if (d=='i') { |
277 if (phy > rommemsize) goto restart; | 316 adr = disasm(adr,adr+(len>16?16:len)); |
278 hexadump(phymem+phy,len>16?16:len,adr+i,16); | 317 } else { |
279 } else { | 318 hexadump(phyadr,len>16?16:len,adr,16); |
280 Byte *phyadr = mem0(phymem,adr+i,mmu); | 319 } |
281 if (phyadr > phymem+rommemsize) goto restart; | 320 } |
282 hexadump(phyadr,len>16?16:len,adr+i,16); | |
283 } | |
284 } | |
285 #else | |
286 for(int i=0; len > 0 ; i+=16, len-=16) { | |
287 hexadump(mem+adr+i,len>16?16:len,adr+i,16); | |
288 } | |
289 #endif | |
290 } | |
291 } else | |
292 disasm(pcreg,pcreg+32); | |
293 goto restart; | 321 goto restart; |
294 } | 322 } |
295 case 'L': | 323 case 'L': |
296 if (logfile) | 324 if (logfile) |
297 fclose(logfile); | 325 fclose(logfile); |
298 logfile = 0; | 326 logfile = 0; |
299 if (s[1]) { | 327 if (s[1]) { |
300 int i=1; while(s[i]==' ') i++; | 328 int i=1; while(s[i]==' ') i++; |
301 logfile = fopen(s + i, "w"); | 329 logfile = fopen(s + i, "w"); |
302 } | 330 } |
331 goto restart; | |
303 break; | 332 break; |
304 case 'S': | 333 case 'S': |
305 if (infile) | 334 if (infile) |
306 fclose(infile); | 335 fclose(infile); |
307 infile = 0; | 336 infile = 0; |
308 if (s[1]) { | 337 if (s[1]) { |
309 int i=1; while(s[i]==' ') i++; | 338 int i=1; while(s[i]==' ') i++; |
310 infile = fopen(s + i, "r"); | 339 infile = fopen(s + i, "r"); |
311 } | 340 } |
341 goto restart; | |
312 break; | 342 break; |
313 case 'h': | 343 case 'h': |
314 case '?': | 344 case '?': |
315 printhelp(); | 345 printhelp(); |
316 goto restart; | 346 goto restart; |
321 else { | 351 else { |
322 xmstat = 0; | 352 xmstat = 0; |
323 fclose(xfile); | 353 fclose(xfile); |
324 xfile = 0; | 354 xfile = 0; |
325 } | 355 } |
356 goto restart; | |
326 break; | 357 break; |
327 case '0': | 358 case '0': |
328 case '1': | 359 case '1': |
329 { FILE **drv = &disk[ s[0]-'0'] ; | 360 { FILE **drv = &disk[ s[0]-'0'] ; |
330 if (*drv) | 361 if (*drv) |
334 int i=1; while(s[i]==' ') i++; | 365 int i=1; while(s[i]==' ') i++; |
335 *drv = fopen(s + i, "r+b"); | 366 *drv = fopen(s + i, "r+b"); |
336 if ( *drv == 0 ) { printf("can't open %s\n", &s[i]); } | 367 if ( *drv == 0 ) { printf("can't open %s\n", &s[i]); } |
337 } | 368 } |
338 } | 369 } |
370 goto restart; | |
339 break; | 371 break; |
340 case 'U': | 372 case 'U': |
341 if (xfile) | 373 if (xfile) |
342 fclose(xfile); | 374 fclose(xfile); |
343 xfile = 0; | 375 xfile = 0; |
352 xmstat = 0; | 384 xmstat = 0; |
353 xidx = 0; | 385 xidx = 0; |
354 acknak = 21; | 386 acknak = 21; |
355 rcvdnak = EOF; | 387 rcvdnak = EOF; |
356 blocknum = 1; | 388 blocknum = 1; |
389 goto restart; | |
357 break; | 390 break; |
358 case 'D': | 391 case 'D': |
359 if (xfile) | 392 if (xfile) |
360 fclose(xfile); | 393 fclose(xfile); |
361 xfile = 0; | 394 xfile = 0; |
369 else | 402 else |
370 xmstat = 0; | 403 xmstat = 0; |
371 xidx = 0; | 404 xidx = 0; |
372 acknak = 21; | 405 acknak = 21; |
373 blocknum = 1; | 406 blocknum = 1; |
407 goto restart; | |
374 break; | 408 break; |
375 case 'R': | 409 case 'R': |
376 pcreg = (mem[0xfffe] << 8) + mem[0xffff]; | 410 pcreg = (mem[0xfffe] << 8) + mem[0xffff]; |
377 bpskip = 0; | 411 bpskip = 0; |
378 #ifdef USE_MMU | 412 #ifdef USE_MMU |
380 mem[0xffa7]=0x3f; | 414 mem[0xffa7]=0x3f; |
381 #endif | 415 #endif |
382 attention = escape = 1; | 416 attention = escape = 1; |
383 // we have to reload romfile | 417 // we have to reload romfile |
384 // readimage(); | 418 // readimage(); |
419 goto restart; | |
385 break; | 420 break; |
386 default: // one step trace | 421 default: // one step trace |
387 trskip = 1; | 422 trskip = 1; |
388 bpskip = 0; | 423 bpskip = 0; |
389 attention = escape = 1; | 424 attention = escape = 1; |
410 bp->next = breakpoint; | 445 bp->next = breakpoint; |
411 breakpoint = bp; | 446 breakpoint = bp; |
412 } | 447 } |
413 | 448 |
414 /* | 449 /* |
415 * length call instruction | 450 * length of call instruction |
416 * | 451 * |
417 * if call instruction, put temporary break on next instruction | 452 * if next instruction is call or swi, put temporary break after the call instruction |
418 * (ignoring page boundary, sorry) | 453 * (ignoring page boundary, sorry) |
419 */ | 454 */ |
420 int nexti(void) { | 455 int nexti(void) { |
421 #ifdef USE_MMU | 456 #ifdef USE_MMU |
422 int op1 = *mem0(phymem,pcreg,mmu); | 457 int op1 = *mem0(phymem,pcreg,mmu); |