summaryrefslogtreecommitdiff
path: root/projects/08/VMTranslator.hs
diff options
context:
space:
mode:
authorYuchen Pei <me@ypei.me>2018-01-06 17:24:28 +0100
committerYuchen Pei <me@ypei.me>2018-01-06 17:24:28 +0100
commit29a1931f2ee4e72ddd240096bf6fe9a04668f131 (patch)
tree03bbc0366ed2b00de6a276f908c751971d0d5628 /projects/08/VMTranslator.hs
parentf84dcda74e13120c5433591feeeed7e7d4c5f322 (diff)
finished project 8.
Diffstat (limited to 'projects/08/VMTranslator.hs')
-rw-r--r--projects/08/VMTranslator.hs10
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"