demo
[mTask.git] / int / interpret.c
index 4c60bc9..39c24b0 100644 (file)
 
 #include "mTaskSymbols.h"
 #include "interpret.h"
-#include "misc.h"
+#include "interface.h"
 #include "task.h"
 #include "sds.h"
 
-void run_task(struct task *t, int fd)
+#ifdef STM
+#define trace(op, ...) {};
+#else
+#define trace(op, ...) {};
+//#define trace(op, ...) printf("pc: %d, sp: %d, op: " op "\n", pc, sp, ##__VA_ARGS__);
+#endif
+
+#define f16(p) program[pc]*265+program[pc+1]
+
+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: %d\n", program[pc]);
-               printf("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
-                       stack[0], stack[1], stack[2], stack[3], stack[4],
-                       stack[5], stack[6], stack[7], stack[8], stack[9]);
+       debug("Running task with length: %d", plen);
+       while(pc < plen){
+//             debug("program: %d", program[pc]);
+//             debug("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
+//                     stack[0], stack[1], stack[2], stack[3], stack[4],
+//                     stack[5], stack[6], stack[7], stack[8], stack[9]);
+
                switch(program[pc++]){
-               case BCNOP: trace("nop\n");
+               case BCNOP: trace("nop");
+                       break;
+               case BCLAB: trace("label: 0x%02x!!!!!!", program[pc]);
+                       pc++;
                        break;
-               case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]);
-                       stack[sp++] = program[pc]*265 + program[pc+1];
+               case BCPUSH: trace("push %d", program[pc]*265+program[pc+1]);
+                       stack[sp++] = f16(pc);
                        pc+=2;
                        break;
-               case BCPOP: trace("pop\n");
+               case BCPOP: trace("pop");
                        sp--;
                        break;
-               case BCSDSSTORE: trace("sds store\n");
-                       sds_store(program[pc++], stack[sp-1]);
+               case BCSDSSTORE: trace("sds store: %d", f16(pc));
+                       sds_store(f16(pc), stack[--sp]);
+                       pc+=2;
                        break;
-               case BCSDSFETCH: trace("sds fetch\n");
-                       stack[sp++] = sds_fetch(program[pc++]);
+               case BCSDSFETCH: trace("sds fetch: %d", f16(pc));
+                       stack[sp++] = sds_fetch(f16(pc));
+                       pc+=2;
                        break;
-               case BCSDSPUBLISH: trace("sds publish\n");
-                       sds_publish(program[pc++], fd);
+               case BCSDSPUBLISH: trace("sds publish %d", f16(pc));
+                       sds_publish(f16(pc));
+                       pc+=2;
                        break;
-               case BCNOT: trace("not\n");
+               case BCNOT: trace("not");
                        stack[sp] = stack[sp] > 0 ? 0 : 1;
                        break;
-               case BCADD: trace("add\n");
+               case BCADD: trace("add");
                        stack[sp-2] = stack[sp-1] + stack[sp-2];
                        sp -= 1;
                        break;
-               case BCSUB: trace("sub\n");
+               case BCSUB: trace("sub");
                        stack[sp-2] = stack[sp-1] - stack[sp-2];
                        sp -= 1;
                        break;
-               case BCMUL: trace("mul\n");
+               case BCMUL: trace("mul");
                        stack[sp-2] = stack[sp-1] * stack[sp-2];
                        sp -= 1;
                        break;
-               case BCDIV: trace("div\n");
+               case BCDIV: trace("div");
                        stack[sp-2] = stack[sp-1] / stack[sp-2];
                        sp -= 1;
                        break;
-               case BCAND: trace("and\n");
+               case BCAND: trace("and");
                        stack[sp-2] = stack[sp-1] && stack[sp-2];
                        sp -= 1;
                        break;
-               case BCOR: trace("or\n");
+               case BCOR: trace("or");
                        stack[sp-2] = stack[sp-1] || stack[sp-2];
                        sp -= 1;
                        break;
-               case BCEQ: trace("eq\n");
+               case BCEQ: trace("eq");
                        stack[sp-2] = stack[sp-1] == stack[sp-2];
                        sp -= 1;
                        break;
