split up in header files and modules and start with sds storage support
[mTask.git] / int / interpret.c
diff --git a/int/interpret.c b/int/interpret.c
new file mode 100644 (file)
index 0000000..f44c7bf
--- /dev/null
@@ -0,0 +1,121 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mTaskSymbols.h"
+#include "interpret.h"
+#include "misc.h"
+#include "task.h"
+
+void run_task(struct task *t)
+{
+       uint8_t *program = t->bc;
+       int plen = t->tlen;
+       int pc = 0;
+       int sp = 0;
+       char stack[STACKSIZE] = {0};
+       printf("Running task with length: %d\n", plen);
+       while(pc != plen){
+               printf("program: %x\n", program[pc]);
+               switch(program[pc++]){
+               case BCNOP: trace("nop\n");
+                       break;
+               case BCPUSH: trace("push %d\n", program[pc]);
+                       stack[sp++] = program[pc++];
+                       break;
+               case BCPOP: trace("pop\n");
+                       sp--;
+                       break;
+               case BCSDSSTORE: trace("sds store\n");
+                       break;
+               case BCSDSFETCH: trace("sds fetch\n");
+                       break;
+               case BCSDSPUBLISH: trace("sds publish\n");
+                       break;
+               case BCNOT: trace("not\n");
+                       stack[sp] = stack[sp] > 0 ? 0 : 1;
+                       break;
+               case BCADD: trace("add\n");
+                       stack[sp-1] = stack[sp] + stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCSUB: trace("sub\n");
+                       stack[sp-1] = stack[sp] - stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCMUL: trace("mul\n");
+                       stack[sp-1] = stack[sp] * stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCDIV: trace("div\n");
+                       stack[sp-1] = stack[sp] / stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCAND: trace("and\n");
+                       stack[sp-1] = stack[sp] && stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCOR: trace("or\n");
+                       stack[sp-1] = stack[sp] || stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCEQ: trace("eq\n");
+                       stack[sp-1] = stack[sp] == stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCNEQ: trace("neq\n");
+                       stack[sp-1] = stack[sp] != stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCLES: trace("les\n");
+                       stack[sp-1] = stack[sp] < stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCGRE: trace("gre\n");
+                       stack[sp-1] = stack[sp] > stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCLEQ: trace("leq\n");
+                       stack[sp-1] = stack[sp] <= stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCGEQ: trace("geq\n");
+                       stack[sp-1] = stack[sp] >= stack[sp-1];
+                       sp -= 1;
+                       break;
+               case BCJMP: trace("jmp to %d\n", program[pc]);
+                       pc = pc + program[pc];
+                       break;
+               case BCJMPT: trace("jmpt to %d\n", program[pc]);
+                       pc += stack[sp] ? program[pc] : 1;
+                       break;
+               case BCJMPF: trace("jmpf to %d\n", program[pc]);
+                       pc += stack[sp] ? 1 : program[pc];
+                       break;
+               case BCSERIALAVAIL: trace("SerialAvailable()\n");
+                       break;
+               case BCSERIALPRINT: trace("SerialPrint()\n");
+                       break;
+               case BCSERIALPRINTLN: trace("SerialPrintln()\n");
+                       break;
+               case BCSERIALREAD: trace("SerialRead()\n");
+                       break;
+               case BCSERIALPARSEINT: trace("SerialParseInt()\n");
+                       break;
+               case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]);
+                       pc++;
+                       break;
+               case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]);
+                       pc++;
+                       break;
+               case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]);
+                       pc++;
+                       break;
+               case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]);
+                       pc++;
+                       break;
+               default:
+                       die("Unrecognized command: %d\n", program[--pc]);
+               }
+       }
+       debug("Task terminated\n");
+}