Mercurial > hg > Members > kono > os9 > sbc09
comparison trace.c @ 22:10e33568b38a
clean up
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 09 Jul 2018 14:07:30 +0900 |
parents | 1925cfa982fe |
children | 5217f23f2f9e |
comparison
equal
deleted
inserted
replaced
21:1925cfa982fe | 22:10e33568b38a |
---|---|
98 ); | 98 ); |
99 } | 99 } |
100 | 100 |
101 | 101 |
102 void setbreak(int adr,int count) ; | 102 void setbreak(int adr,int count) ; |
103 void nexti(void); | 103 int nexti(void); |
104 | 104 |
105 void do_escape(void) { | 105 void do_escape(void) { |
106 char s[80]; | 106 char s[80]; |
107 int adr,skip; | 107 int adr,skip; |
108 if (bpskip) { // skip unbreak instruction | 108 if (bpskip) { // skip unbreak instruction |
109 bpskip--; | 109 bpskip--; |
110 int lpc = paddr(pcreg,mmu); | 110 int lpc = paddr(pcreg,mmu); |
111 BPTR *prev = &breakpoint; | 111 BPTR *prev = &breakpoint; |
112 for(BPTR b = breakpoint; b ; b=b->next, prev=prev->next) { | 112 for(BPTR b = breakpoint; b ; prev=&b->next, b=b->next ) { |
113 if (lpc==b->address) { | 113 if (lpc==b->address) { |
114 if (b->count==-1) { // temporaly break point | 114 if (b->count==-1) { // temporaly break point |
115 BPTR next = b->next; | 115 BPTR next = b->next; |
116 free(b); | 116 free(b); |
117 prev->next = next; | 117 *prev = next; |
118 goto restart0; | 118 goto restart0; |
119 } | 119 } |
120 if (b->count) b->count--; | 120 if (b->count) b->count--; |
121 if (b->count==0) { | 121 if (b->count==0) { |
122 goto restart0; | 122 goto restart0; |
189 goto restart; | 189 goto restart; |
190 case 'd': // delte break point list | 190 case 'd': // delte break point list |
191 if (s[1]) { | 191 if (s[1]) { |
192 int trskip = getarg(s+1,0); | 192 int trskip = getarg(s+1,0); |
193 BPTR *prev = &breakpoint; | 193 BPTR *prev = &breakpoint; |
194 for(BPTR bp = breakpoint; bp ; bp = bp->next) { | 194 for(BPTR bp = breakpoint; bp ; prev=&bp->next, bp = bp->next) { |
195 if (trskip-- == 0) { | 195 if (trskip-- == 0) { |
196 BPTR next = b->next; | 196 BPTR next = bp->next; |
197 free(bp); | 197 free(bp); |
198 prev->next = next; | 198 *prev = next; |
199 break; | 199 break; |
200 } | 200 } |
201 prev = &bp->next; | 201 prev = &bp->next; |
202 } | 202 } |
203 } | 203 } |
346 void setbreak(int adr, int count) { | 346 void setbreak(int adr, int count) { |
347 BPTR bp = calloc(1,sizeof(BP)); | 347 BPTR bp = calloc(1,sizeof(BP)); |
348 bp->next = breakpoint; | 348 bp->next = breakpoint; |
349 breakpoint = bp; | 349 breakpoint = bp; |
350 bp->count = count; | 350 bp->count = count; |
351 if (s[1]) { | 351 bp->laddr = adr; |
352 char *next; | 352 bp->address = paddr(adr,mmu); |
353 bp->laddr = getarg(s+0,&next); | |
354 bp->address = paddr((bp->laddr,&next),mmu); | |
355 if (next[0]) { | |
356 bp->count = getarg(next,&next); | |
357 } | |
358 } else { | |
359 bp->laddr = pcreg; | |
360 bp->address = paddr(pcreg,mmu); | |
361 } | |
362 } | 353 } |
363 | 354 |
364 int nexti(void) { | 355 int nexti(void) { |
365 int op1 = phymem[mem1(pcreg)]; | 356 #ifdef USE_MMU |
357 int op1 = *mem0(phymem,pcreg,mmu); | |
358 int op2 = *mem0(phymem,pcreg+1,mmu); | |
359 #else | |
360 int op1 = mem[pcreg]; | |
361 int op2 = mem[pcreg+1]; | |
362 #endif | |
366 int ofs = 0; | 363 int ofs = 0; |
367 switch(op1) { | 364 switch(op1) { |
368 case 0x17: // LBSR | 365 case 0x17: // LBSR |
369 case 0xbd: // JSR extended | 366 case 0xbd: // JSR extended |
370 ofs=3; beak; | 367 ofs=3; break; |
371 case 0x10: // page2 | 368 case 0x10: // page2 |
372 { | 369 { |
373 int op2 = phymem[mem1(pcreg+1)]; | |
374 if (op2==0x3f) { // os9 system call | 370 if (op2==0x3f) { // os9 system call |
375 ofs=3; beak; | 371 ofs=3; break; |
376 } | 372 } |
377 } | 373 } |
378 case 0x11: // page3 | 374 case 0x11: // page3 |
379 { | 375 { |
380 int op2 = phymem[mem1(pcreg+1)]; | |
381 if (op2==0x3f) { // SWI3 | 376 if (op2==0x3f) { // SWI3 |
382 ofs=2; beak; | 377 ofs=2; break; |
383 } | 378 } |
384 } | 379 } |
385 case 0x3f: // SWI | 380 case 0x3f: // SWI |
386 ofs=1; beak; | 381 ofs=1; break; |
387 case 0x3c: // CWAI | 382 case 0x3c: // CWAI |
388 case 0x8d: // BSR | 383 case 0x8d: // BSR |
389 case 0x9d: // JSR direct | 384 case 0x9d: // JSR direct |
390 ofs=2; beak; | 385 ofs=2; break; |
391 case 0xad: // JSR index | 386 case 0xad: // JSR index |
392 { | 387 { |
393 int op2 = phymem[mem1(pcreg+1)]; | |
394 if (op2<0x80) ofs = 2; // 5bit ofs | 388 if (op2<0x80) ofs = 2; // 5bit ofs |
395 else switch (op2&0xf) { | 389 else switch (op2&0xf) { |
396 case 8: case 0xc: | 390 case 8: case 0xc: |
397 ofs = 3; break; | 391 ofs = 3; break; |
398 case 9: case 0xd: case 0xf: | 392 case 9: case 0xd: case 0xf: |
401 ofs = 2; break; | 395 ofs = 2; break; |
402 } | 396 } |
403 } | 397 } |
404 break; | 398 break; |
405 } | 399 } |
406 if (ofs) setbreak(pc+ofs,-1); | 400 if (ofs) setbreak(pcreg+ofs,-1); |
407 retrun ofs; | 401 return ofs; |
408 } | 402 } |
409 | 403 |
410 | 404 |
411 | 405 |
412 | 406 |
413 | 407 |
414 | 408 |
415 | 409 |
416 | 410 |