robustify task and sds initialization
[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
24 switch(program[pc++]){
25 case BCNOP: trace("nop\n");
26 break;
27 case BCLAB: trace("label: 0x%02x!!!!!!\n", program[pc]);
28 pc++;
29 break;
30 case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]);
31 stack[sp++] = program[pc]*265 + program[pc+1];
32 pc+=2;
33 break;
34 case BCPOP: trace("pop\n");
35 sp--;
36 break;
37 case BCSDSSTORE: trace("sds store: %d\n", program[pc]);
38 sds_store(program[pc++], stack[--sp]);
39 break;
40 case BCSDSFETCH: trace("sds fetch: %d\n", program[pc]);
41 stack[sp++] = sds_fetch(program[pc++]);
42 break;
43 case BCSDSPUBLISH: trace("sds publish %d\n", program[pc]);
44 sds_publish(program[pc++], fd);
45 break;
46 case BCNOT: trace("not\n");
47 stack[sp] = stack[sp] > 0 ? 0 : 1;
48 break;
49 case BCADD: trace("add\n");
50 stack[sp-2] = stack[sp-1] + stack[sp-2];
51 sp -= 1;
52 break;
53 case BCSUB: trace("sub\n");
54 stack[sp-2] = stack[sp-1] - stack[sp-2];
55 sp -= 1;
56 break;
57 case BCMUL: trace("mul\n");
58 stack[sp-2] = stack[sp-1] * stack[sp-2];
59 sp -= 1;
60 break;
61 case BCDIV: trace("div\n");
62 stack[sp-2] = stack[sp-1] / stack[sp-2];
63 sp -= 1;
64 break;
65 case BCAND: trace("and\n");
66 stack[sp-2] = stack[sp-1] && stack[sp-2];
67 sp -= 1;
68 break;
69 case BCOR: trace("or\n");
70 stack[sp-2] = stack[sp-1] || stack[sp-2];
71 sp -= 1;
72 break;
73 case BCEQ: trace("eq\n");
74 stack[sp-2] = stack[sp-1] == stack[sp-2];
75 sp -= 1;
76 break;
77 case BCNEQ: trace("neq\n");
78 stack[sp-2] = stack[sp-1] != stack[sp-2];
79 sp -= 1;
80 break;
81 case BCLES: trace("les\n");
82 stack[sp-2] = stack[sp-1] < stack[sp-2];
83 sp -= 1;
84 break;
85 case BCGRE: trace("gre\n");
86 stack[sp-2] = stack[sp-1] > stack[sp-2];
87 sp -= 1;
88 break;
89 case BCLEQ: trace("leq\n");
90 stack[sp-2] = stack[sp-1] <= stack[sp-2];
91 sp -= 1;
92 break;
93 case BCGEQ: trace("geq\n");
94 stack[sp-2] = stack[sp-1] >= stack[sp-2];
95 sp -= 1;
96 break;
97 case BCJMP: trace("jmp to %d\n", program[pc]);
98 pc = program[pc]-1;
99 break;
100 case BCJMPT: trace("jmpt to %d\n", program[pc]);
101 pc = stack[--sp] ? program[pc]-1 : pc+1;
102 break;
103 case BCJMPF: trace("jmpf to %d\n", program[pc]);
104 pc = stack[--sp] ? pc+1 : program[pc]-1;
105 break;
106 case BCSERIALAVAIL: trace("SerialAvailable()\n");
107 break;
108 case BCSERIALPRINT: trace("SerialPrint()\n");
109 break;
110 case BCSERIALPRINTLN: trace("SerialPrintln()\n");
111 break;
112 case BCSERIALREAD: trace("SerialRead()\n");
113 break;
114 case BCSERIALPARSEINT: trace("SerialParseInt()\n");
115 break;
116 case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]);
117 pc++;
118 break;
119 case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]);
120 pc++;
121 break;
122 case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]);
123 pc++;
124 break;
125 case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]);
126 pc++;
127 break;
128 default:
129 trace("unrecognized\n");
130 die("Unrecognized command: %d\n", program[pc-1]);
131 }
132 }
133 debug("Task terminated\n");
134 }