]> git.gag.com Git - fw/sdcc/blobdiff - debugger/mcs51/simi.c
sdcdb updates,ddd
[fw/sdcc] / debugger / mcs51 / simi.c
index 12430d1e625a5bbc4ad54d7c80854332f34f952d..8da959c34a0c48a6e5911e1c0d73a81844d82750 100644 (file)
 FILE *simin ; /* stream for simulator input */
 FILE *simout; /* stream for simulator output */
 
-int sock ; /* socket descriptor to comm with simulator */
+int sock = -1; /* socket descriptor to comm with simulator */
 pid_t simPid;
 static char simibuff[MAX_SIM_BUFF];    /* sim buffer       */
 static char regBuff[MAX_SIM_BUFF];
 static char *sbp = simibuff;           /* simulator buffer pointer */
 extern char **environ;
 char simactive = 0;
+
+
+#if 0
+#define MS_SLEEP(_ms) usleep(_ms * 1000)
+#endif
+
 /*-----------------------------------------------------------------*/
-/* readSim - reads one character into simulator buffer             */
+/* waitForSim - wait till simulator is done its job                */
 /*-----------------------------------------------------------------*/
-void readSim(int resetp)
+void waitForSim(int timeout_ms, char *expect)
 {
-    int ch ;
-    /* if reset required then point to beginning of buffer */
-    if (resetp)
-       sbp = simibuff;
-    
-    Dprintf(D_simi, ("readSim: reading from sim["));
+  int i=0;
+  int ch;
 
-    while ((ch = fgetc(simin))) {
+Dprintf(D_simi, ("waitForSim start(%d)\n", timeout_ms));
+    sbp = simibuff;
 
-#ifdef SDCDB_DEBUG     
- if (D_simi) {
-       fputc(ch,stdout);
- }
-#endif
+    // MS_SLEEP(timeout_ms); dont need, in blocking mode.
 
-       *sbp++ = ch;    
+    while ((ch = fgetc(simin)) > 0 ) {
+      *sbp++ = ch;
     }
+    *sbp = 0;
+    Dprintf(D_simi, ("waitForSim(%d) got[%s]\n", timeout_ms, simibuff));
 
-    Dprintf(D_simi, ("] end readSim\n"));
-
-    *sbp = '\0';
-}
+#if 0
+  hmmmm, I guess we are not running non-blocking, we may still
+  need this code...Im not sure how the above works, it must block
+  until something gets into the buffer, then fgetc() reads down the
+  buffer...
+    do {
+      while ((ch = fgetc(simin))) {
+        *sbp++ = ch;
+      }
+      *sbp = 0;
+printf("got1[%s]\n", simibuff);
+      MS_SLEEP(20);
+      timeout_ms -= 20;
+printf("..\n");
+
+      if (expect) {
+        if (strstr(expect, sbp)) {
+          timeout_ms = 0;
+        }
+      } else if (sbp != simibuff) {
+        timeout_ms = 0;
+      }
+
+      /* pull in data one more time after delay to try and
+         guarentee we pull in complete responce line */
+      if (timeout_ms <= 0) {
+printf(",,\n");
+        while ((ch = fgetc(simin))) {
+          *sbp++ = ch;
+        }
+        *sbp = 0;
+printf("got2[%s]\n", simibuff);
+      }
+    }
+    while (timeout_ms > 0);
+printf("...\n");
+#endif
 
-/*-----------------------------------------------------------------*/
-/* waitForSim - wait till simulator is done its job                */
-/*-----------------------------------------------------------------*/
-void waitForSim()
-{
-    readSim(TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -88,25 +117,18 @@ void openSimulator (char **args, int nargs)
     struct sockaddr_in sin;     
     int retry = 0;
     int i ;
-    char *simargs[32] = { "s51","-P","-r 9756", NULL };
-    
-    /* create the arguments */
-    for ( i = 0 ; i < nargs ;i++) {
-       simargs[i+3] = args[i];       
-    }
-    simargs[i+3]= NULL;
+ Dprintf(D_simi, ("openSimulator\n"));
 
     /* fork and start the simulator as a subprocess */
     if ((simPid = fork())) {
       Dprintf(D_simi, ("simulator pid %d\n",(int) simPid));
     }
     else {
-       
-       /* we are in the child process : start the simulator */
-       if (execvp("s51",simargs) < 0) {
-           perror("cannot exec simulator");
-           exit(1);
-       }       
+      /* we are in the child process : start the simulator */
+      if (execvp(args[0],args) < 0) {
+        perror("cannot exec simulator");
+        exit(1);
+      }
     }
     
  try_connect:
@@ -141,8 +163,8 @@ void openSimulator (char **args, int nargs)
        exit(1);
     }
 
-    /* now that we have opend wait for the prompt */
-    waitForSim();
+    /* now that we have opened, wait for the prompt */
+    waitForSim(200,NULL);
     simactive = 1;
 }
 /*-----------------------------------------------------------------*/
@@ -158,11 +180,67 @@ char *simResponse()
 /*-----------------------------------------------------------------*/
 void sendSim(char *s)
 {
+    if ( ! simout ) 
+        return;
+
     Dprintf(D_simi, ("sendSim-->%s", s));  // s has LF at end already
     fputs(s,simout);
     fflush(simout);
 }
 
+int simSetValue (unsigned int addr,char mem, int size, unsigned long val)
+{
+    char buffer[40], *s,*prefix;
+    int i;
+    switch (mem) 
+    {
+        case 'A':
+            prefix = "x";
+            break;
+        case 'B':       
+            prefix = "i";
+            break;
+        case 'C':
+        case 'D':
+            prefix = "c";
+            break;
+        case 'E':
+        case 'G':
+            prefix = "i";
+            break;
+        case 'F':
+            prefix = "x";
+            break;
+        case 'H':
+            prefix = "bit" ;
+            break;
+        case 'I':
+            prefix = "sfr" ;
+            break;
+        case 'J':
+            prefix = "sbit" ;
+            break;
+        case 'R':
+            return; /* set registers !! */
+            //prefix = "i" ;
+            break;
+        default:
+            return;
+    }
+    sprintf(buffer,"set mem %s 0x%x",prefix,addr);
+    s = buffer + strlen(buffer);
+    for ( i = 0 ; i < size ; i++ )
+    {
+        sprintf(s," 0x%x", val & 0xff);
+        s += strlen(s);
+        val >>= 8;
+    }
+    sprintf(s,"\n");
+    sendSim(buffer);
+    waitForSim(100,NULL);
+    simResponse();   
+}
+
 /*-----------------------------------------------------------------*/
 /* simGetValue - get value @ address for mem space                 */
 /*-----------------------------------------------------------------*/
@@ -183,7 +261,7 @@ unsigned long simGetValue (unsigned int addr,char mem, int size)
       break;
     case 'C':
     case 'D':
-       prefix = "dch";
+    prefix = "dch";
        break;
     case 'E':
     case 'G':
@@ -194,17 +272,24 @@ unsigned long simGetValue (unsigned int addr,char mem, int size)
        break;
     case 'H':
     case 'J':
-       prefix = "db" ;
+//     prefix = "db" ;
+       prefix = "dump" ;
        break;
     case 'I':
        prefix = "ds" ;
-       break;  
+       break;
+    case 'R':
+       prefix = "i r" ;
+       break;
+    default:
+       prefix = "dump" ;
+       break;
     }
     
     /* create the simulator command */
     sprintf(buffer,"%s 0x%x \n",prefix,addr);
     sendSim(buffer);
