Add solutions for part 1

This commit is contained in:
2020-11-15 13:57:48 -05:00
parent e4f9fd2682
commit 742db6d102
479 changed files with 202980 additions and 13 deletions

View File

@@ -0,0 +1,106 @@
// Unsupported Function
// push argument 0
@0
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(LCL + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class1.0
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class1.0
M = D
// ^ Class1.0 = D
// push argument 1
@1
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(LCL + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class1.1
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class1.1
M = D
// ^ Class1.1 = D
// push constant 0
@0
D = A
@SP
A = M
M = D
@SP
M = M + 1
// Unsupported Return
// Unsupported Function
// push static Class1.0
@Class1.0
D = M
// ^ D = Class1.0
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// push static Class1.1
@Class1.1
D = M
// ^ D = Class1.1
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// sub
@SP
A = M
A = A - 1
A = A - 1
D = M
A = A + 1
D = D - M
A = A - 1
M = D
@SP
M = M - 1
// Unsupported Return

View File

@@ -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

View File

@@ -0,0 +1,106 @@
// Unsupported Function
// push argument 0
@0
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(LCL + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class2.0
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class2.0
M = D
// ^ Class2.0 = D
// push argument 1
@1
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(LCL + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class2.1
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class2.1
M = D
// ^ Class2.1 = D
// push constant 0
@0
D = A
@SP
A = M
M = D
@SP
M = M + 1
// Unsupported Return
// Unsupported Function
// push static Class2.0
@Class2.0
D = M
// ^ D = Class2.0
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// push static Class2.1
@Class2.1
D = M
// ^ D = Class2.1
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// sub
@SP
A = M
A = A - 1
A = A - 1
D = M
A = A + 1
D = D - M
A = A - 1
M = D
@SP
M = M - 1
// Unsupported Return

View File

@@ -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

View File

@@ -0,0 +1,897 @@
// Bootstrap code
@256
D = A
@SP
M = D
// ^ SP = 256
// call Sys.init 0
@Sys.init:return:0
D = A
@SP
A = M
M = D
@SP
M = M + 1
// ^ push return-address
@LCL
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push lcl
@ARG
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push arg
@THIS
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push this
@THAT
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push that
@SP
D = M
@0
D = D - A
@5
D = D - A
@ARG
M = D
// ^ ARG = SP - 0 - 5
@SP
D = M
@LCL
M = D
// ^ LCL = SP
@Sys.init
0;JMP
// ^ goto Sys.init
(Sys.init:return:0)
// Start /home/felixm/dev/nand2tetris/projects/08/FunctionCalls/StaticsTest/Sys.vm
// function Sys.init 0
(Sys.init)
@0
D = A
// ^ push 0 * 0
// push constant 6
@6
D = A
@SP
A = M
M = D
@SP
M = M + 1
// push constant 8
@8
D = A
@SP
A = M
M = D
@SP
M = M + 1
// call Class1.set 2
@Class1.set:return:1
D = A
@SP
A = M
M = D
@SP
M = M + 1
// ^ push return-address
@LCL
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push lcl
@ARG
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push arg
@THIS
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push this
@THAT
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push that
@SP
D = M
@2
D = D - A
@5
D = D - A
@ARG
M = D
// ^ ARG = SP - 2 - 5
@SP
D = M
@LCL
M = D
// ^ LCL = SP
@Class1.set
0;JMP
// ^ goto Class1.set
(Class1.set:return:1)
// pop temp 0
@0
D = A
@5
A = D + A
D = A
@R13
M = D
// ^ R13 = temp + index
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@R13
A = M
M = D
// ^ *R13 = D
// push constant 23
@23
D = A
@SP
A = M
M = D
@SP
M = M + 1
// push constant 15
@15
D = A
@SP
A = M
M = D
@SP
M = M + 1
// call Class2.set 2
@Class2.set:return:2
D = A
@SP
A = M
M = D
@SP
M = M + 1
// ^ push return-address
@LCL
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push lcl
@ARG
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push arg
@THIS
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push this
@THAT
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push that
@SP
D = M
@2
D = D - A
@5
D = D - A
@ARG
M = D
// ^ ARG = SP - 2 - 5
@SP
D = M
@LCL
M = D
// ^ LCL = SP
@Class2.set
0;JMP
// ^ goto Class2.set
(Class2.set:return:2)
// pop temp 0
@0
D = A
@5
A = D + A
D = A
@R13
M = D
// ^ R13 = temp + index
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@R13
A = M
M = D
// ^ *R13 = D
// call Class1.get 0
@Class1.get:return:3
D = A
@SP
A = M
M = D
@SP
M = M + 1
// ^ push return-address
@LCL
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push lcl
@ARG
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push arg
@THIS
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push this
@THAT
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push that
@SP
D = M
@0
D = D - A
@5
D = D - A
@ARG
M = D
// ^ ARG = SP - 0 - 5
@SP
D = M
@LCL
M = D
// ^ LCL = SP
@Class1.get
0;JMP
// ^ goto Class1.get
(Class1.get:return:3)
// call Class2.get 0
@Class2.get:return:4
D = A
@SP
A = M
M = D
@SP
M = M + 1
// ^ push return-address
@LCL
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push lcl
@ARG
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push arg
@THIS
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push this
@THAT
D = M
@SP
A = M
M = D
@SP
M = M + 1
// ^ push that
@SP
D = M
@0
D = D - A
@5
D = D - A
@ARG
M = D
// ^ ARG = SP - 0 - 5
@SP
D = M
@LCL
M = D
// ^ LCL = SP
@Class2.get
0;JMP
// ^ goto Class2.get
(Class2.get:return:4)
// label Sys.init:WHILE
(Sys.init:WHILE)
// goto Sys.init:WHILE
@Sys.init:WHILE
0;JMP
// Start /home/felixm/dev/nand2tetris/projects/08/FunctionCalls/StaticsTest/Class1.vm
// function Class1.set 0
(Class1.set)
@0
D = A
// ^ push 0 * 0
// push argument 0
@0
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(ARG + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class1.0
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class1.0
M = D
// ^ Class1.0 = D
// push argument 1
@1
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(ARG + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class1.1
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class1.1
M = D
// ^ Class1.1 = D
// push constant 0
@0
D = A
@SP
A = M
M = D
@SP
M = M + 1
// return
@LCL
D = M
@R13
M = D
// ^ R13 = FRAME = LCL
@5
D = A
@R13
A = M - D
D = M
@R14
M = D
// ^ R14 = RET = *(FRAME - 5)
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
@ARG
A = M
M = D
// ^ POP into *ARG
@ARG
D = M + 1
@SP
M = D
// ^ SP = ARG + 1
@1
D = A
@R13
A = M - D
D = M
@THAT
M = D
// ^ THAT = *(FRAME - 1)
@2
D = A
@R13
A = M - D
D = M
@THIS
M = D
// ^ THIS = *(FRAME - 2)
@3
D = A
@R13
A = M - D
D = M
@ARG
M = D
// ^ ARG = *(FRAME - 3)
@4
D = A
@R13
A = M - D
D = M
@LCL
M = D
// ^ LCL = *(FRAME - 4)
@R14
A = M
0;JMP
// ^ goto RET
// function Class1.get 0
(Class1.get)
@0
D = A
// ^ push 0 * 0
// push static Class1.0
@Class1.0
D = M
// ^ D = Class1.0
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// push static Class1.1
@Class1.1
D = M
// ^ D = Class1.1
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// sub
@SP
A = M
A = A - 1
A = A - 1
D = M
A = A + 1
D = D - M
A = A - 1
M = D
@SP
M = M - 1
// return
@LCL
D = M
@R13
M = D
// ^ R13 = FRAME = LCL
@5
D = A
@R13
A = M - D
D = M
@R14
M = D
// ^ R14 = RET = *(FRAME - 5)
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
@ARG
A = M
M = D
// ^ POP into *ARG
@ARG
D = M + 1
@SP
M = D
// ^ SP = ARG + 1
@1
D = A
@R13
A = M - D
D = M
@THAT
M = D
// ^ THAT = *(FRAME - 1)
@2
D = A
@R13
A = M - D
D = M
@THIS
M = D
// ^ THIS = *(FRAME - 2)
@3
D = A
@R13
A = M - D
D = M
@ARG
M = D
// ^ ARG = *(FRAME - 3)
@4
D = A
@R13
A = M - D
D = M
@LCL
M = D
// ^ LCL = *(FRAME - 4)
@R14
A = M
0;JMP
// ^ goto RET
// Start /home/felixm/dev/nand2tetris/projects/08/FunctionCalls/StaticsTest/Class2.vm
// function Class2.set 0
(Class2.set)
@0
D = A
// ^ push 0 * 0
// push argument 0
@0
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(ARG + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class2.0
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class2.0
M = D
// ^ Class2.0 = D
// push argument 1
@1
D = A
@ARG
A = M
A = D + A
D = M
// ^ D = *(ARG + index)
@SP
A = M
M = D
@SP
M = M + 1
// ^ push D
// pop static Class2.1
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@Class2.1
M = D
// ^ Class2.1 = D
// push constant 0
@0
D = A
@SP
A = M
M = D
@SP
M = M + 1
// return
@LCL
D = M
@R13
M = D
// ^ R13 = FRAME = LCL
@5
D = A
@R13
A = M - D
D = M
@R14
M = D
// ^ R14 = RET = *(FRAME - 5)
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
@ARG
A = M
M = D
// ^ POP into *ARG
@ARG
D = M + 1
@SP
M = D
// ^ SP = ARG + 1
@1
D = A
@R13
A = M - D
D = M
@THAT
M = D
// ^ THAT = *(FRAME - 1)
@2
D = A
@R13
A = M - D
D = M
@THIS
M = D
// ^ THIS = *(FRAME - 2)
@3
D = A
@R13
A = M - D
D = M
@ARG
M = D
// ^ ARG = *(FRAME - 3)
@4
D = A
@R13
A = M - D
D = M
@LCL
M = D
// ^ LCL = *(FRAME - 4)
@R14
A = M
0;JMP
// ^ goto RET
// function Class2.get 0
(Class2.get)
@0
D = A
// ^ push 0 * 0
// push static Class2.0
@Class2.0
D = M
// ^ D = Class2.0
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// push static Class2.1
@Class2.1
D = M
// ^ D = Class2.1
@SP
A = M
M = D
@SP
M = M + 1
// ^ push from D
// sub
@SP
A = M
A = A - 1
A = A - 1
D = M
A = A + 1
D = D - M
A = A - 1
M = D
@SP
M = M - 1
// return
@LCL
D = M
@R13
M = D
// ^ R13 = FRAME = LCL
@5
D = A
@R13
A = M - D
D = M
@R14
M = D
// ^ R14 = RET = *(FRAME - 5)
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
@ARG
A = M
M = D
// ^ POP into *ARG
@ARG
D = M + 1
@SP
M = D
// ^ SP = ARG + 1
@1
D = A
@R13
A = M - D
D = M
@THAT
M = D
// ^ THAT = *(FRAME - 1)
@2
D = A
@R13
A = M - D
D = M
@THIS
M = D
// ^ THIS = *(FRAME - 2)
@3
D = A
@R13
A = M - D
D = M
@ARG
M = D
// ^ ARG = *(FRAME - 3)
@4
D = A
@R13
A = M - D
D = M
@LCL
M = D
// ^ LCL = *(FRAME - 4)
@R14
A = M
0;JMP
// ^ goto RET

View File

@@ -0,0 +1,2 @@
| RAM[0] |RAM[261]|RAM[262]|
| 263 | -2 | 8 |

View File

@@ -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;

View File

@@ -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;

View File

@@ -0,0 +1,95 @@
// Unsupported Function
// push constant 6
@6
D = A
@SP
A = M
M = D
@SP
M = M + 1
// push constant 8
@8
D = A
@SP
A = M
M = D
@SP
M = M + 1
// Unsupported Call
// pop temp 0
@0
D = A
@5
A = D + A
D = A
@R13
M = D
// ^ R13 = temp + index
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@R13
A = M
M = D
// ^ *R13 = D
// push constant 23
@23
D = A
@SP
A = M
M = D
@SP
M = M + 1
// push constant 15
@15
D = A
@SP
A = M
M = D
@SP
M = M + 1
// Unsupported Call
// pop temp 0
@0
D = A
@5
A = D + A
D = A
@R13
M = D
// ^ R13 = temp + index
@SP
A = M
A = A - 1
D = M
@SP
M = M - 1
// ^ pop into D
@R13
A = M
M = D
// ^ *R13 = D
// Unsupported Call
// Unsupported Call
// label WHILE
(WHILE)
// goto WHILE
@WHILE
0;JMP

View File

@@ -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