changes from Martin
authorkbongers <kbongers@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 6 May 2003 03:45:41 +0000 (03:45 +0000)
committerkbongers <kbongers@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 6 May 2003 03:45:41 +0000 (03:45 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2589 4a8a32a2-be11-0410-ad9d-d568d2c75423

debugger/mcs51/break.c
debugger/mcs51/break.h
debugger/mcs51/cmd.c
debugger/mcs51/sdcdb.c
debugger/mcs51/simi.c
debugger/mcs51/simi.h
debugger/mcs51/symtab.c
debugger/mcs51/symtab.h

index 93a00909b4c03395f6cd5a460415d5435bab34b6..44d412d4b569c96a6fad54f55fe8e03f5ab12927 100644 (file)
@@ -27,6 +27,7 @@
 #include "newalloc.h"
 
 static hTab *bptable = NULL;
+char doingSteps    = 0;
 char userBpPresent = 0;
 /* call stack can be 1024 deep */
 STACK_DCL(callStack,function *,1024);
@@ -59,7 +60,7 @@ int setBreakPoint (unsigned addr, char addrType, char bpType,
         addr,
         debug_bp_type_strings[addrType],
         debug_bp_type_strings[bpType],
-        fileName, lineno));
+        fileName, lineno+1));
 
     /* allocate & init a new bp */
     bp = Safe_calloc(1,sizeof(breakp));
@@ -73,28 +74,32 @@ int setBreakPoint (unsigned addr, char addrType, char bpType,
 
     /* if this is an user break point then
        check if there already exists one for this address */
-    if (bpType == USER) {
-  for ( bpl = hTabFirstItemWK(bptable,addr) ; bpl;
-        bpl = hTabNextItemWK(bptable)) {
-
-      /* if also a user break point then issue Note : */
-      if (bpl->bpType == USER)
-    fprintf(stderr,"Note: breakpoint %d also set at pc 0x%x\n",
-      bpl->bpnum,bpl->addr);
-  }
-
-  fprintf(stderr,"Breakpoint %d at 0x%x: file %s, line %d.\n",
-    bp->bpnum, addr, fileName, lineno);
-
-  userBpPresent++;
+    if (bpType == USER)
+    {
+        for ( bpl = hTabFirstItemWK(bptable,addr) ; bpl;
+              bpl = hTabNextItemWK(bptable)) 
+        {
+
+            /* if also a user break point then issue Note : */
+            if (bpl->bpType == USER)
+                fprintf(stderr,"Note: breakpoint %d also set at pc 0x%x\n",
+                        bpl->bpnum,bpl->addr);
+        }
+
+        fprintf(stderr,"Breakpoint %d at 0x%x: file %s, line %d.\n",
+                bp->bpnum, addr, fileName, lineno+1);
+
+        userBpPresent++;
     }
 
+    if (bpType != STEP && bpType != NEXT)
+    {
     /* if a break point does not already exist then
        send command to simulator to add one */
     if (!hTabSearch(bptable,addr))
-  /* send the break command to the simulator */
-  simSetBP (addr);
-
+        /* send the break command to the simulator */
+        simSetBP (addr);
+    }
 
     /* now add the break point to list */
     hTabAddItem(&bptable,addr,bp);
@@ -119,11 +124,12 @@ void deleteSTEPbp ()
   if (bp->bpType == STEP) {
       hTabDeleteItem(&bptable,bp->addr,bp,DELETE_ITEM,NULL);
 
+#if 0
       /* if this leaves no other break points then
          send command to simulator to delete bp from this addr */
       if (hTabSearch(bptable,bp->addr) == NULL)
     simClearBP (bp->addr);
-
+#endif
       free(bp);
   }
     }
@@ -149,13 +155,14 @@ void deleteNEXTbp ()
   if (bp->bpType == NEXT) {
       hTabDeleteItem(&bptable,bp->addr,bp,DELETE_ITEM,NULL);
 
+#if 0
       /* if this leaves no other break points then
          send command to simulator to delete bp from this addr */
       if (hTabSearch(bptable,bp->addr) == NULL) {
     simClearBP(bp->addr);
 
       }
-
+#endif
       free(bp);
   }
     }
@@ -224,7 +231,7 @@ void listUSERbp ()
   if (bp->bpType == USER ) {
       fprintf(stdout,"%-3d breakpoint     keep y   0x%08x at %s:%d\n",
         bp->bpnum,bp->addr,
-        bp->filename,bp->lineno);
+        bp->filename,bp->lineno+1);
 
   }
     }
@@ -286,6 +293,8 @@ int dispatchCB (unsigned addr, context *ctxt)
     /* if no break points set for this address
        then use a simulator stop break point */
     if ((bp = hTabFirstItemWK(bptable,addr)) == NULL) {
+      if ( doingSteps == 2 ) return 1;
+      if ( doingSteps ) return 0;
       return simStopBPCB(addr);
     }
 
@@ -344,18 +353,18 @@ BP_CALLBACK(userBpCB)
     bpnum,
     ctxt->func->sym->name,
     ctxt->func->mod->c_name,
-    ctxt->cline);
+    ctxt->cline+1);
   if (ctxt->func->mod && ctxt->cline > 0)
-      fprintf(stdout,"%d\t%s",ctxt->cline,
+      fprintf(stdout,"%d\t%s",ctxt->cline+1,
         ctxt->func->mod->cLines[ctxt->cline]->src);
     } else {
   fprintf(stdout,"Breakpoint %d, %s() at %s:%d\n",
     bpnum,
     ctxt->func->sym->name,
     ctxt->func->mod->asm_name,
-    ctxt->asmline);
+    ctxt->asmline+1);
   if (ctxt->func->mod && ctxt->asmline > 0)