-    waitForSim();
+    waitForSim(100,NULL);
     resp = simResponse();
 
     /* got the response we need to parse it the response
@@ -215,11 +300,25 @@ unsigned long simGetValue (unsigned int addr,char mem, int size)
     /* first skip thru white space */
     while (isspace(*resp)) resp++ ;
 
+    if (strncmp(resp, "0x",2) == 0)
+      resp += 2;
+
     /* then make the branch for bit variables */
     /* skip thru the address part */
     while (isxdigit(*resp)) resp++;
+
+    if (!strcmp(prefix,"i r")) 
+    {
+        /* skip registers */
+        for (i = 0 ; i < addr ; i++ ) 
+        {
+            while (isspace(*resp)) resp++ ;
+            /* skip */
+            while (isxdigit(*resp)) resp++;
+        }
+       }
     
-    if (!strcmp(prefix,"db")) {
+    if (!strcmp(prefix,"dump")) {
 
        /* skip white space */
        while (isspace(*resp)) resp++ ;
@@ -258,7 +357,7 @@ void simSetBP (unsigned int addr)
 
     sprintf(buff,"break 0x%x\n",addr);
     sendSim(buff);
-    waitForSim();
+    waitForSim(100,NULL);
 }
 
 /*-----------------------------------------------------------------*/
@@ -270,7 +369,7 @@ void simClearBP (unsigned int addr)
 
     sprintf(buff,"clear 0x%x\n",addr);
     sendSim(buff);
-    waitForSim();  
+    waitForSim(100,NULL);
 }
 
 /*-----------------------------------------------------------------*/