-               case BCNEQ: trace("neq\n");
+               case BCNEQ: trace("neq");
                        stack[sp-2] = stack[sp-1] != stack[sp-2];
                        sp -= 1;
                        break;
-               case BCLES: trace("les\n");
+               case BCLES: trace("les");
                        stack[sp-2] = stack[sp-1] < stack[sp-2];
                        sp -= 1;
                        break;
-               case BCGRE: trace("gre\n");
+               case BCGRE: trace("gre");
                        stack[sp-2] = stack[sp-1] > stack[sp-2];
                        sp -= 1;
                        break;
-               case BCLEQ: trace("leq\n");
+               case BCLEQ: trace("leq");
                        stack[sp-2] = stack[sp-1] <= stack[sp-2];
                        sp -= 1;
                        break;
-               case BCGEQ: trace("geq\n");
+               case BCGEQ: trace("geq");
                        stack[sp-2] = stack[sp-1] >= stack[sp-2];
                        sp -= 1;
                        break;
-               case BCJMP: trace("jmp to %d\n", program[pc]);
-                       pc = pc + program[pc];
+               case BCJMP: trace("jmp to %d", program[pc]);
+                       pc = program[pc]-1;
                        break;
-               case BCJMPT: trace("jmpt to %d\n", program[pc]);
-                       pc += stack[sp] ? program[pc] : 1;
+               case BCJMPT: trace("jmpt to %d", program[pc]);
+                       pc = stack[--sp] ? program[pc]-1 : pc+1;
                        break;
-               case BCJMPF: trace("jmpf to %d\n", program[pc]);
-                       pc += stack[sp] ? 1 : program[pc];
+               case BCJMPF: trace("jmpf(%d) to %d", stack[sp-1], program[pc]);
+                       pc = stack[--sp] ? pc+1 : program[pc]-1;
                        break;
-               case BCSERIALAVAIL: trace("SerialAvailable()\n");
+               case BCSERIALAVAIL: trace("SerialAvailable()");
                        break;
-               case BCSERIALPRINT: trace("SerialPrint()\n");
+               case BCSERIALPRINT: trace("SerialPrint()");
                        break;
-               case BCSERIALPRINTLN: trace("SerialPrintln()\n");
+               case BCSERIALPRINTLN: trace("SerialPrintln()");
                        break;
-               case BCSERIALREAD: trace("SerialRead()\n");
+               case BCSERIALREAD: trace("SerialRead()");
                        break;
-               case BCSERIALPARSEINT: trace("SerialParseInt()\n");
+               case BCSERIALPARSEINT: trace("SerialParseInt()");
                        break;
-               case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]);
-                       pc++;
+               case BCANALOGREAD: trace("AnalogRead(%d)", program[pc]);
+                       stack[sp++] = read_apin(program[pc++]);
                        break;
-               case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]);
-                       pc++;
+               case BCANALOGWRITE: trace("AnalogWrite(%d)", program[pc]);
+                       write_apin(program[pc++], stack[sp-1]);
+                       sp--;
                        break;
-               case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]);
-                       pc++;
+               case BCDIGITALREAD: trace("DigitalRead(%d)", program[pc]);
+                       stack[sp++] = read_dpin(program[pc++]);
                        break;
-               case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]);
-                       pc++;
+               case BCDIGITALWRITE: trace("DigitalWrite(%d)", program[pc]);
+                       write_dpin(program[pc++], stack[sp-1]);
+                       sp--;
+                       break;
+               case BCLEDON: trace("LedOn(%d)", program[pc]);
+                       led_on(program[pc++]);
+                       break;
+               case BCLEDOFF: trace("LedOn(%d)", program[pc]);
+                       led_off(program[pc++]);
                        break;
                default:
-                       die("Unrecognized command: %d\n", program[--pc]);
+                       trace("unrecognized");
+                       die("Unrecognized command: %d", program[pc-1]);
                }
        }
-       debug("Task terminated\n");
+       debug("Task terminated");
 }