-      fprintf(stdout,"%d\t%s",ctxt->asmline,
+      fprintf(stdout,"%d\t%s",ctxt->asmline+1,
         ctxt->func->mod->asmLines[ctxt->asmline]->src);
     }
 
@@ -376,10 +385,10 @@ BP_CALLBACK(stepBpCB)
       fprintf(stdout,"%s () at %s:%d\n",
         ctxt->func->sym->name,
         ctxt->func->mod->c_name,
-        ctxt->cline);
+        ctxt->cline+1);
 
   if (ctxt->func->mod && ctxt->cline > 0) {
-      fprintf(stdout,"%d\t%s",ctxt->cline ,
+      fprintf(stdout,"%d\t%s",ctxt->cline+1 ,
         ctxt->func->mod->cLines[ctxt->cline]->src);
   }
     } else {
@@ -414,10 +423,10 @@ BP_CALLBACK(nextBpCB)
       fprintf(stdout,"%s () at %s:%d\n",
         ctxt->func->sym->name,
         ctxt->func->mod->c_name,
-        ctxt->cline);
+        ctxt->cline+1);
 
   if (ctxt->func->mod && ctxt->cline > 0)
-      fprintf(stdout,"%d\t%s",ctxt->cline,
+      fprintf(stdout,"%d\t%s",ctxt->cline+1,
         ctxt->func->mod->cLines[ctxt->cline]->src);
     } else {
   if ((lfunc && lfunc != ctxt->func) || !lfunc)
index e598502235d729b265079ebae6dde419278e413d..14a6815492069351a56fe0be063af95971c3b777 100644 (file)
@@ -65,6 +65,8 @@ typedef struct breakp
             context *ctxt)
 
 extern char userBpPresent;
+extern char doingSteps;
+
 int setBreakPoint (unsigned , char , char, 
                    int (*callBack)(unsigned,char,char,int,context *),char *, int);
 
index ded949d780c3ee02b0ba90e474c7d15f58665342..237c4a2a016f4745d4dee98850d84712f1655ba4 100644 (file)
@@ -483,8 +483,16 @@ DEFSETFUNC(moduleLineWithAddr)
         {
             *rmod = mod ;
             if (line )
-                *line = mod->ncLines;
-            return 1;
+            {
+                *line = 0;
+                for ( i=0; i < mod->ncLines; i++ ) 
+                {
+                    if ( mod->cLines[i]->addr > addr)
+                        break;
+                    *line = i;
+                }
+                return 1;
+            }
         }
     }
 
@@ -646,10 +654,10 @@ context *discoverContext (unsigned addr)
 
     /* find the function we are in */
     if (!applyToSet(functions,funcInAddr,addr,&func)) {
-        if (!applyToSet(functions,funcWithName,"main") ||
-            !applyToSet(modules,moduleLineWithAddr,addr,&mod,&line))
+        if (!applyToSet(functions,funcWithName,"main",&func) ||
+            !applyToSet(modules,moduleLineWithAddr,addr,&mod,NULL))
         {
-            fprintf(stderr, "Error?:discoverContext: cannot apply to set!\n");
+            fprintf(stderr, "Error?:discoverContext: cannot apply addr 0x%x\n",addr);
             return NULL;
         }
         currCtxt->func = func;
@@ -664,7 +672,10 @@ context *discoverContext (unsigned addr)
         currCtxt->modName = func->modName;
     
         /* find the c line number */
-        if(applyToSet(func->cfpoints,lineNearAddr,addr,
+        if(applyToSet(func->cfpoints,lineAtAddr,addr,
+                  &line,&currCtxt->block,&currCtxt->level)) 
+            currCtxt->cline = func->lline = line;
+        else if(applyToSet(func->cfpoints,lineNearAddr,addr,
                   &line,&currCtxt->block,&currCtxt->level)) 
             currCtxt->cline = func->lline = line;
         else
@@ -716,11 +727,15 @@ void simGo (unsigned int gaddr)
     if (!rv) {
       if (!initial_break_flag) {
         initial_break_flag = 1;  // kludge to stop only at first run
+#if 0
         fprintf(stdout, "Stopping at entry.  You can now list and set breakpoints\n");
+#endif
       }
       else {
-               gaddr = -1;
-               goto top ;
+               if ( gaddr == 0 )
+            gaddr = -1;
+               if ( gaddr == -1 || doingSteps == 1 )
+            goto top ;
       }
 
 // notes: kpb
@@ -1033,7 +1048,9 @@ int cmdSetUserBp (char *s, context *cctxt)
                else
         {
             int line = func->exitline;
-            applyToSet(func->cfpoints,lineNearAddr,braddr,&line,NULL,NULL);
+            if ( !applyToSet(func->cfpoints,lineAtAddr,braddr,
+                                  &line,NULL,NULL))
+                applyToSet(func->cfpoints,lineNearAddr,braddr,&line,NULL,NULL);
             setBreakPoint ( braddr , CODE , USER , userBpCB ,
                             func->mod->c_name,line);
         }
@@ -1043,7 +1060,7 @@ int cmdSetUserBp (char *s, context *cctxt)
     /* check if line number */
     if (isdigit(*s)) {
        /* get the lineno */
-       int line = atoi(s);
+       int line = atoi(s) -1;
 
        /* if current context not present then we must get the module
           which has main & set the break point @ line number provided
@@ -1089,7 +1106,7 @@ int cmdSetUserBp (char *s, context *cctxt)
        /* case c) filename:lineno */
        if (isdigit(*(bp +1))) {                    
         
-           setBPatModLine (mod,atoi(bp+1));        
+           setBPatModLine (mod,atoi(bp+1)-1);      
            goto ret;
            
        }
@@ -1229,7 +1246,9 @@ int cmdStepi (char *s, context *cctxt)
         fprintf(stdout,"The program is not being run.\n");
     else 
     {
+        doingSteps = 2;
            simGo(2);   
+        doingSteps = 0;
         showfull = 1;
     }
     return 0;
@@ -1310,7 +1329,9 @@ int cmdStep (char *s, context *cctxt)
            }
        }
 
-       simGo(-1);
+    doingSteps = 1;
+       simGo(2);
+    doingSteps = 0;
     showfull = 1;
     }
     return 0;
@@ -1325,7 +1346,9 @@ int cmdNexti (char *s, context *cctxt)
         fprintf(stdout,"The program is not being run.\n");
     else 
     {
+        doingSteps = 2;
            simGo(1);   
+        doingSteps = 0;
         showfull = 1;
     }  
     return 0;
@@ -1395,7 +1418,9 @@ int cmdNext (char *s, context *cctxt)
                                   func->aexitline);
                }
            }
