+
+static int getMemString(char *buffer, char wrflag,
+ unsigned int addr, char mem, int size )
+{
+ int cachenr = NMEM_CACHE;
+ char *prefix;
+ char *cmd ;
+
+ if ( wrflag )
+ cmd = "set mem";
+ else
+ cmd = "dump";
+ buffer[0] = '\0' ;
+
+ switch (mem)
+ {
+ case 'A': /* External stack */
+ case 'F': /* External ram */
+ prefix = "xram";
+ cachenr = XMEM_CACHE;
+ break;
+ case 'C': /* Code */
+ case 'D': /* Code / static segment */
+ prefix = "rom";
+ break;
+ case 'B': /* Internal stack */
+ case 'E': /* Internal ram (lower 128) bytes */
+ case 'G': /* Internal ram */
+ prefix = "iram";
+ cachenr = IMEM_CACHE;
+ break;
+ case 'H': /* Bit addressable */
+ case 'J': /* SBIT space */
+ cachenr = BIT_CACHE;
+ if ( wrflag )
+ {
+ cmd = "set bit";
+ }
+ sprintf(buffer,"%s 0x%x\n",cmd,addr);
+ return cachenr;
+ break;
+ case 'I': /* SFR space */
+ prefix = "sfr" ;
+ 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 ;
+ cachenr = IMEM_CACHE;
+ break;
+ default:
+ case 'Z': /* undefined space code */
+ return cachenr;
+ }
+ if ( wrflag )
+ sprintf(buffer,"%s %s 0x%x\n",cmd,prefix,addr,addr);
+ else
+ sprintf(buffer,"%s %s 0x%x 0x%x\n",cmd,prefix,addr,addr+size-1);
+ return cachenr;
+}
+
+int simSetValue (unsigned int addr,char mem, int size, unsigned long val)
+{
+ char cachenr, i;
+ char buffer[40];
+ char *s;
+
+ if ( size <= 0 )
+ return 0;
+
+ cachenr = getMemString(buffer,1,addr,mem,size);
+ if ( cachenr < NMEM_CACHE )
+ {
+ invalidateCache(cachenr);
+ }
+ s = buffer + strlen(buffer) -1;
+ 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();
+}
+
+