From 955c4eb992b45e48a1a3dad6418236431ddcd095 Mon Sep 17 00:00:00 2001 From: Mart Lubbers Date: Mon, 9 Jan 2017 18:17:01 +0100 Subject: [PATCH] fix if statements and sds publishing --- int/interpret.c | 20 ++++++++++++-------- int/main.c | 4 +++- int/misc.h | 2 +- int/task.c | 7 ++----- mTaskInterpret.dcl | 2 +- mTaskInterpret.icl | 47 +++++++++++++++++++++++++++++++++++++--------- miTask.icl | 15 +++++++++++---- 7 files changed, 68 insertions(+), 29 deletions(-) diff --git a/int/interpret.c b/int/interpret.c index 4c60bc9..6875097 100644 --- a/int/interpret.c +++ b/int/interpret.c @@ -23,6 +23,9 @@ void run_task(struct task *t, int fd) switch(program[pc++]){ case BCNOP: trace("nop\n"); break; + case BCLAB: trace("label: 0x%02x!!!!!!\n", program[pc]); + pc++; + break; case BCPUSH: trace("push %d\n", program[pc]*265+program[pc+1]); stack[sp++] = program[pc]*265 + program[pc+1]; pc+=2; @@ -30,13 +33,13 @@ void run_task(struct task *t, int fd) case BCPOP: trace("pop\n"); sp--; break; - case BCSDSSTORE: trace("sds store\n"); - sds_store(program[pc++], stack[sp-1]); + case BCSDSSTORE: trace("sds store: %d\n", program[pc]); + sds_store(program[pc++], stack[--sp]); break; - case BCSDSFETCH: trace("sds fetch\n"); + case BCSDSFETCH: trace("sds fetch: %d\n", program[pc]); stack[sp++] = sds_fetch(program[pc++]); break; - case BCSDSPUBLISH: trace("sds publish\n"); + case BCSDSPUBLISH: trace("sds publish %d\n", program[pc]); sds_publish(program[pc++], fd); break; case BCNOT: trace("not\n"); @@ -91,13 +94,13 @@ void run_task(struct task *t, int fd) sp -= 1; break; case BCJMP: trace("jmp to %d\n", program[pc]); - pc = pc + program[pc]; + pc = program[pc]-1; break; case BCJMPT: trace("jmpt to %d\n", program[pc]); - pc += stack[sp] ? program[pc] : 1; + pc = stack[--sp] ? program[pc]-1 : pc+1; break; case BCJMPF: trace("jmpf to %d\n", program[pc]); - pc += stack[sp] ? 1 : program[pc]; + pc = stack[--sp] ? pc+1 : program[pc]-1; break; case BCSERIALAVAIL: trace("SerialAvailable()\n"); break; @@ -122,7 +125,8 @@ void run_task(struct task *t, int fd) pc++; break; default: - die("Unrecognized command: %d\n", program[--pc]); + trace("unrecognized\n"); + die("Unrecognized command: %d\n", program[pc-1]); } } debug("Task terminated\n"); diff --git a/int/main.c b/int/main.c index de48671..886170e 100644 --- a/int/main.c +++ b/int/main.c @@ -79,7 +79,8 @@ void read_message(int fd_in, int fd_out) case MSG_GET_TASK: debug("Receiving a task\n"); c = task_register(fd_in); - write(fd_out, &c, 1); +// write(fd_out, &c, 1); +// write(fd_out, break; case '\n': break; @@ -89,6 +90,7 @@ void read_message(int fd_in, int fd_out) default: debug("Unknown message: %X\n", c); } + (void) fd_out; } void open_filedescriptors() diff --git a/int/misc.h b/int/misc.h index 033dee6..0c6bec9 100644 --- a/int/misc.h +++ b/int/misc.h @@ -8,7 +8,7 @@ #define trace(op, ...) printf("pc: %d, sp: %d, op: " op, pc, sp, ##__VA_ARGS__); #else #define debug(s, ...) ; -#define trace(pc, sp, op) ; +#define trace(pc-1, sp, op) ; #endif #define pdie(s) {perror(s); exit(1);} diff --git a/int/task.c b/int/task.c index 2e0fbb4..3b5690a 100644 --- a/int/task.c +++ b/int/task.c @@ -20,21 +20,18 @@ int task_register(int fd) die("Trying to add too much tasks...\n"); memset(&tasks[ct], 0, sizeof(struct task)); - debug("Interval: "); //Read interval read16(fd, c, tasks[ct].interval); //Read tasklength - debug("Length: "); read16(fd, c, tasks[ct].tlen); if(tasks[ct].tlen > MAXTASKSIZE) die("Task is too long: %d\n", tasks[ct].tlen); //Read task bytecode for(int i = 0; i String @@ -50,11 +51,27 @@ instance toString MTaskMessage where +++ " value " +++ safePrint v toString MTEmpty = "Empty message" +bclength :: BC -> Int +bclength (BCPush _) = 3 +bclength (BCLab _) = 2 +bclength (BCSdsStore _) = 2 +bclength (BCSdsFetch _) = 2 +bclength (BCSdsPublish _) = 2 +bclength (BCAnalogRead _) = 2 +bclength (BCAnalogWrite _) = 2 +bclength (BCDigitalRead _) = 2 +bclength (BCDigitalWrite _) = 2 +bclength (BCJmp i) = 2 +bclength (BCJmpT i) = 2 +bclength (BCJmpF i) = 2 +bclength _ = 1 + toByteVal :: BC -> [Char] toByteVal b # bt = toChar $ consIndex{|*|} b + 1 = [bt:case b of (BCPush i) = i + (BCLab i) = [toChar i] (BCSdsStore i) = [toChar i] (BCSdsFetch i) = [toChar i] (BCSdsPublish i) = [toChar i] @@ -130,14 +147,16 @@ instance digitalIO ByteCode where digitalWrite p b = b <+-> [BCDigitalWrite $ pin p] instance If ByteCode Stmt Stmt Stmt where If b t e = BCIfStmt b t e +instance If ByteCode e Stmt Stmt where If b t e = BCIfStmt b t e instance If ByteCode Stmt e Stmt where If b t e = BCIfStmt b t e -instance If ByteCode Stmt Stmt e where If b t e = BCIfStmt b t e instance If ByteCode x y Expr where If b t e = BCIfStmt b t e instance IF ByteCode where IF b t e = BCIfStmt b t e (?) b t = BCIfStmt b t $ retrn [] -BCIfStmt b t e = withLabel \else->withLabel \endif->retrn [BCJmpF else] <++> t - <++> retrn [BCJmp endif] <++> e <++> retrn [BCLab endif] +BCIfStmt b t e = + withLabel \else->withLabel \endif-> + b <++> retrn [BCJmpF else] <++> t + <++> retrn [BCJmp endif,BCLab else] <++> e <++> retrn [BCLab endif] instance noOp ByteCode where noOp = mempty @@ -188,13 +207,22 @@ instance serial ByteCode where instance zero BCState where zero = {freshl=[1..], freshs=[1..], sdss=[]} -makeSafe :: Char -> Char -makeSafe c = c//toChar $ toInt c + 31 toRealByteCode :: (ByteCode a b) -> (String, BCState) toRealByteCode x # (bc, st) = runBC x zero -= (concat $ map (toString o map makeSafe o toByteVal) bc, st) +# (bc, gtmap) = computeGotos bc 1 += (concat $ map (toString o toByteVal) (map (implGotos gtmap) bc), st) + +implGotos map (BCJmp t) = BCJmp $ fromJust ('DM'.get t map) +implGotos map (BCJmpT t) = BCJmpT $ fromJust ('DM'.get t map) +implGotos map (BCJmpF t) = BCJmpF $ fromJust ('DM'.get t map) +implGotos _ i = i + +computeGotos :: [BC] Int -> ([BC], 'DM'.Map Int Int) +computeGotos [] _ = ([], 'DM'.newMap) +computeGotos [BCLab l:xs] i = appSnd ('DM'.put l i) (computeGotos xs i) +computeGotos [x:xs] i = appFst (\bc->[x:bc]) (computeGotos xs (i+(bclength x))) readable :: BC -> String readable (BCPush d) = "BCPush " +++ concat (map safe d) @@ -207,7 +235,8 @@ readable b = printToString b toReadableByteCode :: (ByteCode a b) -> (String, BCState) toReadableByteCode x # (bc, st) = runBC x zero -= (join "\n" $ map readable bc, st) +# (bc, gtmap) = computeGotos bc 0 += (join "\n" $ map readable (map (implGotos gtmap) bc), st) //Start :: String //Start = toReadableByteCode bc @@ -228,7 +257,7 @@ Start = toMessages 500 $ toRealByteCode (unMain bc) //pub x = fmp makePub x to16bit :: Int -> String -to16bit i = toString (toChar (i/265)) +++ toString (toChar (i rem 265)) +to16bit i = toString (toChar (i/256)) +++ toString (toChar (i rem 256)) from16bit :: String -> Int -from16bit s = toInt s.[0] * 265 + toInt s.[1] +from16bit s = toInt s.[0] * 256 + toInt s.[1] diff --git a/miTask.icl b/miTask.icl index 2203541..62b6ce1 100644 --- a/miTask.icl +++ b/miTask.icl @@ -14,7 +14,7 @@ Start world = startEngine ( enterInformation "Port Number?" [] >>= \port->withShared ([], False, [], False) (mTaskTask port) ) world -//Start world = startEngine mTaskTask world +Start world = startEngine mTaskTask world mTaskTask :: Int (Shared ([MTaskMessage],Bool,[MTaskMessage],Bool)) -> Task () mTaskTask port ch = @@ -31,13 +31,20 @@ mTaskTask port ch = f [MTEmpty:xs] = f xs f [x:xs] = [toString x:f xs] - msgs = toMessages 500 (toRealByteCode (unMain bc)) + msgs + | not (trace_tn (fst (toReadableByteCode (unMain bc)))) = undef + = toMessages 500 (toRealByteCode (unMain bc)) bc :: Main (ByteCode Int Stmt) - bc = sds \x=0 In {main = x =. x +. lit 1 :. pub x} + bc = sds \x=1 In {main = + If (x ==. lit 3) + (x =. lit 1) + (x =. x +. lit 1) :. pub x} sendMsg :: [MTaskMessage] (Shared ([MTaskMessage],Bool,[MTaskMessage],Bool)) -> Task () -sendMsg m ch = upd (\(r,rs,s,ss)->(r,rs,s ++ m,ss)) ch @! () +sendMsg m ch +| not (trace_tn (join "\n" (map (toString o toJSON) m))) = undef += upd (\(r,rs,s,ss)->(r,rs,s ++ m,ss)) ch @! () syncNetworkChannel :: String Int String (String -> m) (n -> String) (Shared ([m],Bool,[n],Bool)) -> Task () | iTask m & iTask n syncNetworkChannel server port msgSeparator decodeFun encodeFun channel -- 2.20.1