changes from Martin
[fw/sdcc] / debugger / mcs51 / sdcdb.c
index a5b77d5df18bd829d45a4d41649ed7427dc3f74a..693e800f3a7a48b756a6ae304ff16a4766e072e4 100644 (file)
 #include "cmd.h"
 #include "newalloc.h"
 
+#ifdef SDCDB_DEBUG
+int   sdcdbDebug = 0;
+#endif
+
 char *currModName = NULL;
 cdbrecs *recsRoot = NULL ;
 set  *modules = NULL;    /* set of all modules */
 set  *functions = NULL ; /* set of functions */
 set  *symbols = NULL   ; /* set of symbols */
+set  *sfrsymbols= NULL ; /* set of symbols of sfr or sbit */
 int nStructs = 0 ;
 structdef **structs = NULL ; /* all structures */
 int nLinkrecs = 0;
@@ -63,7 +68,7 @@ struct cmdtab
        precede the synonym "b" */
     /* break point */
     { "break"    ,  cmdSetUserBp  ,
-      "{b}reak\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION]\n",
+      "{b}reak\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION | *<address>]\n",
     },
     { "b"        ,  cmdSetUserBp  , NULL },
 
@@ -77,16 +82,22 @@ struct cmdtab
     },
     { "c"        ,  cmdContinue   , NULL },
 
-    { "disassemble",cmdDisasmF    , "disassemble asm commands\n" },
+    { "disassemble",cmdDisasmF    , "disassemble [startaddr [endaddress]]\tdisassemble asm commands\n" },
     { "delete" ,  cmdDelUserBp  ,
       "{d}elete n\t\t clears break point number n\n"
     },
     { "display"    ,  cmdDisplay     ,
-      "display [<variable>]\t print value of given variable each time the program stops\n"
+      "display [/<fmt>] [<variable>]\t print value of given variable each time the program stops\n"
     },
     { "undisplay"  ,  cmdUnDisplay   ,
       "undisplay [<variable>]\t dont display this variable or all\n"
     },
+    { "down"     ,  cmdDown      ,
+      "down\t\tSelect and print stack frame called by this one.\nAn argument says how many frames down to go.\n"
+    },
+    { "up"       ,  cmdUp      ,
+      "up\t\tSelect and print stack frame that called this one.\nAn argument says how many frames up to go.\n"
+    },
     { "d"        ,  cmdDelUserBp  , NULL },
 
     { "info"     ,  cmdInfo       ,
@@ -110,20 +121,26 @@ struct cmdtab
       " <copying warranty>\t copying & distribution terms, warranty\n"
     },
     { "set"      ,  cmdSetOption  , "set <srcmode>\t\t toggle between c/asm.\nset variable <var> = >value\t\tset variable to new value\n" },
+    { "stepi"    ,  cmdStepi      ,
+      "stepi\t\t\tStep one instruction exactly.\n"
+    },
     { "step"     ,  cmdStep       ,
-      "{s}tep\t\t\t Step program until it reaches a different source line.\n"
+      "{s}tep\t\t\tStep program until it reaches a different source line.\n"
     },
     { "s"        ,  cmdStep       , NULL },
+    { "nexti"    ,  cmdNexti      ,
+      "nexti\t\t\tStep one instruction, but proceed through subroutine calls.\n"
+    },
     { "next"     ,  cmdNext       ,
-      "{n}ext\t\t\t Step program, proceeding through subroutine calls.\n"
+      "{n}ext\t\t\tStep program, proceeding through subroutine calls.\n"
     },
     { "n"        ,  cmdNext       , NULL },
     { "run"      ,  cmdRun        ,
-      "{r}un\t\t\t Start debugged program. \n"
+      "{r}un\t\t\tStart debugged program. \n"
     },
     { "r"        ,  cmdRun        , NULL },
     { "ptype"    ,  cmdPrintType  ,
-      "{pt}ype <variable>\t print type information of a variable\n"
+      "{pt}ype <variable>\tprint type information of a variable\n"
     },
     { "pt"       ,  cmdPrintType  , NULL },
     { "print"    ,  cmdPrint      ,
@@ -137,13 +154,13 @@ struct cmdtab
       "file <filename>\t\t load symbolic information from <filename>\n"
     },
     { "frame"    ,  cmdFrame      ,
-      "{fr}ame\t\t\t print information about the current Stack\n"
+      "{fr}ame\t\t print information about the current Stack\n"
     },
     { "finish"   ,  cmdFinish     ,
       "{fi}nish\t\t execute till return of current function\n"
     },
     { "fi"       ,  cmdFinish     , NULL },