-           simGo(-1);  
+           doingSteps = 1;
+        simGo(1);      
+           doingSteps = 0;
         showfull = 1;
        }
     }    
@@ -1699,6 +1724,69 @@ static void infoSymbols(context *ctxt)
 
 }
 
+/*-----------------------------------------------------------------*/
+/* infoRegisters - print register information                      */
+/*-----------------------------------------------------------------*/
+static void infoRegisters( int all, context *ctxt)
+{
+    static unsigned int regaddrs[] = {0x81,0x82,0x83,0xd0,0xe0,0xf0,0};
+    unsigned long val;
+    int i,j,*r;
+
+    i   = simGetValue (0xd0,'I',1);
+    fprintf(stdout,"PC  : 0x%04X  RegisterBank %d:\nR0-7:",ctxt->addr,(i>>3)&3);
+    for ( j = 0; j < 8 ; j++ )
+    {
+        val = simGetValue (j ,'R',1);
+        fprintf(stdout," 0x%02X",val);
+    }
+    fprintf(stdout,"\n");
+    val = simGetValue (0xe0,'I',1);
+    fprintf(stdout,"ACC : 0x%02X %d %c\n",val,val,(isprint(val) ? val : '.'));
+    val = simGetValue (0xf0,'I',1);
+    fprintf(stdout,"B   : 0x%02X %d %c\n",val,val,(isprint(val) ? val : '.'));
+    val = simGetValue (0x82,'I',2);
+    fprintf(stdout,"DPTR: 0x%04X %d\n",val,val);
+    val = simGetValue (0x81,'I',1);
+    fprintf(stdout,"SP  : 0x%02X\n",val);
+    fprintf(stdout,"PSW : 0x%02X | CY : %c | AC : %c | OV : %c | P : %c\n",
+            i,(i&0x80)?'1':'0',(i&0x40)?'1':'0',(i&4)?'1':'0',(i&1)?'1':'0');
+    if ( all )
+    {
+        fprintf(stdout,"Special Function Registers:\n");
+        r = regaddrs;
+        for ( i = 0x80 ; i < 0x100 ; i++ )
+        {
+            symbol *sym = NULL;
+            if ( *r && *r == i )
+            {
+                /* skip normal registers */
+                r++ ;
+                continue;
+            }
+            if (applyToSetFTrue(sfrsymbols,symWithAddr,i,'I',&sym))
+            {
+                val = simGetValue (sym->addr,sym->addrspace,sym->size);
+                fprintf(stdout,"%s : 0x%02x",sym->name,val);
+                if ( !(i & 0x07 ))
+                {
+                    for ( j = 0 ; j < 8 ; j++ )
+                    {
+                        sym = NULL;
+                        if (applyToSetFTrue(sfrsymbols,symWithAddr,i+j,'J',&sym))
+                        {
+                            //val = simGetValue (sym->addr,sym->addrspace,sym->size);
+                            fprintf(stdout," %s=%c",sym->name,(val&1)? '1':'0');
+                        }
+                        val >>= 1;
+                    }
+                }
+                fprintf(stdout,"\n");
+            }
+        }
+    }
+}
+
 /*-----------------------------------------------------------------*/
 /* infoStack - print call stack information                        */
 /*-----------------------------------------------------------------*/
@@ -1762,40 +1850,14 @@ int cmdInfo (char *s, context *cctxt)
 
     /* info stack display call stack */
     if (strcmp(s,"registers") == 0) {
-       fprintf(stdout,"%s",simRegs());
-       return 0;
+        infoRegisters(0,cctxt);
+           return 0;
     }
 
     /* info stack display call stack */
     if (strcmp(s,"all-registers") == 0) 
     {
-        int i,j;
-        fprintf(stdout,"%s",simRegs());
-        fprintf(stdout,"Special Function Registers:\n");
-        for ( i = 0 ; i < 0x100 ; i++ )
-        {
-            symbol *sym = NULL;
-            unsigned long val;
-            if (applyToSetFTrue(sfrsymbols,symWithAddr,i,'I',&sym))
-            {
-                val = simGetValue (sym->addr,sym->addrspace,sym->size);
-                fprintf(stdout,"%s=0x%02x",sym->name,val);
-                if ( !(i & 0x07 ))
-                {
-                    for ( j = 0 ; j < 8 ; j++ )
-                    {
-                        sym = NULL;
-                        if (applyToSetFTrue(sfrsymbols,symWithAddr,i+j,'J',&sym))
-                        {
-                            //val = simGetValue (sym->addr,sym->addrspace,sym->size);
-                            fprintf(stdout," %s=%c",sym->name,(val&1)? '1':'0');
-                        }
-                        val >>= 1;
-                    }
-                }
-                fprintf(stdout,"\n");
-            }
-        }
+        infoRegisters(1,cctxt);
         return 0;
     }
 
