// 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/NestedCall/Sys.vm // function Sys.init 0 (Sys.init) @0 D = A // ^ push 0 * 0 // push constant 4000 @4000 D = A @SP A = M M = D @SP M = M + 1 // pop pointer THIS @SP A = M A = A - 1 D = M @SP M = M - 1 @THIS M = D // ^ pop into THIS // push constant 5000 @5000 D = A @SP A = M M = D @SP M = M + 1 // pop pointer THAT @SP A = M A = A - 1 D = M @SP M = M - 1 @THAT M = D // ^ pop into THAT // call Sys.main 0 @Sys.main: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 @0 D = D - A @5 D = D - A @ARG M = D // ^ ARG = SP - 0 - 5 @SP D = M @LCL M = D // ^ LCL = SP @Sys.main 0;JMP // ^ goto Sys.main (Sys.main:return:1) // pop temp 1 @1 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 // label Sys.init:LOOP (Sys.init:LOOP) // goto Sys.init:LOOP @Sys.init:LOOP 0;JMP // function Sys.main 5 (Sys.main) @0 D = A @SP A = M M = D @SP M = M + 1 // ^ push 0 @SP A = M M = D @SP M = M + 1 // ^ push 0 @SP A = M M = D @SP M = M + 1 // ^ push 0 @SP A = M M = D @SP M = M + 1 // ^ push 0 @SP A = M M = D @SP M = M + 1 // ^ push 0 // ^ push 0 * 5 // push constant 4001 @4001 D = A @SP A = M M = D @SP M = M + 1 // pop pointer THIS @SP A = M A = A - 1 D = M @SP M = M - 1 @THIS M = D // ^ pop into THIS // push constant 5001 @5001 D = A @SP A = M M = D @SP M = M + 1 // pop pointer THAT @SP A = M A = A - 1 D = M @SP M = M - 1 @THAT M = D // ^ pop into THAT // push constant 200 @200 D = A @SP A = M M = D @SP M = M + 1 // pop local 1 @1 D = A @LCL A = M D = D + A @R13 M = D // ^ R13 = local + 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 40 @40 D = A @SP A = M M = D @SP M = M + 1 // pop local 2 @2 D = A @LCL A = M D = D + A @R13 M = D // ^ R13 = local + 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 6 @6 D = A @SP A = M M = D @SP M = M + 1 // pop local 3 @3 D = A @LCL A = M D = D + A @R13 M = D // ^ R13 = local + 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 123 @123 D = A @SP A = M M = D @SP M = M + 1 // call Sys.add12 1 @Sys.add12: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 @1 D = D - A @5 D = D - A @ARG M = D // ^ ARG = SP - 1 - 5 @SP D = M @LCL M = D // ^ LCL = SP @Sys.add12 0;JMP // ^ goto Sys.add12 (Sys.add12: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 // push local 0 @0 D = A @LCL A = M A = D + A D = M // ^ D = *(LCL + index) @SP A = M M = D @SP M = M + 1 // ^ push D // push local 1 @1 D = A @LCL A = M A = D + A D = M // ^ D = *(LCL + index) @SP A = M M = D @SP M = M + 1 // ^ push D // push local 2 @2 D = A @LCL A = M A = D + A D = M // ^ D = *(LCL + index) @SP A = M M = D @SP M = M + 1 // ^ push D // push local 3 @3 D = A @LCL A = M A = D + A D = M // ^ D = *(LCL + index) @SP A = M M = D @SP M = M + 1 // ^ push D // push local 4 @4 D = A @LCL A = M A = D + A D = M // ^ D = *(LCL + index) @SP A = M M = D @SP M = M + 1 // ^ push D // add @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 // add @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 // add @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 // add @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 // function Sys.add12 0 (Sys.add12) @0 D = A // ^ push 0 * 0 // push constant 4002 @4002 D = A @SP A = M M = D @SP M = M + 1 // pop pointer THIS @SP A = M A = A - 1 D = M @SP M = M - 1 @THIS M = D // ^ pop into THIS // push constant 5002 @5002 D = A @SP A = M M = D @SP M = M + 1 // pop pointer THAT @SP A = M A = A - 1 D = M @SP M = M - 1 @THAT M = D // ^ pop into THAT // 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 // push constant 12 @12 D = A @SP A = M M = D @SP M = M + 1 // add @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