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