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