#include "mTaskSymbols.h"
#include "interpret.h"
-#include "misc.h"
+#include "interface.h"
#include "task.h"
+#include "sds.h"
+
+#ifdef STM
+#define trace(op, ...) ;
+#else
+#define trace(op, ...) ;
+//printf("pc: %d, sp: %d, op: " op "\n", pc, sp, ##__VA_ARGS__);
+#endif
void run_task(struct task *t)
{
int pc = 0;
int sp = 0;
char stack[STACKSIZE] = {0};
- printf("Running task with length: %d\n", plen);
+ debug("Running task with length: %d", plen);
while(pc != plen){
- printf("program: %x\n", program[pc]);
+ 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\n");
+ case BCNOP: trace("nop");
break;
- case BCPUSH: trace("push %d\n", program[pc]);
- stack[sp++] = program[pc++];
+ case BCLAB: trace("label: 0x%02x!!!!!!", program[pc]);
+ pc++;
break;
- case BCPOP: trace("pop\n");
+ case BCPUSH: trace("push %d", program[pc]*265+program[pc+1]);
+ stack[sp++] = program[pc]*265 + program[pc+1];
+ pc+=2;
+ break;
+ case BCPOP: trace("pop");
sp--;
break;
- case BCSDSSTORE: trace("sds store\n");
+ case BCSDSSTORE: trace("sds store: %d", program[pc]);
+ sds_store(program[pc++], stack[--sp]);
break;
- case BCSDSFETCH: trace("sds fetch\n");
+ case BCSDSFETCH: trace("sds fetch: %d", program[pc]);
+ stack[sp++] = sds_fetch(program[pc++]);
break;
- case BCSDSPUBLISH: trace("sds publish\n");
+ case BCSDSPUBLISH: trace("sds publish %d", program[pc]);
+ sds_publish(program[pc++]);
break;
- case BCNOT: trace("not\n");
+ case BCNOT: trace("not");
stack[sp] = stack[sp] > 0 ? 0 : 1;
break;
- case BCADD: trace("add\n");
- stack[sp-1] = stack[sp] + stack[sp-1];
+ case BCADD: trace("add");
+ stack[sp-2] = stack[sp-1] + stack[sp-2];
sp -= 1;
break;
- case BCSUB: trace("sub\n");
- stack[sp-1] = stack[sp] - stack[sp-1];
+ case BCSUB: trace("sub");
+ stack[sp-2] = stack[sp-1] - stack[sp-2];
sp -= 1;
break;
- case BCMUL: trace("mul\n");
- stack[sp-1] = stack[sp] * stack[sp-1];
+ case BCMUL: trace("mul");
+ stack[sp-2] = stack[sp-1] * stack[sp-2];
sp -= 1;
break;
- case BCDIV: trace("div\n");
- stack[sp-1] = stack[sp] / stack[sp-1];
+ case BCDIV: trace("div");
+ stack[sp-2] = stack[sp-1] / stack[sp-2];
sp -= 1;
break;
- case BCAND: trace("and\n");
- stack[sp-1] = stack[sp] && stack[sp-1];
+ case BCAND: trace("and");
+ stack[sp-2] = stack[sp-1] && stack[sp-2];
sp -= 1;
break;
- case BCOR: trace("or\n");
- stack[sp-1] = stack[sp] || stack[sp-1];
+ case BCOR: trace("or");
+ stack[sp-2] = stack[sp-1] || stack[sp-2];
sp -= 1;
break;
- case BCEQ: trace("eq\n");
- stack[sp-1] = stack[sp] == stack[sp-1];
+ case BCEQ: trace("eq");
+ stack[sp-2] = stack[sp-1] == stack[sp-2];
sp -= 1;
break;
- case BCNEQ: trace("neq\n");
- stack[sp-1] = stack[sp] != stack[sp-1];
+ case BCNEQ: trace("neq");
+ stack[sp-2] = stack[sp-1] != stack[sp-2];
sp -= 1;
break;
- case BCLES: trace("les\n");
- stack[sp-1] = stack[sp] < stack[sp-1];
+ case BCLES: trace("les");
+ stack[sp-2] = stack[sp-1] < stack[sp-2];
sp -= 1;
break;
- case BCGRE: trace("gre\n");
- stack[sp-1] = stack[sp] > stack[sp-1];
+ case BCGRE: trace("gre");
+ stack[sp-2] = stack[sp-1] > stack[sp-2];
sp -= 1;
break;
- case BCLEQ: trace("leq\n");
- stack[sp-1] = stack[sp] <= stack[sp-1];
+ case BCLEQ: trace("leq");
+ stack[sp-2] = stack[sp-1] <= stack[sp-2];
sp -= 1;
break;
- case BCGEQ: trace("geq\n");
- stack[sp-1] = stack[sp] >= stack[sp-1];
+ case BCGEQ: trace("geq");
+ stack[sp-2] = stack[sp-1] >= stack[sp-2];
sp -= 1;
break;
- case BCJMP: trace("jmp to %d\n", program[pc]);
- pc = pc + program[pc];
+ case BCJMP: trace("jmp to %d", program[pc]);
+ pc = program[pc]-1;
break;
- case BCJMPT: trace("jmpt to %d\n", program[pc]);
- pc += stack[sp] ? program[pc] : 1;
+ case BCJMPT: trace("jmpt to %d", program[pc]);
+ pc = stack[--sp] ? program[pc]-1 : pc+1;
break;
- case BCJMPF: trace("jmpf to %d\n", program[pc]);
- pc += stack[sp] ? 1 : program[pc];
+ case BCJMPF: trace("jmpf to %d", program[pc]);
+ pc = stack[--sp] ? pc+1 : program[pc]-1;
break;
- case BCSERIALAVAIL: trace("SerialAvailable()\n");
+ case BCSERIALAVAIL: trace("SerialAvailable()");
break;
- case BCSERIALPRINT: trace("SerialPrint()\n");
+ case BCSERIALPRINT: trace("SerialPrint()");
break;
- case BCSERIALPRINTLN: trace("SerialPrintln()\n");
+ case BCSERIALPRINTLN: trace("SerialPrintln()");
break;
- case BCSERIALREAD: trace("SerialRead()\n");
+ case BCSERIALREAD: trace("SerialRead()");
break;
- case BCSERIALPARSEINT: trace("SerialParseInt()\n");
+ case BCSERIALPARSEINT: trace("SerialParseInt()");
break;
- case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]);
- pc++;
+ case BCANALOGREAD: trace("AnalogRead(%d)", program[pc]);
+ stack[sp++] = read_apin(program[pc++]);
break;
- case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]);
- pc++;
+ case BCANALOGWRITE: trace("AnalogWrite(%d)", program[pc]);
+ write_apin(program[pc++], stack[sp-1]);
+ sp--;
break;
- case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]);
- pc++;
+ case BCDIGITALREAD: trace("DigitalRead(%d)", program[pc]);
+ stack[sp++] = read_dpin(program[pc++]);
break;
- case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]);
- pc++;
+ case BCDIGITALWRITE: trace("DigitalWrite(%d)", program[pc]);
+ write_dpin(program[pc++], stack[sp-1]);
+ sp--;
break;
default:
- die("Unrecognized command: %d\n", program[--pc]);
+ trace("unrecognized");
+ die("Unrecognized command: %d", program[pc-1]);
}
}
- debug("Task terminated\n");
+ debug("Task terminated");
}