4 #include "mTaskSymbols.h"
11 #define trace(op, ...) {};
13 #define trace(op, ...) {};
14 //#define trace(op, ...) printf("pc: %d, sp: %d, op: " op "\n", pc, sp, ##__VA_ARGS__);
17 #define f16(p) program[pc]*265+program[pc+1]
19 void run_task(struct task
*t
)
21 uint8_t *program
= t
->bc
;
25 char stack
[STACKSIZE
] = {0};
26 debug("Running task with length: %d", plen
);
28 // debug("program: %d", program[pc]);
29 // debug("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
30 // stack[0], stack[1], stack[2], stack[3], stack[4],
31 // stack[5], stack[6], stack[7], stack[8], stack[9]);
33 switch(program
[pc
++]){
34 case BCNOP
: trace("nop");
36 case BCLAB
: trace("label: 0x%02x!!!!!!", program
[pc
]);
39 case BCPUSH
: trace("push %d", program
[pc
]*265+program
[pc
+1]);
40 stack
[sp
++] = f16(pc
);
43 case BCPOP
: trace("pop");
46 case BCSDSSTORE
: trace("sds store: %d", f16(pc
));
47 sds_store(f16(pc
), stack
[--sp
]);
50 case BCSDSFETCH
: trace("sds fetch: %d", f16(pc
));
51 stack
[sp
++] = sds_fetch(f16(pc
));
54 case BCSDSPUBLISH
: trace("sds publish %d", f16(pc
));
58 case BCNOT
: trace("not");
59 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
61 case BCADD
: trace("add");
62 stack
[sp
-2] = stack
[sp
-1] + stack
[sp
-2];
65 case BCSUB
: trace("sub");
66 stack
[sp
-2] = stack
[sp
-1] - stack
[sp
-2];
69 case BCMUL
: trace("mul");
70 stack
[sp
-2] = stack
[sp
-1] * stack
[sp
-2];
73 case BCDIV
: trace("div");
74 stack
[sp
-2] = stack
[sp
-1] / stack
[sp
-2];
77 case BCAND
: trace("and");
78 stack
[sp
-2] = stack
[sp
-1] && stack
[sp
-2];
81 case BCOR
: trace("or");
82 stack
[sp
-2] = stack
[sp
-1] || stack
[sp
-2];
85 case BCEQ
: trace("eq");
86 stack
[sp
-2] = stack
[sp
-1] == stack
[sp
-2];
89 case BCNEQ
: trace("neq");
90 stack
[sp
-2] = stack
[sp
-1] != stack
[sp
-2];
93 case BCLES
: trace("les");
94 stack
[sp
-2] = stack
[sp
-1] < stack
[sp
-2];
97 case BCGRE
: trace("gre");
98 stack
[sp
-2] = stack
[sp
-1] > stack
[sp
-2];
101 case BCLEQ
: trace("leq");
102 stack
[sp
-2] = stack
[sp
-1] <= stack
[sp
-2];
105 case BCGEQ
: trace("geq");
106 stack
[sp
-2] = stack
[sp
-1] >= stack
[sp
-2];
109 case BCJMP
: trace("jmp to %d", program
[pc
]);
112 case BCJMPT
: trace("jmpt to %d", program
[pc
]);
113 pc
= stack
[--sp
] ? program
[pc
]-1 : pc
+1;
115 case BCJMPF
: trace("jmpf(%d) to %d", stack
[sp
-1], program
[pc
]);
116 pc
= stack
[--sp
] ? pc
+1 : program
[pc
]-1;
118 case BCSERIALAVAIL
: trace("SerialAvailable()");
120 case BCSERIALPRINT
: trace("SerialPrint()");
122 case BCSERIALPRINTLN
: trace("SerialPrintln()");
124 case BCSERIALREAD
: trace("SerialRead()");
126 case BCSERIALPARSEINT
: trace("SerialParseInt()");
128 case BCANALOGREAD
: trace("AnalogRead(%d)", program
[pc
]);
129 stack
[sp
++] = read_apin(program
[pc
++]);
131 case BCANALOGWRITE
: trace("AnalogWrite(%d)", program
[pc
]);
132 write_apin(program
[pc
++], stack
[sp
-1]);
135 case BCDIGITALREAD
: trace("DigitalRead(%d)", program
[pc
]);
136 stack
[sp
++] = read_dpin(program
[pc
++]);
138 case BCDIGITALWRITE
: trace("DigitalWrite(%d)", program
[pc
]);
139 write_dpin(program
[pc
++], stack
[sp
-1]);
142 case BCLEDON
: trace("LedOn(%d)", program
[pc
]);
143 led_on(program
[pc
++]);
145 case BCLEDOFF
: trace("LedOn(%d)", program
[pc
]);
146 led_off(program
[pc
++]);
149 trace("unrecognized");
150 die("Unrecognized command: %d", program
[pc
-1]);
153 debug("Task terminated");