-    { "where"    ,  cmdWhere      , "where\t\t\t print stack\n" },
+    { "where"    ,  cmdWhere      , "where\t\t print stack\n" },
     { "fr"       ,  cmdFrame      , NULL },
     { "f"        ,  cmdFrame      , NULL },
     { "x /i"     ,  cmdDisasm1    , "x\t\t disassemble one asm command\n" },
@@ -421,7 +438,7 @@ static void loadModules ()
 
   /* if symbol then parse the symbol */
   case  SYM_REC:
-      parseSymbol(loop->line,&rs);
+      parseSymbol(loop->line,&rs,2);
       break;
 
   case LNK_REC:
@@ -431,6 +448,23 @@ static void loadModules ()
     }
 }
 
+/*-----------------------------------------------------------------*/
+/* generate extra sets of sfr and sbit symbols                     */
+/*-----------------------------------------------------------------*/
+static void specialFunctionRegs ()
+{
+    symbol *sym;
+    for (sym = setFirstItem(symbols);
+         sym ;
+         sym = setNextItem(symbols))
+    {
+        if ( sym->addrspace == 'I' ||
+             sym->addrspace == 'J')
+        {
+            addSet(&sfrsymbols,sym);
+        }
+    }
+}
 /*-----------------------------------------------------------------*/
 /* functionPoints - determine the execution points within a func   */
 /*-----------------------------------------------------------------*/
@@ -447,7 +481,7 @@ static void functionPoints ()
 
   sym = func->sym;
 
-  Dprintf(D_sdcdb, ("func '%s' has entry '%x' exit '%x'\n",
+  Dprintf(D_sdcdb, ("sdcdb: func '%s' has entry '0x%x' exit '0x%x'\n",
          func->sym->name,
          func->sym->addr,
          func->sym->eaddr));
@@ -512,21 +546,24 @@ static void functionPoints ()
   }
 
 #ifdef SDCDB_DEBUG
-  Dprintf(D_sdcdb, ("function '%s' has the following C exePoints\n",
+  if (!( D_sdcdb & sdcdbDebug))
+      continue;
+
+  Dprintf(D_sdcdb, ("sdcdb: function '%s' has the following C exePoints\n",
          func->sym->name));
   {
       exePoint *ep;
 
       for (ep = setFirstItem(func->cfpoints); ep;
      ep = setNextItem(func->cfpoints))
-     Dprintf(D_sdcdb, ("{%x,%d} %s",
-         ep->addr,ep->line,mod->cLines[ep->line]->src));
+     Dprintf(D_sdcdb, ("sdcdb: {0x%x,%d} %s",
+         ep->addr,ep->line+1,mod->cLines[ep->line]->src));
 
-      Dprintf(D_sdcdb, (" and the following ASM exePoints\n"));
+      Dprintf(D_sdcdb, ("sdcdb:  and the following ASM exePoints\n"));
       for (ep = setFirstItem(func->afpoints); ep;
            ep = setNextItem(func->afpoints))
-        Dprintf (D_sdcdb, ("{%x,%d} %s",
-            ep->addr,ep->line,mod->asmLines[ep->line]->src));
+        Dprintf (D_sdcdb, ("sdcdb: {0x%x,%d} %s",
+            ep->addr,ep->line+1,mod->asmLines[ep->line]->src));
   }
 #endif
     }
@@ -594,6 +631,9 @@ int cmdFile (char *s,context *cctxt)
        module */
     functionPoints();
 
+    /* extract known special function registers */
+    specialFunctionRegs();
+
     /* start the simulator & setup connection to it */
     if ( sock == -1 )
         openSimulator((char **)simArgs,nsimArgs);
@@ -634,7 +674,15 @@ int cmdHelp (char *s, context *cctxt)
         for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) 
         {
             if ((cmdTab[i].htxt) && !strcmp(cmdTab[i].cmd,s))
-                fprintf(stdout,"%s",cmdTab[i].htxt);             
+            {
+                s = strrchr(cmdTab[i].htxt,'\t');
+                if ( !s )
+                    s = cmdTab[i].htxt;
+                else
+                    s++;
+                fprintf(stdout,"%s",s);
+                break;
+            }
         }
         return 0;
     }
