bbfa351560029c162fc87634c291c66e1dcb7c3f
4 #include "mTaskSymbols.h"
11 #define trace(op, ...) ;
13 #define trace(op, ...) ;
14 //printf("pc: %d, sp: %d, op: " op, pc, sp, ##__VA_ARGS__);
17 void run_task(struct task
*t
)
19 uint8_t *program
= t
->bc
;
23 char stack
[STACKSIZE
] = {0};
24 printf("Running task with length: %d\n", plen
);
26 //printf("program: %d\n", program[pc]);
27 //printf("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
28 // stack[0], stack[1], stack[2], stack[3], stack[4],
29 // stack[5], stack[6], stack[7], stack[8], stack[9]);
31 switch(program
[pc
++]){
32 case BCNOP
: trace("nop\n");
34 case BCLAB
: trace("label: 0x%02x!!!!!!\n", program
[pc
]);
37 case BCPUSH
: trace("push %d\n", program
[pc
]*265+program
[pc
+1]);
38 stack
[sp
++] = program
[pc
]*265 + program
[pc
+1];
41 case BCPOP
: trace("pop\n");
44 case BCSDSSTORE
: trace("sds store: %d\n", program
[pc
]);
45 sds_store(program
[pc
++], stack
[--sp
]);
47 case BCSDSFETCH
: trace("sds fetch: %d\n", program
[pc
]);
48 stack
[sp
++] = sds_fetch(program
[pc
++]);
50 case BCSDSPUBLISH
: trace("sds publish %d\n", program
[pc
]);
51 sds_publish(program
[pc
++]);
53 case BCNOT
: trace("not\n");
54 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
56 case BCADD
: trace("add\n");
57 stack
[sp
-2] = stack
[sp
-1] + stack
[sp
-2];
60 case BCSUB
: trace("sub\n");
61 stack
[sp
-2] = stack
[sp
-1] - stack
[sp
-2];
64 case BCMUL
: trace("mul\n");
65 stack
[sp
-2] = stack
[sp
-1] * stack
[sp
-2];
68 case BCDIV
: trace("div\n");
69 stack
[sp
-2] = stack
[sp
-1] / stack
[sp
-2];
72 case BCAND
: trace("and\n");
73 stack
[sp
-2] = stack
[sp
-1] && stack
[sp
-2];
76 case BCOR
: trace("or\n");
77 stack
[sp
-2] = stack
[sp
-1] || stack
[sp
-2];
80 case BCEQ
: trace("eq\n");
81 stack
[sp
-2] = stack
[sp
-1] == stack
[sp
-2];
84 case BCNEQ
: trace("neq\n");
85 stack
[sp
-2] = stack
[sp
-1] != stack
[sp
-2];
88 case BCLES
: trace("les\n");
89 stack
[sp
-2] = stack
[sp
-1] < stack
[sp
-2];
92 case BCGRE
: trace("gre\n");
93 stack
[sp
-2] = stack
[sp
-1] > stack
[sp
-2];
96 case BCLEQ
: trace("leq\n");
97 stack
[sp
-2] = stack
[sp
-1] <= stack
[sp
-2];
100 case BCGEQ
: trace("geq\n");
101 stack
[sp
-2] = stack
[sp
-1] >= stack
[sp
-2];
104 case BCJMP
: trace("jmp to %d\n", program
[pc
]);
107 case BCJMPT
: trace("jmpt to %d\n", program
[pc
]);
108 pc
= stack
[--sp
] ? program
[pc
]-1 : pc
+1;
110 case BCJMPF
: trace("jmpf to %d\n", program
[pc
]);
111 pc
= stack
[--sp
] ? pc
+1 : program
[pc
]-1;
113 case BCSERIALAVAIL
: trace("SerialAvailable()\n");
115 case BCSERIALPRINT
: trace("SerialPrint()\n");
117 case BCSERIALPRINTLN
: trace("SerialPrintln()\n");
119 case BCSERIALREAD
: trace("SerialRead()\n");
121 case BCSERIALPARSEINT
: trace("SerialParseInt()\n");
123 case BCANALOGREAD
: trace("AnalogRead(%d)\n", program
[pc
]);
126 case BCANALOGWRITE
: trace("AnalogWrite(%d)\n", program
[pc
]);
129 case BCDIGITALREAD
: trace("DigitalRead(%d)\n", program
[pc
]);
132 case BCDIGITALWRITE
: trace("DigitalWrite(%d)\n", program
[pc
]);
136 trace("unrecognized\n");
137 die("Unrecognized command: %d\n", program
[pc
-1]);
140 debug("Task terminated\n");