From be00f40a6b54a9b204525d017e1259ed063b15a9 Mon Sep 17 00:00:00 2001 From: Sean O'Connor Date: Sun, 26 Oct 2025 17:51:41 -0400 Subject: [PATCH] project07 complete --- 07/MemoryAccess/BasicTest/BasicTest.asm | 223 ++++++++++++ 07/MemoryAccess/PointerTest/PointerTest.asm | 120 +++++++ 07/MemoryAccess/StaticTest/StaticTest.asm | 73 ++++ 07/PythonFileName.txt | 1 + 07/StackArithmetic/SimpleAdd/SimpleAdd.asm | 22 ++ 07/StackArithmetic/StackTest/StackTest.asm | 379 ++++++++++++++++++++ 07/hvm.py | 23 +- 7 files changed, 832 insertions(+), 9 deletions(-) create mode 100644 07/MemoryAccess/BasicTest/BasicTest.asm create mode 100644 07/MemoryAccess/PointerTest/PointerTest.asm create mode 100644 07/MemoryAccess/StaticTest/StaticTest.asm create mode 100644 07/PythonFileName.txt create mode 100644 07/StackArithmetic/SimpleAdd/SimpleAdd.asm create mode 100644 07/StackArithmetic/StackTest/StackTest.asm diff --git a/07/MemoryAccess/BasicTest/BasicTest.asm b/07/MemoryAccess/BasicTest/BasicTest.asm new file mode 100644 index 0000000..f858cbb --- /dev/null +++ b/07/MemoryAccess/BasicTest/BasicTest.asm @@ -0,0 +1,223 @@ +@10 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@0 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@21 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@22 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@2 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@1 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@36 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@6 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@42 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@45 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@5 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THAT +D=M +@2 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@510 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@11 +M=D +@LCL +D=M +@0 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@5 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 +@ARG +D=M +@1 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M-D +@SP +M=M+1 +@THIS +D=M +@6 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@6 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M-D +@SP +M=M+1 +@11 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 diff --git a/07/MemoryAccess/PointerTest/PointerTest.asm b/07/MemoryAccess/PointerTest/PointerTest.asm new file mode 100644 index 0000000..36f1c20 --- /dev/null +++ b/07/MemoryAccess/PointerTest/PointerTest.asm @@ -0,0 +1,120 @@ +@3030 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@THIS +M=D +@3040 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@THAT +M=D +@32 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@2 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@46 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@6 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 +@THIS +D=M +@2 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M-D +@SP +M=M+1 +@THAT +D=M +@6 +A=D+A +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 diff --git a/07/MemoryAccess/StaticTest/StaticTest.asm b/07/MemoryAccess/StaticTest/StaticTest.asm new file mode 100644 index 0000000..54ec769 --- /dev/null +++ b/07/MemoryAccess/StaticTest/StaticTest.asm @@ -0,0 +1,73 @@ +@111 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@333 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@888 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@StaticTest.8 +M=D +@SP +AM=M-1 +D=M +@StaticTest.3 +M=D +@SP +AM=M-1 +D=M +@StaticTest.1 +M=D +@StaticTest.3 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@StaticTest.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M-D +@SP +M=M+1 +@StaticTest.8 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 diff --git a/07/PythonFileName.txt b/07/PythonFileName.txt new file mode 100644 index 0000000..8547736 --- /dev/null +++ b/07/PythonFileName.txt @@ -0,0 +1 @@ +hvm.py diff --git a/07/StackArithmetic/SimpleAdd/SimpleAdd.asm b/07/StackArithmetic/SimpleAdd/SimpleAdd.asm new file mode 100644 index 0000000..0fe3582 --- /dev/null +++ b/07/StackArithmetic/SimpleAdd/SimpleAdd.asm @@ -0,0 +1,22 @@ +@7 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@8 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 diff --git a/07/StackArithmetic/StackTest/StackTest.asm b/07/StackArithmetic/StackTest/StackTest.asm new file mode 100644 index 0000000..07c0ed3 --- /dev/null +++ b/07/StackArithmetic/StackTest/StackTest.asm @@ -0,0 +1,379 @@ +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_0 +D;JEQ +@SP +A=M +M=0 +@END_0 +0;JMP +(TRUE_0) +@SP +A=M +M=-1 +(END_0) +@SP +M=M+1 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@16 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_1 +D;JEQ +@SP +A=M +M=0 +@END_1 +0;JMP +(TRUE_1) +@SP +A=M +M=-1 +(END_1) +@SP +M=M+1 +@16 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_2 +D;JEQ +@SP +A=M +M=0 +@END_2 +0;JMP +(TRUE_2) +@SP +A=M +M=-1 +(END_2) +@SP +M=M+1 +@892 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_3 +D;JLT +@SP +A=M +M=0 +@END_3 +0;JMP +(TRUE_3) +@SP +A=M +M=-1 +(END_3) +@SP +M=M+1 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@892 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_4 +D;JLT +@SP +A=M +M=0 +@END_4 +0;JMP +(TRUE_4) +@SP +A=M +M=-1 +(END_4) +@SP +M=M+1 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_5 +D;JLT +@SP +A=M +M=0 +@END_5 +0;JMP +(TRUE_5) +@SP +A=M +M=-1 +(END_5) +@SP +M=M+1 +@32767 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_6 +D;JGT +@SP +A=M +M=0 +@END_6 +0;JMP +(TRUE_6) +@SP +A=M +M=-1 +(END_6) +@SP +M=M+1 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@32767 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_7 +D;JGT +@SP +A=M +M=0 +@END_7 +0;JMP +(TRUE_7) +@SP +A=M +M=-1 +(END_7) +@SP +M=M+1 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +D=M-D +@TRUE_8 +D;JGT +@SP +A=M +M=0 +@END_8 +0;JMP +(TRUE_8) +@SP +A=M +M=-1 +(END_8) +@SP +M=M+1 +@57 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@31 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@53 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M+D +@SP +M=M+1 +@112 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M-D +@SP +M=M+1 +@SP +A=M-1 +M=-M +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M&D +@SP +M=M+1 +@82 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +AM=M-1 +D=M +@SP +AM=M-1 +M=M|D +@SP +M=M+1 +@SP +A=M-1 +M=!M diff --git a/07/hvm.py b/07/hvm.py index c33d779..2776a0b 100644 --- a/07/hvm.py +++ b/07/hvm.py @@ -291,10 +291,10 @@ def translateVMFile(vmFile, asmFile): def main(): - # translate VM directory to assembly - if len(sys.argv) != 2: - print("Usage: python hvm.py ") - sys.exit(1) + # translate VM file or directory to assembly + # if len(sys.argv) != 2: + # print("Usage: python hvm.py ") + # sys.exit(1) inputPath = sys.argv[1] @@ -313,19 +313,24 @@ def main(): print(f"Translated '{inputPath}' to '{outputFile}'") elif os.path.isdir(inputPath): - # directory mode + # directory mode - find VM file in directory vmFiles = [f for f in os.listdir(inputPath) if f.endswith('.vm')] if not vmFiles: print(f"Error: No .vm files found in directory '{inputPath}'") sys.exit(1) - # output file is dir name + .asm + # find VM file with same name as directory dirName = os.path.basename(inputPath.rstrip('/')) - outputFile = os.path.join(inputPath, dirName + '.asm') + vmFileName = dirName + '.vm' - # translate first VM file found - vmFile = os.path.join(inputPath, vmFiles[0]) + if vmFileName in vmFiles: + vmFile = os.path.join(inputPath, vmFileName) + else: + # use first VM file found + vmFile = os.path.join(inputPath, vmFiles[0]) + + outputFile = os.path.join(inputPath, dirName + '.asm') translateVMFile(vmFile, outputFile) print(f"Translated '{vmFile}' to '{outputFile}'")