From 07a7f480a869180d15e6869dadfb09ad5dff4189 Mon Sep 17 00:00:00 2001
From: avinal <185067@nith.ac.in>
Date: Fri, 21 Aug 2020 19:39:55 +0530
Subject: [PATCH] example files
---
Test-Files/BasicLoop.vm | 22 ++
Test-Files/BasicTest.vm | 31 ++
.../FibonacciElement/FibonacciElement.cmp | 2 +
.../FibonacciElement/FibonacciElement.tst | 18 ++
.../FibonacciElement/FibonacciElementVME.tst | 17 +
Test-Files/FibonacciElement/Main.vm | 30 ++
Test-Files/FibonacciElement/Sys.vm | 16 +
Test-Files/FibonacciSeries.vm | 49 +++
Test-Files/NestedCall/NestedCall.cmp | 2 +
Test-Files/NestedCall/NestedCall.html | 196 +++++++++++
Test-Files/NestedCall/NestedCall.tst | 65 ++++
Test-Files/NestedCall/NestedCallStack.html | 306 ++++++++++++++++++
Test-Files/NestedCall/NestedCallVME.tst | 70 ++++
Test-Files/NestedCall/Sys.vm | 63 ++++
Test-Files/PointerTest.vm | 22 ++
Test-Files/SimpleAdd.vm | 9 +
Test-Files/SimpleFunction/SimpleFunction.cmp | 2 +
Test-Files/SimpleFunction/SimpleFunction.tst | 29 ++
Test-Files/SimpleFunction/SimpleFunction.vm | 16 +
.../SimpleFunction/SimpleFunctionVME.tst | 29 ++
Test-Files/StackTest.vm | 45 +++
Test-Files/StaticTest.vm | 17 +
Test-Files/StaticsTest/Class1.vm | 20 ++
Test-Files/StaticsTest/Class2.vm | 20 ++
Test-Files/StaticsTest/StaticsTest.cmp | 2 +
Test-Files/StaticsTest/StaticsTest.tst | 17 +
Test-Files/StaticsTest/StaticsTestVME.tst | 17 +
Test-Files/StaticsTest/Sys.vm | 20 ++
28 files changed, 1152 insertions(+)
create mode 100644 Test-Files/BasicLoop.vm
create mode 100644 Test-Files/BasicTest.vm
create mode 100644 Test-Files/FibonacciElement/FibonacciElement.cmp
create mode 100644 Test-Files/FibonacciElement/FibonacciElement.tst
create mode 100644 Test-Files/FibonacciElement/FibonacciElementVME.tst
create mode 100644 Test-Files/FibonacciElement/Main.vm
create mode 100644 Test-Files/FibonacciElement/Sys.vm
create mode 100644 Test-Files/FibonacciSeries.vm
create mode 100644 Test-Files/NestedCall/NestedCall.cmp
create mode 100644 Test-Files/NestedCall/NestedCall.html
create mode 100644 Test-Files/NestedCall/NestedCall.tst
create mode 100644 Test-Files/NestedCall/NestedCallStack.html
create mode 100644 Test-Files/NestedCall/NestedCallVME.tst
create mode 100644 Test-Files/NestedCall/Sys.vm
create mode 100644 Test-Files/PointerTest.vm
create mode 100644 Test-Files/SimpleAdd.vm
create mode 100644 Test-Files/SimpleFunction/SimpleFunction.cmp
create mode 100644 Test-Files/SimpleFunction/SimpleFunction.tst
create mode 100644 Test-Files/SimpleFunction/SimpleFunction.vm
create mode 100644 Test-Files/SimpleFunction/SimpleFunctionVME.tst
create mode 100644 Test-Files/StackTest.vm
create mode 100644 Test-Files/StaticTest.vm
create mode 100644 Test-Files/StaticsTest/Class1.vm
create mode 100644 Test-Files/StaticsTest/Class2.vm
create mode 100644 Test-Files/StaticsTest/StaticsTest.cmp
create mode 100644 Test-Files/StaticsTest/StaticsTest.tst
create mode 100644 Test-Files/StaticsTest/StaticsTestVME.tst
create mode 100644 Test-Files/StaticsTest/Sys.vm
diff --git a/Test-Files/BasicLoop.vm b/Test-Files/BasicLoop.vm
new file mode 100644
index 0000000..2d63f13
--- /dev/null
+++ b/Test-Files/BasicLoop.vm
@@ -0,0 +1,22 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/ProgramFlow/BasicLoop/BasicLoop.vm
+
+// Computes the sum 1 + 2 + ... + argument[0] and pushes the
+// result onto the stack. Argument[0] is initialized by the test
+// script before this code starts running.
+push constant 0
+pop local 0 // initializes sum = 0
+label LOOP_START
+push argument 0
+push local 0
+add
+pop local 0 // sum = sum + counter
+push argument 0
+push constant 1
+sub
+pop argument 0 // counter--
+push argument 0
+if-goto LOOP_START // If counter > 0, goto LOOP_START
+push local 0
diff --git a/Test-Files/BasicTest.vm b/Test-Files/BasicTest.vm
new file mode 100644
index 0000000..b2f9343
--- /dev/null
+++ b/Test-Files/BasicTest.vm
@@ -0,0 +1,31 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/07/MemoryAccess/BasicTest/BasicTest.vm
+
+// Executes pop and push commands using the virtual memory segments.
+push constant 10
+pop local 0
+push constant 21
+push constant 22
+pop argument 2
+pop argument 1
+push constant 36
+pop this 6
+push constant 42
+push constant 45
+pop that 5
+pop that 2
+push constant 510
+pop temp 6
+push local 0
+push that 5
+add
+push argument 1
+sub
+push this 6
+push this 6
+add
+sub
+push temp 6
+add
diff --git a/Test-Files/FibonacciElement/FibonacciElement.cmp b/Test-Files/FibonacciElement/FibonacciElement.cmp
new file mode 100644
index 0000000..d667834
--- /dev/null
+++ b/Test-Files/FibonacciElement/FibonacciElement.cmp
@@ -0,0 +1,2 @@
+| RAM[0] |RAM[261]|
+| 262 | 3 |
diff --git a/Test-Files/FibonacciElement/FibonacciElement.tst b/Test-Files/FibonacciElement/FibonacciElement.tst
new file mode 100644
index 0000000..1f907b1
--- /dev/null
+++ b/Test-Files/FibonacciElement/FibonacciElement.tst
@@ -0,0 +1,18 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst
+
+// FibonacciElement.asm results from translating both Main.vm and Sys.vm into
+// a single assembly program, stored in the file FibonacciElement.asm.
+
+load FibonacciElement.asm,
+output-file FibonacciElement.out,
+compare-to FibonacciElement.cmp,
+output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1;
+
+repeat 6000 {
+ ticktock;
+}
+
+output;
diff --git a/Test-Files/FibonacciElement/FibonacciElementVME.tst b/Test-Files/FibonacciElement/FibonacciElementVME.tst
new file mode 100644
index 0000000..87c0920
--- /dev/null
+++ b/Test-Files/FibonacciElement/FibonacciElementVME.tst
@@ -0,0 +1,17 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst
+
+load, // Load all the VM files from the current directory
+output-file FibonacciElement.out,
+compare-to FibonacciElement.cmp,
+output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1;
+
+set sp 261,
+
+repeat 110 {
+ vmstep;
+}
+
+output;
diff --git a/Test-Files/FibonacciElement/Main.vm b/Test-Files/FibonacciElement/Main.vm
new file mode 100644
index 0000000..55e5ad2
--- /dev/null
+++ b/Test-Files/FibonacciElement/Main.vm
@@ -0,0 +1,30 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/FibonacciElement/Main.vm
+
+// Computes the n'th element of the Fibonacci series, recursively.
+// n is given in argument[0]. Called by the Sys.init function
+// (part of the Sys.vm file), which also pushes the argument[0]
+// parameter before this code starts running.
+
+function Main.fibonacci 0
+push argument 0
+push constant 2
+lt // checks if n<2
+if-goto IF_TRUE
+goto IF_FALSE
+label IF_TRUE // if n<2, return n
+push argument 0
+return
+label IF_FALSE // if n>=2, returns fib(n-2)+fib(n-1)
+push argument 0
+push constant 2
+sub
+call Main.fibonacci 1 // computes fib(n-2)
+push argument 0
+push constant 1
+sub
+call Main.fibonacci 1 // computes fib(n-1)
+add // returns fib(n-1) + fib(n-2)
+return
diff --git a/Test-Files/FibonacciElement/Sys.vm b/Test-Files/FibonacciElement/Sys.vm
new file mode 100644
index 0000000..e0989f7
--- /dev/null
+++ b/Test-Files/FibonacciElement/Sys.vm
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/FibonacciElement/Sys.vm
+
+// Pushes a constant, say n, onto the stack, and calls the Main.fibonacii
+// function, which computes the n'th element of the Fibonacci series.
+// Note that by convention, the Sys.init function is called "automatically"
+// by the bootstrap code.
+
+
+function Sys.init 0
+push constant 4
+call Main.fibonacci 1 // computes the 4'th fibonacci element
+label WHILE
+goto WHILE // loops infinitely
diff --git a/Test-Files/FibonacciSeries.vm b/Test-Files/FibonacciSeries.vm
new file mode 100644
index 0000000..6a643b6
--- /dev/null
+++ b/Test-Files/FibonacciSeries.vm
@@ -0,0 +1,49 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm
+
+// Puts the first argument[0] elements of the Fibonacci series
+// in the memory, starting in the address given in argument[1].
+// Argument[0] and argument[1] are initialized by the test script
+// before this code starts running.
+
+push argument 1
+pop pointer 1 // that = argument[1]
+
+push constant 0
+pop that 0 // first element in the series = 0
+push constant 1
+pop that 1 // second element in the series = 1
+
+push argument 0
+push constant 2
+sub
+pop argument 0 // num_of_elements -= 2 (first 2 elements are set)
+
+label MAIN_LOOP_START
+
+push argument 0
+if-goto COMPUTE_ELEMENT // if num_of_elements > 0, goto COMPUTE_ELEMENT
+goto END_PROGRAM // otherwise, goto END_PROGRAM
+
+label COMPUTE_ELEMENT
+
+push that 0
+push that 1
+add
+pop that 2 // that[2] = that[0] + that[1]
+
+push pointer 1
+push constant 1
+add
+pop pointer 1 // that += 1
+
+push argument 0
+push constant 1
+sub
+pop argument 0 // num_of_elements--
+
+goto MAIN_LOOP_START
+
+label END_PROGRAM
diff --git a/Test-Files/NestedCall/NestedCall.cmp b/Test-Files/NestedCall/NestedCall.cmp
new file mode 100644
index 0000000..9200202
--- /dev/null
+++ b/Test-Files/NestedCall/NestedCall.cmp
@@ -0,0 +1,2 @@
+| RAM[0] | RAM[1] | RAM[2] | RAM[3] | RAM[4] | RAM[5] | RAM[6] |
+| 261 | 261 | 256 | 4000 | 5000 | 135 | 246 |
diff --git a/Test-Files/NestedCall/NestedCall.html b/Test-Files/NestedCall/NestedCall.html
new file mode 100644
index 0000000..0821f9c
--- /dev/null
+++ b/Test-Files/NestedCall/NestedCall.html
@@ -0,0 +1,196 @@
+
+
+
+
+ NestedCall.tst — Nand2Tetris Calling Convention Test
+
+
+
+
+Synopsis
+NestedCall.tst is an intermediate test (in terms of complexity) intended to be used between the SimpleFunction and
+FibonacciElement tests. It may be useful when SimpleFunction passes but FibonacciElement fails or crashes. NestedCall also
+tests several requirements of the Function Calling Protocol that are not verified by the other
+supplied tests. NestedCall can be used with or without the VM bootstrap code.
+
+NestedCallVME.tst runs the same test on the VM Emulator.
+
+The NestedCall tests and supporting documentation were written by Mark Armbrust.
+
+
+
Test Structure
+Startup
+NestedCall is implemented entirely within the Sys.vm file. The first function in Sys.vm is
+Sys.init(). This allows it to be used before the bootstrap code has been added to the VM Translator
+since there will be no file processing order issues.
+
+NestedCall loads Sys.asm, sets up the stack to simulate the bootstrap's call to Sys.init(), then
+begins execution at the beginning of Sys.asm. If the bootstrap is not present, the program begins
+running with Sys.init() since it is the first function in Sys.vm.
+
+If Sys.asm includes the bootstrap, the bootstrap will (re)initialize the stack and call Sys.init(),
+so the test should see the same environment either way it gets to Sys.init().
+
+The test setup also initializes the
+
+
Sys.init()
+
+THIS and THAT are set to known values so that context save and restore can be tested.
+
+Sys.init() calls Sys.main() and stores the return value in temp 1. This tests call to and
+return from a function with no arguments.
+
+
Sys.main()
+Sys.init() allocates 5 local variables. It sets local 1, local 2 and
+local 3. local 0 and local 4 are intentionally not set.
+
+THIS and THAT are changed so that context save and restore can be tested.
+
+Sys.main() calls Sys.add12(123) and stores the return value in temp 0. This tests call to and
+return from a function with arguments.
+
+After Sys.add12() returns, Sys.main() sums local 0 through local 4 and returns the
+result. This tests that the local segment was properly allocated on the stack and that the local
+variables were not overwritten by the call to Sys.main(). It also tests that local 0 and
+local 4 were properly initialized to 0.
+
+
Sys.add12()
+
+THIS and THAT are set to known values so that context save and restore can be tested.
+
+Returns argument 0 plus 12.
+
+
+
Test Coverage
+
+
+Functions with no arguments return to correct RIP (Return Instruction Point) with correct return value on stack.
+This can fail if the RIP is not correctly pushed on the stack by the calling code, or if the returning
+code does not store the RIP in a temporary register before overwriting it with the return value.
+
+
+Functions with arguments return to correct RIP with correct return value on stack.
+This can fail if it is assumed that ARG points to the RIP.
+
+
+Functions with local variables allocate space on the stack for the local variables.
+This can fail if the function prologue is not written or if the SP is not updated after zeroing
+the local variables.
+
+
+All local variables are initialized to 0.
+Common errors are to forget this completely, or for the zeroing loop to be off by one.
+
+
+THIS and THAT are correctly retained across function calls. Looking ahead, in Project 9 you will be asked to write a simple computer game in the high-level Jack language. You can run your game (following compilation) on the supplied VM Emulator. But, if you choose to translate the VM code that the compiler generates using your VM Translator, then code like
+"push THIS, push THAT ... pop THIS, pop THAT" can cause some interesting failures!
+
+
+
Debugging
+These comments assume that your VM translator has passed the SimpleFunction test.
+
+If RAM[0] is incorrect, you have a stack skew. More data was pushed onto the stack by
+call than was popped by return, or vice versa. See debugging with
+breakpoints later in this section.
+
+If one or more of RAM[1] through RAM[4] is incorrect, the LCL,
+ARG, THIS and THAT pointers are not being correctly saved or restored.
+Most likely problem is when they are being saved; the SimpleFunction test verified that
+return restored them correctly.
+
+If RAM[5] is incorrect there may be a problem with setting up the ARG pointer.
+
+If RAM[4] is incorrect and RAM[5] is correct, there may be a problem with
+allocation or initialization of local variables.
+
+
Debugging with breakpoints
+
+To find tough bugs you can use the "breakpoint" facility in the CPU Emulator (red flag button).
+You can use breakpoints to have you program stop when it gets to a particular RAM address. For
+example:
+ • load the NestedCall.tst file,
+ • set a PC breakpoint at the ROM address for (Sys.main),
+ • hit the run button.
+When the CPU Emulator stops at the breakpoint you can inspect the RAM to check the stack and pointers values.
+(If the breakpoint isn't hit, you will need to to single-step debug through
+your calling code to see why it didn't get there.)
+
+Other useful places to set breakpoints are the entry points to the other functions and at the
+first and final instructions generated for return commands.
+
+NestedCallStack.html shows the expected stack values at various points
+during the test.
+
+
Finding ROM address in your ASM code
+It is not easy to find the ROM locations where you want to set breakpoints, because there is no
+one-to-one correspondence between the ASM file line numbers and the ROM addresses. This is made even more
+difficult because the supplied CPU Emulator does not display the (LABELS) in its ROM panel.
+
+There are two things that you can do to make this easier.
+
+
Modify your assembler to generate a listing file.
+A listing file shows all the ASM source lines, including comments, as well as the ROM addresses and
+the values of the labels and the instructions. For example, here is a snippet of a listing file generated by an assembler written by Mark Armbrust:
+
+ 20 16 @i // i -= 1
+ 21 FC88 M=M-1
+
+ 22 FC10 D=M // if i > 0
+ 23 6 @LOOP
+ 24 E301 D;JGT // goto LOOP
+
+ 25 (STOP)
+ 25 25 @STOP
+ 26 EA87 0;JMP
+
+Data Symbols
+
+ 16 D i
+
+Code Symbols
+
+ 6 C LOOP
+ 17 C SKIP
+ 25 C STOP
+
+For the Nand2Tetris environment, it is most useful to list the ROM addresses and A-instruction
+values in decimal. In the above snippet, the C-instruction values are
+listed in hexadecimal.
+
+The list file is generated during pass 2 of the Assembler, parallel to generating the .hack file. To
+make it easier to handle blank and comment only lines, Mark has Parser.commandType() return
+NO_COMMAND for source lines with no command. Mark also added Parser.sourceLine() that returns the
+unmodified source line.
+
+
Have your VM Translator write the VM source lines as comments in the ASM output.
+For example:
+
+ // label LOOP
+(Sys.init$LOOP)
+ // goto LOOP
+@Sys.init$LOOP
+0;JMP
+ //
+ // // Sys.main()
+ //
+ // // Sets locals 1, 2 and 3, leaving locals 0 and 4 unchanged to test
+ // // default local initialization to 0. (RAM set to -1 by test setup.)
+ // // Calls Sys.add12(123) and stores return value (135) in temp 0.
+ // // Returns local 0 + local 1 + local 2 + local 3 + local 4 (456) to confirm
+ // // that locals were not mangled by function call.
+ //
+ // function Sys.main 5
+(Sys.main)
+@5
+D=-A
+($3)
+@SP
+
+Note that comments in the VM source become double comments. Looking ahead, in Project 11 you will be asked to write a compiler for the Jack language. If your compiler will write the Jack source lines as comments in the
+generated VM files, this convention will be quite useful.
+
+
+
\ No newline at end of file
diff --git a/Test-Files/NestedCall/NestedCall.tst b/Test-Files/NestedCall/NestedCall.tst
new file mode 100644
index 0000000..70e5523
--- /dev/null
+++ b/Test-Files/NestedCall/NestedCall.tst
@@ -0,0 +1,65 @@
+// Test file for NestedCall test.
+
+load NestedCall.asm,
+output-file NestedCall.out,
+compare-to NestedCall.cmp,
+output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[5]%D1.6.1 RAM[6]%D1.6.1;
+
+set RAM[0] 261,
+set RAM[1] 261,
+set RAM[2] 256,
+set RAM[3] -3,
+set RAM[4] -4,
+set RAM[5] -1, // test results
+set RAM[6] -1,
+set RAM[256] 1234, // fake stack frame from call Sys.init
+set RAM[257] -1,
+set RAM[258] -2,
+set RAM[259] -3,
+set RAM[260] -4,
+
+set RAM[261] -1, // Initialize stack to check for local segment
+set RAM[262] -1, // being cleared to zero.
+set RAM[263] -1,
+set RAM[264] -1,
+set RAM[265] -1,
+set RAM[266] -1,
+set RAM[267] -1,
+set RAM[268] -1,
+set RAM[269] -1,
+set RAM[270] -1,
+set RAM[271] -1,
+set RAM[272] -1,
+set RAM[273] -1,
+set RAM[274] -1,
+set RAM[275] -1,
+set RAM[276] -1,
+set RAM[277] -1,
+set RAM[278] -1,
+set RAM[279] -1,
+set RAM[280] -1,
+set RAM[281] -1,
+set RAM[282] -1,
+set RAM[283] -1,
+set RAM[284] -1,
+set RAM[285] -1,
+set RAM[286] -1,
+set RAM[287] -1,
+set RAM[288] -1,
+set RAM[289] -1,
+set RAM[290] -1,
+set RAM[291] -1,
+set RAM[292] -1,
+set RAM[293] -1,
+set RAM[294] -1,
+set RAM[295] -1,
+set RAM[296] -1,
+set RAM[297] -1,
+set RAM[298] -1,
+set RAM[299] -1,
+
+repeat 4000 {
+ ticktock;
+}
+
+output;
diff --git a/Test-Files/NestedCall/NestedCallStack.html b/Test-Files/NestedCall/NestedCallStack.html
new file mode 100644
index 0000000..70582b6
--- /dev/null
+++ b/Test-Files/NestedCall/NestedCallStack.html
@@ -0,0 +1,306 @@
+
+
+
+
+ NestedCall.tst — Stack Frames
+
+
+
+
+
+
+
+
+ | Bootstrap init |
+ | Pointers |
+ | 0 | 256 | SP | |
+ | 1 | -1 | LCL | |
+ | 2 | -2 | ARG | |
+ | 3 | -3 | THIS | |
+ | 4 | -4 | THAT | |
+ | Stack |
+ | 256 | ??? | | ←SP |
+
+ This is how my bootstrap code initializes the pointers before calling Sys.init().
+
+ Setting the LCL, ARG, THIS and THAT pointers to known illegal values helps identify
+ when a pointer is used before it is initialized.
+
+ (If you are running the NestedCall test without bootstrap code, you will not see this state.) |
+
+ |
+
+ | Entry to Sys.init() |
+ | Pointers |
+ | 0 | 261 | SP | |
+ | 1 | 261 | LCL | |
+ | 2 | 256 | ARG | |
+ | 3 | -3 | THIS | |
+ | 4 | -4 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | ←ARG |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | ??? | | ←LCL, SP |
+
+ This is how NestedCall.tst initializes the pointers and stack. This is what RAM looks
+ like after my bootstrap calls Sys.init().
+
+ (If your VM translation includes the bootstrap, the -1 through -4 values may be
+ different if your bootstrap initializes them.) |
+
+ |
+
+ | Entry to Sys.main() |
+ | Pointers |
+ | 0 | 266 | SP | |
+ | 1 | 266 | LCL | |
+ | 2 | 261 | ARG | |
+ | 3 | 4000 | THIS | |
+ | 4 | 5000 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | * | Return IP | ←ARG |
+ | 262 | 261 | Saved LCL | |
+ | 263 | 256 | Saved ARG | Sys.main |
+ | 264 | 4000 | Saved THIS | frame |
+ | 265 | 5000 | Saved THAT | |
+ | 266 | ??? | | ←LCL, SP |
+
+ |
+
+ | After Sys.main() prologue |
+ | Pointers |
+ | 0 | 271 | SP | |
+ | 1 | 266 | LCL | |
+ | 2 | 261 | ARG | |
+ | 3 | 4000 | THIS | |
+ | 4 | 5000 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | * | Return IP | ←ARG |
+ | 262 | 261 | Saved LCL | |
+ | 263 | 256 | Saved ARG | Sys.main |
+ | 264 | 4000 | Saved THIS | frame |
+ | 265 | 5000 | Saved THAT | |
+ | 266 | 0 | local 0 | ←LCL |
+ | 267 | 0 | local 1 | |
+ | 268 | 0 | local 2 | |
+ | 269 | 0 | local 3 | |
+ | 270 | 0 | local 4 | |
+ | 271 | ??? | | ←SP |
+
+ The function prologue is the assembly language code generated for the
+ "function" VM command.
+ |
+ |
+
+ | Entry to Sys.add12(123) |
+ | Pointers |
+ | 0 | 277 | SP | |
+ | 1 | 277 | LCL | |
+ | 2 | 271 | ARG | |
+ | 3 | 4001 | THIS | |
+ | 4 | 5001 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | * | Return IP | |
+ | 262 | 261 | Saved LCL | |
+ | 263 | 256 | Saved ARG | Sys.main |
+ | 264 | 4000 | Saved THIS | frame |
+ | 265 | 5000 | Saved THAT | |
+ | 266 | 0 | local 0 | |
+ | 267 | 200 | local 1 | |
+ | 268 | 40 | local 2 | |
+ | 269 | 6 | local 3 | |
+ | 270 | 0 | local 4 | |
+ | 271 | 123 | argument 0 | ←ARG |
+ | 272 | * | Return IP | |
+ | 273 | 266 | Saved LCL | Sys.add12 |
+ | 274 | 261 | Saved ARG | frame |
+ | 275 | 4001 | Saved THIS | |
+ | 276 | 5001 | Saved THAT | |
+ | 277 | ??? | | ←LCL, SP |
+
+ |
+
+
+
+
+
+
+
+
+ | Before Sys.add12() return |
+ | Pointers |
+ | 0 | 278 | SP | |
+ | 1 | 277 | LCL | |
+ | 2 | 271 | ARG | |
+ | 3 | 4002 | THIS | |
+ | 4 | 5002 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | * | Return IP | |
+ | 262 | 261 | Saved LCL | |
+ | 263 | 256 | Saved ARG | Sys.main |
+ | 264 | 4000 | Saved THIS | frame |
+ | 265 | 5000 | Saved THAT | |
+ | 266 | 0 | local 0 | |
+ | 267 | 200 | local 1 | |
+ | 268 | 40 | local 2 | |
+ | 269 | 6 | local 3 | |
+ | 270 | 0 | local 4 | |
+ | 271 | 123 | argument 0 | ←ARG |
+ | 272 | * | Return IP | |
+ | 273 | 266 | Saved LCL | Sys.add12 |
+ | 274 | 261 | Saved ARG | frame |
+ | 275 | 4001 | Saved THIS | |
+ | 276 | 5001 | Saved THAT | |
+ | 277 | 135 | Return value | ←LCL |
+ | 278 | ??? | | ←SP |
+
+ |
+
+ | After Sys.add12() return |
+ | Pointers |
+ | 0 | 272 | SP | |
+ | 1 | 266 | LCL | |
+ | 2 | 261 | ARG | |
+ | 3 | 4001 | THIS | |
+ | 4 | 5001 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | * | Return IP | ←ARG |
+ | 262 | 261 | Saved LCL | |
+ | 263 | 256 | Saved ARG | Sys.main |
+ | 264 | 4000 | Saved THIS | frame |
+ | 265 | 5000 | Saved THAT | |
+ | 266 | 0 | local 0 | ←LCL |
+ | 267 | 200 | local 1 | |
+ | 268 | 40 | local 2 | |
+ | 269 | 6 | local 3 | |
+ | 270 | 0 | local 4 | |
+ | 271 | 135 | Return value | |
+ | 272 | ??? | | ←SP |
+
+ |
+
+ | Before Sys.main() return |
+ | Pointers |
+ | 0 | 272 | SP | |
+ | 1 | 266 | LCL | |
+ | 2 | 261 | ARG | |
+ | 3 | 4001 | THIS | |
+ | 4 | 5001 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | * | Return IP | ←ARG |
+ | 262 | 261 | Saved LCL | |
+ | 263 | 256 | Saved ARG | Sys.main |
+ | 264 | 4000 | Saved THIS | frame |
+ | 265 | 5000 | Saved THAT | |
+ | 266 | 0 | local 0 | ←LCL |
+ | 267 | 200 | local 1 | |
+ | 268 | 40 | local 2 | |
+ | 269 | 6 | local 3 | |
+ | 270 | 0 | local 4 | |
+ | 271 | 246 | Return value | |
+ | 272 | ??? | | ←SP |
+
+ |
+
+ | After Sys.main() return |
+ | Pointers |
+ | 0 | 262 | SP | |
+ | 1 | 261 | LCL | |
+ | 2 | 256 | ARG | |
+ | 3 | 4000 | THIS | |
+ | 4 | 5000 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | ←ARG |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | 246 | Return value | ←LCL |
+ | 262 | ??? | | ←SP |
+
+ |
+
+ | In Sys.init() halt loop |
+ | Pointers |
+ | 0 | 261 | SP | |
+ | 1 | 261 | LCL | |
+ | 2 | 256 | ARG | |
+ | 3 | 4000 | THIS | |
+ | 4 | 5000 | THAT | |
+ | Stack |
+ | 256 | * | Return IP | ←ARG |
+ | 257 | -1 | Saved LCL | |
+ | 258 | -2 | Saved ARG | Sys.init |
+ | 259 | -3 | Saved THIS | frame |
+ | 260 | -4 | Saved THAT | |
+ | 261 | ??? | | ←LCL, SP |
+
+ |
+
+
+
+
\ No newline at end of file
diff --git a/Test-Files/NestedCall/NestedCallVME.tst b/Test-Files/NestedCall/NestedCallVME.tst
new file mode 100644
index 0000000..2c689b8
--- /dev/null
+++ b/Test-Files/NestedCall/NestedCallVME.tst
@@ -0,0 +1,70 @@
+// Test file for NestedCall test.
+
+load Sys.vm,
+output-file NestedCall.out,
+compare-to NestedCall.cmp,
+output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[5]%D1.6.1 RAM[6]%D1.6.1;
+
+set RAM[0] 261,
+set RAM[1] 261,
+set RAM[2] 256,
+set RAM[3] -3,
+set RAM[4] -4,
+set RAM[5] -1, // test results
+set RAM[6] -1,
+set RAM[256] 1234, // fake stack frame from call Sys.init
+set RAM[257] -1,
+set RAM[258] -2,
+set RAM[259] -3,
+set RAM[260] -4,
+
+set RAM[261] -1, // Initialize stack to check for local segment
+set RAM[262] -1, // being cleared to zero.
+set RAM[263] -1,
+set RAM[264] -1,
+set RAM[265] -1,
+set RAM[266] -1,
+set RAM[267] -1,
+set RAM[268] -1,
+set RAM[269] -1,
+set RAM[270] -1,
+set RAM[271] -1,
+set RAM[272] -1,
+set RAM[273] -1,
+set RAM[274] -1,
+set RAM[275] -1,
+set RAM[276] -1,
+set RAM[277] -1,
+set RAM[278] -1,
+set RAM[279] -1,
+set RAM[280] -1,
+set RAM[281] -1,
+set RAM[282] -1,
+set RAM[283] -1,
+set RAM[284] -1,
+set RAM[285] -1,
+set RAM[286] -1,
+set RAM[287] -1,
+set RAM[288] -1,
+set RAM[289] -1,
+set RAM[290] -1,
+set RAM[291] -1,
+set RAM[292] -1,
+set RAM[293] -1,
+set RAM[294] -1,
+set RAM[295] -1,
+set RAM[296] -1,
+set RAM[297] -1,
+set RAM[298] -1,
+set RAM[299] -1,
+
+set sp 261,
+set local 261,
+set argument 256,
+set this 3000,
+set that 4000;
+
+repeat 50 {
+ vmstep;
+}
+output;
diff --git a/Test-Files/NestedCall/Sys.vm b/Test-Files/NestedCall/Sys.vm
new file mode 100644
index 0000000..8b0b003
--- /dev/null
+++ b/Test-Files/NestedCall/Sys.vm
@@ -0,0 +1,63 @@
+// Sys.vm for NestedCall test.
+
+// Sys.init()
+//
+// Calls Sys.main() and stores return value in temp 1.
+// Does not return. (Enters infinite loop.)
+
+function Sys.init 0
+push constant 4000 // test THIS and THAT context save
+pop pointer 0
+push constant 5000
+pop pointer 1
+call Sys.main 0
+pop temp 1
+label LOOP
+goto LOOP
+
+// Sys.main()
+//
+// Sets locals 1, 2 and 3, leaving locals 0 and 4 unchanged to test
+// default local initialization to 0. (RAM set to -1 by test setup.)
+// Calls Sys.add12(123) and stores return value (135) in temp 0.
+// Returns local 0 + local 1 + local 2 + local 3 + local 4 (456) to confirm
+// that locals were not mangled by function call.
+
+function Sys.main 5
+push constant 4001
+pop pointer 0
+push constant 5001
+pop pointer 1
+push constant 200
+pop local 1
+push constant 40
+pop local 2
+push constant 6
+pop local 3
+push constant 123
+call Sys.add12 1
+pop temp 0
+push local 0
+push local 1
+push local 2
+push local 3
+push local 4
+add
+add
+add
+add
+return
+
+// Sys.add12(int n)
+//
+// Returns n+12.
+
+function Sys.add12 0
+push constant 4002
+pop pointer 0
+push constant 5002
+pop pointer 1
+push argument 0
+push constant 12
+add
+return
diff --git a/Test-Files/PointerTest.vm b/Test-Files/PointerTest.vm
new file mode 100644
index 0000000..5b0a109
--- /dev/null
+++ b/Test-Files/PointerTest.vm
@@ -0,0 +1,22 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/07/MemoryAccess/PointerTest/PointerTest.vm
+
+// Executes pop and push commands using the
+// pointer, this, and that segments.
+push constant 3030
+pop pointer 0
+push constant 3040
+pop pointer 1
+push constant 32
+pop this 2
+push constant 46
+pop that 6
+push pointer 0
+push pointer 1
+add
+push this 2
+sub
+push that 6
+add
diff --git a/Test-Files/SimpleAdd.vm b/Test-Files/SimpleAdd.vm
new file mode 100644
index 0000000..cfd4ee9
--- /dev/null
+++ b/Test-Files/SimpleAdd.vm
@@ -0,0 +1,9 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm
+
+// Pushes and adds two constants.
+push constant 7
+push constant 8
+add
diff --git a/Test-Files/SimpleFunction/SimpleFunction.cmp b/Test-Files/SimpleFunction/SimpleFunction.cmp
new file mode 100644
index 0000000..c3ea911
--- /dev/null
+++ b/Test-Files/SimpleFunction/SimpleFunction.cmp
@@ -0,0 +1,2 @@
+| RAM[0] | RAM[1] | RAM[2] | RAM[3] | RAM[4] |RAM[310]|
+| 311 | 305 | 300 | 3010 | 4010 | 1196 |
diff --git a/Test-Files/SimpleFunction/SimpleFunction.tst b/Test-Files/SimpleFunction/SimpleFunction.tst
new file mode 100644
index 0000000..c7b5905
--- /dev/null
+++ b/Test-Files/SimpleFunction/SimpleFunction.tst
@@ -0,0 +1,29 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst
+
+load SimpleFunction.asm,
+output-file SimpleFunction.out,
+compare-to SimpleFunction.cmp,
+output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1
+ RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[310]%D1.6.1;
+
+set RAM[0] 317,
+set RAM[1] 317,
+set RAM[2] 310,
+set RAM[3] 3000,
+set RAM[4] 4000,
+set RAM[310] 1234,
+set RAM[311] 37,
+set RAM[312] 1000,
+set RAM[313] 305,
+set RAM[314] 300,
+set RAM[315] 3010,
+set RAM[316] 4010,
+
+repeat 300 {
+ ticktock;
+}
+
+output;
diff --git a/Test-Files/SimpleFunction/SimpleFunction.vm b/Test-Files/SimpleFunction/SimpleFunction.vm
new file mode 100644
index 0000000..d64a34f
--- /dev/null
+++ b/Test-Files/SimpleFunction/SimpleFunction.vm
@@ -0,0 +1,16 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm
+
+// Performs a simple calculation and returns the result.
+function SimpleFunction.test 2
+push local 0
+push local 1
+add
+not
+push argument 0
+add
+push argument 1
+sub
+return
diff --git a/Test-Files/SimpleFunction/SimpleFunctionVME.tst b/Test-Files/SimpleFunction/SimpleFunctionVME.tst
new file mode 100644
index 0000000..c9267ee
--- /dev/null
+++ b/Test-Files/SimpleFunction/SimpleFunctionVME.tst
@@ -0,0 +1,29 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst
+
+load SimpleFunction.vm,
+output-file SimpleFunction.out,
+compare-to SimpleFunction.cmp,
+output-list RAM[0]%D1.6.1 RAM[1]%D1.6.1 RAM[2]%D1.6.1
+ RAM[3]%D1.6.1 RAM[4]%D1.6.1 RAM[310]%D1.6.1;
+
+set sp 317,
+set local 317,
+set argument 310,
+set this 3000,
+set that 4000,
+set argument[0] 1234,
+set argument[1] 37,
+set argument[2] 9,
+set argument[3] 305,
+set argument[4] 300,
+set argument[5] 3010,
+set argument[6] 4010,
+
+repeat 10 {
+ vmstep;
+}
+
+output;
diff --git a/Test-Files/StackTest.vm b/Test-Files/StackTest.vm
new file mode 100644
index 0000000..bfe78e0
--- /dev/null
+++ b/Test-Files/StackTest.vm
@@ -0,0 +1,45 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/07/StackArithmetic/StackTest/StackTest.vm
+
+// Executes a sequence of arithmetic and logical operations
+// on the stack.
+push constant 17
+push constant 17
+eq
+push constant 17
+push constant 16
+eq
+push constant 16
+push constant 17
+eq
+push constant 892
+push constant 891
+lt
+push constant 891
+push constant 892
+lt
+push constant 891
+push constant 891
+lt
+push constant 32767
+push constant 32766
+gt
+push constant 32766
+push constant 32767
+gt
+push constant 32766
+push constant 32766
+gt
+push constant 57
+push constant 31
+push constant 53
+add
+push constant 112
+sub
+neg
+and
+push constant 82
+or
+not
diff --git a/Test-Files/StaticTest.vm b/Test-Files/StaticTest.vm
new file mode 100644
index 0000000..65b4f6f
--- /dev/null
+++ b/Test-Files/StaticTest.vm
@@ -0,0 +1,17 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/07/MemoryAccess/StaticTest/StaticTest.vm
+
+// Executes pop and push commands using the static segment.
+push constant 111
+push constant 333
+push constant 888
+pop static 8
+pop static 3
+pop static 1
+push static 3
+push static 1
+sub
+push static 8
+add
diff --git a/Test-Files/StaticsTest/Class1.vm b/Test-Files/StaticsTest/Class1.vm
new file mode 100644
index 0000000..c463537
--- /dev/null
+++ b/Test-Files/StaticsTest/Class1.vm
@@ -0,0 +1,20 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/StaticsTest/Class1.vm
+
+// Stores two supplied arguments in static[0] and static[1].
+function Class1.set 0
+push argument 0
+pop static 0
+push argument 1
+pop static 1
+push constant 0
+return
+
+// Returns static[0] - static[1].
+function Class1.get 0
+push static 0
+push static 1
+sub
+return
diff --git a/Test-Files/StaticsTest/Class2.vm b/Test-Files/StaticsTest/Class2.vm
new file mode 100644
index 0000000..94f2946
--- /dev/null
+++ b/Test-Files/StaticsTest/Class2.vm
@@ -0,0 +1,20 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/StaticsTest/Class2.vm
+
+// Stores two supplied arguments in static[0] and static[1].
+function Class2.set 0
+push argument 0
+pop static 0
+push argument 1
+pop static 1
+push constant 0
+return
+
+// Returns static[0] - static[1].
+function Class2.get 0
+push static 0
+push static 1
+sub
+return
diff --git a/Test-Files/StaticsTest/StaticsTest.cmp b/Test-Files/StaticsTest/StaticsTest.cmp
new file mode 100644
index 0000000..5589f1e
--- /dev/null
+++ b/Test-Files/StaticsTest/StaticsTest.cmp
@@ -0,0 +1,2 @@
+| RAM[0] |RAM[261]|RAM[262]|
+| 263 | -2 | 8 |
diff --git a/Test-Files/StaticsTest/StaticsTest.tst b/Test-Files/StaticsTest/StaticsTest.tst
new file mode 100644
index 0000000..1b9194e
--- /dev/null
+++ b/Test-Files/StaticsTest/StaticsTest.tst
@@ -0,0 +1,17 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/StaticsTest/StaticsTest.tst
+
+load StaticsTest.asm,
+output-file StaticsTest.out,
+compare-to StaticsTest.cmp,
+output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1 RAM[262]%D1.6.1;
+
+set RAM[0] 256,
+
+repeat 2500 {
+ ticktock;
+}
+
+output;
diff --git a/Test-Files/StaticsTest/StaticsTestVME.tst b/Test-Files/StaticsTest/StaticsTestVME.tst
new file mode 100644
index 0000000..130ba66
--- /dev/null
+++ b/Test-Files/StaticsTest/StaticsTestVME.tst
@@ -0,0 +1,17 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst
+
+load, // loads all the VM files from the current directory.
+output-file StaticsTest.out,
+compare-to StaticsTest.cmp,
+output-list RAM[0]%D1.6.1 RAM[261]%D1.6.1 RAM[262]%D1.6.1;
+
+set sp 261,
+
+repeat 36 {
+ vmstep;
+}
+
+output;
diff --git a/Test-Files/StaticsTest/Sys.vm b/Test-Files/StaticsTest/Sys.vm
new file mode 100644
index 0000000..3708322
--- /dev/null
+++ b/Test-Files/StaticsTest/Sys.vm
@@ -0,0 +1,20 @@
+// This file is part of www.nand2tetris.org
+// and the book "The Elements of Computing Systems"
+// by Nisan and Schocken, MIT Press.
+// File name: projects/08/FunctionCalls/StaticsTest/Sys.vm
+
+// Tests that different functions, stored in two different
+// class files, manipulate the static segment correctly.
+function Sys.init 0
+push constant 6
+push constant 8
+call Class1.set 2
+pop temp 0 // Dumps the return value
+push constant 23
+push constant 15
+call Class2.set 2
+pop temp 0 // Dumps the return value
+call Class1.get 0
+call Class2.get 0
+label WHILE
+goto WHILE