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 = toChar $ consIndex{|*|} b
= [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]