#define f16(p) program[pc]*265+program[pc+1]
+uint16_t stack[STACKSIZE] = {0};
+
void run_task(struct task *t)
{
uint8_t *program = t->bc;
- int plen = t->tlen;
+ int plen = t->tasklength;
int pc = 0;
int sp = 0;
- char stack[STACKSIZE] = {0};
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");
break;
pc++;
break;
case BCPUSH: trace("push %d", program[pc]*265+program[pc+1]);
- stack[sp++] = f16(pc);
- pc+=2;
+ switch(program[pc++]){
+ //Long
+ case 'l':
+ //Int
+ case 'i':
+ stack[sp++] = f16(pc);
+ pc+=2;
+ break;
+ case 'b': //Bool
+ case 'c': //Character
+ case 'B': //Button
+ case 'L': //UserLED
+ stack[sp++] = program[pc++];
+ break;
+ }
break;
case BCPOP: trace("pop");
sp--;
break;
case BCSERIALPARSEINT: trace("SerialParseInt()");
break;
+#if HAVEAIO == 1
case BCANALOGREAD: trace("AnalogRead(%d)", program[pc]);
stack[sp++] = read_apin(program[pc++]);
break;
write_apin(program[pc++], stack[sp-1]);
sp--;
break;
+#endif
+#if HAVEDIO == 1
case BCDIGITALREAD: trace("DigitalRead(%d)", program[pc]);
stack[sp++] = read_dpin(program[pc++]);
break;
write_dpin(program[pc++], stack[sp-1]);
sp--;
break;
+#endif
+#if HAVELED == 1
case BCLEDON: trace("LedOn(%d)", program[pc]);
led_on(stack[sp-1]);
sp--;
led_off(stack[sp-1]);
sp--;
break;
+#endif
+ case BCRETURN: trace("Return");
+ debug("Task returned");
+ task_delete(t->taskid);
+ return;
default:
trace("unrecognized");
die("Unrecognized command: %d", program[pc-1]);