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);