X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=int%2Finterpret.c;h=39c24b0e58e8684b1f0816f1a5315031b4146b72;hb=f90517d738696125a067f113edf93f404873115b;hp=4c60bc90e52511b9e3a51d922fe86ff7edbbffe4;hpb=93cabbcd5d18b7b45d6f43a6ff39f94cfcb95522;p=mTask.git diff --git a/int/interpret.c b/int/interpret.c index 4c60bc9..39c24b0 100644 --- a/int/interpret.c +++ b/int/interpret.c @@ -3,127 +3,152 @@ #include "mTaskSymbols.h" #include "interpret.h" -#include "misc.h" +#include "interface.h" #include "task.h" #include "sds.h" -void run_task(struct task *t, int fd) +#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}; - printf("Running task with length: %d\n", plen); - while(pc != plen){ - printf("program: %d\n", program[pc]); - printf("stack: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - stack[0], stack[1], stack[2], stack[3], stack[4], - stack[5], stack[6], stack[7], stack[8], stack[9]); + 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\n"); + case BCNOP: trace("nop"); + break; + case BCLAB: trace("label: 0x%02x!!!!!!", program[pc]); + pc++; break; - case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]); - stack[sp++] = program[pc]*265 + program[pc+1]; + case BCPUSH: trace("push %d", program[pc]*265+program[pc+1]); + stack[sp++] = f16(pc); pc+=2; break; - case BCPOP: trace("pop\n"); + case BCPOP: trace("pop"); sp--; break; - case BCSDSSTORE: trace("sds store\n"); - sds_store(program[pc++], stack[sp-1]); + case BCSDSSTORE: trace("sds store: %d", f16(pc)); + sds_store(f16(pc), stack[--sp]); + pc+=2; break; - case BCSDSFETCH: trace("sds fetch\n"); - stack[sp++] = sds_fetch(program[pc++]); + case BCSDSFETCH: trace("sds fetch: %d", f16(pc)); + stack[sp++] = sds_fetch(f16(pc)); + pc+=2; break; - case BCSDSPUBLISH: trace("sds publish\n"); - sds_publish(program[pc++], fd); + case BCSDSPUBLISH: trace("sds publish %d", f16(pc)); + sds_publish(f16(pc)); + pc+=2; break; - case BCNOT: trace("not\n"); + case BCNOT: trace("not"); stack[sp] = stack[sp] > 0 ? 0 : 1; break; - case BCADD: trace("add\n"); + case BCADD: trace("add"); stack[sp-2] = stack[sp-1] + stack[sp-2]; sp -= 1; break; - case BCSUB: trace("sub\n"); + case BCSUB: trace("sub"); stack[sp-2] = stack[sp-1] - stack[sp-2]; sp -= 1; break; - case BCMUL: trace("mul\n"); + case BCMUL: trace("mul"); stack[sp-2] = stack[sp-1] * stack[sp-2]; sp -= 1; break; - case BCDIV: trace("div\n"); + case BCDIV: trace("div"); stack[sp-2] = stack[sp-1] / stack[sp-2]; sp -= 1; break; - case BCAND: trace("and\n"); + case BCAND: trace("and"); stack[sp-2] = stack[sp-1] && stack[sp-2]; sp -= 1; break; - case BCOR: trace("or\n"); + case BCOR: trace("or"); stack[sp-2] = stack[sp-1] || stack[sp-2]; sp -= 1; break; - case BCEQ: trace("eq\n"); + case BCEQ: trace("eq"); stack[sp-2] = stack[sp-1] == stack[sp-2]; sp -= 1; break; - case BCNEQ: trace("neq\n"); + case BCNEQ: trace("neq"); stack[sp-2] = stack[sp-1] != stack[sp-2]; sp -= 1; break; - case BCLES: trace("les\n"); + case BCLES: trace("les"); stack[sp-2] = stack[sp-1] < stack[sp-2]; sp -= 1; break; - case BCGRE: trace("gre\n"); + case BCGRE: trace("gre"); stack[sp-2] = stack[sp-1] > stack[sp-2]; sp -= 1; break; - case BCLEQ: trace("leq\n"); + case BCLEQ: trace("leq"); stack[sp-2] = stack[sp-1] <= stack[sp-2]; sp -= 1; break; - case BCGEQ: trace("geq\n"); + 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(%d) to %d", stack[sp-1], 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; + 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: - die("Unrecognized command: %d\n", program[--pc]); + trace("unrecognized"); + die("Unrecognized command: %d", program[pc-1]); } } - debug("Task terminated\n"); + debug("Task terminated"); }