changeset 21:1925cfa982fe

fixing trace
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 09 Jul 2018 11:25:28 +0900
parents 49fac9474858
children 10e33568b38a
files engine.c trace.c
diffstat 2 files changed, 134 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/engine.c	Mon Jul 09 09:29:33 2018 +0900
+++ b/engine.c	Mon Jul 09 11:25:28 2018 +0900
@@ -39,12 +39,29 @@
 static int tracetrick=0;
 extern long romstart;
 
-#ifdef USE_MMU
+#ifndef USE_MMU
+
+static Byte mem1(Word adr) {
+    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff);
+    return mem[adr];
+}
+
+static void SETBYTE1(Word a,Byte n) {
+    if ((a&0xfe00)==(IOPAGE&0xfe00)) do_output(a&0x1ff,n);
+    if(!(a>=romstart))mem[a]=n;
+}
+#define mem(a) mem1(a)
+#define SETBYTE(a,n) SETBYTE1(a,n);
+
+#else
+
+int paddr(Word adr, Byte *immu) { 
+    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return memsize-0x10000+adr;
+    return  (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); 
+}
 
 Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
-    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return &mem[adr];
-    int addr = (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); 
-    return & iphymem[ addr ];
+    return & iphymem[ paddr(adr,immu) ];
 }
 
 static Byte mem1(Byte *iphymem, Word adr, Byte *immu) {
@@ -72,21 +89,6 @@
     } \
 } 
 
-
-#else
-
-static Byte mem1(Word adr) {
-    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff);
-    return mem[adr];
-}
-
-static void SETBYTE1(Word a,Byte n) {
-    if ((a&0xfe00)==(IOPAGE&0xfe00)) do_output(a&0x1ff,n);
-    if(!(a>=romstart))mem[a]=n;
-}
-#define mem(a) mem1(a)
-#define SETBYTE(a,n) SETBYTE1(a,n);
-
 #endif
 
 #define GETWORD(a) (mem(a)<<8|mem((a)+1))
--- a/trace.c	Mon Jul 09 09:29:33 2018 +0900
+++ b/trace.c	Mon Jul 09 11:25:28 2018 +0900
@@ -43,6 +43,9 @@
 #ifdef USE_MMU
 extern char *prog ;   // for disass
 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ;
+extern int paddr(Word adr, Byte *immu) ;
+#else
+#define paddr(a,m)  (a)
 #endif
 
 void do_exit(void) {
@@ -52,7 +55,8 @@
 
 
 typedef struct bp {
-  int address;
+  int address;       // physical address
+  int laddr;
   int count;
   struct bp *next;
 } BP, *BPTR;
@@ -94,13 +98,25 @@
     );
 }
 
