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;
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");
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;
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");
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;
default:
debug("Unknown message: %X\n", c);
}
+ (void) fd_out;
}
void open_filedescriptors()
#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);}
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);
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
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
+++ " 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]
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
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)
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
//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]
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 =
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