fix if statements and sds publishing
[mTask.git] / int / interpret.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include "mTaskSymbols.h"
5 #include "interpret.h"
6 #include "misc.h"
7 #include "task.h"
8 #include "sds.h"
9
10 void run_task(struct task *t, int fd)
11 {
12 uint8_t *program = t->bc;
13 int plen = t->tlen;
14 int pc = 0;
15 int sp = 0;
16 char stack[STACKSIZE] = {0};
17 printf("Running task with length: %d\n", plen);
18 while(pc != plen){
19 printf("program: %d\n", program[pc]);
20 printf("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
21 stack[0], stack[1], stack[2], stack[3], stack[4],
22 stack[5], stack[6], stack[7], stack[8], stack[9]);
23 switch(program[pc++]){
24 case BCNOP: trace("nop\n");
25 break;
26 case BCLAB: trace("label: 0x%02x!!!!!!\n", program[pc]);
27 pc++;
28 break;
29 case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]);
30 stack[sp++] = program[pc]*265 + program[pc+1];
31 pc+=2;
32 break;
33 case BCPOP: trace("pop\n");
34 sp--;
35 break;
36 case BCSDSSTORE: trace("sds store: %d\n", program[pc]);
37 sds_store(program[pc++], stack[--sp]);
38 break;
39 case BCSDSFETCH: trace("sds fetch: %d\n", program[pc]);
40 stack[sp++] = sds_fetch(program[pc++]);
41 break;
42 case BCSDSPUBLISH: trace("sds publish %d\n", program[pc]);
43 sds_publish(program[pc++], fd);
44 break;
45 case BCNOT: trace("not\n");
46 stack[sp] = stack[sp] > 0 ? 0 : 1;
47 break;
48 case BCADD: trace("add\n");
49 stack[sp-2] = stack[sp-1] + stack[sp-2];
50 sp -= 1;
51 break;
52 case BCSUB: trace("sub\n");
53 stack[sp-2] = stack[sp-1] - stack[sp-2];
54 sp -= 1;
55 break;
56 case BCMUL: trace("mul\n");
57 stack[sp-2] = stack[sp-1] * stack[sp-2];
58 sp -= 1;
59 break;
60 case BCDIV: trace("div\n");
61 stack[sp-2] = stack[sp-1] / stack[sp-2];
62 sp -= 1;
63 break;
64 case BCAND: trace("and\n");
65 stack[sp-2] = stack[sp-1] && stack[sp-2];
66 sp -= 1;
67 break;
68 case BCOR: trace("or\n");
69 stack[sp-2] = stack[sp-1] || stack[sp-2];
70 sp -= 1;
71 break;
72 case BCEQ: trace("eq\n");
73 stack[sp-2] = stack[sp-1] == stack[sp-2];
74 sp -= 1;
75 break;
76 case BCNEQ: trace("neq\n");
77 stack[sp-2] = stack[sp-1] != stack[sp-2];
78 sp -= 1;
79 break;
80 case BCLES: trace("les\n");
81 stack[sp-2] = stack[sp-1] < stack[sp-2];
82 sp -= 1;
83 break;
84 case BCGRE: trace("gre\n");
85 stack[sp-2] = stack[sp-1] > stack[sp-2];
86 sp -= 1;
87 break;
88 case BCLEQ: trace("leq\n");
89 stack[sp-2] = stack[sp-1] <= stack[sp-2];
90 sp -= 1;
91 break;
92 case BCGEQ: trace("geq\n");
93 stack[sp-2] = stack[sp-1] >= stack[sp-2];
94 sp -= 1;
95 break;
96 case BCJMP: trace("jmp to %d\n", program[pc]);
97 pc = program[pc]-1;
98 break;
99 case BCJMPT: trace("jmpt to %d\n", program[pc]);
100 pc = stack[--sp] ? program[pc]-1 : pc+1;
101 break;
102 case BCJMPF: trace("jmpf to %d\n", program[pc]);
103 pc = stack[--sp] ? pc+1 : program[pc]-1;
104 break;
105 case BCSERIALAVAIL: trace("SerialAvailable()\n");
106 break;
107 case BCSERIALPRINT: trace("SerialPrint()\n");
108 break;
109 case BCSERIALPRINTLN: trace("SerialPrintln()\n");
110 break;
111 case BCSERIALREAD: trace("SerialRead()\n");
112 break;
113 case BCSERIALPARSEINT: trace("SerialParseInt()\n");
114 break;
115 case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]);
116 pc++;
117 break;
118 case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]);
119 pc++;
120 break;
121 case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]);
122 pc++;
123 break;
124 case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]);
125 pc++;
126 break;
127 default:
128 trace("unrecognized\n");
129 die("Unrecognized command: %d\n", program[pc-1]);
130 }
131 }
132 debug("Task terminated\n");
133 }