X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=int%2Finterpret.c;fp=int%2Finterpret.c;h=4c60bc90e52511b9e3a51d922fe86ff7edbbffe4;hb=93cabbcd5d18b7b45d6f43a6ff39f94cfcb95522;hp=f44c7bf761451c7b953cdc1e1e882a7b0ed3d955;hpb=a0182655c28502ffcadbe36de99d9a4e503e310e;p=mTask.git diff --git a/int/interpret.c b/int/interpret.c index f44c7bf..4c60bc9 100644 --- a/int/interpret.c +++ b/int/interpret.c @@ -5,8 +5,9 @@ #include "interpret.h" #include "misc.h" #include "task.h" +#include "sds.h" -void run_task(struct task *t) +void run_task(struct task *t, int fd) { uint8_t *program = t->bc; int plen = t->tlen; @@ -15,71 +16,78 @@ void run_task(struct task *t) char stack[STACKSIZE] = {0}; printf("Running task with length: %d\n", plen); while(pc != plen){ - printf("program: %x\n", program[pc]); + 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]); switch(program[pc++]){ case BCNOP: trace("nop\n"); break; - case BCPUSH: trace("push %d\n", program[pc]); - stack[sp++] = program[pc++]; + case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]); + stack[sp++] = program[pc]*265 + program[pc+1]; + pc+=2; break; case BCPOP: trace("pop\n"); sp--; break; case BCSDSSTORE: trace("sds store\n"); + sds_store(program[pc++], stack[sp-1]); break; case BCSDSFETCH: trace("sds fetch\n"); + stack[sp++] = sds_fetch(program[pc++]); break; case BCSDSPUBLISH: trace("sds publish\n"); + sds_publish(program[pc++], fd); 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]; + 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]; + 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]; + 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]; + 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]; + 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]; + 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]; + 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]; + 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]; + 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]; + 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]; + 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]; + stack[sp-2] = stack[sp-1] >= stack[sp-2]; sp -= 1; break; case BCJMP: trace("jmp to %d\n", program[pc]);