@@ -1851,7 +1913,7 @@ int cmdListSrc (char *s, context *cctxt)
     if (*s) {
        /* case a) LINE */
        if (isdigit(*s)) {
-           sscanf(s,"%d",&pline);
+        pline = strtol(s,0,10) - 1;
            if (!cctxt || !cctxt->func || !cctxt->func->mod) {
              if (!list_mod) {
                fprintf(stdout,"Sdcdb fails to have a proper context at %d.\n", __LINE__);
@@ -1883,7 +1945,7 @@ int cmdListSrc (char *s, context *cctxt)
                            return 0;
                        }
                    }
-                   sscanf(bp,"%d",&pline);
+                   pline = strtol(bp,0,10) - 1;
                } else {
                    /* FILE:FUCTION */
                    if (!applyToSet(functions,funcWithNameModule,bp,s,&func)) {
@@ -1902,6 +1964,16 @@ int cmdListSrc (char *s, context *cctxt)
            }
            else {
                /* FUNCTION */
+            if (*s == '\'') 
+            {
+                /* 'FUNCTION' */
+                s++ ;
+                if ((bp = strrchr(s,'\''))) 
+                {
+                    *bp = '\0';
+                }
+                
+            }
                if (!applyToSet(functions,funcWithName,s,&func)) {
                    fprintf(stderr,"Function \"%s\" not defined.\n",s); 
                    return 0;
@@ -1945,7 +2017,7 @@ int cmdListSrc (char *s, context *cctxt)
 
     if ( infomode )
     {
-           fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x.\n",pline,
+           fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x.\n",pline+1,
                    list_mod->c_name, list_mod->cLines[pline]->addr);
         infomode=0;
         return 0;
@@ -2140,9 +2212,11 @@ static void printValBasic(symbol *sym, link *type,
             if (IS_CHAR(etype))
             { 
                 if ( isprint(v.val))
-                    printFmtInteger("'%c'",fmt,(long)v.val,0,size);
+                    printFmtInteger((SPEC_USIGN(etype)?"0x%02x":"'%c'"),
+                                    fmt,(long)v.val,0,size);
                 else
-                    printFmtInteger("'\\%o'",fmt,(long)v.val,0,size);
+                    printFmtInteger((SPEC_USIGN(etype)?"0x%02x":"'\\%o'"),
+                                    fmt,(long)v.val,0,size);
             }
             else
             {
@@ -2800,9 +2874,9 @@ static int printFrame(int framenr, int getlast)
     if ( func )
     {
         fprintf(stdout,"#%d  0x%08x in %s () at %s:%d\n",
-                framenr,func->laddr,func->sym->name,func->mod->c_name,func->lline);
+                framenr,func->laddr,func->sym->name,func->mod->c_name,func->lline+1);
         fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
-                func->mod->cfullname,func->lline,func->laddr);
+                func->mod->cfullname,func->lline+1,func->laddr);
     }
     else
         fprintf(stdout,"No stack.\n");
index cb241699d47bf3f729587bfb8ae24698ec9948e2..693e800f3a7a48b756a6ae304ff16a4766e072e4 100644 (file)
@@ -438,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:
@@ -557,13 +557,13 @@ static void functionPoints ()
       for (ep = setFirstItem(func->cfpoints); ep;
      ep = setNextItem(func->cfpoints))
      Dprintf(D_sdcdb, ("sdcdb: {0x%x,%d} %s",
-         ep->addr,ep->line,mod->cLines[ep->line]->src));
+         ep->addr,ep->line+1,mod->cLines[ep->line]->src));
 
       Dprintf(D_sdcdb, ("sdcdb:  and the following ASM exePoints\n"));
       for (ep = setFirstItem(func->afpoints); ep;
            ep = setNextItem(func->afpoints))
         Dprintf (D_sdcdb, ("sdcdb: {0x%x,%d} %s",
-            ep->addr,ep->line,mod->asmLines[ep->line]->src));
+            ep->addr,ep->line+1,mod->asmLines[ep->line]->src));
   }
 #endif
     }
@@ -770,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,
@@ -921,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 ;
@@ -930,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 ;
       }
@@ -972,7 +972,7 @@ sigintr(int sig)
 {
     /* may be interrupt from user: stop debugger and also simulator */
     userinterrupt = 1;
-    sendSim("\n");
+    sendSim("stop\n");
 }
 
 /* the only child can be the simulator */
index 0edc1e98d58d19d55993286b6d37a86ff8ff1f73..61133fa5481f6e136f26034c7376d9efc664784b 100644 (file)
@@ -38,7 +38,7 @@ FILE *simin ; /* stream for simulator input */
 FILE *simout; /* stream for simulator output */
 
 int sock = -1; /* socket descriptor to comm with simulator */
