Beginnings of info flash support. It isn't very good.
[goodfet] / firmware / apps / monitor / monitor.c
index 3f35ea2..218afca 100644 (file)
@@ -7,11 +7,25 @@
 #include "platform.h"
 #include "monitor.h"
 
+//! Call a function by address.
+int fncall(unsigned int adr){
+  int (*machfn)() = 0;
+  machfn= (int (*)()) adr;
+  return machfn();
+}
+
 //! Handles a monitor command.
 void monitorhandle(unsigned char app,
                   unsigned char verb,
                   unsigned long len){
   switch(verb){
+  default:
+    debugstr("ERROR: Command unsupported by debug monitor.");
+    break;
+  case MONITOR_ECHO:
+    //Echo back the same buffer.
+    txdata(app,verb,len);
+    break;
   case PEEK:
     cmddata[0]=memorybyte[cmddataword[0]];
     txdata(app,verb,1);
@@ -22,6 +36,16 @@ void monitorhandle(unsigned char app,
     cmddata[0]=memorybyte[cmddataword[0]];
     txdata(app,verb,1);
     break;
+  case CALL:
+    //Set the program counter to cmdword[0];
+    cmddataword[0]=fncall(cmddataword[0]);
+    txdata(app,verb,2);
+    break;
+  case EXEC:
+    //Execute the argument as code from RAM.
+    cmddataword[0]=fncall((u16) cmddataword);
+    txdata(app,verb,2);
+    break;
   case MONITOR_SIZEBUF:
     //TODO make the data length target-specific, varying by ram.
     cmddataword[0]=0x100;
@@ -55,6 +79,10 @@ void monitorhandle(unsigned char app,
     silent=cmddata[0];
     txdata(app,verb,1);
     break;
+  case MONITOR_CONNECTED:
+    msp430_init_dco_done();
+    txdata(app,verb,0);
+    break;
   }
 }
 
@@ -69,7 +97,9 @@ void monitor_ram_pattern(){
   txdata(0x00,0x90,0);
   
   //Reboot
+  #ifdef MSP430
   asm("br &0xfffe");
+  #endif
 }
 
 //! Return the number of contiguous bytes 0xBEEF, to measure RAM usage.