@@ -722,7 +770,7 @@ int interpretCmd (char *s)
           if (srcMode == SRC_CMODE)
             fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
                     currCtxt->func->mod->cfullname,
-                    currCtxt->cline,currCtxt->addr);
+                    currCtxt->cline+1,currCtxt->addr);
           else
             fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
                     currCtxt->func->mod->afullname,
@@ -794,7 +842,7 @@ static void parseCmdLine (int argc, char **argv)
     char *filename = NULL;
     int passon_args_flag = 0;  /* if true, pass on args to simulator */
 
-    Dprintf(D_sdcdb, ("parseCmdLine\n"));
+    Dprintf(D_sdcdb, ("sdcdb: parseCmdLine\n"));
 
     for ( i = 1; i < argc ; i++) {
   //fprintf(stdout,"%s\n",argv[i]);
@@ -835,6 +883,13 @@ static void parseCmdLine (int argc, char **argv)
     continue;
       }
 
+#ifdef SDCDB_DEBUG
+      if (strncmp(argv[i],"-d=",3) == 0) {
+          sdcdbDebug = strtol(&argv[i][3],0,0);
+          continue;
+      }
+#endif
+
       /* model string */
       if (strncmp(argv[i],"-m",2) == 0) {
         strncpy(model_str, &argv[i][2], 15);
@@ -866,7 +921,7 @@ static void parseCmdLine (int argc, char **argv)
 
       /* XTAL Frequency */
       if (strcmp(argv[i],"-X") == 0 ||
-    strcmp(argv[i],"-frequency") == 0) {
+          strcmp(argv[i],"-frequency") == 0) {
         simArgs[nsimArgs++] = "-X";
         simArgs[nsimArgs++] = strdup(argv[++i]);
         continue ;
@@ -875,7 +930,7 @@ static void parseCmdLine (int argc, char **argv)
       /* serial port */
       if ( (strcmp(argv[i],"-S") == 0) ||
            (strcmp(argv[i],"-s") == 0)) {
-        simArgs[nsimArgs++] = "-s";
+        simArgs[nsimArgs++] = strdup(argv[i]);
         simArgs[nsimArgs++] = strdup(argv[++i]);
         continue ;
       }
@@ -915,8 +970,9 @@ bad_signal(int sig)
 static void
 sigintr(int sig)
 {
-    /* may be interrupt from user: stop debugger ( also simulator ??) */
+    /* may be interrupt from user: stop debugger and also simulator */
     userinterrupt = 1;
+    sendSim("stop\n");
 }
 
 /* the only child can be the simulator */
@@ -937,7 +993,6 @@ setsignals()
     signal(SIGTERM, bad_signal);       
     signal(SIGCHLD, sigchld );
 
-    signal(SIGPIPE, SIG_IGN);
     signal(SIGABRT, bad_signal);
     signal(SIGALRM, bad_signal);
     signal(SIGFPE,  bad_signal);
@@ -954,7 +1009,7 @@ setsignals()
 int main ( int argc, char **argv)
 {
     printVersionInfo();
-    printf("WARNING: SDCDB is EXPERIMENTAL and NOT A FULLY FUNCTIONING TOOL.\n");
+    printf("WARNING: SDCDB is EXPERIMENTAL.\n");
 
     simArgs[nsimArgs++] = "s51";
     simArgs[nsimArgs++] = "-P";