-pid_t simPid;
+pid_t simPid = -1;
 static char simibuff[MAX_SIM_BUFF];    /* sim buffer       */
 static char regBuff[MAX_SIM_BUFF];
 static char *sbp = simibuff;           /* simulator buffer pointer */
@@ -64,6 +64,10 @@ static char *getMemCache(unsigned int addr,int cachenum, int size)
         {
             sendSim("di 0x0 0xff\n");
         }
+        else if ( cachenum == SREG_CACHE )
+        {
+            sendSim("ds 0x80 0xff\n");
+        }
         else
         {
             laddr = addr & 0xffffffc0;
@@ -139,26 +143,11 @@ void openSimulator (char **args, int nargs)
     struct sockaddr_in sin;     
     int retry = 0;
     int i ;
- Dprintf(D_simi, ("simi: openSimulator\n"));
   Dprintf(D_simi, ("simi: openSimulator\n"));
 
     invalidateCache(XMEM_CACHE);
     invalidateCache(IMEM_CACHE);
-    /* fork and start the simulator as a subprocess */
-    if ((simPid = fork())) {
-      Dprintf(D_simi, ("simi: simulator pid %d\n",(int) simPid));
-    }
-    else {
-      /* we are in the child process : start the simulator */
-      signal(SIGHUP , SIG_IGN );
-      signal(SIGINT , SIG_IGN );
-      signal(SIGABRT, SIG_IGN );
-      signal(SIGCHLD, SIG_IGN );
-
-      if (execvp(args[0],args) < 0) {
-        perror("cannot exec simulator");
-        exit(1);
-      }
-    }
+    invalidateCache(SREG_CACHE);
     
  try_connect:
     sock = socket(AF_INET,SOCK_STREAM,0);
@@ -168,14 +157,32 @@ void openSimulator (char **args, int nargs)
     sin.sin_addr.s_addr = inet_addr("127.0.0.1");
     sin.sin_port = htons(9756);
     
-    sleep(1);
     /* connect to the simulator */
     if (connect(sock,(struct sockaddr *) &sin, sizeof(sin)) < 0) {
        /* if failed then wait 1 second & try again
           do this for 10 secs only */
        if (retry < 10) {
+        if ( !retry )
+        {
+            /* fork and start the simulator as a subprocess */
+            if ((simPid = fork())) {
+                Dprintf(D_simi, ("simi: simulator pid %d\n",(int) simPid));
+            }
+            else {
+                /* we are in the child process : start the simulator */
+                signal(SIGHUP , SIG_IGN );
+                signal(SIGINT , SIG_IGN );
+                signal(SIGABRT, SIG_IGN );
+                signal(SIGCHLD, SIG_IGN );
+
+                if (execvp(args[0],args) < 0) {
+                    perror("cannot exec simulator");
+                    exit(1);
+                }
+            }
+        }
            retry ++;
-           sleep (1);
+        sleep (1);
            goto try_connect;
        }
        perror("connect failed :");
@@ -219,7 +226,7 @@ void sendSim(char *s)
 
 
 static int getMemString(char *buffer, char wrflag, 
-                        unsigned int addr, char mem, int size )
+                        unsigned int *addr, char mem, int size )
 {
     int cachenr = NMEM_CACHE;
     char *prefix;
@@ -255,23 +262,18 @@ static int getMemString(char *buffer, char wrflag,
             {
                 cmd = "set bit";
             }
-            sprintf(buffer,"%s 0x%x\n",cmd,addr);
+            sprintf(buffer,"%s 0x%x\n",cmd,*addr);
             return cachenr;
             break;
         case 'I': /* SFR space */
             prefix = "sfr" ;
+            cachenr = SREG_CACHE;
             break;
         case 'R': /* Register space */ 
-            if ( !wrflag )
-            {
-                cachenr = REG_CACHE;
-                sprintf(buffer,"info reg\n");
-                return cachenr;
-            }
             prefix = "iram";
             /* get register bank */
             cachenr = simGetValue (0xd0,'I',1); 
-            addr   += cachenr & 0x18 ;
+            *addr  += cachenr & 0x18 ;
             cachenr = IMEM_CACHE;
             break;
         default: 
@@ -279,9 +281,9 @@ static int getMemString(char *buffer, char wrflag,
             return cachenr;
     }
     if ( wrflag )
-        sprintf(buffer,"%s %s 0x%x\n",cmd,prefix,addr,addr);
+        sprintf(buffer,"%s %s 0x%x\n",cmd,prefix,*addr);
     else
-        sprintf(buffer,"%s %s 0x%x 0x%x\n",cmd,prefix,addr,addr+size-1);
+        sprintf(buffer,"%s %s 0x%x 0x%x\n",cmd,prefix,*addr,*addr+size-1);
     return cachenr;
 }
 
@@ -294,7 +296,7 @@ int simSetValue (unsigned int addr,char mem, int size, unsigned long val)
     if ( size <= 0 )
         return 0;
 
-    cachenr = getMemString(buffer,1,addr,mem,size);
+    cachenr = getMemString(buffer,1,&addr,mem,size);
     if ( cachenr < NMEM_CACHE )
     {
         invalidateCache(cachenr);
@@ -326,7 +328,7 @@ unsigned long simGetValue (unsigned int addr,char mem, int size)
     if ( size <= 0 )
         return 0;
 
-    cachenr = getMemString(buffer,0,addr,mem,size);
+    cachenr = getMemString(buffer,0,&addr,mem,size);
 
     resp = NULL;
     if ( cachenr < NMEM_CACHE )
@@ -354,17 +356,6 @@ unsigned long simGetValue (unsigned int addr,char mem, int size)
         /* skip thru the address part */
         while (isxdigit(*resp)) resp++;
 
-        /* then make the branch for bit variables */
-        if ( cachenr == REG_CACHE ) 
-        {
-            /* skip registers */
-            for (i = 0 ; i < addr ; i++ ) 
-            {
-                while (isspace(*resp)) resp++ ;
-                /* skip */
-                while (isxdigit(*resp)) resp++;
-            }
-        }
     }   
     /* make the branch for bit variables */
     if ( cachenr == BIT_CACHE) 
@@ -431,16 +422,17 @@ void simLoadFile (char *s)
 /*-----------------------------------------------------------------*/
 unsigned int simGoTillBp ( unsigned int gaddr)
 {
-    char *sr, *svr;
+    char *sr;
     unsigned addr ; 
     char *sfmt;
     int wait_ms = 1000;
 
     invalidateCache(XMEM_CACHE);
     invalidateCache(IMEM_CACHE);
+    invalidateCache(SREG_CACHE);
     if (gaddr == 0) {
       /* initial start, start & stop from address 0 */
-      char buf[20];
+      //char buf[20];
 
          // this program is setting up a bunch of breakpoints automatically
          // at key places.  Like at startup & main() and other function
@@ -454,11 +446,11 @@ unsigned int simGoTillBp ( unsigned int gaddr)
       sendSim ("run\n");
       wait_ms = 100;
     }
-    else       if (gaddr == 1 ) { /* nexti */
+    else       if (gaddr == 1 ) { /* nexti or next */
       sendSim ("next\n");
       wait_ms = 100;
     }
-    else       if (gaddr == 2 ) { /* stepi */
+    else       if (gaddr == 2 ) { /* stepi or step */
       sendSim ("step\n");
       wait_ms = 100;
     }
@@ -470,56 +462,28 @@ unsigned int simGoTillBp ( unsigned int gaddr)
     waitForSim(wait_ms, NULL);
     
     /* get the simulator response */
-    svr  = sr = strdup(simResponse());
-
-    if ( gaddr == 1 || gaddr == 2 )
+    sr = simResponse();
+    /* check for errors */
+    while ( *sr )
     {
-        int nl;
-        for ( nl = 0; nl < 3 ; nl++ )
+        while ( *sr && *sr != 'E' ) sr++ ;
+        if ( !*sr )
+            break;
+        if ( ! strncmp(sr,"Error:",6))
         {
-            while (*sr && *sr != '\n') sr++ ;
-            sr++ ;
+            fputs(sr,stdout);
+            break;
         }
-        if ( nl < 3 )
-            return 0;
-        gaddr = strtol(sr,0,0);
-        /* empty response */
-        simibuff[0] = '\0';
-        return gaddr;
-        
-    }
-    /* figure out the address of the break point the simulators 
-       response in a break point situation is of the form 
-       [... F* <addr> <disassembled instruction> ] 
-       we will ignore till we get F* then parse the address */
-    while (*sr) {
-      if (strncmp(sr,"Stop at",7) == 0) {
-          sr += 7;
-          sfmt = "%x";
-          break;
-      } 
-
-      if (*sr == 'F' && ( *(sr+1) == '*' || *(sr+1) == ' ')) {
-          sr += 2;
-          sfmt = "%x";
-          break;
-      }
-      sr++;
-    }
-
-    if (!*sr) {
-      fprintf(stderr, "Error?, simGoTillBp failed to Stop\n");
-      return 0;
+        sr++ ;
     }
 
-    while (isspace(*sr)) sr++ ;
-
-    if (sscanf(sr,sfmt,&addr) != 1) {
-      fprintf(stderr, "Error?, simGoTillBp failed to get Addr\n");
-      return 0;
-    }
-       return addr;
+    /* better solution: ask pc */
+    sendSim ("pc\n");
+    waitForSim(100, NULL);
+    sr = simResponse();
 
+    gaddr = strtol(sr+3,0,0);
+    return gaddr;
 }
 
 /*-----------------------------------------------------------------*/
@@ -529,121 +493,11 @@ void simReset ()
 {
     invalidateCache(XMEM_CACHE);
     invalidateCache(IMEM_CACHE);
+    invalidateCache(SREG_CACHE);
     sendSim("res\n");
     waitForSim(100,NULL);
 }
 
-/*-----------------------------------------------------------------*/
-/* getValueStr - read a value followed by a string =               */
-/*-----------------------------------------------------------------*/
-static unsigned int getValueStr (char *src,char *cstr)
-{
-    int i = strlen(cstr);
-    int rv;
-    /* look for the string */
-    if (! (src = strstr(src,cstr)))
-       return 0;
-
-    src += i;
-    if (!*src) return 0;
-
-    /* look for the digit */
-    while (*src && !isxdigit(*src)) src++;
-    sscanf(src,"%x",&rv);
-    return rv;
-}
-
-/*-----------------------------------------------------------------*/
-/* simRegs - returns value of registers                            */
-/*-----------------------------------------------------------------*/
-char  *simRegs()
-{   
-    char *resp ;
-    unsigned int rv;
-    char *rb = regBuff;
-    int i;
-
-    sendSim("info registers\n");
-
-    waitForSim(100,NULL);
-         
-    resp  = simResponse();
-
-#if 0
-    return resp;
-
-#else
-    /*Take this out(2-09-02) cant see as its that useful to reformat, karl.*/
-  
-    /* the response is of the form 
-       XXXXXX R0 R1 R2 R3 R4 R5 R6 R7 ........
-       XXXXXX XX . ACC=0xxx dd cc B=0xxx dd cc DPTR= 0xxxxx @DPTR= 0xxx dd cc
-       XXXXXX XX . PSW= 0xxx CY=[1|0] AC=[0|1] OV=[0|1] P=[1|0]
-
-Format as of 8-4-01:
-       0x00 00 00 00 00 00 00 00 00 ........
-       000000 00 .  ACC= 0x00   0 .  B= 0x00   DPTR= 0x0000 @DPTR= 0x00   0 .
-       000000 00 .  PSW= 0x00 CY=0 AC=0 OV=0 P=0
-F  0x006d 75 87 80 MOV   PCON,#80
-*/
-
-    memset(regBuff,0,sizeof(regBuff));
-    /* skip the first numerics */
-    while (*resp && !isxdigit(*resp)) resp++;
-
-    if (strncmp(resp, "0x", 2)) {
-      fprintf(stderr, "Error: Format1A\n");
-      return regBuff;
-    }
-    resp += 2;
-    while (*resp && isxdigit(*resp)) resp++;
-
-    /* now get the eight registers */
-    for (i = 0 ; i < 7 ; i++) {
-        while (*resp && isspace(*resp)) resp++;
-       if (!*resp)
-           break;
-       rv = strtol(resp,&resp,16);
-       sprintf(rb,"R%d  : 0x%02X %d %c\n",i,rv,rv,(isprint(rv) ? rv : '.'));
-       rb += strlen(rb);
-    }
-
-    if (!*resp) return regBuff;
-
-    /* skip till end of line */
-    while (*resp && *resp != '\n') resp++;
-    while (*resp && !isxdigit(*resp)) resp++;
-    while (*resp && isxdigit(*resp)) resp++;
-    
-    /* accumulator value */
-    rv = getValueStr(resp,"ACC");
-    sprintf(rb,"ACC : 0x%02X %d %c\n",rv,rv,(isprint(rv) ? rv : '.'));
-    rb += strlen(rb);
-    
-    /* value of B */
-    rv = getValueStr(resp,"B=");
-    sprintf(rb,"B   : 0x%02X %d %c\n",rv,rv,(isprint(rv) ? rv : '.'));
-    rb += strlen(rb);
-
-    rv = getValueStr(resp,"DPTR=");
-    sprintf(rb,"DPTR: 0x%04X %d\n",rv,rv);
-    rb += strlen(rb);
-
-    rv = getValueStr(resp,"@DPTR=");
-    sprintf(rb,"@DPTR: 0x%02X %d %c\n", rv,rv,(isprint(rv) ? rv : '.'));
-    rb += strlen(rb);
-    
-    sprintf(rb,"PSW  : 0x%02X | CY : %d | AC : %d | OV : %d | P : %d\n",
-           getValueStr(resp,"PSW="),
-           getValueStr(resp,"CY="),
-           getValueStr(resp,"AC="),
-           getValueStr(resp,"OV="),
-           getValueStr(resp,"P="));
-
-    return regBuff;
-#endif
-
-}
 
 /*-----------------------------------------------------------------*/
 /* closeSimulator - close connection to simulator                  */
@@ -655,13 +509,14 @@ void closeSimulator ()
         simactive = 0;
         return;
     }
-    sendSim("q\n");
-    kill (simPid,SIGKILL);
+    sendSim("quit\n");
     fclose (simin);
     fclose (simout);
     shutdown(sock,2);   
     close(sock);    
     sock = -1;
+    if ( simPid > 0 )
+        kill (simPid,SIGKILL);
 }
 
 
index 7003c74ad506f0a51ff998618aefaaf2b36176fe..e65a9e43d97755005deea4b21d3e4707201426f8 100644 (file)
@@ -31,9 +31,9 @@
 /* number of cache */
 #define IMEM_CACHE     0
 #define XMEM_CACHE     1
-#define NMEM_CACHE     2
+#define SREG_CACHE     2
+#define NMEM_CACHE     3
 /* special index */
-#define  REG_CACHE     3
 #define  BIT_CACHE     4
 
 typedef struct _memcache
index 506ef79be54b92b90bc36ccd735a1222a499a196..b35e2d150a36e33d578132a22e620958f686c4bb 100644 (file)
@@ -97,10 +97,10 @@ void parseFunc (char *line)
 
     func = Safe_calloc(1,sizeof(function));
     func->sym = NULL;
-    applyToSet(symbols,symWithRName,line,&func->sym);
+    applyToSetFTrue(symbols,symWithRName,line,&func->sym);
     *rs++ = '0';
     if (! func->sym)
-        func->sym = parseSymbol(line,&rs);
+        func->sym = parseSymbol(line,&rs,1);
     func->sym->isfunc = 1;
     func->modName = currModName ;
     while(*rs && *rs != ',') rs++;
@@ -244,18 +244,33 @@ static char  *parseTypeInfo (symbol *sym, char *s)
 /*              {G|F<filename>|L<functionName>}'$'<name>'$'<level> */
 /*              '$'<block><type info>                              */
 /*-----------------------------------------------------------------*/
-symbol *parseSymbol (char *s, char **rs)
+symbol *parseSymbol (char *s, char **rs, int doadd)
 {
     symbol *nsym ;
+    char save_ch;
     char *bp = s;
 
-    nsym = Safe_calloc(1,sizeof(symbol));
-
-    /* copy over the mangled name */
-    while (*bp != '(') bp++;
-     bp -= 1;
-    nsym->rname = alloccpy(s,bp - s);
-
+    /* go the mangled name */
+    for ( bp = s; *bp && *bp != '('; bp++ );
+    save_ch = *--bp;
+    *bp = '\0';
+    nsym = NULL;
+    if ( doadd == 2 )
+    {
+        /* add only if not present and if linkrecord before symbol record*/
+        if ( applyToSetFTrue(symbols,symWithRName,s,&nsym))
+        {
+            if ( nsym->rname != nsym->name )
+                return;
+            doadd = 0;
+        }
+    }
+    if ( ! nsym )
+    {
+        nsym = Safe_calloc(1,sizeof(symbol));
+        nsym->rname = alloccpy(s,bp - s);
+    }
+    *bp = save_ch;
     /* if this is a Global Symbol */
     nsym->scopetype = *s;
     s++ ;
@@ -303,7 +318,9 @@ symbol *parseSymbol (char *s, char **rs)
     }
 
     *rs = s;
-    addSet(&symbols,nsym);
+    if ( doadd ) addSet(&symbols,nsym);
+
+    Dprintf(D_symtab, ("symtab: par %s(0x%x) add=%d sym=%p\n",nsym->name,nsym->addr,doadd,nsym));
 
     return nsym;
 }
@@ -336,7 +353,7 @@ structdef *parseStruct (char *s)
   offset = strtol(s,&s,10);
   while (*s != ':') s++;
   s++;
-  sym = parseSymbol(s,&s);
+  sym = parseSymbol(s,&s,0);
   sym->offset = offset ;
   s += 3;
   if (!fields)
@@ -618,7 +635,7 @@ static void lnkFuncEnd (char *s)
     s++;
     sscanf(s,"%x",&func->sym->eaddr);
 
-    Dprintf(D_symtab, ("symtab: %s(eaddr 0x%x)\n",func->sym->name,func->sym->eaddr));
+    Dprintf(D_symtab, ("symtab: ead %s(0x%x)\n",func->sym->name,func->sym->eaddr));
 }
 
 /*-----------------------------------------------------------------*/
