Mercurial > hg > Members > kono > os9 > sbc09
diff src/trace.c @ 84:9b661787d5ed
2Mbyte
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 11 Aug 2018 18:16:04 +0900 |
parents | 8f3c0906adb9 |
children | 6f7276831219 |
line wrap: on
line diff
--- a/src/trace.c Sat Aug 11 14:06:43 2018 +0900 +++ b/src/trace.c Sat Aug 11 18:16:04 2018 +0900 @@ -142,7 +142,7 @@ } -void setbreak(int adr,int count) ; +void setbreak(int adr,int count, int page) ; int nexti(void); void do_escape(void) { @@ -225,20 +225,27 @@ stkskip = sreg + 2; attention = escape = 1; break; - case 'b': // set break point - if (s[1]) { - char *next; + case 'b': { // set break point + char *next = s; + int page = -1; + if (next[1]=='p') { + next++; + if (next[1]) + page = getarg(next+1,&next); + } + if (next[1]) { int count = 0; - int adr = getarg(s+1,&next); + int adr = getarg(next+1,&next); if (next[0]) { count = getarg(next,&next); } - setbreak(adr,count); + setbreak(adr,count,page); } else { - setbreak(pcreg,0); + setbreak(pcreg,0,page); } bpskip = -1; goto restart; + } case 'B': // break point list for(BPTR bp = breakpoint; bp ; bp = bp->next) { #ifdef USE_MMU @@ -291,8 +298,8 @@ if (next[0]) { adr = getarg(next,&next); #ifdef USE_MMU - adr -= adr &0xf; - // if (p=='p') adr -= adr&0x1fff; + if (d!='i') // disassembler may fail on page boundary + adr -= adr &0xf; #endif if (next[0]) { len = getarg(next,&next); @@ -432,14 +439,17 @@ /* * keep break point / watch point in a list */ -void setbreak(int adr, int count) { +void setbreak(int adr, int count, int page) { BPTR bp = calloc(1,sizeof(BP)); bp->count = count; bp->laddr = adr; bp->address = paddr(adr,mmu); #ifdef USE_MMU + if (page!=-1) { + bp->address = page*0x2000 + adr; + } if (bp->address >= memsize) { free(bp); return; } - bp->watch = *mem0(phymem,adr,mmu); + bp->watch = phymem[bp->address]; #else bp->watch = mem[adr]; #endif @@ -500,7 +510,7 @@ } break; } - if (ofs) setbreak(pcreg+ofs,-1); + if (ofs) setbreak(pcreg+ofs,-1,-1); return ofs; }