X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=int%2Finterpret.c;fp=int%2Finterpret.c;h=f44c7bf761451c7b953cdc1e1e882a7b0ed3d955;hb=fa71b6dc45c53e87d9045eb7cdf3cd4328ad0e7d;hp=0000000000000000000000000000000000000000;hpb=73d6866bdbab8f393b53c9951b05b62005a5423a;p=mTask.git diff --git a/int/interpret.c b/int/interpret.c new file mode 100644 index 0000000..f44c7bf --- /dev/null +++ b/int/interpret.c @@ -0,0 +1,121 @@ +#include +#include + +#include "mTaskSymbols.h" +#include "interpret.h" +#include "misc.h" +#include "task.h" + +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}; + printf("Running task with length: %d\n", plen); + while(pc != plen){ + printf("program: %x\n", program[pc]); + switch(program[pc++]){ + case BCNOP: trace("nop\n"); + break; + case BCPUSH: trace("push %d\n", program[pc]); + stack[sp++] = program[pc++]; + break; + case BCPOP: trace("pop\n"); + sp--; + break; + case BCSDSSTORE: trace("sds store\n"); + break; + case BCSDSFETCH: trace("sds fetch\n"); + break; + case BCSDSPUBLISH: trace("sds publish\n"); + break; + case BCNOT: trace("not\n"); + stack[sp] = stack[sp] > 0 ? 0 : 1; + break; + case BCADD: trace("add\n"); + stack[sp-1] = stack[sp] + stack[sp-1]; + sp -= 1; + break; + case BCSUB: trace("sub\n"); + stack[sp-1] = stack[sp] - stack[sp-1]; + sp -= 1; + break; + case BCMUL: trace("mul\n"); + stack[sp-1] = stack[sp] * stack[sp-1]; + sp -= 1; + break; + case BCDIV: trace("div\n"); + stack[sp-1] = stack[sp] / stack[sp-1]; + sp -= 1; + break; + case BCAND: trace("and\n"); + stack[sp-1] = stack[sp] && stack[sp-1]; + sp -= 1; + break; + case BCOR: trace("or\n"); + stack[sp-1] = stack[sp] || stack[sp-1]; + sp -= 1; + break; + case BCEQ: trace("eq\n"); + stack[sp-1] = stack[sp] == stack[sp-1]; + sp -= 1; + break; + case BCNEQ: trace("neq\n"); + stack[sp-1] = stack[sp] != stack[sp-1]; + sp -= 1; + break; + case BCLES: trace("les\n"); + stack[sp-1] = stack[sp] < stack[sp-1]; + sp -= 1; + break; + case BCGRE: trace("gre\n"); + stack[sp-1] = stack[sp] > stack[sp-1]; + sp -= 1; + break; + case BCLEQ: trace("leq\n"); + stack[sp-1] = stack[sp] <= stack[sp-1]; + sp -= 1; + break; + case BCGEQ: trace("geq\n"); + stack[sp-1] = stack[sp] >= stack[sp-1]; + sp -= 1; + break; + case BCJMP: trace("jmp to %d\n", program[pc]); + pc = pc + program[pc]; + break; + case BCJMPT: trace("jmpt to %d\n", program[pc]); + pc += stack[sp] ? program[pc] : 1; + break; + case BCJMPF: trace("jmpf to %d\n", program[pc]); + pc += stack[sp] ? 1 : program[pc]; + break; + case BCSERIALAVAIL: trace("SerialAvailable()\n"); + break; + case BCSERIALPRINT: trace("SerialPrint()\n"); + break; + case BCSERIALPRINTLN: trace("SerialPrintln()\n"); + break; + case BCSERIALREAD: trace("SerialRead()\n"); + break; + case BCSERIALPARSEINT: trace("SerialParseInt()\n"); + break; + case BCANALOGREAD: trace("AnalogRead(%d)\n", program[pc]); + pc++; + break; + case BCANALOGWRITE: trace("AnalogWrite(%d)\n", program[pc]); + pc++; + break; + case BCDIGITALREAD: trace("DigitalRead(%d)\n", program[pc]); + pc++; + break; + case BCDIGITALWRITE: trace("DigitalWrite(%d)\n", program[pc]); + pc++; + break; + default: + die("Unrecognized command: %d\n", program[--pc]); + } + } + debug("Task terminated\n"); +}