diff options
author | Yuchen Pei <me@ypei.me> | 2018-01-06 17:24:28 +0100 |
---|---|---|
committer | Yuchen Pei <me@ypei.me> | 2018-01-06 17:24:28 +0100 |
commit | 29a1931f2ee4e72ddd240096bf6fe9a04668f131 (patch) | |
tree | 03bbc0366ed2b00de6a276f908c751971d0d5628 /projects/08/VMTranslator.hs | |
parent | f84dcda74e13120c5433591feeeed7e7d4c5f322 (diff) |
finished project 8.
Diffstat (limited to 'projects/08/VMTranslator.hs')
-rw-r--r-- | projects/08/VMTranslator.hs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/projects/08/VMTranslator.hs b/projects/08/VMTranslator.hs index d8a2e46..d5a7075 100644 --- a/projects/08/VMTranslator.hs +++ b/projects/08/VMTranslator.hs @@ -1,3 +1,5 @@ +--usage: ./VMTranslator path/to/dir/ +--will produce path/to/dir/dir.asm from path/to/dir/*.vm import Data.Char (toUpper) import Data.List.Split (splitOn) import System.Environment (getArgs) @@ -6,6 +8,9 @@ import Data.List (elemIndex) import System.Directory (listDirectory) --preamble = "@256\nD=A\n@SP\nM=D\n" +--For ProgramFlow and SimpleFunction preamble should be set as "" +--preamble = "" +--For StaticsTest and FibonacciElement, preamble should be setSP ++ callInit preamble = setSP ++ callInit where setSP = "@256\nD=A\n@SP\nM=D\n" callInit = parse' "call" ["Sys.init", "0"] 0 "" "" @@ -16,14 +21,15 @@ epilogue = "" -- parse' command restOfCommand vmLineNumber fileName functionName = asm code parse' :: [Char] -> [[Char]] -> Int -> [Char] -> [Char] -> [Char] -parse' "return" [] _ _ _ = backupLCL ++ popToARG ++ moveSP ++ restore "THAT" +parse' "return" [] _ _ _ = backupLCL ++ backupRet ++ popToARG ++ moveSP ++ restore "THAT" ++ restore "THIS" ++ restore "ARG" ++ restore "LCL" ++ gotoRet where backupLCL = "@LCL\nD=M\n@R13\nM=D\n" + backupRet = "@5\nA=D-A\nD=M\n@R14\nM=D\n" popToARG = pop "M" ++ "@ARG\nA=M\nM=D\n" moveSP = "@ARG\nD=M+1\n@SP\nM=D\n" restore name = "@R13\nAM=M-1\nD=M\n@" ++ name ++ "\nM=D\n" - gotoRet = "@R13\nA=M-1\nA=M\n0;JMP\n" + gotoRet = "@R14\nA=M\n0;JMP\n" parse' op [] n fileName _ | op `elem` ["add", "sub", "and", "or"] = pop "M" ++ pop ('M':(f op):"D") ++ push "D" |