Rough draft of CALL/EXEC support for the Monitor.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Thu, 7 Jan 2010 13:23:07 +0000 (13:23 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Thu, 7 Jan 2010 13:23:07 +0000 (13:23 +0000)
Nice and neighborly, for quickly patching in new code.

git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@260 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

firmware/apps/monitor/monitor.c
firmware/include/command.h

index 3f35ea2..33b31c7 100644 (file)
@@ -7,6 +7,13 @@
 #include "platform.h"
 #include "monitor.h"
 
 #include "platform.h"
 #include "monitor.h"
 
+//! Call a function by address.
+int fncall(unsigned int adr){
+  //TODO replace this with portable C.
+  //Preprocessor definition might help.
+  __asm__("call r15"); //r12 on IAR
+}
+
 //! Handles a monitor command.
 void monitorhandle(unsigned char app,
                   unsigned char verb,
 //! Handles a monitor command.
 void monitorhandle(unsigned char app,
                   unsigned char verb,
@@ -22,6 +29,16 @@ void monitorhandle(unsigned char app,
     cmddata[0]=memorybyte[cmddataword[0]];
     txdata(app,verb,1);
     break;
     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;
   case MONITOR_SIZEBUF:
     //TODO make the data length target-specific, varying by ram.
     cmddataword[0]=0x100;
index 6f94d6b..7ec0f1c 100644 (file)
@@ -41,6 +41,8 @@ extern unsigned char silent;
 #define SETUP 0x10
 #define START 0x20
 #define STOP  0x21
 #define SETUP 0x10
 #define START 0x20
 #define STOP  0x21
+#define CALL  0x30
+#define EXEC  0x31
 #define NOK   0x7E
 #define OK    0x7F
 
 #define NOK   0x7E
 #define OK    0x7F