fix if statements and sds publishing
authorMart Lubbers <mart@martlubbers.net>
Mon, 9 Jan 2017 17:17:01 +0000 (18:17 +0100)
committerMart Lubbers <mart@martlubbers.net>
Mon, 9 Jan 2017 17:17:01 +0000 (18:17 +0100)
int/interpret.c
int/main.c
int/misc.h
int/task.c
mTaskInterpret.dcl
mTaskInterpret.icl
miTask.icl

index 4c60bc9..6875097 100644 (file)
@@ -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");
index de48671..886170e 100644 (file)
@@ -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()
index 033dee6..0c6bec9 100644 (file)
@@ -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);}
index 2e0fbb4..3b5690a 100644 (file)
@@ -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<tasks[ct].tlen; i++){
-               debug("Read %d\n", i);
                read(fd, tasks[ct].bc+i, 1);
-               debug("t[][%i]: %d\n", i,
-                       tasks[ct].bc[i]);
+               debug("t[][%i]: 0x%02x %d\n", i,
+                       tasks[ct].bc[i], tasks[ct].bc[i]);
        }
        //Return the task number for later removal
        debug("Received a task of length %d\n", tasks[ct].tlen);
index cce5735..1baf878 100644 (file)
@@ -83,8 +83,8 @@ instance boolExpr ByteCode
 instance analogIO ByteCode
 instance digitalIO ByteCode
 instance If ByteCode Stmt Stmt Stmt
+instance If ByteCode e Stmt Stmt
 instance If ByteCode Stmt e Stmt
-instance If ByteCode Stmt Stmt e
 instance If ByteCode x y Expr
 instance IF ByteCode
 instance noOp ByteCode
index 3cf4dfe..1cd7c70 100644 (file)
@@ -19,6 +19,7 @@ import StdList
 from Data.Func import $
 from Text import class Text(concat,join,toUpperCase), instance Text String
 
+import qualified Data.Map as DM
 import Text.Encodings.Base64
 
 encode :: MTaskMessage -> 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]
index 2203541..62b6ce1 100644 (file)
@@ -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