c3c6bd1cdc050db8b256efb32a8390b934cc2a14
4 #include "mTaskSymbols.h"
11 #define trace(op, ...) ;
13 #define trace(op, ...) printf("pc: %d, sp: %d, op: " op "\n", pc, sp, ##__VA_ARGS__);
16 void run_task(struct task
*t
)
18 uint8_t *program
= t
->bc
;
22 char stack
[STACKSIZE
] = {0};
23 debug("Running task with length: %d", plen
);
25 debug("program: %d", program
[pc
]);
26 debug("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
27 stack
[0], stack
[1], stack
[2], stack
[3], stack
[4],
28 stack
[5], stack
[6], stack
[7], stack
[8], stack
[9]);
30 switch(program
[pc
++]){
31 case BCNOP
: trace("nop");
33 case BCLAB
: trace("label: 0x%02x!!!!!!", program
[pc
]);
36 case BCPUSH
: trace("push %d", program
[pc
]*265+program
[pc
+1]);
37 stack
[sp
++] = program
[pc
]*265 + program
[pc
+1];
40 case BCPOP
: trace("pop");
43 case BCSDSSTORE
: trace("sds store: %d", program
[pc
]);
44 sds_store(program
[pc
++], stack
[--sp
]);
46 case BCSDSFETCH
: trace("sds fetch: %d", program
[pc
]);
47 stack
[sp
++] = sds_fetch(program
[pc
++]);
49 case BCSDSPUBLISH
: trace("sds publish %d", program
[pc
]);
50 sds_publish(program
[pc
++]);
52 case BCNOT
: trace("not");
53 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
55 case BCADD
: trace("add");
56 stack
[sp
-2] = stack
[sp
-1] + stack
[sp
-2];
59 case BCSUB
: trace("sub");
60 stack
[sp
-2] = stack
[sp
-1] - stack
[sp
-2];
63 case BCMUL
: trace("mul");
64 stack
[sp
-2] = stack
[sp
-1] * stack
[sp
-2];
67 case BCDIV
: trace("div");
68 stack
[sp
-2] = stack
[sp
-1] / stack
[sp
-2];
71 case BCAND
: trace("and");
72 stack
[sp
-2] = stack
[sp
-1] && stack
[sp
-2];
75 case BCOR
: trace("or");
76 stack
[sp
-2] = stack
[sp
-1] || stack
[sp
-2];
79 case BCEQ
: trace("eq");
80 stack
[sp
-2] = stack
[sp
-1] == stack
[sp
-2];
83 case BCNEQ
: trace("neq");
84 stack
[sp
-2] = stack
[sp
-1] != stack
[sp
-2];
87 case BCLES
: trace("les");
88 stack
[sp
-2] = stack
[sp
-1] < stack
[sp
-2];
91 case BCGRE
: trace("gre");
92 stack
[sp
-2] = stack
[sp
-1] > stack
[sp
-2];
95 case BCLEQ
: trace("leq");
96 stack
[sp
-2] = stack
[sp
-1] <= stack
[sp
-2];
99 case BCGEQ
: trace("geq");
100 stack
[sp
-2] = stack
[sp
-1] >= stack
[sp
-2];
103 case BCJMP
: trace("jmp to %d", program
[pc
]);
106 case BCJMPT
: trace("jmpt to %d", program
[pc
]);
107 pc
= stack
[--sp
] ? program
[pc
]-1 : pc
+1;
109 case BCJMPF
: trace("jmpf to %d", program
[pc
]);
110 pc
= stack
[--sp
] ? pc
+1 : program
[pc
]-1;
112 case BCSERIALAVAIL
: trace("SerialAvailable()");
114 case BCSERIALPRINT
: trace("SerialPrint()");
116 case BCSERIALPRINTLN
: trace("SerialPrintln()");
118 case BCSERIALREAD
: trace("SerialRead()");
120 case BCSERIALPARSEINT
: trace("SerialParseInt()");
122 case BCANALOGREAD
: trace("AnalogRead(%d)", program
[pc
]);
123 stack
[sp
++] = read_apin(program
[pc
++]);
125 case BCANALOGWRITE
: trace("AnalogWrite(%d)", program
[pc
]);
126 write_apin(program
[pc
++], stack
[sp
-1]);
129 case BCDIGITALREAD
: trace("DigitalRead(%d)", program
[pc
]);
130 stack
[sp
++] = read_dpin(program
[pc
++]);
132 case BCDIGITALWRITE
: trace("DigitalWrite(%d)", program
[pc
]);
133 write_dpin(program
[pc
++], stack
[sp
-1]);
137 trace("unrecognized");
138 die("Unrecognized command: %d", program
[pc
-1]);
141 debug("Task terminated");