@@ -626,24 +643,31 @@ static void lnkFuncEnd (char *s)
 /*-----------------------------------------------------------------*/
 static void lnkSymRec (char *s)
 {
-    char sname[128], *bp = sname;
+    char *bp, save_ch ;
     symbol *sym;
 
-    /* copy till we get to a ':' */
-    while ( *s != ':')
-  *bp++ = *s++;
-    bp -= 1;
+    /* search  to a ':' */
+    for ( bp = s; *bp && *bp != ':'; bp++ );
+    save_ch = *--bp;
     *bp = '\0';
 
 
     sym = NULL;
-    if (!applyToSet(symbols,symWithRName,sname,&sym))
-  return ;
-
-    s++;
-    sscanf(s,"%x",&sym->addr);
-
-    Dprintf(D_symtab, ("symtab: %s(0x%x)\n",sym->name,sym->addr));
+    applyToSetFTrue(symbols,symWithRName,s,&sym);
+    if (! sym)
+    {
+        sym = Safe_calloc(1,sizeof(symbol));
+        sym->rname = alloccpy(s,bp - s);
+        sym->scopetype = *s;
+        sym->name  = sym->rname;
+        addSet(&symbols,sym); 
+    }
+    *bp = save_ch;
+    if ( *bp )
+    {
+        sscanf(bp+2,"%x",&sym->addr);
+    }
+    Dprintf(D_symtab, ("symtab: lnk %s(0x%x)\n",sym->name,sym->addr));
 }
 
 /*-----------------------------------------------------------------*/