@@ -283,7 +382,7 @@ void simLoadFile (char *s)
     sprintf(buff,"l \"%s\"\n",s);
     printf(buff);
     sendSim(buff);
-    waitForSim();    
+    waitForSim(500,NULL);
 }
 
 /*-----------------------------------------------------------------*/
@@ -294,11 +393,12 @@ unsigned int simGoTillBp ( unsigned int gaddr)
     char *sr, *svr;
     unsigned addr ; 
     char *sfmt;
+    int wait_ms = 1000;
 
-    /* kpb: new code 8-03-01 */
     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
          // entry points.  So we don't need to setup one here..
@@ -306,32 +406,17 @@ unsigned int simGoTillBp ( unsigned int gaddr)
       //sleep(1);
       //waitForSim();
 
-       sendSim("run 0x0\n");
-      sleep(1);  /* do I need this? */
+      sendSim("run 0x0\n");
     } else     if (gaddr == -1) { /* resume */
-
-      // try adding this(kpb)
-      sendSim("step\n");
-      usleep(100000);
-      waitForSim();
-
-       sendSim ("run\n");
+      sendSim ("run\n");
+      wait_ms = 100;
     }
     else {
       printf("Error, simGoTillBp > 0!\n");
       exit(1);
     }
 
-#if 0
-    if (gaddr != -1) {
-       char buf[20];
-       sprintf(buf,"g 0x%x\n",gaddr);
-       sendSim(buf);
-    } else     
-       sendSim ("g\n");
-#endif
-    
-    waitForSim();
+    waitForSim(wait_ms, NULL);
     
     /* get the simulator response */
     svr  = sr = strdup(simResponse());
@@ -341,19 +426,18 @@ unsigned int simGoTillBp ( unsigned int gaddr)
        [... 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 (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) {
@@ -377,7 +461,7 @@ unsigned int simGoTillBp ( unsigned int gaddr)
 void simReset ()
 {
     sendSim("res\n");
-    waitForSim();
+    waitForSim(100,NULL);
 }
 
 /*-----------------------------------------------------------------*/
@@ -411,12 +495,17 @@ char  *simRegs()
     int i;
 
     sendSim("info registers\n");
-    //kpb(8-5-01) sendSim("dr\n");
 
-    waitForSim();
-    /* make it some more readable */
+    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
@@ -483,8 +572,7 @@ F  0x006d 75 87 80 MOV   PCON,#80
            getValueStr(resp,"P="));
 
     return regBuff;
-    
-    
+#endif
 
 }
 
@@ -493,12 +581,18 @@ F  0x006d 75 87 80 MOV   PCON,#80
 /*-----------------------------------------------------------------*/
 void closeSimulator ()
 {
-
+    if ( ! simin || ! simout || sock == -1 )
+    {
+        simactive = 0;
+        return;
+    }
     sendSim("q\n");
     kill (simPid,SIGKILL);
     fclose (simin);
     fclose (simout);
     shutdown(sock,2);   
     close(sock);    
-    
+    sock = -1;
 }
+
+