changeset 64:41f14f365b34

add trace command
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 26 Jul 2018 19:55:29 +0900
parents 1887f7098f15
children 9779a34e1a92
files src/trace.c src/v09.c
diffstat 2 files changed, 96 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/src/trace.c	Wed Jul 25 22:46:39 2018 +0900
+++ b/src/trace.c	Thu Jul 26 19:55:29 2018 +0900
@@ -68,21 +68,42 @@
 int trskip = 0;
 int stkskip = 0;
 
+int getterm(char *buf, char** next) {
+     int value = 0;
+     while (*buf==' ') buf++;
+     if (*buf=='x') { value = xreg; buf++; *next = buf ;
+     } else if (*buf=='y') { value = yreg; buf++; *next = buf;
+     } else if (*buf=='u') { value = ureg; buf++; *next = buf;
+     } else if (*buf=='s') { value = sreg; buf++; *next = buf;
+     } else if (*buf=='p') { value = pcreg; buf++; *next = buf;
+     } else if (*buf=='d') { value = (*areg<<8)+*breg; buf++; *next = buf;
+     } else if (*buf=='a') { value = *areg; buf++; *next = buf;
+     } else if (*buf=='b') { value = *breg; buf++; *next = buf;
+     } else value = strtol(buf,next,0);
+     return value;
+}
+
 int getarg(char *buf, char** next) {
-     int value = strtol(buf,next,0);
-     for(;next;) {
+     int value = 0;
+     char *b = buf;
+     if (next==0) next = &b;
+     value=getterm(*next,next);
+     for(;**next;) {
          if  ( **next == '+' ) {
-            value += strtol(*next+1,next,0);
+            value += getterm(*next+1,next);
          } else if  ( **next == '*' ) {
-            value *= strtol(*next+1,next,0);
+            value *= getterm(*next+1,next);
          } else if  ( **next == '/' ) {
-            value /= strtol(*next+1,next,0);
+            value /= getterm(*next+1,next);
          } else if  ( **next == '-' ) {
-            value -= strtol(*next+1,next,0);
+            value -= getterm(*next+1,next);
          } else if  ( **next == '&' ) {
-            value &= strtol(*next+1,next,0);
+            value &= getterm(*next+1,next);
          } else if  ( **next == '|' ) {
-            value |= strtol(*next+1,next,0);
+            value |= getterm(*next+1,next);
+         } else if  ( **next == '(' ) {
+            value = getarg(*next+1,next);
+            if(**next==')') *next=*next+1;
          } else break;
      }
      return value;
@@ -91,6 +112,7 @@
 void printhelp(void)
 {
   printf( 
+     "use 0x for hex inputs\n"
      "  s [count]  one step trace\n"
      "  n          step over\n"
      "  f          finish this call (until stack pop)\n"
@@ -98,11 +120,13 @@
      "  B          break point list\n"
      "  d [n]      delte break point list\n"
      "  c  [count] continue;\n"
+     "  p  data    print\n"
      "  x  [adr] [count]  dump\n"
+     "  xi [adr] [count]  disassemble\n"
 #ifdef USE_MMU
-     "  xp page [adr]   dump physical memory\n"
+     "  x  [p page] [offset] [count]  dump physical memory\n"
+     "  xi [p page] [offset] [count]  disassemble\n"
 #endif
-     "  xi [adr] [count]  disassemble\n"
      "  0  file    disk drive 0 image\n"
      "  1  file    disk drive 1 image\n"
      "  L  file    start log to file\n"
@@ -178,6 +202,11 @@
         fgets(s, sizeof(s)-1, stdin); 
         s[strlen(s)-1] = 0; // chop
         switch (s[0]) {
+        case 'p':  {
+                int d = getarg(s+1,0);
+                printf("0x%x %d '%c'\n",d,d,(d<' '||d>0x7f)?' ':d);
+                goto restart;
+           } 
         case 'n':   // step over
                 if (nexti()) {
                    bpskip = -1;
@@ -244,52 +273,51 @@
                  * we should have disassembler for a mmu page
                  */
         case 'x':   // dump 
-           {    char *next = s+1;
-                if (s[1]=='i') next=s+2;
-                else if (s[1]=='p') { 
-                   next = s+2;
+           {    char d = 0;
+                char p = 0;
+                char *next = s+1;
+                int len = 32;
+                int adr = pcreg;
+                if (*next=='i') { next++; d='i';
+                } 
+                if (*next=='p') { 
+                   p = 'p';
+                   next++;
                    if (next[0]) {
                       page =  getarg(next,&next);
                    }
                 }
                 if (next[0]) {
-                   int adr = getarg(next,&next);
-                   int len = 32;
-                   if (next[0]) {
-                      len =  getarg(next,&next);
-                   }
-                   if (s[1]=='i') {
-                     Word end = adr + len;
-                     while(adr < end) {
+                   adr = getarg(next,&next);
 #ifdef USE_MMU
-                        Byte *phyadr = mem0(phymem,adr,mmu);
-                        prog = (char*)phyadr - adr  ;
-                        if (phyadr > phymem+memsize) goto restart;
+                   adr -= adr &0xf;
+                   if (p=='p') adr -= adr&0x1fff;
 #endif
-                        int len = adr+16<end? 16 : end-adr -1 ;
-                        adr = disasm(adr,adr+len);
-                      }
-                   } else {
+                   if (next[0]) {
+                       len = getarg(next,&next);
+                   }
+                }
+                for(; len > 0 ; len-=16,adr+=16) {
+                    Byte *phyadr = 0;
 #ifdef USE_MMU
-                     for(int i=0; len > 0 ; i+=16, len-=16) {
-                        if (s[1]=='p') {
-                            int phy = page * 0x2000 + adr + i;
-                            if (phy > rommemsize) goto restart;
-                            hexadump(phymem+phy,len>16?16:len,adr+i,16);
-                        } else {
-                            Byte *phyadr = mem0(phymem,adr+i,mmu);
-                            if (phyadr > phymem+rommemsize) goto restart;
-                            hexadump(phyadr,len>16?16:len,adr+i,16);
-                        }
-                     }
+                    if (p=='p') {
+                        phyadr  = phymem + (page * 0x2000 + adr);
+                        prog = (char*)phyadr - adr  ;
+                    } else {
+                        phyadr = mem0(phymem,adr,mmu);
+                        prog = (char*)phyadr - adr  ;
+                    }
+                    if (phyadr > phymem+memsize) goto restart;
 #else
-                     for(int i=0; len > 0 ; i+=16, len-=16) {
-                        hexadump(mem+adr+i,len>16?16:len,adr+i,16);
-                     }
+                    phyadr = mem+adr;
+                    if (phyadr > mem+0xffff) goto restart;
 #endif
-                   }
-                } else 
-                   disasm(pcreg,pcreg+32);
+                    if (d=='i') {
+                        adr = disasm(adr,adr+(len>16?16:len));
+                    } else {
+                        hexadump(phyadr,len>16?16:len,adr,16);
+                    }
+                }
                 goto restart;
             }
         case 'L':
@@ -300,6 +328,7 @@
                         int i=1; while(s[i]==' ') i++;
                         logfile = fopen(s + i, "w");
                 }
+                goto restart;
                 break;
         case 'S':
                 if (infile)
@@ -309,6 +338,7 @@
                         int i=1; while(s[i]==' ') i++;
                         infile = fopen(s + i, "r");
                 }
+                goto restart;
                 break;
         case 'h':
         case '?':
@@ -323,6 +353,7 @@
                         fclose(xfile);
                         xfile = 0;
                 }
+                goto restart;
                 break;
         case '0':
         case '1':
@@ -336,6 +367,7 @@
                         if ( *drv == 0 ) { printf("can't open %s\n", &s[i]); }
                 }
                 }
+                goto restart;
                 break;
         case 'U':
                 if (xfile)
@@ -354,6 +386,7 @@
                 acknak = 21;
                 rcvdnak = EOF;
                 blocknum = 1;
+                goto restart;
                 break;
         case 'D':
                 if (xfile)
@@ -371,6 +404,7 @@
                 xidx = 0;
                 acknak = 21;
                 blocknum = 1;
+                goto restart;
                 break;
         case 'R':
                 pcreg = (mem[0xfffe] << 8) + mem[0xffff];
@@ -382,6 +416,7 @@
                 attention = escape = 1;
                 // we have to reload romfile
                 // readimage();
+                goto restart;
                 break;
         default:  // one step trace
                 trskip = 1;
@@ -412,9 +447,9 @@
 }
 
 /*
- * length call instruction
+ * length of call instruction
  *
- * if call instruction, put temporary break on next instruction
+ * if next instruction is call or swi, put temporary break after the call instruction
  *   (ignoring page boundary, sorry)
  */
 int nexti(void) {
--- a/src/v09.c	Wed Jul 25 22:46:39 2018 +0900
+++ b/src/v09.c	Thu Jul 26 19:55:29 2018 +0900
@@ -44,6 +44,10 @@
 extern void disasm(int,int);
 extern void do_mmu(Word,Byte);
 extern void init_term(void) ;
+#ifdef USE_VDISK
+extern int setVdisk(int drv,char *name) ;
+#endif
+
 
 
 void do_trace(FILE *tracefile)
@@ -131,6 +135,10 @@
 void usage(void)
 {
  fprintf(stderr,"Usage: v09 [-rom rom-image] [-l romstart] [-t tracefile [-tl addr] [-nt]"
+           "[-[01] disk-image ] "
+#ifdef USE_VDISK
+           "[v vdisk-base-dir ] "
+#endif
                 "[-th addr] ]\n[-e escchar] \n");
  exit(1); 
 }
@@ -168,6 +176,11 @@
    } else if (strcmp(argv[i],"-1")==0) {
       i++;
       disk[1] = fopen(argv[i],"r+");
+#ifdef USE_VDISK
+   } else if (strcmp(argv[i],"-v")==0) {
+      i++;
+      setVdisk(0,argv[i]);
+#endif
    } else if (strcmp(argv[i],"-tl")==0) {
      i++;
      tracelo=strtol(argv[i],(char**)0,0);