+               
+void setbreak(int adr,int count) ;
+void nexti(void);
+
 void do_escape(void) {
         char s[80];
         int adr,skip;
         if (bpskip) { // skip unbreak instruction
             bpskip--;
-            for(BPTR b = breakpoint; b ; b=b->next) {
-                if (pcreg==b->address) {
+            int lpc = paddr(pcreg,mmu);
+            BPTR *prev = &breakpoint;
+            for(BPTR b = breakpoint; b ; b=b->next, prev=prev->next) {
+                if (lpc==b->address) {
+                    if (b->count==-1) {  // temporaly break point
+                        BPTR next = b->next;
+                        free(b);
+                        prev->next = next;
+                        goto restart0;
+                    }
                     if (b->count) b->count--;
                     if (b->count==0) {
                         goto restart0;
@@ -131,6 +147,11 @@
         if (s[0])
                 s[strlen(s) - 1] = 0;
         switch (s[0]) {
+        case 'n':   // step over
+                if (nexti()) {
+                   bpskip = -1;
+                   break;
+                } 
         case 's':   // one step trace
                 trskip = 1;
                 if (s[1]) {
@@ -139,35 +160,31 @@
                 bpskip = 0;
                 attention = escape = 1;
                 break;
-        case 'n':   // step over
-                stkskip = sreg;
-                attention = escape = 1;
-                break;
         case 'f':   // finish this call (until stack pop)
                 stkskip = sreg + 2;
                 attention = escape = 1;
                 break;
         case 'b':   // set break point
-                {
-                  BPTR bp = calloc(1,sizeof(BP));
-                  bp->next = breakpoint;
-                  breakpoint = bp;
-                  bp->count = 1;
-                  if (s[1]) {
-                     char *next;
-                     bp->address = getarg(s+1,&next);
-                     if (next[0]) {
-                         bp->count = getarg(next,&next);
-                     }
-                  } else {
-                     bp->address = pcreg;
-                  }
+                if (s[1]) {
+                   char *next;
+                   int count = 0;
+                   int adr = getarg(s+0,&next);
+                   if (next[0]) {
+                      count = getarg(next,&next);
+                   }
+                   setbreak(adr,count);
+                } else {
+                   setbreak(pcreg,0);
                 }
                 bpskip = -1;
                 goto restart;
         case 'l':   // break point list
                 for(BPTR bp = breakpoint; bp ; bp = bp->next) {
-                    printf("%x %i\n", bp->address, bp->count);
+#ifdef USE_MMU
+                    printf("%x %x %d\n", bp->laddr, bp->address, bp->count);
+#else
+                    printf("%x %d\n", bp->address, bp->count);
+#endif
                 }
                 goto restart;
         case 'd':   // delte break point list
@@ -176,9 +193,9 @@
                    BPTR *prev = &breakpoint;
                    for(BPTR bp = breakpoint; bp ; bp = bp->next) {
                        if (trskip-- == 0) {
-                          if (bp) {
-                              *prev = bp->next;
-                          }
+                          BPTR next = b->next;
+                          free(bp);
+                          prev->next = next;
                           break;
                        }
                        prev = &bp->next;
@@ -326,3 +343,74 @@
         set_term(escchar);
 }
 
+void setbreak(int adr, int count) {
+  BPTR bp = calloc(1,sizeof(BP));
+  bp->next = breakpoint;
+  breakpoint = bp;
+  bp->count = count;
+  if (s[1]) {
+     char *next;
+     bp->laddr = getarg(s+0,&next);
+     bp->address = paddr((bp->laddr,&next),mmu);
+     if (next[0]) {
+         bp->count = getarg(next,&next);
+     }
+  } else {
+     bp->laddr = pcreg;
+     bp->address = paddr(pcreg,mmu);
+  }
+}
+
+int nexti(void) {
+    int op1 = phymem[mem1(pcreg)];
+    int ofs = 0;
+    switch(op1) {
+        case 0x17: // LBSR
+        case 0xbd: // JSR extended
+            ofs=3; beak;
+        case 0x10: // page2
+            {
+                int op2 = phymem[mem1(pcreg+1)];
+                if (op2==0x3f) { // os9 system call
+                    ofs=3; beak;
+                }
+            }
+        case 0x11: // page3
+            {
+                int op2 = phymem[mem1(pcreg+1)];
+                if (op2==0x3f) { // SWI3
+                    ofs=2; beak;
+                }
+            }
+        case 0x3f: // SWI
+            ofs=1; beak;
+        case 0x3c: // CWAI
+        case 0x8d: // BSR
+        case 0x9d: // JSR direct
+            ofs=2; beak;
+        case 0xad: // JSR index
+            {
+                int op2 = phymem[mem1(pcreg+1)];
+                if (op2<0x80) ofs = 2;   // 5bit ofs
+                else switch (op2&0xf) { 
+                    case 8: case 0xc:
+                        ofs = 3; break;
+                    case 9: case 0xd: case 0xf:
+                        ofs = 4; break;
+                    default:
+                        ofs = 2; break;
+                }
+            }
+            break;
+    }
+    if (ofs) setbreak(pc+ofs,-1);
+    retrun ofs;
+}
+
+
+
+
+
+
+
+