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 uint16_t stack
[STACKSIZE
] = {0};
21 void run_task(struct task
*t
)
23 uint8_t *program
= t
->bc
;
24 int plen
= t
->tasklength
;
27 debug("Running task with length: %d", plen
);
29 switch(program
[pc
++]){
30 case BCNOP
: trace("nop");
32 case BCLAB
: trace("label: 0x%02x!!!!!!", program
[pc
]);
35 case BCPUSH
: trace("push %d", program
[pc
]*265+program
[pc
+1]);
36 switch(program
[pc
++]){
41 stack
[sp
++] = f16(pc
);
48 stack
[sp
++] = program
[pc
++];
52 case BCPOP
: trace("pop");
55 case BCSDSSTORE
: trace("sds store: %d", f16(pc
));
56 sds_store(f16(pc
), stack
[--sp
]);
59 case BCSDSFETCH
: trace("sds fetch: %d", f16(pc
));
60 stack
[sp
++] = sds_fetch(f16(pc
));
63 case BCSDSPUBLISH
: trace("sds publish %d", f16(pc
));
67 case BCNOT
: trace("not");
68 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
70 case BCADD
: trace("add");
71 stack
[sp
-2] = stack
[sp
-2] + stack
[sp
-1];
74 case BCSUB
: trace("sub");
75 stack
[sp
-2] = stack
[sp
-2] - stack
[sp
-1];
78 case BCMUL
: trace("mul");
79 stack
[sp
-2] = stack
[sp
-2] * stack
[sp
-1];
82 case BCDIV
: trace("div");
83 stack
[sp
-2] = stack
[sp
-2] / stack
[sp
-1];
86 case BCAND
: trace("and");
87 stack
[sp
-2] = stack
[sp
-2] && stack
[sp
-1];
90 case BCOR
: trace("or");
91 stack
[sp
-2] = stack
[sp
-2] || stack
[sp
-1];
94 case BCEQ
: trace("eq");
95 stack
[sp
-2] = stack
[sp
-2] == stack
[sp
-1];
98 case BCNEQ
: trace("neq");
99 stack
[sp
-2] = stack
[sp
-2] != stack
[sp
-1];
102 case BCLES
: trace("les");
103 stack
[sp
-2] = stack
[sp
-2] < stack
[sp
-1];
106 case BCGRE
: trace("gre");
107 stack
[sp
-2] = stack
[sp
-2] > stack
[sp
-1];
110 case BCLEQ
: trace("leq");
111 stack
[sp
-2] = stack
[sp
-2] <= stack
[sp
-1];
114 case BCGEQ
: trace("geq");
115 stack
[sp
-2] = stack
[sp
-2] >= stack
[sp
-1];
118 case BCJMP
: trace("jmp to %d", program
[pc
]);
121 case BCJMPT
: trace("jmpt to %d", program
[pc
]);
122 pc
= stack
[--sp
] ? program
[pc
]-1 : pc
+1;
124 case BCJMPF
: trace("jmpf(%d) to %d", stack
[sp
-1], program
[pc
]);
125 pc
= stack
[--sp
] ? pc
+1 : program
[pc
]-1;
127 case BCSERIALAVAIL
: trace("SerialAvailable()");
129 case BCSERIALPRINT
: trace("SerialPrint()");
131 case BCSERIALPRINTLN
: trace("SerialPrintln()");
133 case BCSERIALREAD
: trace("SerialRead()");
135 case BCSERIALPARSEINT
: trace("SerialParseInt()");
138 case BCANALOGREAD
: trace("AnalogRead(%d)", program
[pc
]);
139 stack
[sp
++] = read_apin(program
[pc
++]);
141 case BCANALOGWRITE
: trace("AnalogWrite(%d)", program
[pc
]);
142 write_apin(program
[pc
++], stack
[sp
-1]);
147 case BCDIGITALREAD
: trace("DigitalRead(%d)", program
[pc
]);
148 stack
[sp
++] = read_dpin(program
[pc
++]);
150 case BCDIGITALWRITE
: trace("DigitalWrite(%d)", program
[pc
]);
151 write_dpin(program
[pc
++], stack
[sp
-1]);
156 case BCLEDON
: trace("LedOn(%d)", program
[pc
]);
160 case BCLEDOFF
: trace("LedOn(%d)", program
[pc
]);
161 led_off(stack
[sp
-1]);
165 case BCRETURN
: trace("Return");
166 debug("Task returned");
167 task_delete(t
->taskid
);
170 trace("unrecognized");
171 die("Unrecognized command: %d", program
[pc
-1]);
174 debug("Task terminated");