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