@@ -673,7 +697,7 @@ static void lnkAsmSrc (char *s)
     line--;
     if (line < mod->nasmLines) {
   mod->asmLines[line]->addr = addr;
-  Dprintf(D_symtab, ("symtab: %s(%d:0x%x) %s",mod->asm_name,line,addr,mod->asmLines[line]->src));
+  Dprintf(D_symtab, ("symtab: asm %s(%d:0x%x) %s",mod->asm_name,line,addr,mod->asmLines[line]->src));
     }
 }
 
@@ -709,11 +733,14 @@ static void lnkCSrc (char *s)
     }
 
     line--;
-    if (line < mod->ncLines && line > 0) {
+    /* one line can have more than one address : (for loops !)*/
+    if (line < mod->ncLines && line > 0 &&
+        ( !mod->cLines[line]->addr ||
+           mod->cLines[line]->level > level )) {
   mod->cLines[line]->addr = addr;
   mod->cLines[line]->block = block;
   mod->cLines[line]->level = level;
-  Dprintf(D_symtab, ("symtab: %s(%d:0x%x) %s",mod->c_name,
+  Dprintf(D_symtab, ("symtab: ccc %s(%d:0x%x) %s",mod->c_name,
          line+1,addr,mod->cLines[line]->src));
     }
     return;
index 3f7845f91dee156d3bdc67f7e4539b82a7930b6b..384d4c1fcc303e8791d965d3287b82f816f71f89 100644 (file)
@@ -233,7 +233,7 @@ typedef struct symbol {
 #define IS_ISR(x)              (IS_SPEC(x)  && SPEC_INTRTN(x))
 
 
-symbol *parseSymbol (char *, char **);
+symbol *parseSymbol (char *, char **, int );
 structdef *parseStruct (char *);
 void parseFunc (char *);
 module *parseModule (char *, bool  );