X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=int%2Finterpret.c;fp=int%2Finterpret.c;h=e1245894cb27a1b58015d17ef017ca2d4513713b;hb=fb5465ae10e39a9505634e0aaf8e1cab9710f5d7;hp=0000000000000000000000000000000000000000;hpb=a5c6b47a3e645aa8ce326e00c80e8bf10d515215;p=mTask.git diff --git a/int/interpret.c b/int/interpret.c new file mode 100644 index 0000000..e124589 --- /dev/null +++ b/int/interpret.c @@ -0,0 +1,143 @@ +#include +#include + +#include "mTaskSymbols.h" +#include "interpret.h" +#include "interface.h" +#include "task.h" +#include "sds.h" + +#ifdef STM32F767xx +#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) +{ + 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++] = program[pc]*265 + program[pc+1]; + pc+=2; + break; + case BCPOP: trace("pop"); + sp--; + break; + case BCSDSSTORE: trace("sds store: %d", program[pc]); + sds_store(program[pc++], stack[--sp]); + break; + case BCSDSFETCH: trace("sds fetch: %d", program[pc]); + stack[sp++] = sds_fetch(program[pc++]); + break; + case BCSDSPUBLISH: trace("sds publish %d", program[pc]); + sds_publish(program[pc++]); + 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 to %d", 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; + default: + trace("unrecognized"); + die("Unrecognized command: %d", program[pc-1]); + } + } + debug("Task terminated"); +}