From 77576ba62622ad0c2b3a3496aa1696f195539ef8 Mon Sep 17 00:00:00 2001 From: Pratyush Desai Date: Wed, 29 Sep 2021 16:43:29 +0530 Subject: [PATCH] Init with src project and tools suite --- nand2tetris-suite/projects/00/file.txt | 6 + nand2tetris-suite/projects/01/And.cmp | 5 + nand2tetris-suite/projects/01/And.hdl | 18 + nand2tetris-suite/projects/01/And.tst | 29 + nand2tetris-suite/projects/01/And16.cmp | 7 + nand2tetris-suite/projects/01/And16.hdl | 17 + nand2tetris-suite/projects/01/And16.tst | 39 + nand2tetris-suite/projects/01/DMux.cmp | 5 + nand2tetris-suite/projects/01/DMux.hdl | 18 + nand2tetris-suite/projects/01/DMux.tst | 27 + nand2tetris-suite/projects/01/DMux4Way.cmp | 9 + nand2tetris-suite/projects/01/DMux4Way.hdl | 20 + nand2tetris-suite/projects/01/DMux4Way.tst | 43 + nand2tetris-suite/projects/01/DMux8Way.cmp | 17 + nand2tetris-suite/projects/01/DMux8Way.hdl | 20 + nand2tetris-suite/projects/01/DMux8Way.tst | 75 + nand2tetris-suite/projects/01/Mux.cmp | 9 + nand2tetris-suite/projects/01/Mux.hdl | 18 + nand2tetris-suite/projects/01/Mux.tst | 49 + nand2tetris-suite/projects/01/Mux16.cmp | 9 + nand2tetris-suite/projects/01/Mux16.hdl | 18 + nand2tetris-suite/projects/01/Mux16.tst | 49 + nand2tetris-suite/projects/01/Mux4Way16.cmp | 9 + nand2tetris-suite/projects/01/Mux4Way16.hdl | 20 + nand2tetris-suite/projects/01/Mux4Way16.tst | 49 + nand2tetris-suite/projects/01/Mux8Way16.cmp | 17 + nand2tetris-suite/projects/01/Mux8Way16.hdl | 22 + nand2tetris-suite/projects/01/Mux8Way16.tst | 89 + nand2tetris-suite/projects/01/Not.cmp | 3 + nand2tetris-suite/projects/01/Not.hdl | 17 + nand2tetris-suite/projects/01/Not.tst | 17 + nand2tetris-suite/projects/01/Not16.cmp | 6 + nand2tetris-suite/projects/01/Not16.hdl | 17 + nand2tetris-suite/projects/01/Not16.tst | 29 + nand2tetris-suite/projects/01/Or.cmp | 5 + nand2tetris-suite/projects/01/Or.hdl | 18 + nand2tetris-suite/projects/01/Or.tst | 29 + nand2tetris-suite/projects/01/Or16.cmp | 7 + nand2tetris-suite/projects/01/Or16.hdl | 17 + nand2tetris-suite/projects/01/Or16.tst | 39 + nand2tetris-suite/projects/01/Or8Way.cmp | 6 + nand2tetris-suite/projects/01/Or8Way.hdl | 17 + nand2tetris-suite/projects/01/Or8Way.tst | 29 + nand2tetris-suite/projects/01/Xor.cmp | 5 + nand2tetris-suite/projects/01/Xor.hdl | 17 + nand2tetris-suite/projects/01/Xor.tst | 29 + nand2tetris-suite/projects/02/ALU-nostat.cmp | 37 + nand2tetris-suite/projects/02/ALU-nostat.tst | 353 + nand2tetris-suite/projects/02/ALU.cmp | 37 + nand2tetris-suite/projects/02/ALU.hdl | 46 + nand2tetris-suite/projects/02/ALU.tst | 377 + nand2tetris-suite/projects/02/Add16.cmp | 7 + nand2tetris-suite/projects/02/Add16.hdl | 17 + nand2tetris-suite/projects/02/Add16.tst | 39 + nand2tetris-suite/projects/02/FullAdder.cmp | 9 + nand2tetris-suite/projects/02/FullAdder.hdl | 17 + nand2tetris-suite/projects/02/FullAdder.tst | 47 + nand2tetris-suite/projects/02/HalfAdder.cmp | 5 + nand2tetris-suite/projects/02/HalfAdder.hdl | 17 + nand2tetris-suite/projects/02/HalfAdder.tst | 29 + nand2tetris-suite/projects/02/Inc16.cmp | 5 + nand2tetris-suite/projects/02/Inc16.hdl | 17 + nand2tetris-suite/projects/02/Inc16.tst | 25 + nand2tetris-suite/projects/03/a/Bit.cmp | 215 + nand2tetris-suite/projects/03/a/Bit.hdl | 18 + nand2tetris-suite/projects/03/a/Bit.tst | 865 + nand2tetris-suite/projects/03/a/PC.cmp | 31 + nand2tetris-suite/projects/03/a/PC.hdl | 20 + nand2tetris-suite/projects/03/a/PC.tst | 125 + nand2tetris-suite/projects/03/a/RAM64.cmp | 320 + nand2tetris-suite/projects/03/a/RAM64.hdl | 19 + nand2tetris-suite/projects/03/a/RAM64.tst | 1026 + nand2tetris-suite/projects/03/a/RAM8.cmp | 173 + nand2tetris-suite/projects/03/a/RAM8.hdl | 19 + nand2tetris-suite/projects/03/a/RAM8.tst | 560 + nand2tetris-suite/projects/03/a/Register.cmp | 149 + nand2tetris-suite/projects/03/a/Register.hdl | 18 + nand2tetris-suite/projects/03/a/Register.tst | 569 + nand2tetris-suite/projects/03/b/RAM16K.cmp | 320 + nand2tetris-suite/projects/03/b/RAM16K.hdl | 19 + nand2tetris-suite/projects/03/b/RAM16K.tst | 1026 + nand2tetris-suite/projects/03/b/RAM4K.cmp | 320 + nand2tetris-suite/projects/03/b/RAM4K.hdl | 19 + nand2tetris-suite/projects/03/b/RAM4K.tst | 1026 + nand2tetris-suite/projects/03/b/RAM512.cmp | 320 + nand2tetris-suite/projects/03/b/RAM512.hdl | 19 + nand2tetris-suite/projects/03/b/RAM512.tst | 1027 + nand2tetris-suite/projects/04/fill/Fill.asm | 14 + nand2tetris-suite/projects/04/fill/Fill.tst | 11 + .../projects/04/fill/FillAutomatic.cmp | 4 + .../projects/04/fill/FillAutomatic.tst | 37 + nand2tetris-suite/projects/04/mult/Mult.asm | 12 + nand2tetris-suite/projects/04/mult/Mult.cmp | 7 + nand2tetris-suite/projects/04/mult/Mult.tst | 74 + nand2tetris-suite/projects/05/Add.hack | 6 + .../projects/05/CPU-external.cmp | 93 + .../projects/05/CPU-external.tst | 150 + nand2tetris-suite/projects/05/CPU.cmp | 97 + nand2tetris-suite/projects/05/CPU.hdl | 43 + nand2tetris-suite/projects/05/CPU.tst | 156 + nand2tetris-suite/projects/05/Computer.hdl | 23 + .../projects/05/ComputerAdd-external.cmp | 15 + .../projects/05/ComputerAdd-external.tst | 32 + nand2tetris-suite/projects/05/ComputerAdd.cmp | 15 + nand2tetris-suite/projects/05/ComputerAdd.tst | 32 + .../projects/05/ComputerMax-external.cmp | 28 + .../projects/05/ComputerMax-external.tst | 38 + nand2tetris-suite/projects/05/ComputerMax.cmp | 28 + nand2tetris-suite/projects/05/ComputerMax.tst | 39 + .../projects/05/ComputerRect-external.cmp | 65 + .../projects/05/ComputerRect-external.tst | 26 + .../projects/05/ComputerRect.cmp | 65 + .../projects/05/ComputerRect.tst | 26 + nand2tetris-suite/projects/05/Max.hack | 16 + nand2tetris-suite/projects/05/Memory.cmp | 68 + nand2tetris-suite/projects/05/Memory.hdl | 31 + nand2tetris-suite/projects/05/Memory.tst | 191 + nand2tetris-suite/projects/05/Rect.hack | 25 + nand2tetris-suite/projects/06/add/Add.asm | 13 + nand2tetris-suite/projects/06/max/Max.asm | 26 + nand2tetris-suite/projects/06/max/MaxL.asm | 23 + nand2tetris-suite/projects/06/pong/Pong.asm | 28375 ++++++++++++++++ nand2tetris-suite/projects/06/pong/PongL.asm | 27490 +++++++++++++++ nand2tetris-suite/projects/06/rect/Rect.asm | 35 + nand2tetris-suite/projects/06/rect/RectL.asm | 32 + .../07/MemoryAccess/BasicTest/BasicTest.cmp | 2 + .../07/MemoryAccess/BasicTest/BasicTest.tst | 25 + .../07/MemoryAccess/BasicTest/BasicTest.vm | 31 + .../MemoryAccess/BasicTest/BasicTestVME.tst | 25 + .../MemoryAccess/PointerTest/PointerTest.cmp | 2 + .../MemoryAccess/PointerTest/PointerTest.tst | 20 + .../MemoryAccess/PointerTest/PointerTest.vm | 22 + .../PointerTest/PointerTestVME.tst | 20 + .../07/MemoryAccess/StaticTest/StaticTest.cmp | 2 + .../07/MemoryAccess/StaticTest/StaticTest.tst | 17 + .../07/MemoryAccess/StaticTest/StaticTest.vm | 17 + .../MemoryAccess/StaticTest/StaticTestVME.tst | 17 + .../StackArithmetic/SimpleAdd/SimpleAdd.cmp | 2 + .../StackArithmetic/SimpleAdd/SimpleAdd.tst | 17 + .../07/StackArithmetic/SimpleAdd/SimpleAdd.vm | 9 + .../SimpleAdd/SimpleAddVME.tst | 17 + .../StackArithmetic/StackTest/StackTest.cmp | 4 + .../StackArithmetic/StackTest/StackTest.tst | 22 + .../07/StackArithmetic/StackTest/StackTest.vm | 45 + .../StackTest/StackTestVME.tst | 22 + .../FibonacciElement/FibonacciElement.cmp | 2 + .../FibonacciElement/FibonacciElement.tst | 18 + .../FibonacciElement/FibonacciElementVME.tst | 17 + .../08/FunctionCalls/FibonacciElement/Main.vm | 30 + .../08/FunctionCalls/FibonacciElement/Sys.vm | 15 + .../FunctionCalls/NestedCall/NestedCall.cmp | 2 + .../FunctionCalls/NestedCall/NestedCall.html | 196 + .../FunctionCalls/NestedCall/NestedCall.tst | 65 + .../NestedCall/NestedCallStack.html | 306 + .../NestedCall/NestedCallVME.tst | 70 + .../08/FunctionCalls/NestedCall/Sys.vm | 63 + .../SimpleFunction/SimpleFunction.cmp | 2 + .../SimpleFunction/SimpleFunction.tst | 29 + .../SimpleFunction/SimpleFunction.vm | 16 + .../SimpleFunction/SimpleFunctionVME.tst | 29 + .../08/FunctionCalls/StaticsTest/Class1.vm | 20 + .../08/FunctionCalls/StaticsTest/Class2.vm | 20 + .../FunctionCalls/StaticsTest/StaticsTest.cmp | 2 + .../FunctionCalls/StaticsTest/StaticsTest.tst | 17 + .../StaticsTest/StaticsTestVME.tst | 17 + .../08/FunctionCalls/StaticsTest/Sys.vm | 20 + .../08/ProgramFlow/BasicLoop/BasicLoop.cmp | 2 + .../08/ProgramFlow/BasicLoop/BasicLoop.tst | 20 + .../08/ProgramFlow/BasicLoop/BasicLoop.vm | 22 + .../08/ProgramFlow/BasicLoop/BasicLoopVME.tst | 20 + .../FibonacciSeries/FibonacciSeries.cmp | 2 + .../FibonacciSeries/FibonacciSeries.tst | 22 + .../FibonacciSeries/FibonacciSeries.vm | 49 + .../FibonacciSeries/FibonacciSeriesVME.tst | 22 + .../projects/09/Average/Main.jack | 27 + .../09/BitmapEditor/BitmapEditor.html | 200 + .../projects/09/BitmapEditor/BitmapEditor.iml | 10 + .../projects/09/Fraction/Fraction.jack | 65 + .../projects/09/Fraction/Main.jack | 16 + .../projects/09/HelloWorld/Main.jack | 14 + nand2tetris-suite/projects/09/Jack OS API.pdf | Bin 0 -> 108857 bytes nand2tetris-suite/projects/09/List/List.jack | 46 + nand2tetris-suite/projects/09/List/Main.jack | 17 + .../projects/09/Square/Main.jack | 15 + .../projects/09/Square/Square.jack | 108 + .../projects/09/Square/SquareGame.jack | 79 + .../projects/10/ArrayTest/Main.jack | 38 + .../projects/10/ArrayTest/Main.xml | 286 + .../projects/10/ArrayTest/MainT.xml | 142 + .../10/ExpressionLessSquare/Main.jack | 28 + .../projects/10/ExpressionLessSquare/Main.xml | 114 + .../10/ExpressionLessSquare/MainT.xml | 64 + .../10/ExpressionLessSquare/Square.jack | 99 + .../10/ExpressionLessSquare/Square.xml | 967 + .../10/ExpressionLessSquare/SquareGame.jack | 60 + .../10/ExpressionLessSquare/SquareGame.xml | 544 + .../10/ExpressionLessSquare/SquareGameT.xml | 268 + .../10/ExpressionLessSquare/SquareT.xml | 449 + .../projects/10/Square/Main.jack | 36 + nand2tetris-suite/projects/10/Square/Main.xml | 244 + .../projects/10/Square/MainT.xml | 126 + .../projects/10/Square/Square.jack | 110 + .../projects/10/Square/Square.xml | 1211 + .../projects/10/Square/SquareGame.jack | 81 + .../projects/10/Square/SquareGame.xml | 643 + .../projects/10/Square/SquareGameT.xml | 315 + .../projects/10/Square/SquareT.xml | 561 + .../projects/11/Average/Main.jack | 29 + .../projects/11/ComplexArrays/Main.jack | 70 + .../projects/11/ConvertToBin/Main.jack | 82 + nand2tetris-suite/projects/11/Pong/Ball.jack | 203 + nand2tetris-suite/projects/11/Pong/Bat.jack | 103 + nand2tetris-suite/projects/11/Pong/Main.jack | 20 + .../projects/11/Pong/PongGame.jack | 137 + nand2tetris-suite/projects/11/Seven/Main.jack | 17 + .../projects/11/Square/Main.jack | 17 + .../projects/11/Square/Square.jack | 110 + .../projects/11/Square/SquareGame.jack | 81 + nand2tetris-suite/projects/12/Array.jack | 23 + .../projects/12/ArrayTest/ArrayTest.cmp | 2 + .../projects/12/ArrayTest/ArrayTest.tst | 15 + .../projects/12/ArrayTest/Main.jack | 40 + nand2tetris-suite/projects/12/Keyboard.jack | 62 + .../12/KeyboardTest/KeyboardTestOutput.gif | Bin 0 -> 12048 bytes .../projects/12/KeyboardTest/Main.jack | 93 + nand2tetris-suite/projects/12/Math.jack | 47 + .../projects/12/MathTest/Main.jack | 35 + .../projects/12/MathTest/MathTest.cmp | 2 + .../projects/12/MathTest/MathTest.tst | 15 + nand2tetris-suite/projects/12/Memory.jack | 34 + .../projects/12/MemoryTest/Main.jack | 53 + .../12/MemoryTest/MemoryDiag/Main.jack | 183 + .../12/MemoryTest/MemoryDiag/MemoryDiag.cmp | 2 + .../12/MemoryTest/MemoryDiag/MemoryDiag.tst | 18 + .../12/MemoryTest/MemoryDiag/README.html | 55 + .../projects/12/MemoryTest/MemoryTest.cmp | 2 + .../projects/12/MemoryTest/MemoryTest.tst | 15 + .../projects/12/MemoryTest/README.txt | 9 + nand2tetris-suite/projects/12/Output.jack | 203 + .../projects/12/OutputTest/Main.jack | 42 + .../12/OutputTest/OutputTestOutput.gif | Bin 0 -> 6184 bytes nand2tetris-suite/projects/12/Screen.jack | 43 + .../projects/12/ScreenTest/Main.jack | 36 + .../12/ScreenTest/ScreenTestOutput.gif | Bin 0 -> 4563 bytes nand2tetris-suite/projects/12/String.jack | 64 + .../projects/12/StringTest/Main.jack | 83 + .../12/StringTest/StringTestOutput.gif | Bin 0 -> 8126 bytes nand2tetris-suite/projects/12/Sys.jack | 27 + .../projects/12/SysTest/Main.jack | 31 + .../projects/13/more fun to go.txt | 9 + nand2tetris-suite/projects/demo/Xor.cmp | 5 + nand2tetris-suite/projects/demo/Xor.hdl | 25 + nand2tetris-suite/projects/demo/Xor.out | 0 nand2tetris-suite/projects/demo/Xor.tst | 29 + nand2tetris-suite/tools/Assembler.bat | 27 + nand2tetris-suite/tools/Assembler.sh | 32 + nand2tetris-suite/tools/CPUEmulator.bat | 29 + nand2tetris-suite/tools/CPUEmulator.sh | 33 + nand2tetris-suite/tools/HardwareSimulator.bat | 30 + nand2tetris-suite/tools/HardwareSimulator.sh | 34 + nand2tetris-suite/tools/JackCompiler.bat | 26 + nand2tetris-suite/tools/JackCompiler.sh | 35 + nand2tetris-suite/tools/OS/Array.vm | 23 + nand2tetris-suite/tools/OS/Keyboard.vm | 102 + nand2tetris-suite/tools/OS/Math.vm | 408 + nand2tetris-suite/tools/OS/Memory.vm | 376 + nand2tetris-suite/tools/OS/Output.vm | 1852 + nand2tetris-suite/tools/OS/Screen.vm | 806 + nand2tetris-suite/tools/OS/String.vm | 393 + nand2tetris-suite/tools/OS/Sys.vm | 83 + nand2tetris-suite/tools/TextComparer.bat | 29 + nand2tetris-suite/tools/TextComparer.sh | 36 + nand2tetris-suite/tools/VMEmulator.bat | 29 + nand2tetris-suite/tools/VMEmulator.sh | 33 + .../tools/bin/classes/CPUEmulatorMain.class | Bin 0 -> 1084 bytes .../tools/bin/classes/HackAssemblerMain.class | Bin 0 -> 1098 bytes .../bin/classes/HardwareSimulatorMain.class | Bin 0 -> 1182 bytes .../tools/bin/classes/TextComparer.class | Bin 0 -> 1739 bytes .../tools/bin/classes/VMEmulatorMain.class | Bin 0 -> 1073 bytes .../tools/bin/help/asmAbout.html | 96 + .../tools/bin/help/asmUsage.html | 115 + nand2tetris-suite/tools/bin/help/compiler.txt | 9 + .../tools/bin/help/cpuAbout.html | 96 + .../tools/bin/help/cpuUsage.html | 115 + nand2tetris-suite/tools/bin/help/hwAbout.html | 96 + nand2tetris-suite/tools/bin/help/hwUsage.html | 115 + nand2tetris-suite/tools/bin/help/vmAbout.html | 110 + nand2tetris-suite/tools/bin/help/vmUsage.html | 115 + nand2tetris-suite/tools/bin/images/arrow2.gif | Bin 0 -> 1073 bytes .../tools/bin/images/calculator2.gif | Bin 0 -> 302 bytes nand2tetris-suite/tools/bin/images/cancel.gif | Bin 0 -> 1133 bytes nand2tetris-suite/tools/bin/images/chip.gif | Bin 0 -> 1078 bytes nand2tetris-suite/tools/bin/images/clock2.gif | Bin 0 -> 1138 bytes nand2tetris-suite/tools/bin/images/equal.gif | Bin 0 -> 1042 bytes nand2tetris-suite/tools/bin/images/find.gif | Bin 0 -> 1014 bytes nand2tetris-suite/tools/bin/images/hex.gif | Bin 0 -> 1422 bytes .../tools/bin/images/keyboard.gif | Bin 0 -> 1017 bytes nand2tetris-suite/tools/bin/images/ok.gif | Bin 0 -> 988 bytes nand2tetris-suite/tools/bin/images/ok2.gif | Bin 0 -> 920 bytes nand2tetris-suite/tools/bin/images/open.gif | Bin 0 -> 930 bytes nand2tetris-suite/tools/bin/images/open2.gif | Bin 0 -> 969 bytes .../tools/bin/images/opendoc.gif | Bin 0 -> 1094 bytes .../tools/bin/images/redflag.gif | Bin 0 -> 1100 bytes nand2tetris-suite/tools/bin/images/save.gif | Bin 0 -> 1257 bytes nand2tetris-suite/tools/bin/images/scroll.gif | Bin 0 -> 949 bytes .../tools/bin/images/smallcancel.gif | Bin 0 -> 946 bytes .../tools/bin/images/smallequal.gif | Bin 0 -> 898 bytes .../tools/bin/images/smallminus.gif | Bin 0 -> 863 bytes .../tools/bin/images/smallnew.gif | Bin 0 -> 1000 bytes .../tools/bin/images/smallok.gif | Bin 0 -> 925 bytes .../tools/bin/images/smallplus.gif | Bin 0 -> 873 bytes .../tools/bin/images/vcrfastforward.gif | Bin 0 -> 1122 bytes .../tools/bin/images/vcrforward.gif | Bin 0 -> 1021 bytes .../tools/bin/images/vcrrewind.gif | Bin 0 -> 1122 bytes .../tools/bin/images/vcrstop.gif | Bin 0 -> 972 bytes .../tools/bin/lib/AssemblerGUI.jar | Bin 0 -> 4470 bytes nand2tetris-suite/tools/bin/lib/Compilers.jar | Bin 0 -> 27094 bytes nand2tetris-suite/tools/bin/lib/Hack.jar | Bin 0 -> 59364 bytes nand2tetris-suite/tools/bin/lib/HackGUI.jar | Bin 0 -> 96666 bytes .../tools/bin/lib/Simulators.jar | Bin 0 -> 81810 bytes .../tools/bin/lib/SimulatorsGUI.jar | Bin 0 -> 68492 bytes .../tools/bin/lib/TranslatorsGUI.jar | Bin 0 -> 13643 bytes .../tools/bin/scripts/defaultCPU.txt | 3 + .../tools/bin/scripts/defaultHW.txt | 4 + .../tools/bin/scripts/defaultVM.txt | 3 + .../tools/builtInChips/ALU.class | Bin 0 -> 1754 bytes nand2tetris-suite/tools/builtInChips/ALU.hdl | 55 + .../tools/builtInChips/ARegister.class | Bin 0 -> 337 bytes .../tools/builtInChips/ARegister.hdl | 24 + .../tools/builtInChips/Add16.class | Bin 0 -> 343 bytes .../tools/builtInChips/Add16.hdl | 18 + .../tools/builtInChips/And.class | Bin 0 -> 341 bytes nand2tetris-suite/tools/builtInChips/And.hdl | 16 + .../tools/builtInChips/And16.hdl | 17 + .../tools/builtInChips/Bit.class | Bin 0 -> 416 bytes nand2tetris-suite/tools/builtInChips/Bit.hdl | 19 + .../tools/builtInChips/DFF.class | Bin 0 -> 401 bytes nand2tetris-suite/tools/builtInChips/DFF.hdl | 18 + .../tools/builtInChips/DMux.class | Bin 0 -> 365 bytes nand2tetris-suite/tools/builtInChips/DMux.hdl | 20 + .../tools/builtInChips/DMux4Way.class | Bin 0 -> 408 bytes .../tools/builtInChips/DMux4Way.hdl | 22 + .../tools/builtInChips/DMux8Way.class | Bin 0 -> 488 bytes .../tools/builtInChips/DMux8Way.hdl | 22 + .../tools/builtInChips/DRegister.class | Bin 0 -> 339 bytes .../tools/builtInChips/DRegister.hdl | 24 + .../tools/builtInChips/FullAdder.class | Bin 0 -> 380 bytes .../tools/builtInChips/FullAdder.hdl | 19 + .../tools/builtInChips/HalfAdder.class | Bin 0 -> 360 bytes .../tools/builtInChips/HalfAdder.hdl | 18 + .../tools/builtInChips/Inc16.class | Bin 0 -> 333 bytes .../tools/builtInChips/Inc16.hdl | 18 + .../tools/builtInChips/Keyboard.class | Bin 0 -> 1709 bytes .../tools/builtInChips/Keyboard.hdl | 23 + .../tools/builtInChips/Mux.class | Bin 0 -> 356 bytes nand2tetris-suite/tools/builtInChips/Mux.hdl | 16 + .../tools/builtInChips/Mux16.hdl | 16 + .../tools/builtInChips/Mux4Way16.class | Bin 0 -> 435 bytes .../tools/builtInChips/Mux4Way16.hdl | 21 + .../tools/builtInChips/Mux8Way16.class | Bin 0 -> 527 bytes .../tools/builtInChips/Mux8Way16.hdl | 24 + .../tools/builtInChips/Nand.class | Bin 0 -> 344 bytes nand2tetris-suite/tools/builtInChips/Nand.hdl | 16 + .../tools/builtInChips/Not.class | Bin 0 -> 331 bytes nand2tetris-suite/tools/builtInChips/Not.hdl | 16 + .../tools/builtInChips/Not16.class | Bin 0 -> 327 bytes .../tools/builtInChips/Not16.hdl | 16 + nand2tetris-suite/tools/builtInChips/Or.class | Bin 0 -> 340 bytes nand2tetris-suite/tools/builtInChips/Or.hdl | 16 + nand2tetris-suite/tools/builtInChips/Or16.hdl | 16 + .../tools/builtInChips/Or8Way.class | Bin 0 -> 340 bytes .../tools/builtInChips/Or8Way.hdl | 16 + nand2tetris-suite/tools/builtInChips/PC.class | Bin 0 -> 1899 bytes nand2tetris-suite/tools/builtInChips/PC.hdl | 22 + .../tools/builtInChips/RAM.class | Bin 0 -> 1928 bytes .../tools/builtInChips/RAM16K.class | Bin 0 -> 390 bytes .../tools/builtInChips/RAM16K.hdl | 24 + .../tools/builtInChips/RAM4K.class | Bin 0 -> 309 bytes .../tools/builtInChips/RAM4K.hdl | 24 + .../tools/builtInChips/RAM512.class | Bin 0 -> 311 bytes .../tools/builtInChips/RAM512.hdl | 24 + .../tools/builtInChips/RAM64.class | Bin 0 -> 308 bytes .../tools/builtInChips/RAM64.hdl | 24 + .../tools/builtInChips/RAM8.class | Bin 0 -> 306 bytes nand2tetris-suite/tools/builtInChips/RAM8.hdl | 24 + .../tools/builtInChips/ROM32K.class | Bin 0 -> 3469 bytes .../tools/builtInChips/ROM32K.hdl | 30 + .../tools/builtInChips/Register.class | Bin 0 -> 423 bytes .../tools/builtInChips/Register.hdl | 19 + .../tools/builtInChips/RegisterWithGUI.class | Bin 0 -> 1769 bytes .../tools/builtInChips/Screen.class | Bin 0 -> 1322 bytes .../tools/builtInChips/Screen.hdl | 35 + .../tools/builtInChips/Xor.class | Bin 0 -> 341 bytes nand2tetris-suite/tools/builtInChips/Xor.hdl | 16 + .../tools/builtInVMCode/Array.class | Bin 0 -> 436 bytes .../tools/builtInVMCode/JackOSClass.class | Bin 0 -> 1782 bytes .../tools/builtInVMCode/Keyboard.class | Bin 0 -> 1362 bytes .../tools/builtInVMCode/Math.class | Bin 0 -> 650 bytes .../tools/builtInVMCode/Memory.class | Bin 0 -> 788 bytes .../tools/builtInVMCode/Output.class | Bin 0 -> 4264 bytes .../tools/builtInVMCode/Screen.class | Bin 0 -> 1921 bytes .../tools/builtInVMCode/String.class | Bin 0 -> 1630 bytes .../tools/builtInVMCode/Sys.class | Bin 0 -> 1885 bytes 403 files changed, 84436 insertions(+) create mode 100644 nand2tetris-suite/projects/00/file.txt create mode 100644 nand2tetris-suite/projects/01/And.cmp create mode 100644 nand2tetris-suite/projects/01/And.hdl create mode 100644 nand2tetris-suite/projects/01/And.tst create mode 100644 nand2tetris-suite/projects/01/And16.cmp create mode 100644 nand2tetris-suite/projects/01/And16.hdl create mode 100644 nand2tetris-suite/projects/01/And16.tst create mode 100644 nand2tetris-suite/projects/01/DMux.cmp create mode 100644 nand2tetris-suite/projects/01/DMux.hdl create mode 100644 nand2tetris-suite/projects/01/DMux.tst create mode 100644 nand2tetris-suite/projects/01/DMux4Way.cmp create mode 100644 nand2tetris-suite/projects/01/DMux4Way.hdl create mode 100644 nand2tetris-suite/projects/01/DMux4Way.tst create mode 100644 nand2tetris-suite/projects/01/DMux8Way.cmp create mode 100644 nand2tetris-suite/projects/01/DMux8Way.hdl create mode 100644 nand2tetris-suite/projects/01/DMux8Way.tst create mode 100644 nand2tetris-suite/projects/01/Mux.cmp create mode 100644 nand2tetris-suite/projects/01/Mux.hdl create mode 100644 nand2tetris-suite/projects/01/Mux.tst create mode 100644 nand2tetris-suite/projects/01/Mux16.cmp create mode 100644 nand2tetris-suite/projects/01/Mux16.hdl create mode 100644 nand2tetris-suite/projects/01/Mux16.tst create mode 100644 nand2tetris-suite/projects/01/Mux4Way16.cmp create mode 100644 nand2tetris-suite/projects/01/Mux4Way16.hdl create mode 100644 nand2tetris-suite/projects/01/Mux4Way16.tst create mode 100644 nand2tetris-suite/projects/01/Mux8Way16.cmp create mode 100644 nand2tetris-suite/projects/01/Mux8Way16.hdl create mode 100644 nand2tetris-suite/projects/01/Mux8Way16.tst create mode 100644 nand2tetris-suite/projects/01/Not.cmp create mode 100644 nand2tetris-suite/projects/01/Not.hdl create mode 100644 nand2tetris-suite/projects/01/Not.tst create mode 100644 nand2tetris-suite/projects/01/Not16.cmp create mode 100644 nand2tetris-suite/projects/01/Not16.hdl create mode 100644 nand2tetris-suite/projects/01/Not16.tst create mode 100644 nand2tetris-suite/projects/01/Or.cmp create mode 100644 nand2tetris-suite/projects/01/Or.hdl create mode 100644 nand2tetris-suite/projects/01/Or.tst create mode 100644 nand2tetris-suite/projects/01/Or16.cmp create mode 100644 nand2tetris-suite/projects/01/Or16.hdl create mode 100644 nand2tetris-suite/projects/01/Or16.tst create mode 100644 nand2tetris-suite/projects/01/Or8Way.cmp create mode 100644 nand2tetris-suite/projects/01/Or8Way.hdl create mode 100644 nand2tetris-suite/projects/01/Or8Way.tst create mode 100644 nand2tetris-suite/projects/01/Xor.cmp create mode 100644 nand2tetris-suite/projects/01/Xor.hdl create mode 100644 nand2tetris-suite/projects/01/Xor.tst create mode 100644 nand2tetris-suite/projects/02/ALU-nostat.cmp create mode 100644 nand2tetris-suite/projects/02/ALU-nostat.tst create mode 100644 nand2tetris-suite/projects/02/ALU.cmp create mode 100644 nand2tetris-suite/projects/02/ALU.hdl create mode 100644 nand2tetris-suite/projects/02/ALU.tst create mode 100644 nand2tetris-suite/projects/02/Add16.cmp create mode 100644 nand2tetris-suite/projects/02/Add16.hdl create mode 100644 nand2tetris-suite/projects/02/Add16.tst create mode 100644 nand2tetris-suite/projects/02/FullAdder.cmp create mode 100644 nand2tetris-suite/projects/02/FullAdder.hdl create mode 100644 nand2tetris-suite/projects/02/FullAdder.tst create mode 100644 nand2tetris-suite/projects/02/HalfAdder.cmp create mode 100644 nand2tetris-suite/projects/02/HalfAdder.hdl create mode 100644 nand2tetris-suite/projects/02/HalfAdder.tst create mode 100644 nand2tetris-suite/projects/02/Inc16.cmp create mode 100644 nand2tetris-suite/projects/02/Inc16.hdl create mode 100644 nand2tetris-suite/projects/02/Inc16.tst create mode 100644 nand2tetris-suite/projects/03/a/Bit.cmp create mode 100644 nand2tetris-suite/projects/03/a/Bit.hdl create mode 100644 nand2tetris-suite/projects/03/a/Bit.tst create mode 100644 nand2tetris-suite/projects/03/a/PC.cmp create mode 100644 nand2tetris-suite/projects/03/a/PC.hdl create mode 100644 nand2tetris-suite/projects/03/a/PC.tst create mode 100644 nand2tetris-suite/projects/03/a/RAM64.cmp create mode 100644 nand2tetris-suite/projects/03/a/RAM64.hdl create mode 100644 nand2tetris-suite/projects/03/a/RAM64.tst create mode 100644 nand2tetris-suite/projects/03/a/RAM8.cmp create mode 100644 nand2tetris-suite/projects/03/a/RAM8.hdl create mode 100644 nand2tetris-suite/projects/03/a/RAM8.tst create mode 100644 nand2tetris-suite/projects/03/a/Register.cmp create mode 100644 nand2tetris-suite/projects/03/a/Register.hdl create mode 100644 nand2tetris-suite/projects/03/a/Register.tst create mode 100644 nand2tetris-suite/projects/03/b/RAM16K.cmp create mode 100644 nand2tetris-suite/projects/03/b/RAM16K.hdl create mode 100644 nand2tetris-suite/projects/03/b/RAM16K.tst create mode 100644 nand2tetris-suite/projects/03/b/RAM4K.cmp create mode 100644 nand2tetris-suite/projects/03/b/RAM4K.hdl create mode 100644 nand2tetris-suite/projects/03/b/RAM4K.tst create mode 100644 nand2tetris-suite/projects/03/b/RAM512.cmp create mode 100644 nand2tetris-suite/projects/03/b/RAM512.hdl create mode 100644 nand2tetris-suite/projects/03/b/RAM512.tst create mode 100644 nand2tetris-suite/projects/04/fill/Fill.asm create mode 100644 nand2tetris-suite/projects/04/fill/Fill.tst create mode 100644 nand2tetris-suite/projects/04/fill/FillAutomatic.cmp create mode 100644 nand2tetris-suite/projects/04/fill/FillAutomatic.tst create mode 100644 nand2tetris-suite/projects/04/mult/Mult.asm create mode 100644 nand2tetris-suite/projects/04/mult/Mult.cmp create mode 100644 nand2tetris-suite/projects/04/mult/Mult.tst create mode 100644 nand2tetris-suite/projects/05/Add.hack create mode 100644 nand2tetris-suite/projects/05/CPU-external.cmp create mode 100644 nand2tetris-suite/projects/05/CPU-external.tst create mode 100644 nand2tetris-suite/projects/05/CPU.cmp create mode 100644 nand2tetris-suite/projects/05/CPU.hdl create mode 100644 nand2tetris-suite/projects/05/CPU.tst create mode 100644 nand2tetris-suite/projects/05/Computer.hdl create mode 100644 nand2tetris-suite/projects/05/ComputerAdd-external.cmp create mode 100644 nand2tetris-suite/projects/05/ComputerAdd-external.tst create mode 100644 nand2tetris-suite/projects/05/ComputerAdd.cmp create mode 100644 nand2tetris-suite/projects/05/ComputerAdd.tst create mode 100644 nand2tetris-suite/projects/05/ComputerMax-external.cmp create mode 100644 nand2tetris-suite/projects/05/ComputerMax-external.tst create mode 100644 nand2tetris-suite/projects/05/ComputerMax.cmp create mode 100644 nand2tetris-suite/projects/05/ComputerMax.tst create mode 100644 nand2tetris-suite/projects/05/ComputerRect-external.cmp create mode 100644 nand2tetris-suite/projects/05/ComputerRect-external.tst create mode 100644 nand2tetris-suite/projects/05/ComputerRect.cmp create mode 100644 nand2tetris-suite/projects/05/ComputerRect.tst create mode 100644 nand2tetris-suite/projects/05/Max.hack create mode 100644 nand2tetris-suite/projects/05/Memory.cmp create mode 100644 nand2tetris-suite/projects/05/Memory.hdl create mode 100644 nand2tetris-suite/projects/05/Memory.tst create mode 100644 nand2tetris-suite/projects/05/Rect.hack create mode 100644 nand2tetris-suite/projects/06/add/Add.asm create mode 100644 nand2tetris-suite/projects/06/max/Max.asm create mode 100644 nand2tetris-suite/projects/06/max/MaxL.asm create mode 100644 nand2tetris-suite/projects/06/pong/Pong.asm create mode 100644 nand2tetris-suite/projects/06/pong/PongL.asm create mode 100644 nand2tetris-suite/projects/06/rect/Rect.asm create mode 100644 nand2tetris-suite/projects/06/rect/RectL.asm create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.cmp create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.tst create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.vm create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.cmp create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.tst create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.vm create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTestVME.tst create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.cmp create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.tst create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.vm create mode 100644 nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTestVME.tst create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.tst create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.cmp create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.tst create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.vm create mode 100644 nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTestVME.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/Main.vm create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/Sys.vm create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.cmp create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.html create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCallStack.html create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCallVME.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/NestedCall/Sys.vm create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Class1.vm create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Class2.vm create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTest.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst create mode 100644 nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Sys.vm create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.vm create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm create mode 100644 nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst create mode 100644 nand2tetris-suite/projects/09/Average/Main.jack create mode 100644 nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.html create mode 100644 nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.iml create mode 100644 nand2tetris-suite/projects/09/Fraction/Fraction.jack create mode 100644 nand2tetris-suite/projects/09/Fraction/Main.jack create mode 100644 nand2tetris-suite/projects/09/HelloWorld/Main.jack create mode 100644 nand2tetris-suite/projects/09/Jack OS API.pdf create mode 100644 nand2tetris-suite/projects/09/List/List.jack create mode 100644 nand2tetris-suite/projects/09/List/Main.jack create mode 100644 nand2tetris-suite/projects/09/Square/Main.jack create mode 100644 nand2tetris-suite/projects/09/Square/Square.jack create mode 100644 nand2tetris-suite/projects/09/Square/SquareGame.jack create mode 100644 nand2tetris-suite/projects/10/ArrayTest/Main.jack create mode 100644 nand2tetris-suite/projects/10/ArrayTest/Main.xml create mode 100644 nand2tetris-suite/projects/10/ArrayTest/MainT.xml create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/Main.jack create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/Main.xml create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/MainT.xml create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/Square.jack create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/Square.xml create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.jack create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.xml create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGameT.xml create mode 100644 nand2tetris-suite/projects/10/ExpressionLessSquare/SquareT.xml create mode 100644 nand2tetris-suite/projects/10/Square/Main.jack create mode 100644 nand2tetris-suite/projects/10/Square/Main.xml create mode 100644 nand2tetris-suite/projects/10/Square/MainT.xml create mode 100644 nand2tetris-suite/projects/10/Square/Square.jack create mode 100644 nand2tetris-suite/projects/10/Square/Square.xml create mode 100644 nand2tetris-suite/projects/10/Square/SquareGame.jack create mode 100644 nand2tetris-suite/projects/10/Square/SquareGame.xml create mode 100644 nand2tetris-suite/projects/10/Square/SquareGameT.xml create mode 100644 nand2tetris-suite/projects/10/Square/SquareT.xml create mode 100644 nand2tetris-suite/projects/11/Average/Main.jack create mode 100644 nand2tetris-suite/projects/11/ComplexArrays/Main.jack create mode 100644 nand2tetris-suite/projects/11/ConvertToBin/Main.jack create mode 100644 nand2tetris-suite/projects/11/Pong/Ball.jack create mode 100644 nand2tetris-suite/projects/11/Pong/Bat.jack create mode 100644 nand2tetris-suite/projects/11/Pong/Main.jack create mode 100644 nand2tetris-suite/projects/11/Pong/PongGame.jack create mode 100644 nand2tetris-suite/projects/11/Seven/Main.jack create mode 100644 nand2tetris-suite/projects/11/Square/Main.jack create mode 100644 nand2tetris-suite/projects/11/Square/Square.jack create mode 100644 nand2tetris-suite/projects/11/Square/SquareGame.jack create mode 100644 nand2tetris-suite/projects/12/Array.jack create mode 100644 nand2tetris-suite/projects/12/ArrayTest/ArrayTest.cmp create mode 100644 nand2tetris-suite/projects/12/ArrayTest/ArrayTest.tst create mode 100644 nand2tetris-suite/projects/12/ArrayTest/Main.jack create mode 100644 nand2tetris-suite/projects/12/Keyboard.jack create mode 100644 nand2tetris-suite/projects/12/KeyboardTest/KeyboardTestOutput.gif create mode 100644 nand2tetris-suite/projects/12/KeyboardTest/Main.jack create mode 100644 nand2tetris-suite/projects/12/Math.jack create mode 100644 nand2tetris-suite/projects/12/MathTest/Main.jack create mode 100644 nand2tetris-suite/projects/12/MathTest/MathTest.cmp create mode 100644 nand2tetris-suite/projects/12/MathTest/MathTest.tst create mode 100644 nand2tetris-suite/projects/12/Memory.jack create mode 100644 nand2tetris-suite/projects/12/MemoryTest/Main.jack create mode 100644 nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/Main.jack create mode 100644 nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp create mode 100644 nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst create mode 100644 nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/README.html create mode 100644 nand2tetris-suite/projects/12/MemoryTest/MemoryTest.cmp create mode 100644 nand2tetris-suite/projects/12/MemoryTest/MemoryTest.tst create mode 100644 nand2tetris-suite/projects/12/MemoryTest/README.txt create mode 100644 nand2tetris-suite/projects/12/Output.jack create mode 100644 nand2tetris-suite/projects/12/OutputTest/Main.jack create mode 100644 nand2tetris-suite/projects/12/OutputTest/OutputTestOutput.gif create mode 100644 nand2tetris-suite/projects/12/Screen.jack create mode 100644 nand2tetris-suite/projects/12/ScreenTest/Main.jack create mode 100644 nand2tetris-suite/projects/12/ScreenTest/ScreenTestOutput.gif create mode 100644 nand2tetris-suite/projects/12/String.jack create mode 100644 nand2tetris-suite/projects/12/StringTest/Main.jack create mode 100644 nand2tetris-suite/projects/12/StringTest/StringTestOutput.gif create mode 100644 nand2tetris-suite/projects/12/Sys.jack create mode 100644 nand2tetris-suite/projects/12/SysTest/Main.jack create mode 100644 nand2tetris-suite/projects/13/more fun to go.txt create mode 100644 nand2tetris-suite/projects/demo/Xor.cmp create mode 100644 nand2tetris-suite/projects/demo/Xor.hdl create mode 100644 nand2tetris-suite/projects/demo/Xor.out create mode 100644 nand2tetris-suite/projects/demo/Xor.tst create mode 100644 nand2tetris-suite/tools/Assembler.bat create mode 100644 nand2tetris-suite/tools/Assembler.sh create mode 100644 nand2tetris-suite/tools/CPUEmulator.bat create mode 100644 nand2tetris-suite/tools/CPUEmulator.sh create mode 100644 nand2tetris-suite/tools/HardwareSimulator.bat create mode 100755 nand2tetris-suite/tools/HardwareSimulator.sh create mode 100644 nand2tetris-suite/tools/JackCompiler.bat create mode 100644 nand2tetris-suite/tools/JackCompiler.sh create mode 100644 nand2tetris-suite/tools/OS/Array.vm create mode 100644 nand2tetris-suite/tools/OS/Keyboard.vm create mode 100644 nand2tetris-suite/tools/OS/Math.vm create mode 100644 nand2tetris-suite/tools/OS/Memory.vm create mode 100644 nand2tetris-suite/tools/OS/Output.vm create mode 100644 nand2tetris-suite/tools/OS/Screen.vm create mode 100644 nand2tetris-suite/tools/OS/String.vm create mode 100644 nand2tetris-suite/tools/OS/Sys.vm create mode 100644 nand2tetris-suite/tools/TextComparer.bat create mode 100644 nand2tetris-suite/tools/TextComparer.sh create mode 100644 nand2tetris-suite/tools/VMEmulator.bat create mode 100644 nand2tetris-suite/tools/VMEmulator.sh create mode 100644 nand2tetris-suite/tools/bin/classes/CPUEmulatorMain.class create mode 100644 nand2tetris-suite/tools/bin/classes/HackAssemblerMain.class create mode 100644 nand2tetris-suite/tools/bin/classes/HardwareSimulatorMain.class create mode 100644 nand2tetris-suite/tools/bin/classes/TextComparer.class create mode 100644 nand2tetris-suite/tools/bin/classes/VMEmulatorMain.class create mode 100644 nand2tetris-suite/tools/bin/help/asmAbout.html create mode 100644 nand2tetris-suite/tools/bin/help/asmUsage.html create mode 100644 nand2tetris-suite/tools/bin/help/compiler.txt create mode 100644 nand2tetris-suite/tools/bin/help/cpuAbout.html create mode 100644 nand2tetris-suite/tools/bin/help/cpuUsage.html create mode 100644 nand2tetris-suite/tools/bin/help/hwAbout.html create mode 100644 nand2tetris-suite/tools/bin/help/hwUsage.html create mode 100644 nand2tetris-suite/tools/bin/help/vmAbout.html create mode 100644 nand2tetris-suite/tools/bin/help/vmUsage.html create mode 100644 nand2tetris-suite/tools/bin/images/arrow2.gif create mode 100644 nand2tetris-suite/tools/bin/images/calculator2.gif create mode 100644 nand2tetris-suite/tools/bin/images/cancel.gif create mode 100644 nand2tetris-suite/tools/bin/images/chip.gif create mode 100644 nand2tetris-suite/tools/bin/images/clock2.gif create mode 100644 nand2tetris-suite/tools/bin/images/equal.gif create mode 100644 nand2tetris-suite/tools/bin/images/find.gif create mode 100644 nand2tetris-suite/tools/bin/images/hex.gif create mode 100644 nand2tetris-suite/tools/bin/images/keyboard.gif create mode 100644 nand2tetris-suite/tools/bin/images/ok.gif create mode 100644 nand2tetris-suite/tools/bin/images/ok2.gif create mode 100644 nand2tetris-suite/tools/bin/images/open.gif create mode 100644 nand2tetris-suite/tools/bin/images/open2.gif create mode 100644 nand2tetris-suite/tools/bin/images/opendoc.gif create mode 100644 nand2tetris-suite/tools/bin/images/redflag.gif create mode 100644 nand2tetris-suite/tools/bin/images/save.gif create mode 100644 nand2tetris-suite/tools/bin/images/scroll.gif create mode 100644 nand2tetris-suite/tools/bin/images/smallcancel.gif create mode 100644 nand2tetris-suite/tools/bin/images/smallequal.gif create mode 100644 nand2tetris-suite/tools/bin/images/smallminus.gif create mode 100644 nand2tetris-suite/tools/bin/images/smallnew.gif create mode 100644 nand2tetris-suite/tools/bin/images/smallok.gif create mode 100644 nand2tetris-suite/tools/bin/images/smallplus.gif create mode 100644 nand2tetris-suite/tools/bin/images/vcrfastforward.gif create mode 100644 nand2tetris-suite/tools/bin/images/vcrforward.gif create mode 100644 nand2tetris-suite/tools/bin/images/vcrrewind.gif create mode 100644 nand2tetris-suite/tools/bin/images/vcrstop.gif create mode 100644 nand2tetris-suite/tools/bin/lib/AssemblerGUI.jar create mode 100644 nand2tetris-suite/tools/bin/lib/Compilers.jar create mode 100644 nand2tetris-suite/tools/bin/lib/Hack.jar create mode 100644 nand2tetris-suite/tools/bin/lib/HackGUI.jar create mode 100644 nand2tetris-suite/tools/bin/lib/Simulators.jar create mode 100644 nand2tetris-suite/tools/bin/lib/SimulatorsGUI.jar create mode 100644 nand2tetris-suite/tools/bin/lib/TranslatorsGUI.jar create mode 100644 nand2tetris-suite/tools/bin/scripts/defaultCPU.txt create mode 100644 nand2tetris-suite/tools/bin/scripts/defaultHW.txt create mode 100644 nand2tetris-suite/tools/bin/scripts/defaultVM.txt create mode 100644 nand2tetris-suite/tools/builtInChips/ALU.class create mode 100644 nand2tetris-suite/tools/builtInChips/ALU.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/ARegister.class create mode 100644 nand2tetris-suite/tools/builtInChips/ARegister.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Add16.class create mode 100644 nand2tetris-suite/tools/builtInChips/Add16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/And.class create mode 100644 nand2tetris-suite/tools/builtInChips/And.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/And16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Bit.class create mode 100644 nand2tetris-suite/tools/builtInChips/Bit.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/DFF.class create mode 100644 nand2tetris-suite/tools/builtInChips/DFF.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/DMux.class create mode 100644 nand2tetris-suite/tools/builtInChips/DMux.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/DMux4Way.class create mode 100644 nand2tetris-suite/tools/builtInChips/DMux4Way.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/DMux8Way.class create mode 100644 nand2tetris-suite/tools/builtInChips/DMux8Way.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/DRegister.class create mode 100644 nand2tetris-suite/tools/builtInChips/DRegister.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/FullAdder.class create mode 100644 nand2tetris-suite/tools/builtInChips/FullAdder.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/HalfAdder.class create mode 100644 nand2tetris-suite/tools/builtInChips/HalfAdder.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Inc16.class create mode 100644 nand2tetris-suite/tools/builtInChips/Inc16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Keyboard.class create mode 100644 nand2tetris-suite/tools/builtInChips/Keyboard.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Mux.class create mode 100644 nand2tetris-suite/tools/builtInChips/Mux.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Mux16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Mux4Way16.class create mode 100644 nand2tetris-suite/tools/builtInChips/Mux4Way16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Mux8Way16.class create mode 100644 nand2tetris-suite/tools/builtInChips/Mux8Way16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Nand.class create mode 100644 nand2tetris-suite/tools/builtInChips/Nand.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Not.class create mode 100644 nand2tetris-suite/tools/builtInChips/Not.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Not16.class create mode 100644 nand2tetris-suite/tools/builtInChips/Not16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Or.class create mode 100644 nand2tetris-suite/tools/builtInChips/Or.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Or16.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Or8Way.class create mode 100644 nand2tetris-suite/tools/builtInChips/Or8Way.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/PC.class create mode 100644 nand2tetris-suite/tools/builtInChips/PC.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/RAM.class create mode 100644 nand2tetris-suite/tools/builtInChips/RAM16K.class create mode 100644 nand2tetris-suite/tools/builtInChips/RAM16K.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/RAM4K.class create mode 100644 nand2tetris-suite/tools/builtInChips/RAM4K.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/RAM512.class create mode 100644 nand2tetris-suite/tools/builtInChips/RAM512.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/RAM64.class create mode 100644 nand2tetris-suite/tools/builtInChips/RAM64.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/RAM8.class create mode 100644 nand2tetris-suite/tools/builtInChips/RAM8.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/ROM32K.class create mode 100644 nand2tetris-suite/tools/builtInChips/ROM32K.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Register.class create mode 100644 nand2tetris-suite/tools/builtInChips/Register.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/RegisterWithGUI.class create mode 100644 nand2tetris-suite/tools/builtInChips/Screen.class create mode 100644 nand2tetris-suite/tools/builtInChips/Screen.hdl create mode 100644 nand2tetris-suite/tools/builtInChips/Xor.class create mode 100644 nand2tetris-suite/tools/builtInChips/Xor.hdl create mode 100644 nand2tetris-suite/tools/builtInVMCode/Array.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/JackOSClass.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/Keyboard.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/Math.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/Memory.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/Output.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/Screen.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/String.class create mode 100644 nand2tetris-suite/tools/builtInVMCode/Sys.class diff --git a/nand2tetris-suite/projects/00/file.txt b/nand2tetris-suite/projects/00/file.txt new file mode 100644 index 0000000..ff654e3 --- /dev/null +++ b/nand2tetris-suite/projects/00/file.txt @@ -0,0 +1,6 @@ +The only purpose of this file is to practice submitting files +in the Nand to Tetris course websites in Coursera. + +There is no need to modify the contents of this file. +All you have to do is submit it as is, following the +Project 0 guidelines in the website. \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/And.cmp b/nand2tetris-suite/projects/01/And.cmp new file mode 100644 index 0000000..75e709a --- /dev/null +++ b/nand2tetris-suite/projects/01/And.cmp @@ -0,0 +1,5 @@ +| a | b | out | +| 0 | 0 | 0 | +| 0 | 1 | 0 | +| 1 | 0 | 0 | +| 1 | 1 | 1 | diff --git a/nand2tetris-suite/projects/01/And.hdl b/nand2tetris-suite/projects/01/And.hdl new file mode 100644 index 0000000..3ffb270 --- /dev/null +++ b/nand2tetris-suite/projects/01/And.hdl @@ -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/01/And.hdl + +/** + * And gate: + * out = 1 if (a == 1 and b == 1) + * 0 otherwise + */ + +CHIP And { + IN a, b; + OUT out; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/01/And.tst b/nand2tetris-suite/projects/01/And.tst new file mode 100644 index 0000000..7ace19d --- /dev/null +++ b/nand2tetris-suite/projects/01/And.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/01/And.tst + +load And.hdl, +output-file And.out, +compare-to And.cmp, +output-list a%B3.1.3 b%B3.1.3 out%B3.1.3; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output; diff --git a/nand2tetris-suite/projects/01/And16.cmp b/nand2tetris-suite/projects/01/And16.cmp new file mode 100644 index 0000000..32c8648 --- /dev/null +++ b/nand2tetris-suite/projects/01/And16.cmp @@ -0,0 +1,7 @@ +| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0000000000000000 | +| 1111111111111111 | 1111111111111111 | 1111111111111111 | +| 1010101010101010 | 0101010101010101 | 0000000000000000 | +| 0011110011000011 | 0000111111110000 | 0000110011000000 | +| 0001001000110100 | 1001100001110110 | 0001000000110100 | diff --git a/nand2tetris-suite/projects/01/And16.hdl b/nand2tetris-suite/projects/01/And16.hdl new file mode 100644 index 0000000..27fe04a --- /dev/null +++ b/nand2tetris-suite/projects/01/And16.hdl @@ -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/01/And16.hdl + +/** + * 16-bit bitwise And: + * for i = 0..15: out[i] = (a[i] and b[i]) + */ + +CHIP And16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/And16.tst b/nand2tetris-suite/projects/01/And16.tst new file mode 100644 index 0000000..c8921e7 --- /dev/null +++ b/nand2tetris-suite/projects/01/And16.tst @@ -0,0 +1,39 @@ +// 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/01/And16.tst + +load And16.hdl, +output-file And16.out, +compare-to And16.cmp, +output-list a%B1.16.1 b%B1.16.1 out%B1.16.1; + +set a %B0000000000000000, +set b %B0000000000000000, +eval, +output; + +set a %B0000000000000000, +set b %B1111111111111111, +eval, +output; + +set a %B1111111111111111, +set b %B1111111111111111, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +eval, +output; + +set a %B0011110011000011, +set b %B0000111111110000, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +eval, +output; \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/DMux.cmp b/nand2tetris-suite/projects/01/DMux.cmp new file mode 100644 index 0000000..6982094 --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux.cmp @@ -0,0 +1,5 @@ +| in | sel | a | b | +| 0 | 0 | 0 | 0 | +| 0 | 1 | 0 | 0 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 | diff --git a/nand2tetris-suite/projects/01/DMux.hdl b/nand2tetris-suite/projects/01/DMux.hdl new file mode 100644 index 0000000..ad66d18 --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux.hdl @@ -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/01/DMux.hdl + +/** + * Demultiplexor: + * {a, b} = {in, 0} if sel == 0 + * {0, in} if sel == 1 + */ + +CHIP DMux { + IN in, sel; + OUT a, b; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/01/DMux.tst b/nand2tetris-suite/projects/01/DMux.tst new file mode 100644 index 0000000..4adbc43 --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux.tst @@ -0,0 +1,27 @@ +// 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/01/DMux.tst + +load DMux.hdl, +output-file DMux.out, +compare-to DMux.cmp, +output-list in%B3.1.3 sel%B3.1.3 a%B3.1.3 b%B3.1.3; + +set in 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set in 1, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; diff --git a/nand2tetris-suite/projects/01/DMux4Way.cmp b/nand2tetris-suite/projects/01/DMux4Way.cmp new file mode 100644 index 0000000..eac35c4 --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux4Way.cmp @@ -0,0 +1,9 @@ +| in | sel | a | b | c | d | +| 0 | 00 | 0 | 0 | 0 | 0 | +| 0 | 01 | 0 | 0 | 0 | 0 | +| 0 | 10 | 0 | 0 | 0 | 0 | +| 0 | 11 | 0 | 0 | 0 | 0 | +| 1 | 00 | 1 | 0 | 0 | 0 | +| 1 | 01 | 0 | 1 | 0 | 0 | +| 1 | 10 | 0 | 0 | 1 | 0 | +| 1 | 11 | 0 | 0 | 0 | 1 | diff --git a/nand2tetris-suite/projects/01/DMux4Way.hdl b/nand2tetris-suite/projects/01/DMux4Way.hdl new file mode 100644 index 0000000..24270c0 --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux4Way.hdl @@ -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/01/DMux4Way.hdl + +/** + * 4-way demultiplexor: + * {a, b, c, d} = {in, 0, 0, 0} if sel == 00 + * {0, in, 0, 0} if sel == 01 + * {0, 0, in, 0} if sel == 10 + * {0, 0, 0, in} if sel == 11 + */ + +CHIP DMux4Way { + IN in, sel[2]; + OUT a, b, c, d; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/DMux4Way.tst b/nand2tetris-suite/projects/01/DMux4Way.tst new file mode 100644 index 0000000..6fbbb56 --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux4Way.tst @@ -0,0 +1,43 @@ +// 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/01/DMux4Way.tst + +load DMux4Way.hdl, +output-file DMux4Way.out, +compare-to DMux4Way.cmp, +output-list in%B2.1.2 sel%B2.2.2 a%B2.1.2 b%B2.1.2 c%B2.1.2 d%B2.1.2; + +set in 0, +set sel %B00, +eval, +output; + +set sel %B01, +eval, +output; + +set sel %B10, +eval, +output; + +set sel %B11, +eval, +output; + +set in 1, +set sel %B00, +eval, +output; + +set sel %B01, +eval, +output; + +set sel %B10, +eval, +output; + +set sel %B11, +eval, +output; diff --git a/nand2tetris-suite/projects/01/DMux8Way.cmp b/nand2tetris-suite/projects/01/DMux8Way.cmp new file mode 100644 index 0000000..375d44a --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux8Way.cmp @@ -0,0 +1,17 @@ +| in | sel | a | b | c | d | e | f | g | h | +| 0 | 000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 010 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 011 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 100 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 101 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 110 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 0 | 111 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 000 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 001 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 010 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | +| 1 | 011 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | +| 1 | 100 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | +| 1 | 101 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | +| 1 | 110 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | +| 1 | 111 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | diff --git a/nand2tetris-suite/projects/01/DMux8Way.hdl b/nand2tetris-suite/projects/01/DMux8Way.hdl new file mode 100644 index 0000000..75714a5 --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux8Way.hdl @@ -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/01/DMux8Way.hdl + +/** + * 8-way demultiplexor: + * {a, b, c, d, e, f, g, h} = {in, 0, 0, 0, 0, 0, 0, 0} if sel == 000 + * {0, in, 0, 0, 0, 0, 0, 0} if sel == 001 + * etc. + * {0, 0, 0, 0, 0, 0, 0, in} if sel == 111 + */ + +CHIP DMux8Way { + IN in, sel[3]; + OUT a, b, c, d, e, f, g, h; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/DMux8Way.tst b/nand2tetris-suite/projects/01/DMux8Way.tst new file mode 100644 index 0000000..56d827e --- /dev/null +++ b/nand2tetris-suite/projects/01/DMux8Way.tst @@ -0,0 +1,75 @@ +// 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/01/DMux8Way.tst + +load DMux8Way.hdl, +output-file DMux8Way.out, +compare-to DMux8Way.cmp, +output-list in%B2.1.2 sel%B2.3.2 a%B2.1.2 b%B2.1.2 c%B2.1.2 d%B2.1.2 e%B2.1.2 f%B2.1.2 g%B2.1.2 h%B2.1.2; + +set in 0, +set sel %B000, +eval, +output; + +set sel %B001, +eval, +output; + +set sel %B010, +eval, +output; + +set sel %B011, +eval, +output; + +set sel %B100, +eval, +output; + +set sel %B101, +eval, +output; + +set sel %B110, +eval, +output; + +set sel %B111, +eval, +output; + +set in 1, +set sel %B000, +eval, +output; + +set sel %B001, +eval, +output; + +set sel %B010, +eval, +output; + +set sel %B011, +eval, +output; + +set sel %B100, +eval, +output; + +set sel %B101, +eval, +output; + +set sel %B110, +eval, +output; + +set sel %B111, +eval, +output; diff --git a/nand2tetris-suite/projects/01/Mux.cmp b/nand2tetris-suite/projects/01/Mux.cmp new file mode 100644 index 0000000..7a5cc5b --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux.cmp @@ -0,0 +1,9 @@ +| a | b | sel | out | +| 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 0 | +| 0 | 1 | 0 | 0 | +| 0 | 1 | 1 | 1 | +| 1 | 0 | 0 | 1 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 | +| 1 | 1 | 1 | 1 | diff --git a/nand2tetris-suite/projects/01/Mux.hdl b/nand2tetris-suite/projects/01/Mux.hdl new file mode 100644 index 0000000..d5fd1d5 --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux.hdl @@ -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/01/Mux.hdl + +/** + * Multiplexor: + * out = a if sel == 0 + * b otherwise + */ + +CHIP Mux { + IN a, b, sel; + OUT out; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Mux.tst b/nand2tetris-suite/projects/01/Mux.tst new file mode 100644 index 0000000..9b7afd9 --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux.tst @@ -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/01/Mux.tst + +load Mux.hdl, +output-file Mux.out, +compare-to Mux.cmp, +output-list a%B3.1.3 b%B3.1.3 sel%B3.1.3 out%B3.1.3; + +set a 0, +set b 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a 0, +set b 1, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a 1, +set b 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a 1, +set b 1, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; diff --git a/nand2tetris-suite/projects/01/Mux16.cmp b/nand2tetris-suite/projects/01/Mux16.cmp new file mode 100644 index 0000000..661ee67 --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux16.cmp @@ -0,0 +1,9 @@ +| a | b | sel | out | +| 0000000000000000 | 0000000000000000 | 0 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 1 | 0000000000000000 | +| 0000000000000000 | 0001001000110100 | 0 | 0000000000000000 | +| 0000000000000000 | 0001001000110100 | 1 | 0001001000110100 | +| 1001100001110110 | 0000000000000000 | 0 | 1001100001110110 | +| 1001100001110110 | 0000000000000000 | 1 | 0000000000000000 | +| 1010101010101010 | 0101010101010101 | 0 | 1010101010101010 | +| 1010101010101010 | 0101010101010101 | 1 | 0101010101010101 | diff --git a/nand2tetris-suite/projects/01/Mux16.hdl b/nand2tetris-suite/projects/01/Mux16.hdl new file mode 100644 index 0000000..97dd784 --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux16.hdl @@ -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/01/Mux16.hdl + +/** + * 16-bit multiplexor: + * for i = 0..15 out[i] = a[i] if sel == 0 + * b[i] if sel == 1 + */ + +CHIP Mux16 { + IN a[16], b[16], sel; + OUT out[16]; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/01/Mux16.tst b/nand2tetris-suite/projects/01/Mux16.tst new file mode 100644 index 0000000..cf34155 --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux16.tst @@ -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/01/Mux16.tst + +load Mux16.hdl, +output-file Mux16.out, +compare-to Mux16.cmp, +output-list a%B1.16.1 b%B1.16.1 sel%D2.1.2 out%B1.16.1; + +set a 0, +set b 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a %B0000000000000000, +set b %B0001001000110100, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a %B1001100001110110, +set b %B0000000000000000, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Mux4Way16.cmp b/nand2tetris-suite/projects/01/Mux4Way16.cmp new file mode 100644 index 0000000..8704e79 --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux4Way16.cmp @@ -0,0 +1,9 @@ +| a | b | c | d | sel | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 00 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 01 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 10 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 11 | 0000000000000000 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 00 | 0001001000110100 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 01 | 1001100001110110 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 10 | 1010101010101010 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | 0101010101010101 | 11 | 0101010101010101 | diff --git a/nand2tetris-suite/projects/01/Mux4Way16.hdl b/nand2tetris-suite/projects/01/Mux4Way16.hdl new file mode 100644 index 0000000..75baced --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux4Way16.hdl @@ -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/01/Mux4Way16.hdl + +/** + * 4-way 16-bit multiplexor: + * out = a if sel == 00 + * b if sel == 01 + * c if sel == 10 + * d if sel == 11 + */ + +CHIP Mux4Way16 { + IN a[16], b[16], c[16], d[16], sel[2]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Mux4Way16.tst b/nand2tetris-suite/projects/01/Mux4Way16.tst new file mode 100644 index 0000000..3f4efa3 --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux4Way16.tst @@ -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/01/Mux4Way16.tst + +load Mux4Way16.hdl, +output-file Mux4Way16.out, +compare-to Mux4Way16.cmp, +output-list a%B1.16.1 b%B1.16.1 c%B1.16.1 d%B1.16.1 sel%B2.2.2 out%B1.16.1; + +set a 0, +set b 0, +set c 0, +set d 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +set c %B1010101010101010, +set d %B0101010101010101, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output; diff --git a/nand2tetris-suite/projects/01/Mux8Way16.cmp b/nand2tetris-suite/projects/01/Mux8Way16.cmp new file mode 100644 index 0000000..1484e0a --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux8Way16.cmp @@ -0,0 +1,17 @@ +| a | b | c | d | e | f | g | h | sel | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 000 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 001 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 010 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 011 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 100 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 101 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 110 | 0000000000000000 | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 0000000000000000 | 111 | 0000000000000000 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 000 | 0001001000110100 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 001 | 0010001101000101 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 010 | 0011010001010110 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 011 | 0100010101100111 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 100 | 0101011001111000 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 101 | 0110011110001001 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 110 | 0111100010011010 | +| 0001001000110100 | 0010001101000101 | 0011010001010110 | 0100010101100111 | 0101011001111000 | 0110011110001001 | 0111100010011010 | 1000100110101011 | 111 | 1000100110101011 | diff --git a/nand2tetris-suite/projects/01/Mux8Way16.hdl b/nand2tetris-suite/projects/01/Mux8Way16.hdl new file mode 100644 index 0000000..88c791e --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux8Way16.hdl @@ -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/01/Mux8Way16.hdl + +/** + * 8-way 16-bit multiplexor: + * out = a if sel == 000 + * b if sel == 001 + * etc. + * h if sel == 111 + */ + +CHIP Mux8Way16 { + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Mux8Way16.tst b/nand2tetris-suite/projects/01/Mux8Way16.tst new file mode 100644 index 0000000..59bb41c --- /dev/null +++ b/nand2tetris-suite/projects/01/Mux8Way16.tst @@ -0,0 +1,89 @@ +// 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/01/Mux8Way16.tst + +load Mux8Way16.hdl, +output-file Mux8Way16.out, +compare-to Mux8Way16.cmp, +output-list a%B1.16.1 b%B1.16.1 c%B1.16.1 d%B1.16.1 e%B1.16.1 f%B1.16.1 g%B1.16.1 h%B1.16.1 sel%B2.3.2 out%B1.16.1; + +set a 0, +set b 0, +set c 0, +set d 0, +set e 0, +set f 0, +set g 0, +set h 0, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output; + +set sel 4, +eval, +output; + +set sel 5, +eval, +output; + +set sel 6, +eval, +output; + +set sel 7, +eval, +output; + +set a %B0001001000110100, +set b %B0010001101000101, +set c %B0011010001010110, +set d %B0100010101100111, +set e %B0101011001111000, +set f %B0110011110001001, +set g %B0111100010011010, +set h %B1000100110101011, +set sel 0, +eval, +output; + +set sel 1, +eval, +output; + +set sel 2, +eval, +output; + +set sel 3, +eval, +output; + +set sel 4, +eval, +output; + +set sel 5, +eval, +output; + +set sel 6, +eval, +output; + +set sel 7, +eval, +output; diff --git a/nand2tetris-suite/projects/01/Not.cmp b/nand2tetris-suite/projects/01/Not.cmp new file mode 100644 index 0000000..e8c1191 --- /dev/null +++ b/nand2tetris-suite/projects/01/Not.cmp @@ -0,0 +1,3 @@ +| in | out | +| 0 | 1 | +| 1 | 0 | diff --git a/nand2tetris-suite/projects/01/Not.hdl b/nand2tetris-suite/projects/01/Not.hdl new file mode 100644 index 0000000..6f1135f --- /dev/null +++ b/nand2tetris-suite/projects/01/Not.hdl @@ -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/01/Not.hdl + +/** + * Not gate: + * out = not in + */ + +CHIP Not { + IN in; + OUT out; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Not.tst b/nand2tetris-suite/projects/01/Not.tst new file mode 100644 index 0000000..1e3bbe7 --- /dev/null +++ b/nand2tetris-suite/projects/01/Not.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/01/Not.tst + +load Not.hdl, +output-file Not.out, +compare-to Not.cmp, +output-list in%B3.1.3 out%B3.1.3; + +set in 0, +eval, +output; + +set in 1, +eval, +output; diff --git a/nand2tetris-suite/projects/01/Not16.cmp b/nand2tetris-suite/projects/01/Not16.cmp new file mode 100644 index 0000000..68a5512 --- /dev/null +++ b/nand2tetris-suite/projects/01/Not16.cmp @@ -0,0 +1,6 @@ +| in | out | +| 0000000000000000 | 1111111111111111 | +| 1111111111111111 | 0000000000000000 | +| 1010101010101010 | 0101010101010101 | +| 0011110011000011 | 1100001100111100 | +| 0001001000110100 | 1110110111001011 | diff --git a/nand2tetris-suite/projects/01/Not16.hdl b/nand2tetris-suite/projects/01/Not16.hdl new file mode 100644 index 0000000..3d25bbe --- /dev/null +++ b/nand2tetris-suite/projects/01/Not16.hdl @@ -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/01/Not16.hdl + +/** + * 16-bit Not: + * for i=0..15: out[i] = not in[i] + */ + +CHIP Not16 { + IN in[16]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Not16.tst b/nand2tetris-suite/projects/01/Not16.tst new file mode 100644 index 0000000..e7e2c3b --- /dev/null +++ b/nand2tetris-suite/projects/01/Not16.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/01/Not16.tst + +load Not16.hdl, +output-file Not16.out, +compare-to Not16.cmp, +output-list in%B1.16.1 out%B1.16.1; + +set in %B0000000000000000, +eval, +output; + +set in %B1111111111111111, +eval, +output; + +set in %B1010101010101010, +eval, +output; + +set in %B0011110011000011, +eval, +output; + +set in %B0001001000110100, +eval, +output; \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Or.cmp b/nand2tetris-suite/projects/01/Or.cmp new file mode 100644 index 0000000..dab924c --- /dev/null +++ b/nand2tetris-suite/projects/01/Or.cmp @@ -0,0 +1,5 @@ +| a | b | out | +| 0 | 0 | 0 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 1 | diff --git a/nand2tetris-suite/projects/01/Or.hdl b/nand2tetris-suite/projects/01/Or.hdl new file mode 100644 index 0000000..a3800a6 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or.hdl @@ -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/01/Or.hdl + + /** + * Or gate: + * out = 1 if (a == 1 or b == 1) + * 0 otherwise + */ + +CHIP Or { + IN a, b; + OUT out; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/01/Or.tst b/nand2tetris-suite/projects/01/Or.tst new file mode 100644 index 0000000..948b6b3 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or.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/01/Or.tst + +load Or.hdl, +output-file Or.out, +compare-to Or.cmp, +output-list a%B3.1.3 b%B3.1.3 out%B3.1.3; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output; diff --git a/nand2tetris-suite/projects/01/Or16.cmp b/nand2tetris-suite/projects/01/Or16.cmp new file mode 100644 index 0000000..e2c3a30 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or16.cmp @@ -0,0 +1,7 @@ +| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1111111111111111 | +| 1111111111111111 | 1111111111111111 | 1111111111111111 | +| 1010101010101010 | 0101010101010101 | 1111111111111111 | +| 0011110011000011 | 0000111111110000 | 0011111111110011 | +| 0001001000110100 | 1001100001110110 | 1001101001110110 | diff --git a/nand2tetris-suite/projects/01/Or16.hdl b/nand2tetris-suite/projects/01/Or16.hdl new file mode 100644 index 0000000..0238f05 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or16.hdl @@ -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/01/Or16.hdl + +/** + * 16-bit bitwise Or: + * for i = 0..15 out[i] = (a[i] or b[i]) + */ + +CHIP Or16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Or16.tst b/nand2tetris-suite/projects/01/Or16.tst new file mode 100644 index 0000000..ea7b944 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or16.tst @@ -0,0 +1,39 @@ +// 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/01/Or16.tst + +load Or16.hdl, +output-file Or16.out, +compare-to Or16.cmp, +output-list a%B1.16.1 b%B1.16.1 out%B1.16.1; + +set a %B0000000000000000, +set b %B0000000000000000, +eval, +output; + +set a %B0000000000000000, +set b %B1111111111111111, +eval, +output; + +set a %B1111111111111111, +set b %B1111111111111111, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +eval, +output; + +set a %B0011110011000011, +set b %B0000111111110000, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +eval, +output; \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Or8Way.cmp b/nand2tetris-suite/projects/01/Or8Way.cmp new file mode 100644 index 0000000..3f9fd54 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or8Way.cmp @@ -0,0 +1,6 @@ +| in | out | +| 00000000 | 0 | +| 11111111 | 1 | +| 00010000 | 1 | +| 00000001 | 1 | +| 00100110 | 1 | diff --git a/nand2tetris-suite/projects/01/Or8Way.hdl b/nand2tetris-suite/projects/01/Or8Way.hdl new file mode 100644 index 0000000..24c78c4 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or8Way.hdl @@ -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/01/Or8Way.hdl + +/** + * 8-way Or: + * out = (in[0] or in[1] or ... or in[7]) + */ + +CHIP Or8Way { + IN in[8]; + OUT out; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Or8Way.tst b/nand2tetris-suite/projects/01/Or8Way.tst new file mode 100644 index 0000000..e6fbba7 --- /dev/null +++ b/nand2tetris-suite/projects/01/Or8Way.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/01/Or8Way.tst + +load Or8Way.hdl, +output-file Or8Way.out, +compare-to Or8Way.cmp, +output-list in%B2.8.2 out%B2.1.2; + +set in %B00000000, +eval, +output; + +set in %B11111111, +eval, +output; + +set in %B00010000, +eval, +output; + +set in %B00000001, +eval, +output; + +set in %B00100110, +eval, +output; \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Xor.cmp b/nand2tetris-suite/projects/01/Xor.cmp new file mode 100644 index 0000000..a1e07b2 --- /dev/null +++ b/nand2tetris-suite/projects/01/Xor.cmp @@ -0,0 +1,5 @@ +| a | b | out | +| 0 | 0 | 0 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 0 | diff --git a/nand2tetris-suite/projects/01/Xor.hdl b/nand2tetris-suite/projects/01/Xor.hdl new file mode 100644 index 0000000..14755bd --- /dev/null +++ b/nand2tetris-suite/projects/01/Xor.hdl @@ -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/01/Xor.hdl + +/** + * Exclusive-or gate: + * out = not (a == b) + */ + +CHIP Xor { + IN a, b; + OUT out; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/01/Xor.tst b/nand2tetris-suite/projects/01/Xor.tst new file mode 100644 index 0000000..658cbe5 --- /dev/null +++ b/nand2tetris-suite/projects/01/Xor.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/01/Xor.tst + +load Xor.hdl, +output-file Xor.out, +compare-to Xor.cmp, +output-list a%B3.1.3 b%B3.1.3 out%B3.1.3; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output; diff --git a/nand2tetris-suite/projects/02/ALU-nostat.cmp b/nand2tetris-suite/projects/02/ALU-nostat.cmp new file mode 100644 index 0000000..976ab78 --- /dev/null +++ b/nand2tetris-suite/projects/02/ALU-nostat.cmp @@ -0,0 +1,37 @@ +| x | y |zx |nx |zy |ny | f |no | out | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 0 | 0101101110100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 0 | 0001111011010010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 1 | 1010010001011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 1 | 1110000100101101 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 1 | 1010010001100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 1 | 1110000100101110 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 1 | 1 | 1 | 1 | 0101101110100001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 1 | 1 | 1 | 0001111011010011 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 0 | 0101101110011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 0 | 0001111011010001 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 1 | 0 | 0111101001110010 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 0 | 1 | 1 | 0011110011001110 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 1 | 1 | 1 | 1100001100110010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 0 | 0 | 0001101010000000 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 1 | 0 | 1 | 0101111111110010 | diff --git a/nand2tetris-suite/projects/02/ALU-nostat.tst b/nand2tetris-suite/projects/02/ALU-nostat.tst new file mode 100644 index 0000000..fa3e448 --- /dev/null +++ b/nand2tetris-suite/projects/02/ALU-nostat.tst @@ -0,0 +1,353 @@ +// This file is part of the materials accompanying the book +// "The Elements of Computing Systems" by Nisan and Schocken, +// MIT Press. Book site: www.idc.ac.il/tecs +// File name: projects/02/ALU-nostat.tst + +// ALU-nostat.tst provides a partial test of the ALU chip. +// It IS NOT a replacement for ALU.tst. + +// ALU-nostat.tst tests only the computation part of the ALU. +// The 'zr' and 'ng' status outputs are ignored. + +// This test lets you concentrate on getting the ALU computation right without the +// additional task of handling the status outputs. + +// Once your ALU passes ALU-nostat.tst you need to test it with ALU.tst. +// This way, any comparison failures during ALU.tst will be caused by errors in +// the handling of the 'zr' and 'ng' status outputs. + +load ALU.hdl, +output-file ALU-nostat.out, +compare-to ALU-nostat.cmp, +output-list x%B1.16.1 y%B1.16.1 zx%B1.1.1 nx%B1.1.1 zy%B1.1.1 + ny%B1.1.1 f%B1.1.1 no%B1.1.1 out%B1.16.1; + +set x %B0000000000000000, +set y %B1111111111111111, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set x %B101101110100000, +set y %B001111011010010, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; diff --git a/nand2tetris-suite/projects/02/ALU.cmp b/nand2tetris-suite/projects/02/ALU.cmp new file mode 100644 index 0000000..2ec3a55 --- /dev/null +++ b/nand2tetris-suite/projects/02/ALU.cmp @@ -0,0 +1,37 @@ +| x | y |zx |nx |zy |ny | f |no | out |zr |ng | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000010010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 0 | 0000000000010000 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 0 | 0000000000000010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 1 | 0 | 0000000000010100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000001110 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111110010 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 1 | 0 | 1 | 0000000000010011 | 0 | 0 | diff --git a/nand2tetris-suite/projects/02/ALU.hdl b/nand2tetris-suite/projects/02/ALU.hdl new file mode 100644 index 0000000..9a753e3 --- /dev/null +++ b/nand2tetris-suite/projects/02/ALU.hdl @@ -0,0 +1,46 @@ +// 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/02/ALU.hdl + +/** + * The ALU (Arithmetic Logic Unit). + * Computes one of the following functions: + * x+y, x-y, y-x, 0, 1, -1, x, y, -x, -y, !x, !y, + * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs, + * according to 6 input bits denoted zx,nx,zy,ny,f,no. + * In addition, the ALU computes two 1-bit outputs: + * if the ALU output == 0, zr is set to 1; otherwise zr is set to 0; + * if the ALU output < 0, ng is set to 1; otherwise ng is set to 0. + */ + +// Implementation: the ALU logic manipulates the x and y inputs +// and operates on the resulting values, as follows: +// if (zx == 1) set x = 0 // 16-bit constant +// if (nx == 1) set x = !x // bitwise not +// if (zy == 1) set y = 0 // 16-bit constant +// if (ny == 1) set y = !y // bitwise not +// if (f == 1) set out = x + y // integer 2's complement addition +// if (f == 0) set out = x & y // bitwise and +// if (no == 1) set out = !out // bitwise not +// if (out == 0) set zr = 1 +// if (out < 0) set ng = 1 + +CHIP ALU { + IN + x[16], y[16], // 16-bit inputs + zx, // zero the x input? + nx, // negate the x input? + zy, // zero the y input? + ny, // negate the y input? + f, // compute out = x + y (if 1) or x & y (if 0) + no; // negate the out output? + + OUT + out[16], // 16-bit output + zr, // 1 if (out == 0), 0 otherwise + ng; // 1 if (out < 0), 0 otherwise + + PARTS: + // Put you code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/02/ALU.tst b/nand2tetris-suite/projects/02/ALU.tst new file mode 100644 index 0000000..9e665b0 --- /dev/null +++ b/nand2tetris-suite/projects/02/ALU.tst @@ -0,0 +1,377 @@ +// 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/02/ALU.tst + +load ALU.hdl, +output-file ALU.out, +compare-to ALU.cmp, +output-list x%B1.16.1 y%B1.16.1 zx%B1.1.1 nx%B1.1.1 zy%B1.1.1 + ny%B1.1.1 f%B1.1.1 no%B1.1.1 out%B1.16.1 zr%B1.1.1 + ng%B1.1.1; + +set x %B0000000000000000, // x = 0 +set y %B1111111111111111; // y = -1 + +// Compute 0 +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute 1 +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -1 +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +// Compute y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute !x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +// Compute !y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +// Compute -x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute x + 1 +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute y + 1 +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x - 1 +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +// Compute y - 1 +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x + y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x - y +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute y - x +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x & y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute x | y +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set x %B000000000010001, // x = 17 +set y %B000000000000011; // y = 3 + +// Compute 0 +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute 1 +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -1 +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +// Compute y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute !x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +// Compute !y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +// Compute -x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute x + 1 +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute y + 1 +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x - 1 +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +// Compute y - 1 +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x + y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x - y +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute y - x +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x & y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute x | y +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; diff --git a/nand2tetris-suite/projects/02/Add16.cmp b/nand2tetris-suite/projects/02/Add16.cmp new file mode 100644 index 0000000..76d069c --- /dev/null +++ b/nand2tetris-suite/projects/02/Add16.cmp @@ -0,0 +1,7 @@ +| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1111111111111111 | +| 1111111111111111 | 1111111111111111 | 1111111111111110 | +| 1010101010101010 | 0101010101010101 | 1111111111111111 | +| 0011110011000011 | 0000111111110000 | 0100110010110011 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | diff --git a/nand2tetris-suite/projects/02/Add16.hdl b/nand2tetris-suite/projects/02/Add16.hdl new file mode 100644 index 0000000..aa7604d --- /dev/null +++ b/nand2tetris-suite/projects/02/Add16.hdl @@ -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/02/Adder16.hdl + +/** + * Adds two 16-bit values. + * The most significant carry bit is ignored. + */ + +CHIP Add16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + // Put you code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/02/Add16.tst b/nand2tetris-suite/projects/02/Add16.tst new file mode 100644 index 0000000..85e1be1 --- /dev/null +++ b/nand2tetris-suite/projects/02/Add16.tst @@ -0,0 +1,39 @@ +// 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/02/Add16.tst + +load Add16.hdl, +output-file Add16.out, +compare-to Add16.cmp, +output-list a%B1.16.1 b%B1.16.1 out%B1.16.1; + +set a %B0000000000000000, +set b %B0000000000000000, +eval, +output; + +set a %B0000000000000000, +set b %B1111111111111111, +eval, +output; + +set a %B1111111111111111, +set b %B1111111111111111, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +eval, +output; + +set a %B0011110011000011, +set b %B0000111111110000, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +eval, +output; diff --git a/nand2tetris-suite/projects/02/FullAdder.cmp b/nand2tetris-suite/projects/02/FullAdder.cmp new file mode 100644 index 0000000..84551aa --- /dev/null +++ b/nand2tetris-suite/projects/02/FullAdder.cmp @@ -0,0 +1,9 @@ +| a | b | c | sum | carry | +| 0 | 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 1 | 0 | +| 0 | 1 | 0 | 1 | 0 | +| 0 | 1 | 1 | 0 | 1 | +| 1 | 0 | 0 | 1 | 0 | +| 1 | 0 | 1 | 0 | 1 | +| 1 | 1 | 0 | 0 | 1 | +| 1 | 1 | 1 | 1 | 1 | diff --git a/nand2tetris-suite/projects/02/FullAdder.hdl b/nand2tetris-suite/projects/02/FullAdder.hdl new file mode 100644 index 0000000..67559c3 --- /dev/null +++ b/nand2tetris-suite/projects/02/FullAdder.hdl @@ -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/02/FullAdder.hdl + +/** + * Computes the sum of three bits. + */ + +CHIP FullAdder { + IN a, b, c; // 1-bit inputs + OUT sum, // Right bit of a + b + c + carry; // Left bit of a + b + c + + PARTS: + // Put you code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/02/FullAdder.tst b/nand2tetris-suite/projects/02/FullAdder.tst new file mode 100644 index 0000000..5125cee --- /dev/null +++ b/nand2tetris-suite/projects/02/FullAdder.tst @@ -0,0 +1,47 @@ +// 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/02/FullAdder.tst + +load FullAdder.hdl, +output-file FullAdder.out, +compare-to FullAdder.cmp, +output-list a%B3.1.3 b%B3.1.3 c%B3.1.3 sum%B3.1.3 carry%B3.1.3; + +set a 0, +set b 0, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set b 1, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set a 1, +set b 0, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set b 1, +set c 0, +eval, +output; + +set c 1, +eval, +output; diff --git a/nand2tetris-suite/projects/02/HalfAdder.cmp b/nand2tetris-suite/projects/02/HalfAdder.cmp new file mode 100644 index 0000000..911c770 --- /dev/null +++ b/nand2tetris-suite/projects/02/HalfAdder.cmp @@ -0,0 +1,5 @@ +| a | b | sum | carry | +| 0 | 0 | 0 | 0 | +| 0 | 1 | 1 | 0 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 | diff --git a/nand2tetris-suite/projects/02/HalfAdder.hdl b/nand2tetris-suite/projects/02/HalfAdder.hdl new file mode 100644 index 0000000..98b281f --- /dev/null +++ b/nand2tetris-suite/projects/02/HalfAdder.hdl @@ -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/02/HalfAdder.hdl + +/** + * Computes the sum of two bits. + */ + +CHIP HalfAdder { + IN a, b; // 1-bit inputs + OUT sum, // Right bit of a + b + carry; // Left bit of a + b + + PARTS: + // Put you code here: +} diff --git a/nand2tetris-suite/projects/02/HalfAdder.tst b/nand2tetris-suite/projects/02/HalfAdder.tst new file mode 100644 index 0000000..069b8ea --- /dev/null +++ b/nand2tetris-suite/projects/02/HalfAdder.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/02/HalfAdder.tst + +load HalfAdder.hdl, +output-file HalfAdder.out, +compare-to HalfAdder.cmp, +output-list a%B3.1.3 b%B3.1.3 sum%B3.1.3 carry%B3.1.3; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output; diff --git a/nand2tetris-suite/projects/02/Inc16.cmp b/nand2tetris-suite/projects/02/Inc16.cmp new file mode 100644 index 0000000..451f563 --- /dev/null +++ b/nand2tetris-suite/projects/02/Inc16.cmp @@ -0,0 +1,5 @@ +| in | out | +| 0000000000000000 | 0000000000000001 | +| 1111111111111111 | 0000000000000000 | +| 0000000000000101 | 0000000000000110 | +| 1111111111111011 | 1111111111111100 | diff --git a/nand2tetris-suite/projects/02/Inc16.hdl b/nand2tetris-suite/projects/02/Inc16.hdl new file mode 100644 index 0000000..fb6c0dd --- /dev/null +++ b/nand2tetris-suite/projects/02/Inc16.hdl @@ -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/02/Inc16.hdl + +/** + * 16-bit incrementer: + * out = in + 1 (arithmetic addition) + */ + +CHIP Inc16 { + IN in[16]; + OUT out[16]; + + PARTS: + // Put you code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/02/Inc16.tst b/nand2tetris-suite/projects/02/Inc16.tst new file mode 100644 index 0000000..8537d86 --- /dev/null +++ b/nand2tetris-suite/projects/02/Inc16.tst @@ -0,0 +1,25 @@ +// 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/02/Inc16.tst + +load Inc16.hdl, +output-file Inc16.out, +compare-to Inc16.cmp, +output-list in%B1.16.1 out%B1.16.1; + +set in %B0000000000000000, // in = 0 +eval, +output; + +set in %B1111111111111111, // in = -1 +eval, +output; + +set in %B0000000000000101, // in = 5 +eval, +output; + +set in %B1111111111111011, // in = -5 +eval, +output; diff --git a/nand2tetris-suite/projects/03/a/Bit.cmp b/nand2tetris-suite/projects/03/a/Bit.cmp new file mode 100644 index 0000000..e900ec7 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/Bit.cmp @@ -0,0 +1,215 @@ +| time | in |load | out | +| 0+ | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | +| 2 | 0 | 1 | 0 | +| 2+ | 1 | 0 | 0 | +| 3 | 1 | 0 | 0 | +| 3+ | 1 | 1 | 0 | +| 4 | 1 | 1 | 1 | +| 4+ | 0 | 0 | 1 | +| 5 | 0 | 0 | 1 | +| 5+ | 1 | 0 | 1 | +| 6 | 1 | 0 | 1 | +| 6+ | 0 | 1 | 1 | +| 7 | 0 | 1 | 0 | +| 7+ | 1 | 1 | 0 | +| 8 | 1 | 1 | 1 | +| 8+ | 0 | 0 | 1 | +| 9 | 0 | 0 | 1 | +| 9+ | 0 | 0 | 1 | +| 10 | 0 | 0 | 1 | +| 10+ | 0 | 0 | 1 | +| 11 | 0 | 0 | 1 | +| 11+ | 0 | 0 | 1 | +| 12 | 0 | 0 | 1 | +| 12+ | 0 | 0 | 1 | +| 13 | 0 | 0 | 1 | +| 13+ | 0 | 0 | 1 | +| 14 | 0 | 0 | 1 | +| 14+ | 0 | 0 | 1 | +| 15 | 0 | 0 | 1 | +| 15+ | 0 | 0 | 1 | +| 16 | 0 | 0 | 1 | +| 16+ | 0 | 0 | 1 | +| 17 | 0 | 0 | 1 | +| 17+ | 0 | 0 | 1 | +| 18 | 0 | 0 | 1 | +| 18+ | 0 | 0 | 1 | +| 19 | 0 | 0 | 1 | +| 19+ | 0 | 0 | 1 | +| 20 | 0 | 0 | 1 | +| 20+ | 0 | 0 | 1 | +| 21 | 0 | 0 | 1 | +| 21+ | 0 | 0 | 1 | +| 22 | 0 | 0 | 1 | +| 22+ | 0 | 0 | 1 | +| 23 | 0 | 0 | 1 | +| 23+ | 0 | 0 | 1 | +| 24 | 0 | 0 | 1 | +| 24+ | 0 | 0 | 1 | +| 25 | 0 | 0 | 1 | +| 25+ | 0 | 0 | 1 | +| 26 | 0 | 0 | 1 | +| 26+ | 0 | 0 | 1 | +| 27 | 0 | 0 | 1 | +| 27+ | 0 | 0 | 1 | +| 28 | 0 | 0 | 1 | +| 28+ | 0 | 0 | 1 | +| 29 | 0 | 0 | 1 | +| 29+ | 0 | 0 | 1 | +| 30 | 0 | 0 | 1 | +| 30+ | 0 | 0 | 1 | +| 31 | 0 | 0 | 1 | +| 31+ | 0 | 0 | 1 | +| 32 | 0 | 0 | 1 | +| 32+ | 0 | 0 | 1 | +| 33 | 0 | 0 | 1 | +| 33+ | 0 | 0 | 1 | +| 34 | 0 | 0 | 1 | +| 34+ | 0 | 0 | 1 | +| 35 | 0 | 0 | 1 | +| 35+ | 0 | 0 | 1 | +| 36 | 0 | 0 | 1 | +| 36+ | 0 | 0 | 1 | +| 37 | 0 | 0 | 1 | +| 37+ | 0 | 0 | 1 | +| 38 | 0 | 0 | 1 | +| 38+ | 0 | 0 | 1 | +| 39 | 0 | 0 | 1 | +| 39+ | 0 | 0 | 1 | +| 40 | 0 | 0 | 1 | +| 40+ | 0 | 0 | 1 | +| 41 | 0 | 0 | 1 | +| 41+ | 0 | 0 | 1 | +| 42 | 0 | 0 | 1 | +| 42+ | 0 | 0 | 1 | +| 43 | 0 | 0 | 1 | +| 43+ | 0 | 0 | 1 | +| 44 | 0 | 0 | 1 | +| 44+ | 0 | 0 | 1 | +| 45 | 0 | 0 | 1 | +| 45+ | 0 | 0 | 1 | +| 46 | 0 | 0 | 1 | +| 46+ | 0 | 0 | 1 | +| 47 | 0 | 0 | 1 | +| 47+ | 0 | 0 | 1 | +| 48 | 0 | 0 | 1 | +| 48+ | 0 | 0 | 1 | +| 49 | 0 | 0 | 1 | +| 49+ | 0 | 0 | 1 | +| 50 | 0 | 0 | 1 | +| 50+ | 0 | 0 | 1 | +| 51 | 0 | 0 | 1 | +| 51+ | 0 | 0 | 1 | +| 52 | 0 | 0 | 1 | +| 52+ | 0 | 0 | 1 | +| 53 | 0 | 0 | 1 | +| 53+ | 0 | 0 | 1 | +| 54 | 0 | 0 | 1 | +| 54+ | 0 | 0 | 1 | +| 55 | 0 | 0 | 1 | +| 55+ | 0 | 0 | 1 | +| 56 | 0 | 0 | 1 | +| 56+ | 0 | 0 | 1 | +| 57 | 0 | 0 | 1 | +| 57+ | 0 | 1 | 1 | +| 58 | 0 | 1 | 0 | +| 58+ | 1 | 0 | 0 | +| 59 | 1 | 0 | 0 | +| 59+ | 1 | 0 | 0 | +| 60 | 1 | 0 | 0 | +| 60+ | 1 | 0 | 0 | +| 61 | 1 | 0 | 0 | +| 61+ | 1 | 0 | 0 | +| 62 | 1 | 0 | 0 | +| 62+ | 1 | 0 | 0 | +| 63 | 1 | 0 | 0 | +| 63+ | 1 | 0 | 0 | +| 64 | 1 | 0 | 0 | +| 64+ | 1 | 0 | 0 | +| 65 | 1 | 0 | 0 | +| 65+ | 1 | 0 | 0 | +| 66 | 1 | 0 | 0 | +| 66+ | 1 | 0 | 0 | +| 67 | 1 | 0 | 0 | +| 67+ | 1 | 0 | 0 | +| 68 | 1 | 0 | 0 | +| 68+ | 1 | 0 | 0 | +| 69 | 1 | 0 | 0 | +| 69+ | 1 | 0 | 0 | +| 70 | 1 | 0 | 0 | +| 70+ | 1 | 0 | 0 | +| 71 | 1 | 0 | 0 | +| 71+ | 1 | 0 | 0 | +| 72 | 1 | 0 | 0 | +| 72+ | 1 | 0 | 0 | +| 73 | 1 | 0 | 0 | +| 73+ | 1 | 0 | 0 | +| 74 | 1 | 0 | 0 | +| 74+ | 1 | 0 | 0 | +| 75 | 1 | 0 | 0 | +| 75+ | 1 | 0 | 0 | +| 76 | 1 | 0 | 0 | +| 76+ | 1 | 0 | 0 | +| 77 | 1 | 0 | 0 | +| 77+ | 1 | 0 | 0 | +| 78 | 1 | 0 | 0 | +| 78+ | 1 | 0 | 0 | +| 79 | 1 | 0 | 0 | +| 79+ | 1 | 0 | 0 | +| 80 | 1 | 0 | 0 | +| 80+ | 1 | 0 | 0 | +| 81 | 1 | 0 | 0 | +| 81+ | 1 | 0 | 0 | +| 82 | 1 | 0 | 0 | +| 82+ | 1 | 0 | 0 | +| 83 | 1 | 0 | 0 | +| 83+ | 1 | 0 | 0 | +| 84 | 1 | 0 | 0 | +| 84+ | 1 | 0 | 0 | +| 85 | 1 | 0 | 0 | +| 85+ | 1 | 0 | 0 | +| 86 | 1 | 0 | 0 | +| 86+ | 1 | 0 | 0 | +| 87 | 1 | 0 | 0 | +| 87+ | 1 | 0 | 0 | +| 88 | 1 | 0 | 0 | +| 88+ | 1 | 0 | 0 | +| 89 | 1 | 0 | 0 | +| 89+ | 1 | 0 | 0 | +| 90 | 1 | 0 | 0 | +| 90+ | 1 | 0 | 0 | +| 91 | 1 | 0 | 0 | +| 91+ | 1 | 0 | 0 | +| 92 | 1 | 0 | 0 | +| 92+ | 1 | 0 | 0 | +| 93 | 1 | 0 | 0 | +| 93+ | 1 | 0 | 0 | +| 94 | 1 | 0 | 0 | +| 94+ | 1 | 0 | 0 | +| 95 | 1 | 0 | 0 | +| 95+ | 1 | 0 | 0 | +| 96 | 1 | 0 | 0 | +| 96+ | 1 | 0 | 0 | +| 97 | 1 | 0 | 0 | +| 97+ | 1 | 0 | 0 | +| 98 | 1 | 0 | 0 | +| 98+ | 1 | 0 | 0 | +| 99 | 1 | 0 | 0 | +| 99+ | 1 | 0 | 0 | +| 100 | 1 | 0 | 0 | +| 100+ | 1 | 0 | 0 | +| 101 | 1 | 0 | 0 | +| 101+ | 1 | 0 | 0 | +| 102 | 1 | 0 | 0 | +| 102+ | 1 | 0 | 0 | +| 103 | 1 | 0 | 0 | +| 103+ | 1 | 0 | 0 | +| 104 | 1 | 0 | 0 | +| 104+ | 1 | 0 | 0 | +| 105 | 1 | 0 | 0 | +| 105+ | 1 | 0 | 0 | +| 106 | 1 | 0 | 0 | +| 106+ | 1 | 0 | 0 | +| 107 | 1 | 0 | 0 | diff --git a/nand2tetris-suite/projects/03/a/Bit.hdl b/nand2tetris-suite/projects/03/a/Bit.hdl new file mode 100644 index 0000000..3064198 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/Bit.hdl @@ -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/03/a/Bit.hdl + +/** + * 1-bit register: + * If load[t] == 1 then out[t+1] = in[t] + * else out does not change (out[t+1] = out[t]) + */ + +CHIP Bit { + IN in, load; + OUT out; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/03/a/Bit.tst b/nand2tetris-suite/projects/03/a/Bit.tst new file mode 100644 index 0000000..c6bf523 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/Bit.tst @@ -0,0 +1,865 @@ +// 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/03/a/Bit.tst + +load Bit.hdl, +output-file Bit.out, +compare-to Bit.cmp, +output-list time%S1.4.1 in%B2.1.2 load%B2.1.2 out%B2.1.2; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 1, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in 1, +set load 1, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; + +set in 1, +set load 0, +tick, +output; + +tock, +output; diff --git a/nand2tetris-suite/projects/03/a/PC.cmp b/nand2tetris-suite/projects/03/a/PC.cmp new file mode 100644 index 0000000..6a050d9 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/PC.cmp @@ -0,0 +1,31 @@ +| time | in |reset|load | inc | out | +| 0+ | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 0 | 0 | 1 | 0 | +| 2 | 0 | 0 | 0 | 1 | 1 | +| 2+ | -32123 | 0 | 0 | 1 | 1 | +| 3 | -32123 | 0 | 0 | 1 | 2 | +| 3+ | -32123 | 0 | 1 | 1 | 2 | +| 4 | -32123 | 0 | 1 | 1 | -32123 | +| 4+ | -32123 | 0 | 0 | 1 | -32123 | +| 5 | -32123 | 0 | 0 | 1 | -32122 | +| 5+ | -32123 | 0 | 0 | 1 | -32122 | +| 6 | -32123 | 0 | 0 | 1 | -32121 | +| 6+ | 12345 | 0 | 1 | 0 | -32121 | +| 7 | 12345 | 0 | 1 | 0 | 12345 | +| 7+ | 12345 | 1 | 1 | 0 | 12345 | +| 8 | 12345 | 1 | 1 | 0 | 0 | +| 8+ | 12345 | 0 | 1 | 1 | 0 | +| 9 | 12345 | 0 | 1 | 1 | 12345 | +| 9+ | 12345 | 1 | 1 | 1 | 12345 | +| 10 | 12345 | 1 | 1 | 1 | 0 | +| 10+ | 12345 | 0 | 0 | 1 | 0 | +| 11 | 12345 | 0 | 0 | 1 | 1 | +| 11+ | 12345 | 1 | 0 | 1 | 1 | +| 12 | 12345 | 1 | 0 | 1 | 0 | +| 12+ | 0 | 0 | 1 | 1 | 0 | +| 13 | 0 | 0 | 1 | 1 | 0 | +| 13+ | 0 | 0 | 0 | 1 | 0 | +| 14 | 0 | 0 | 0 | 1 | 1 | +| 14+ | 22222 | 1 | 0 | 0 | 1 | +| 15 | 22222 | 1 | 0 | 0 | 0 | diff --git a/nand2tetris-suite/projects/03/a/PC.hdl b/nand2tetris-suite/projects/03/a/PC.hdl new file mode 100644 index 0000000..a326e43 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/PC.hdl @@ -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/03/a/PC.hdl + +/** + * A 16-bit counter with load and reset control bits. + * if (reset[t] == 1) out[t+1] = 0 + * else if (load[t] == 1) out[t+1] = in[t] + * else if (inc[t] == 1) out[t+1] = out[t] + 1 (integer addition) + * else out[t+1] = out[t] + */ + +CHIP PC { + IN in[16],load,inc,reset; + OUT out[16]; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/03/a/PC.tst b/nand2tetris-suite/projects/03/a/PC.tst new file mode 100644 index 0000000..7f4f3cd --- /dev/null +++ b/nand2tetris-suite/projects/03/a/PC.tst @@ -0,0 +1,125 @@ +// 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/03/a/PC.tst + +load PC.hdl, +output-file PC.out, +compare-to PC.cmp, +output-list time%S1.4.1 in%D1.6.1 reset%B2.1.2 load%B2.1.2 inc%B2.1.2 out%D1.6.1; + +set in 0, +set reset 0, +set load 0, +set inc 0, +tick, +output; + +tock, +output; + +set inc 1, +tick, +output; + +tock, +output; + +set in -32123, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set load 0, +tick, +output; + +tock, +output; + +tick, +output; + +tock, +output; + +set in 12345, +set load 1, +set inc 0, +tick, +output; + +tock, +output; + +set reset 1, +tick, +output; + +tock, +output; + +set reset 0, +set inc 1, +tick, +output; + +tock, +output; + +set reset 1, +tick, +output; + +tock, +output; + +set reset 0, +set load 0, +tick, +output; + +tock, +output; + +set reset 1, +tick, +output; + +tock, +output; + +set in 0, +set reset 0, +set load 1, +tick, +output; + +tock, +output; + +set load 0, +set inc 1, +tick, +output; + +tock, +output; + +set in 22222, +set reset 1, +set inc 0, +tick, +output; + +tock, +output; diff --git a/nand2tetris-suite/projects/03/a/RAM64.cmp b/nand2tetris-suite/projects/03/a/RAM64.cmp new file mode 100644 index 0000000..fdb7745 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/RAM64.cmp @@ -0,0 +1,320 @@ +| time | in |load |address| out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 1313 | 0 | 0 | 0 | +| 3 | 1313 | 0 | 0 | 0 | +| 3+ | 1313 | 1 | 13 | 0 | +| 4 | 1313 | 1 | 13 | 1313 | +| 4+ | 1313 | 0 | 0 | 0 | +| 5 | 1313 | 0 | 0 | 0 | +| 5+ | 4747 | 0 | 47 | 0 | +| 6 | 4747 | 0 | 47 | 0 | +| 6+ | 4747 | 1 | 47 | 0 | +| 7 | 4747 | 1 | 47 | 4747 | +| 7+ | 4747 | 0 | 47 | 4747 | +| 8 | 4747 | 0 | 47 | 4747 | +| 8 | 4747 | 0 | 13 | 1313 | +| 8+ | 6363 | 0 | 13 | 1313 | +| 9 | 6363 | 0 | 13 | 1313 | +| 9+ | 6363 | 1 | 63 | 0 | +| 10 | 6363 | 1 | 63 | 6363 | +| 10+ | 6363 | 0 | 63 | 6363 | +| 11 | 6363 | 0 | 63 | 6363 | +| 11 | 6363 | 0 | 47 | 4747 | +| 11 | 6363 | 0 | 63 | 6363 | +| 11+ | 6363 | 0 | 40 | 0 | +| 12 | 6363 | 0 | 40 | 0 | +| 12 | 6363 | 0 | 41 | 0 | +| 12 | 6363 | 0 | 42 | 0 | +| 12 | 6363 | 0 | 43 | 0 | +| 12 | 6363 | 0 | 44 | 0 | +| 12 | 6363 | 0 | 45 | 0 | +| 12 | 6363 | 0 | 46 | 0 | +| 12 | 6363 | 0 | 47 | 4747 | +| 12+ | 21845 | 1 | 40 | 0 | +| 13 | 21845 | 1 | 40 | 21845 | +| 13+ | 21845 | 1 | 41 | 0 | +| 14 | 21845 | 1 | 41 | 21845 | +| 14+ | 21845 | 1 | 42 | 0 | +| 15 | 21845 | 1 | 42 | 21845 | +| 15+ | 21845 | 1 | 43 | 0 | +| 16 | 21845 | 1 | 43 | 21845 | +| 16+ | 21845 | 1 | 44 | 0 | +| 17 | 21845 | 1 | 44 | 21845 | +| 17+ | 21845 | 1 | 45 | 0 | +| 18 | 21845 | 1 | 45 | 21845 | +| 18+ | 21845 | 1 | 46 | 0 | +| 19 | 21845 | 1 | 46 | 21845 | +| 19+ | 21845 | 1 | 47 | 4747 | +| 20 | 21845 | 1 | 47 | 21845 | +| 20+ | 21845 | 0 | 40 | 21845 | +| 21 | 21845 | 0 | 40 | 21845 | +| 21 | 21845 | 0 | 41 | 21845 | +| 21 | 21845 | 0 | 42 | 21845 | +| 21 | 21845 | 0 | 43 | 21845 | +| 21 | 21845 | 0 | 44 | 21845 | +| 21 | 21845 | 0 | 45 | 21845 | +| 21 | 21845 | 0 | 46 | 21845 | +| 21 | 21845 | 0 | 47 | 21845 | +| 21+ | -21846 | 1 | 40 | 21845 | +| 22 | -21846 | 1 | 40 | -21846 | +| 22+ | -21846 | 0 | 40 | -21846 | +| 23 | -21846 | 0 | 40 | -21846 | +| 23 | -21846 | 0 | 41 | 21845 | +| 23 | -21846 | 0 | 42 | 21845 | +| 23 | -21846 | 0 | 43 | 21845 | +| 23 | -21846 | 0 | 44 | 21845 | +| 23 | -21846 | 0 | 45 | 21845 | +| 23 | -21846 | 0 | 46 | 21845 | +| 23 | -21846 | 0 | 47 | 21845 | +| 23+ | 21845 | 1 | 40 | -21846 | +| 24 | 21845 | 1 | 40 | 21845 | +| 24+ | -21846 | 1 | 41 | 21845 | +| 25 | -21846 | 1 | 41 | -21846 | +| 25+ | -21846 | 0 | 40 | 21845 | +| 26 | -21846 | 0 | 40 | 21845 | +| 26 | -21846 | 0 | 41 | -21846 | +| 26 | -21846 | 0 | 42 | 21845 | +| 26 | -21846 | 0 | 43 | 21845 | +| 26 | -21846 | 0 | 44 | 21845 | +| 26 | -21846 | 0 | 45 | 21845 | +| 26 | -21846 | 0 | 46 | 21845 | +| 26 | -21846 | 0 | 47 | 21845 | +| 26+ | 21845 | 1 | 41 | -21846 | +| 27 | 21845 | 1 | 41 | 21845 | +| 27+ | -21846 | 1 | 42 | 21845 | +| 28 | -21846 | 1 | 42 | -21846 | +| 28+ | -21846 | 0 | 40 | 21845 | +| 29 | -21846 | 0 | 40 | 21845 | +| 29 | -21846 | 0 | 41 | 21845 | +| 29 | -21846 | 0 | 42 | -21846 | +| 29 | -21846 | 0 | 43 | 21845 | +| 29 | -21846 | 0 | 44 | 21845 | +| 29 | -21846 | 0 | 45 | 21845 | +| 29 | -21846 | 0 | 46 | 21845 | +| 29 | -21846 | 0 | 47 | 21845 | +| 29+ | 21845 | 1 | 42 | -21846 | +| 30 | 21845 | 1 | 42 | 21845 | +| 30+ | -21846 | 1 | 43 | 21845 | +| 31 | -21846 | 1 | 43 | -21846 | +| 31+ | -21846 | 0 | 40 | 21845 | +| 32 | -21846 | 0 | 40 | 21845 | +| 32 | -21846 | 0 | 41 | 21845 | +| 32 | -21846 | 0 | 42 | 21845 | +| 32 | -21846 | 0 | 43 | -21846 | +| 32 | -21846 | 0 | 44 | 21845 | +| 32 | -21846 | 0 | 45 | 21845 | +| 32 | -21846 | 0 | 46 | 21845 | +| 32 | -21846 | 0 | 47 | 21845 | +| 32+ | 21845 | 1 | 43 | -21846 | +| 33 | 21845 | 1 | 43 | 21845 | +| 33+ | -21846 | 1 | 44 | 21845 | +| 34 | -21846 | 1 | 44 | -21846 | +| 34+ | -21846 | 0 | 40 | 21845 | +| 35 | -21846 | 0 | 40 | 21845 | +| 35 | -21846 | 0 | 41 | 21845 | +| 35 | -21846 | 0 | 42 | 21845 | +| 35 | -21846 | 0 | 43 | 21845 | +| 35 | -21846 | 0 | 44 | -21846 | +| 35 | -21846 | 0 | 45 | 21845 | +| 35 | -21846 | 0 | 46 | 21845 | +| 35 | -21846 | 0 | 47 | 21845 | +| 35+ | 21845 | 1 | 44 | -21846 | +| 36 | 21845 | 1 | 44 | 21845 | +| 36+ | -21846 | 1 | 45 | 21845 | +| 37 | -21846 | 1 | 45 | -21846 | +| 37+ | -21846 | 0 | 40 | 21845 | +| 38 | -21846 | 0 | 40 | 21845 | +| 38 | -21846 | 0 | 41 | 21845 | +| 38 | -21846 | 0 | 42 | 21845 | +| 38 | -21846 | 0 | 43 | 21845 | +| 38 | -21846 | 0 | 44 | 21845 | +| 38 | -21846 | 0 | 45 | -21846 | +| 38 | -21846 | 0 | 46 | 21845 | +| 38 | -21846 | 0 | 47 | 21845 | +| 38+ | 21845 | 1 | 45 | -21846 | +| 39 | 21845 | 1 | 45 | 21845 | +| 39+ | -21846 | 1 | 46 | 21845 | +| 40 | -21846 | 1 | 46 | -21846 | +| 40+ | -21846 | 0 | 40 | 21845 | +| 41 | -21846 | 0 | 40 | 21845 | +| 41 | -21846 | 0 | 41 | 21845 | +| 41 | -21846 | 0 | 42 | 21845 | +| 41 | -21846 | 0 | 43 | 21845 | +| 41 | -21846 | 0 | 44 | 21845 | +| 41 | -21846 | 0 | 45 | 21845 | +| 41 | -21846 | 0 | 46 | -21846 | +| 41 | -21846 | 0 | 47 | 21845 | +| 41+ | 21845 | 1 | 46 | -21846 | +| 42 | 21845 | 1 | 46 | 21845 | +| 42+ | -21846 | 1 | 47 | 21845 | +| 43 | -21846 | 1 | 47 | -21846 | +| 43+ | -21846 | 0 | 40 | 21845 | +| 44 | -21846 | 0 | 40 | 21845 | +| 44 | -21846 | 0 | 41 | 21845 | +| 44 | -21846 | 0 | 42 | 21845 | +| 44 | -21846 | 0 | 43 | 21845 | +| 44 | -21846 | 0 | 44 | 21845 | +| 44 | -21846 | 0 | 45 | 21845 | +| 44 | -21846 | 0 | 46 | 21845 | +| 44 | -21846 | 0 | 47 | -21846 | +| 44+ | 21845 | 1 | 47 | -21846 | +| 45 | 21845 | 1 | 47 | 21845 | +| 45+ | 21845 | 0 | 40 | 21845 | +| 46 | 21845 | 0 | 40 | 21845 | +| 46 | 21845 | 0 | 41 | 21845 | +| 46 | 21845 | 0 | 42 | 21845 | +| 46 | 21845 | 0 | 43 | 21845 | +| 46 | 21845 | 0 | 44 | 21845 | +| 46 | 21845 | 0 | 45 | 21845 | +| 46 | 21845 | 0 | 46 | 21845 | +| 46 | 21845 | 0 | 47 | 21845 | +| 46+ | 21845 | 0 | 5 | 0 | +| 47 | 21845 | 0 | 5 | 0 | +| 47 | 21845 | 0 | 13 | 1313 | +| 47 | 21845 | 0 | 21 | 0 | +| 47 | 21845 | 0 | 29 | 0 | +| 47 | 21845 | 0 | 37 | 0 | +| 47 | 21845 | 0 | 45 | 21845 | +| 47 | 21845 | 0 | 53 | 0 | +| 47 | 21845 | 0 | 61 | 0 | +| 47+ | 21845 | 1 | 5 | 0 | +| 48 | 21845 | 1 | 5 | 21845 | +| 48+ | 21845 | 1 | 13 | 1313 | +| 49 | 21845 | 1 | 13 | 21845 | +| 49+ | 21845 | 1 | 21 | 0 | +| 50 | 21845 | 1 | 21 | 21845 | +| 50+ | 21845 | 1 | 29 | 0 | +| 51 | 21845 | 1 | 29 | 21845 | +| 51+ | 21845 | 1 | 37 | 0 | +| 52 | 21845 | 1 | 37 | 21845 | +| 52+ | 21845 | 1 | 45 | 21845 | +| 53 | 21845 | 1 | 45 | 21845 | +| 53+ | 21845 | 1 | 53 | 0 | +| 54 | 21845 | 1 | 53 | 21845 | +| 54+ | 21845 | 1 | 61 | 0 | +| 55 | 21845 | 1 | 61 | 21845 | +| 55+ | 21845 | 0 | 5 | 21845 | +| 56 | 21845 | 0 | 5 | 21845 | +| 56 | 21845 | 0 | 13 | 21845 | +| 56 | 21845 | 0 | 21 | 21845 | +| 56 | 21845 | 0 | 29 | 21845 | +| 56 | 21845 | 0 | 37 | 21845 | +| 56 | 21845 | 0 | 45 | 21845 | +| 56 | 21845 | 0 | 53 | 21845 | +| 56 | 21845 | 0 | 61 | 21845 | +| 56+ | -21846 | 1 | 5 | 21845 | +| 57 | -21846 | 1 | 5 | -21846 | +| 57+ | -21846 | 0 | 5 | -21846 | +| 58 | -21846 | 0 | 5 | -21846 | +| 58 | -21846 | 0 | 13 | 21845 | +| 58 | -21846 | 0 | 21 | 21845 | +| 58 | -21846 | 0 | 29 | 21845 | +| 58 | -21846 | 0 | 37 | 21845 | +| 58 | -21846 | 0 | 45 | 21845 | +| 58 | -21846 | 0 | 53 | 21845 | +| 58 | -21846 | 0 | 61 | 21845 | +| 58+ | 21845 | 1 | 5 | -21846 | +| 59 | 21845 | 1 | 5 | 21845 | +| 59+ | -21846 | 1 | 13 | 21845 | +| 60 | -21846 | 1 | 13 | -21846 | +| 60+ | -21846 | 0 | 5 | 21845 | +| 61 | -21846 | 0 | 5 | 21845 | +| 61 | -21846 | 0 | 13 | -21846 | +| 61 | -21846 | 0 | 21 | 21845 | +| 61 | -21846 | 0 | 29 | 21845 | +| 61 | -21846 | 0 | 37 | 21845 | +| 61 | -21846 | 0 | 45 | 21845 | +| 61 | -21846 | 0 | 53 | 21845 | +| 61 | -21846 | 0 | 61 | 21845 | +| 61+ | 21845 | 1 | 13 | -21846 | +| 62 | 21845 | 1 | 13 | 21845 | +| 62+ | -21846 | 1 | 21 | 21845 | +| 63 | -21846 | 1 | 21 | -21846 | +| 63+ | -21846 | 0 | 5 | 21845 | +| 64 | -21846 | 0 | 5 | 21845 | +| 64 | -21846 | 0 | 13 | 21845 | +| 64 | -21846 | 0 | 21 | -21846 | +| 64 | -21846 | 0 | 29 | 21845 | +| 64 | -21846 | 0 | 37 | 21845 | +| 64 | -21846 | 0 | 45 | 21845 | +| 64 | -21846 | 0 | 53 | 21845 | +| 64 | -21846 | 0 | 61 | 21845 | +| 64+ | 21845 | 1 | 21 | -21846 | +| 65 | 21845 | 1 | 21 | 21845 | +| 65+ | -21846 | 1 | 29 | 21845 | +| 66 | -21846 | 1 | 29 | -21846 | +| 66+ | -21846 | 0 | 5 | 21845 | +| 67 | -21846 | 0 | 5 | 21845 | +| 67 | -21846 | 0 | 13 | 21845 | +| 67 | -21846 | 0 | 21 | 21845 | +| 67 | -21846 | 0 | 29 | -21846 | +| 67 | -21846 | 0 | 37 | 21845 | +| 67 | -21846 | 0 | 45 | 21845 | +| 67 | -21846 | 0 | 53 | 21845 | +| 67 | -21846 | 0 | 61 | 21845 | +| 67+ | 21845 | 1 | 29 | -21846 | +| 68 | 21845 | 1 | 29 | 21845 | +| 68+ | -21846 | 1 | 37 | 21845 | +| 69 | -21846 | 1 | 37 | -21846 | +| 69+ | -21846 | 0 | 5 | 21845 | +| 70 | -21846 | 0 | 5 | 21845 | +| 70 | -21846 | 0 | 13 | 21845 | +| 70 | -21846 | 0 | 21 | 21845 | +| 70 | -21846 | 0 | 29 | 21845 | +| 70 | -21846 | 0 | 37 | -21846 | +| 70 | -21846 | 0 | 45 | 21845 | +| 70 | -21846 | 0 | 53 | 21845 | +| 70 | -21846 | 0 | 61 | 21845 | +| 70+ | 21845 | 1 | 37 | -21846 | +| 71 | 21845 | 1 | 37 | 21845 | +| 71+ | -21846 | 1 | 45 | 21845 | +| 72 | -21846 | 1 | 45 | -21846 | +| 72+ | -21846 | 0 | 5 | 21845 | +| 73 | -21846 | 0 | 5 | 21845 | +| 73 | -21846 | 0 | 13 | 21845 | +| 73 | -21846 | 0 | 21 | 21845 | +| 73 | -21846 | 0 | 29 | 21845 | +| 73 | -21846 | 0 | 37 | 21845 | +| 73 | -21846 | 0 | 45 | -21846 | +| 73 | -21846 | 0 | 53 | 21845 | +| 73 | -21846 | 0 | 61 | 21845 | +| 73+ | 21845 | 1 | 45 | -21846 | +| 74 | 21845 | 1 | 45 | 21845 | +| 74+ | -21846 | 1 | 53 | 21845 | +| 75 | -21846 | 1 | 53 | -21846 | +| 75+ | -21846 | 0 | 5 | 21845 | +| 76 | -21846 | 0 | 5 | 21845 | +| 76 | -21846 | 0 | 13 | 21845 | +| 76 | -21846 | 0 | 21 | 21845 | +| 76 | -21846 | 0 | 29 | 21845 | +| 76 | -21846 | 0 | 37 | 21845 | +| 76 | -21846 | 0 | 45 | 21845 | +| 76 | -21846 | 0 | 53 | -21846 | +| 76 | -21846 | 0 | 61 | 21845 | +| 76+ | 21845 | 1 | 53 | -21846 | +| 77 | 21845 | 1 | 53 | 21845 | +| 77+ | -21846 | 1 | 61 | 21845 | +| 78 | -21846 | 1 | 61 | -21846 | +| 78+ | -21846 | 0 | 5 | 21845 | +| 79 | -21846 | 0 | 5 | 21845 | +| 79 | -21846 | 0 | 13 | 21845 | +| 79 | -21846 | 0 | 21 | 21845 | +| 79 | -21846 | 0 | 29 | 21845 | +| 79 | -21846 | 0 | 37 | 21845 | +| 79 | -21846 | 0 | 45 | 21845 | +| 79 | -21846 | 0 | 53 | 21845 | +| 79 | -21846 | 0 | 61 | -21846 | +| 79+ | 21845 | 1 | 61 | -21846 | +| 80 | 21845 | 1 | 61 | 21845 | +| 80+ | 21845 | 0 | 5 | 21845 | +| 81 | 21845 | 0 | 5 | 21845 | +| 81 | 21845 | 0 | 13 | 21845 | +| 81 | 21845 | 0 | 21 | 21845 | +| 81 | 21845 | 0 | 29 | 21845 | +| 81 | 21845 | 0 | 37 | 21845 | +| 81 | 21845 | 0 | 45 | 21845 | +| 81 | 21845 | 0 | 53 | 21845 | +| 81 | 21845 | 0 | 61 | 21845 | diff --git a/nand2tetris-suite/projects/03/a/RAM64.hdl b/nand2tetris-suite/projects/03/a/RAM64.hdl new file mode 100644 index 0000000..66efcbd --- /dev/null +++ b/nand2tetris-suite/projects/03/a/RAM64.hdl @@ -0,0 +1,19 @@ +// 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/03/a/RAM64.hdl + +/** + * Memory of 64 registers, each 16 bit-wide. Out holds the value + * stored at the memory location specified by address. If load==1, then + * the in value is loaded into the memory location specified by address + * (the loaded value will be emitted to out from the next time step onward). + */ + +CHIP RAM64 { + IN in[16], load, address[6]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/03/a/RAM64.tst b/nand2tetris-suite/projects/03/a/RAM64.tst new file mode 100644 index 0000000..e1a1409 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/RAM64.tst @@ -0,0 +1,1026 @@ +// 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/03/a/RAM64.tst + +load RAM64.hdl, +output-file RAM64.out, +compare-to RAM64.cmp, +output-list time%S1.4.1 in%D1.6.1 load%B2.1.2 address%D2.3.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 1313, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 13, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 4747, +set address 47, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 13, +eval, +output; + +set in 6363, +tick, +output; +tock, +output; + +set load 1, +set address 63, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 47, +eval, +output; + +set address 63, +eval, +output; + + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +tick, +output, +tock, +output; +set address %B101010, +tick, +output, +tock, +output; +set address %B101011, +tick, +output, +tock, +output; +set address %B101100, +tick, +output, +tock, +output; +set address %B101101, +tick, +output, +tock, +output; +set address %B101110, +tick, +output, +tock, +output; +set address %B101111, +tick, +output, +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + +set load 1, +set address %B101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B101000, +tick, +output; +tock, +output; +set address %B101001, +eval, +output; +set address %B101010, +eval, +output; +set address %B101011, +eval, +output; +set address %B101100, +eval, +output; +set address %B101101, +eval, +output; +set address %B101110, +eval, +output; +set address %B101111, +eval, +output; + + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +tick, +output, +tock, +output; +set address %B010101, +tick, +output, +tock, +output; +set address %B011101, +tick, +output, +tock, +output; +set address %B100101, +tick, +output, +tock, +output; +set address %B101101, +tick, +output, +tock, +output; +set address %B110101, +tick, +output, +tock, +output; +set address %B111101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B000101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B000101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B001101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B001101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B011101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B011101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B100101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B100101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B110101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B110101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B111101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; + +set load 1, +set address %B111101, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101, +tick, +output; +tock, +output; +set address %B001101, +eval, +output; +set address %B010101, +eval, +output; +set address %B011101, +eval, +output; +set address %B100101, +eval, +output; +set address %B101101, +eval, +output; +set address %B110101, +eval, +output; +set address %B111101, +eval, +output; diff --git a/nand2tetris-suite/projects/03/a/RAM8.cmp b/nand2tetris-suite/projects/03/a/RAM8.cmp new file mode 100644 index 0000000..536c6ef --- /dev/null +++ b/nand2tetris-suite/projects/03/a/RAM8.cmp @@ -0,0 +1,173 @@ +| time | in |load |address| out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 11111 | 0 | 0 | 0 | +| 3 | 11111 | 0 | 0 | 0 | +| 3+ | 11111 | 1 | 1 | 0 | +| 4 | 11111 | 1 | 1 | 11111 | +| 4+ | 11111 | 0 | 0 | 0 | +| 5 | 11111 | 0 | 0 | 0 | +| 5+ | 3333 | 0 | 3 | 0 | +| 6 | 3333 | 0 | 3 | 0 | +| 6+ | 3333 | 1 | 3 | 0 | +| 7 | 3333 | 1 | 3 | 3333 | +| 7+ | 3333 | 0 | 3 | 3333 | +| 8 | 3333 | 0 | 3 | 3333 | +| 8 | 3333 | 0 | 1 | 11111 | +| 8+ | 7777 | 0 | 1 | 11111 | +| 9 | 7777 | 0 | 1 | 11111 | +| 9+ | 7777 | 1 | 7 | 0 | +| 10 | 7777 | 1 | 7 | 7777 | +| 10+ | 7777 | 0 | 7 | 7777 | +| 11 | 7777 | 0 | 7 | 7777 | +| 11 | 7777 | 0 | 3 | 3333 | +| 11 | 7777 | 0 | 7 | 7777 | +| 11+ | 7777 | 0 | 0 | 0 | +| 12 | 7777 | 0 | 0 | 0 | +| 12 | 7777 | 0 | 1 | 11111 | +| 12 | 7777 | 0 | 2 | 0 | +| 12 | 7777 | 0 | 3 | 3333 | +| 12 | 7777 | 0 | 4 | 0 | +| 12 | 7777 | 0 | 5 | 0 | +| 12 | 7777 | 0 | 6 | 0 | +| 12 | 7777 | 0 | 7 | 7777 | +| 12+ | 21845 | 1 | 0 | 0 | +| 13 | 21845 | 1 | 0 | 21845 | +| 13+ | 21845 | 1 | 1 | 11111 | +| 14 | 21845 | 1 | 1 | 21845 | +| 14+ | 21845 | 1 | 2 | 0 | +| 15 | 21845 | 1 | 2 | 21845 | +| 15+ | 21845 | 1 | 3 | 3333 | +| 16 | 21845 | 1 | 3 | 21845 | +| 16+ | 21845 | 1 | 4 | 0 | +| 17 | 21845 | 1 | 4 | 21845 | +| 17+ | 21845 | 1 | 5 | 0 | +| 18 | 21845 | 1 | 5 | 21845 | +| 18+ | 21845 | 1 | 6 | 0 | +| 19 | 21845 | 1 | 6 | 21845 | +| 19+ | 21845 | 1 | 7 | 7777 | +| 20 | 21845 | 1 | 7 | 21845 | +| 20+ | 21845 | 0 | 0 | 21845 | +| 21 | 21845 | 0 | 0 | 21845 | +| 21 | 21845 | 0 | 1 | 21845 | +| 21 | 21845 | 0 | 2 | 21845 | +| 21 | 21845 | 0 | 3 | 21845 | +| 21 | 21845 | 0 | 4 | 21845 | +| 21 | 21845 | 0 | 5 | 21845 | +| 21 | 21845 | 0 | 6 | 21845 | +| 21 | 21845 | 0 | 7 | 21845 | +| 21+ | -21846 | 1 | 0 | 21845 | +| 22 | -21846 | 1 | 0 | -21846 | +| 22+ | -21846 | 0 | 0 | -21846 | +| 23 | -21846 | 0 | 0 | -21846 | +| 23 | -21846 | 0 | 1 | 21845 | +| 23 | -21846 | 0 | 2 | 21845 | +| 23 | -21846 | 0 | 3 | 21845 | +| 23 | -21846 | 0 | 4 | 21845 | +| 23 | -21846 | 0 | 5 | 21845 | +| 23 | -21846 | 0 | 6 | 21845 | +| 23 | -21846 | 0 | 7 | 21845 | +| 23+ | 21845 | 1 | 0 | -21846 | +| 24 | 21845 | 1 | 0 | 21845 | +| 24+ | -21846 | 1 | 1 | 21845 | +| 25 | -21846 | 1 | 1 | -21846 | +| 25+ | -21846 | 0 | 0 | 21845 | +| 26 | -21846 | 0 | 0 | 21845 | +| 26 | -21846 | 0 | 1 | -21846 | +| 26 | -21846 | 0 | 2 | 21845 | +| 26 | -21846 | 0 | 3 | 21845 | +| 26 | -21846 | 0 | 4 | 21845 | +| 26 | -21846 | 0 | 5 | 21845 | +| 26 | -21846 | 0 | 6 | 21845 | +| 26 | -21846 | 0 | 7 | 21845 | +| 26+ | 21845 | 1 | 1 | -21846 | +| 27 | 21845 | 1 | 1 | 21845 | +| 27+ | -21846 | 1 | 2 | 21845 | +| 28 | -21846 | 1 | 2 | -21846 | +| 28+ | -21846 | 0 | 0 | 21845 | +| 29 | -21846 | 0 | 0 | 21845 | +| 29 | -21846 | 0 | 1 | 21845 | +| 29 | -21846 | 0 | 2 | -21846 | +| 29 | -21846 | 0 | 3 | 21845 | +| 29 | -21846 | 0 | 4 | 21845 | +| 29 | -21846 | 0 | 5 | 21845 | +| 29 | -21846 | 0 | 6 | 21845 | +| 29 | -21846 | 0 | 7 | 21845 | +| 29+ | 21845 | 1 | 2 | -21846 | +| 30 | 21845 | 1 | 2 | 21845 | +| 30+ | -21846 | 1 | 3 | 21845 | +| 31 | -21846 | 1 | 3 | -21846 | +| 31+ | -21846 | 0 | 0 | 21845 | +| 32 | -21846 | 0 | 0 | 21845 | +| 32 | -21846 | 0 | 1 | 21845 | +| 32 | -21846 | 0 | 2 | 21845 | +| 32 | -21846 | 0 | 3 | -21846 | +| 32 | -21846 | 0 | 4 | 21845 | +| 32 | -21846 | 0 | 5 | 21845 | +| 32 | -21846 | 0 | 6 | 21845 | +| 32 | -21846 | 0 | 7 | 21845 | +| 32+ | 21845 | 1 | 3 | -21846 | +| 33 | 21845 | 1 | 3 | 21845 | +| 33+ | -21846 | 1 | 4 | 21845 | +| 34 | -21846 | 1 | 4 | -21846 | +| 34+ | -21846 | 0 | 0 | 21845 | +| 35 | -21846 | 0 | 0 | 21845 | +| 35 | -21846 | 0 | 1 | 21845 | +| 35 | -21846 | 0 | 2 | 21845 | +| 35 | -21846 | 0 | 3 | 21845 | +| 35 | -21846 | 0 | 4 | -21846 | +| 35 | -21846 | 0 | 5 | 21845 | +| 35 | -21846 | 0 | 6 | 21845 | +| 35 | -21846 | 0 | 7 | 21845 | +| 35+ | 21845 | 1 | 4 | -21846 | +| 36 | 21845 | 1 | 4 | 21845 | +| 36+ | -21846 | 1 | 5 | 21845 | +| 37 | -21846 | 1 | 5 | -21846 | +| 37+ | -21846 | 0 | 0 | 21845 | +| 38 | -21846 | 0 | 0 | 21845 | +| 38 | -21846 | 0 | 1 | 21845 | +| 38 | -21846 | 0 | 2 | 21845 | +| 38 | -21846 | 0 | 3 | 21845 | +| 38 | -21846 | 0 | 4 | 21845 | +| 38 | -21846 | 0 | 5 | -21846 | +| 38 | -21846 | 0 | 6 | 21845 | +| 38 | -21846 | 0 | 7 | 21845 | +| 38+ | 21845 | 1 | 5 | -21846 | +| 39 | 21845 | 1 | 5 | 21845 | +| 39+ | -21846 | 1 | 6 | 21845 | +| 40 | -21846 | 1 | 6 | -21846 | +| 40+ | -21846 | 0 | 0 | 21845 | +| 41 | -21846 | 0 | 0 | 21845 | +| 41 | -21846 | 0 | 1 | 21845 | +| 41 | -21846 | 0 | 2 | 21845 | +| 41 | -21846 | 0 | 3 | 21845 | +| 41 | -21846 | 0 | 4 | 21845 | +| 41 | -21846 | 0 | 5 | 21845 | +| 41 | -21846 | 0 | 6 | -21846 | +| 41 | -21846 | 0 | 7 | 21845 | +| 41+ | 21845 | 1 | 6 | -21846 | +| 42 | 21845 | 1 | 6 | 21845 | +| 42+ | -21846 | 1 | 7 | 21845 | +| 43 | -21846 | 1 | 7 | -21846 | +| 43+ | -21846 | 0 | 0 | 21845 | +| 44 | -21846 | 0 | 0 | 21845 | +| 44 | -21846 | 0 | 1 | 21845 | +| 44 | -21846 | 0 | 2 | 21845 | +| 44 | -21846 | 0 | 3 | 21845 | +| 44 | -21846 | 0 | 4 | 21845 | +| 44 | -21846 | 0 | 5 | 21845 | +| 44 | -21846 | 0 | 6 | 21845 | +| 44 | -21846 | 0 | 7 | -21846 | +| 44+ | 21845 | 1 | 7 | -21846 | +| 45 | 21845 | 1 | 7 | 21845 | +| 45+ | 21845 | 0 | 0 | 21845 | +| 46 | 21845 | 0 | 0 | 21845 | +| 46 | 21845 | 0 | 1 | 21845 | +| 46 | 21845 | 0 | 2 | 21845 | +| 46 | 21845 | 0 | 3 | 21845 | +| 46 | 21845 | 0 | 4 | 21845 | +| 46 | 21845 | 0 | 5 | 21845 | +| 46 | 21845 | 0 | 6 | 21845 | +| 46 | 21845 | 0 | 7 | 21845 | diff --git a/nand2tetris-suite/projects/03/a/RAM8.hdl b/nand2tetris-suite/projects/03/a/RAM8.hdl new file mode 100644 index 0000000..4c0e070 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/RAM8.hdl @@ -0,0 +1,19 @@ +// 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/03/a/RAM8.hdl + +/** + * Memory of 8 registers, each 16 bit-wide. Out holds the value + * stored at the memory location specified by address. If load==1, then + * the in value is loaded into the memory location specified by address + * (the loaded value will be emitted to out from the next time step onward). + */ + +CHIP RAM8 { + IN in[16], load, address[3]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/03/a/RAM8.tst b/nand2tetris-suite/projects/03/a/RAM8.tst new file mode 100644 index 0000000..9b6069c --- /dev/null +++ b/nand2tetris-suite/projects/03/a/RAM8.tst @@ -0,0 +1,560 @@ +// 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/03/a/RAM8.tst + +load RAM8.hdl, +output-file RAM8.out, +compare-to RAM8.cmp, +output-list time%S1.4.1 in%D1.6.1 load%B2.1.2 address%D3.1.3 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 11111, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 1, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 3333, +set address 3, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 1, +eval, +output; + +set in 7777, +tick, +output; +tock, +output; + +set load 1, +set address 7, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 3, +eval, +output; + +set address 7, +eval, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address 0, +tick, +output; +tock, +output; +set address 1, +tick, +output, +tock, +output; +set address 2, +tick, +output, +tock, +output; +set address 3, +tick, +output, +tock, +output; +set address 4, +tick, +output, +tock, +output; +set address 5, +tick, +output, +tock, +output; +set address 6, +tick, +output, +tock, +output; +set address 7, +tick, +output, +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 0, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 0, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 1, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 1, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 2, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 2, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 3, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 3, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 4, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 4, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 5, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 5, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 6, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 6, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address 7, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + +set load 1, +set address 7, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; +set address 1, +eval, +output; +set address 2, +eval, +output; +set address 3, +eval, +output; +set address 4, +eval, +output; +set address 5, +eval, +output; +set address 6, +eval, +output; +set address 7, +eval, +output; + diff --git a/nand2tetris-suite/projects/03/a/Register.cmp b/nand2tetris-suite/projects/03/a/Register.cmp new file mode 100644 index 0000000..a899f27 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/Register.cmp @@ -0,0 +1,149 @@ +| time | in |load | out | +| 0+ | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | +| 2 | 0 | 1 | 0 | +| 2+ | -32123 | 0 | 0 | +| 3 | -32123 | 0 | 0 | +| 3+ | 11111 | 0 | 0 | +| 4 | 11111 | 0 | 0 | +| 4+ | -32123 | 1 | 0 | +| 5 | -32123 | 1 | -32123 | +| 5+ | -32123 | 1 | -32123 | +| 6 | -32123 | 1 | -32123 | +| 6+ | -32123 | 0 | -32123 | +| 7 | -32123 | 0 | -32123 | +| 7+ | 12345 | 1 | -32123 | +| 8 | 12345 | 1 | 12345 | +| 8+ | 0 | 0 | 12345 | +| 9 | 0 | 0 | 12345 | +| 9+ | 0 | 1 | 12345 | +| 10 | 0 | 1 | 0 | +| 10+ | 1 | 0 | 0 | +| 11 | 1 | 0 | 0 | +| 11+ | 1 | 1 | 0 | +| 12 | 1 | 1 | 1 | +| 12+ | 2 | 0 | 1 | +| 13 | 2 | 0 | 1 | +| 13+ | 2 | 1 | 1 | +| 14 | 2 | 1 | 2 | +| 14+ | 4 | 0 | 2 | +| 15 | 4 | 0 | 2 | +| 15+ | 4 | 1 | 2 | +| 16 | 4 | 1 | 4 | +| 16+ | 8 | 0 | 4 | +| 17 | 8 | 0 | 4 | +| 17+ | 8 | 1 | 4 | +| 18 | 8 | 1 | 8 | +| 18+ | 16 | 0 | 8 | +| 19 | 16 | 0 | 8 | +| 19+ | 16 | 1 | 8 | +| 20 | 16 | 1 | 16 | +| 20+ | 32 | 0 | 16 | +| 21 | 32 | 0 | 16 | +| 21+ | 32 | 1 | 16 | +| 22 | 32 | 1 | 32 | +| 22+ | 64 | 0 | 32 | +| 23 | 64 | 0 | 32 | +| 23+ | 64 | 1 | 32 | +| 24 | 64 | 1 | 64 | +| 24+ | 128 | 0 | 64 | +| 25 | 128 | 0 | 64 | +| 25+ | 128 | 1 | 64 | +| 26 | 128 | 1 | 128 | +| 26+ | 256 | 0 | 128 | +| 27 | 256 | 0 | 128 | +| 27+ | 256 | 1 | 128 | +| 28 | 256 | 1 | 256 | +| 28+ | 512 | 0 | 256 | +| 29 | 512 | 0 | 256 | +| 29+ | 512 | 1 | 256 | +| 30 | 512 | 1 | 512 | +| 30+ | 1024 | 0 | 512 | +| 31 | 1024 | 0 | 512 | +| 31+ | 1024 | 1 | 512 | +| 32 | 1024 | 1 | 1024 | +| 32+ | 2048 | 0 | 1024 | +| 33 | 2048 | 0 | 1024 | +| 33+ | 2048 | 1 | 1024 | +| 34 | 2048 | 1 | 2048 | +| 34+ | 4096 | 0 | 2048 | +| 35 | 4096 | 0 | 2048 | +| 35+ | 4096 | 1 | 2048 | +| 36 | 4096 | 1 | 4096 | +| 36+ | 8192 | 0 | 4096 | +| 37 | 8192 | 0 | 4096 | +| 37+ | 8192 | 1 | 4096 | +| 38 | 8192 | 1 | 8192 | +| 38+ | 16384 | 0 | 8192 | +| 39 | 16384 | 0 | 8192 | +| 39+ | 16384 | 1 | 8192 | +| 40 | 16384 | 1 | 16384 | +| 40+ | -32768 | 0 | 16384 | +| 41 | -32768 | 0 | 16384 | +| 41+ | -32768 | 1 | 16384 | +| 42 | -32768 | 1 | -32768 | +| 42+ | -2 | 0 | -32768 | +| 43 | -2 | 0 | -32768 | +| 43+ | -2 | 1 | -32768 | +| 44 | -2 | 1 | -2 | +| 44+ | -3 | 0 | -2 | +| 45 | -3 | 0 | -2 | +| 45+ | -3 | 1 | -2 | +| 46 | -3 | 1 | -3 | +| 46+ | -5 | 0 | -3 | +| 47 | -5 | 0 | -3 | +| 47+ | -5 | 1 | -3 | +| 48 | -5 | 1 | -5 | +| 48+ | -9 | 0 | -5 | +| 49 | -9 | 0 | -5 | +| 49+ | -9 | 1 | -5 | +| 50 | -9 | 1 | -9 | +| 50+ | -17 | 0 | -9 | +| 51 | -17 | 0 | -9 | +| 51+ | -17 | 1 | -9 | +| 52 | -17 | 1 | -17 | +| 52+ | -33 | 0 | -17 | +| 53 | -33 | 0 | -17 | +| 53+ | -33 | 1 | -17 | +| 54 | -33 | 1 | -33 | +| 54+ | -65 | 0 | -33 | +| 55 | -65 | 0 | -33 | +| 55+ | -65 | 1 | -33 | +| 56 | -65 | 1 | -65 | +| 56+ | -129 | 0 | -65 | +| 57 | -129 | 0 | -65 | +| 57+ | -129 | 1 | -65 | +| 58 | -129 | 1 | -129 | +| 58+ | -257 | 0 | -129 | +| 59 | -257 | 0 | -129 | +| 59+ | -257 | 1 | -129 | +| 60 | -257 | 1 | -257 | +| 60+ | -513 | 0 | -257 | +| 61 | -513 | 0 | -257 | +| 61+ | -513 | 1 | -257 | +| 62 | -513 | 1 | -513 | +| 62+ | -1025 | 0 | -513 | +| 63 | -1025 | 0 | -513 | +| 63+ | -1025 | 1 | -513 | +| 64 | -1025 | 1 | -1025 | +| 64+ | -2049 | 0 | -1025 | +| 65 | -2049 | 0 | -1025 | +| 65+ | -2049 | 1 | -1025 | +| 66 | -2049 | 1 | -2049 | +| 66+ | -4097 | 0 | -2049 | +| 67 | -4097 | 0 | -2049 | +| 67+ | -4097 | 1 | -2049 | +| 68 | -4097 | 1 | -4097 | +| 68+ | -8193 | 0 | -4097 | +| 69 | -8193 | 0 | -4097 | +| 69+ | -8193 | 1 | -4097 | +| 70 | -8193 | 1 | -8193 | +| 70+ | -16385 | 0 | -8193 | +| 71 | -16385 | 0 | -8193 | +| 71+ | -16385 | 1 | -8193 | +| 72 | -16385 | 1 | -16385 | +| 72+ | 32767 | 0 | -16385 | +| 73 | 32767 | 0 | -16385 | +| 73+ | 32767 | 1 | -16385 | +| 74 | 32767 | 1 | 32767 | diff --git a/nand2tetris-suite/projects/03/a/Register.hdl b/nand2tetris-suite/projects/03/a/Register.hdl new file mode 100644 index 0000000..926b99f --- /dev/null +++ b/nand2tetris-suite/projects/03/a/Register.hdl @@ -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/03/a/Register.hdl + +/** + * 16-bit register: + * If load[t] == 1 then out[t+1] = in[t] + * else out does not change + */ + +CHIP Register { + IN in[16], load; + OUT out[16]; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/03/a/Register.tst b/nand2tetris-suite/projects/03/a/Register.tst new file mode 100644 index 0000000..aeec166 --- /dev/null +++ b/nand2tetris-suite/projects/03/a/Register.tst @@ -0,0 +1,569 @@ +// 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/03/a/Register.tst + +load Register.hdl, +output-file Register.out, +compare-to Register.cmp, +output-list time%S1.4.1 in%D1.6.1 load%B2.1.2 out%D1.6.1; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in -32123, +set load 0, +tick, +output; + +tock, +output; + +set in 11111, +set load 0, +tick, +output; + +tock, +output; + +set in -32123, +set load 1, +tick, +output; + +tock, +output; + +set in -32123, +set load 1, +tick, +output; + +tock, +output; + +set in -32123, +set load 0, +tick, +output; + +tock, +output; + +set in 12345, +set load 1, +tick, +output; + +tock, +output; + +set in 0, +set load 0, +tick, +output; + +tock, +output; + +set in 0, +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000000001, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000000010, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000000100, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000001000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000010000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000000100000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000001000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000010000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000000100000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000001000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000010000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0000100000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0001000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0010000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0100000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1000000000000000, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111111110, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111111101, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111111011, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111110111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111101111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111111011111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111110111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111101111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111111011111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111110111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111101111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1111011111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1110111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1101111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B1011111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; + +set in %B0111111111111111, +set load 0, +tick, +output; + +tock, +output; + +set load 1, +tick, +output; + +tock, +output; diff --git a/nand2tetris-suite/projects/03/b/RAM16K.cmp b/nand2tetris-suite/projects/03/b/RAM16K.cmp new file mode 100644 index 0000000..a1ad9db --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM16K.cmp @@ -0,0 +1,320 @@ +| time | in |load | address | out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 4321 | 0 | 0 | 0 | +| 3 | 4321 | 0 | 0 | 0 | +| 3+ | 4321 | 1 | 4321 | 0 | +| 4 | 4321 | 1 | 4321 | 4321 | +| 4+ | 4321 | 0 | 0 | 0 | +| 5 | 4321 | 0 | 0 | 0 | +| 5+ | 12345 | 0 | 12345 | 0 | +| 6 | 12345 | 0 | 12345 | 0 | +| 6+ | 12345 | 1 | 12345 | 0 | +| 7 | 12345 | 1 | 12345 | 12345 | +| 7+ | 12345 | 0 | 12345 | 12345 | +| 8 | 12345 | 0 | 12345 | 12345 | +| 8 | 12345 | 0 | 4321 | 4321 | +| 8+ | 16383 | 0 | 4321 | 4321 | +| 9 | 16383 | 0 | 4321 | 4321 | +| 9+ | 16383 | 1 | 16383 | 0 | +| 10 | 16383 | 1 | 16383 | 16383 | +| 10+ | 16383 | 0 | 16383 | 16383 | +| 11 | 16383 | 0 | 16383 | 16383 | +| 11 | 16383 | 0 | 12345 | 12345 | +| 11 | 16383 | 0 | 16383 | 16383 | +| 11+ | 16383 | 0 | 10920 | 0 | +| 12 | 16383 | 0 | 10920 | 0 | +| 12 | 16383 | 0 | 10921 | 0 | +| 12 | 16383 | 0 | 10922 | 0 | +| 12 | 16383 | 0 | 10923 | 0 | +| 12 | 16383 | 0 | 10924 | 0 | +| 12 | 16383 | 0 | 10925 | 0 | +| 12 | 16383 | 0 | 10926 | 0 | +| 12 | 16383 | 0 | 10927 | 0 | +| 12+ | 21845 | 1 | 10920 | 0 | +| 13 | 21845 | 1 | 10920 | 21845 | +| 13+ | 21845 | 1 | 10921 | 0 | +| 14 | 21845 | 1 | 10921 | 21845 | +| 14+ | 21845 | 1 | 10922 | 0 | +| 15 | 21845 | 1 | 10922 | 21845 | +| 15+ | 21845 | 1 | 10923 | 0 | +| 16 | 21845 | 1 | 10923 | 21845 | +| 16+ | 21845 | 1 | 10924 | 0 | +| 17 | 21845 | 1 | 10924 | 21845 | +| 17+ | 21845 | 1 | 10925 | 0 | +| 18 | 21845 | 1 | 10925 | 21845 | +| 18+ | 21845 | 1 | 10926 | 0 | +| 19 | 21845 | 1 | 10926 | 21845 | +| 19+ | 21845 | 1 | 10927 | 0 | +| 20 | 21845 | 1 | 10927 | 21845 | +| 20+ | 21845 | 0 | 10920 | 21845 | +| 21 | 21845 | 0 | 10920 | 21845 | +| 21 | 21845 | 0 | 10921 | 21845 | +| 21 | 21845 | 0 | 10922 | 21845 | +| 21 | 21845 | 0 | 10923 | 21845 | +| 21 | 21845 | 0 | 10924 | 21845 | +| 21 | 21845 | 0 | 10925 | 21845 | +| 21 | 21845 | 0 | 10926 | 21845 | +| 21 | 21845 | 0 | 10927 | 21845 | +| 21+ | -21846 | 1 | 10920 | 21845 | +| 22 | -21846 | 1 | 10920 | -21846 | +| 22+ | -21846 | 0 | 10920 | -21846 | +| 23 | -21846 | 0 | 10920 | -21846 | +| 23 | -21846 | 0 | 10921 | 21845 | +| 23 | -21846 | 0 | 10922 | 21845 | +| 23 | -21846 | 0 | 10923 | 21845 | +| 23 | -21846 | 0 | 10924 | 21845 | +| 23 | -21846 | 0 | 10925 | 21845 | +| 23 | -21846 | 0 | 10926 | 21845 | +| 23 | -21846 | 0 | 10927 | 21845 | +| 23+ | 21845 | 1 | 10920 | -21846 | +| 24 | 21845 | 1 | 10920 | 21845 | +| 24+ | -21846 | 1 | 10921 | 21845 | +| 25 | -21846 | 1 | 10921 | -21846 | +| 25+ | -21846 | 0 | 10920 | 21845 | +| 26 | -21846 | 0 | 10920 | 21845 | +| 26 | -21846 | 0 | 10921 | -21846 | +| 26 | -21846 | 0 | 10922 | 21845 | +| 26 | -21846 | 0 | 10923 | 21845 | +| 26 | -21846 | 0 | 10924 | 21845 | +| 26 | -21846 | 0 | 10925 | 21845 | +| 26 | -21846 | 0 | 10926 | 21845 | +| 26 | -21846 | 0 | 10927 | 21845 | +| 26+ | 21845 | 1 | 10921 | -21846 | +| 27 | 21845 | 1 | 10921 | 21845 | +| 27+ | -21846 | 1 | 10922 | 21845 | +| 28 | -21846 | 1 | 10922 | -21846 | +| 28+ | -21846 | 0 | 10920 | 21845 | +| 29 | -21846 | 0 | 10920 | 21845 | +| 29 | -21846 | 0 | 10921 | 21845 | +| 29 | -21846 | 0 | 10922 | -21846 | +| 29 | -21846 | 0 | 10923 | 21845 | +| 29 | -21846 | 0 | 10924 | 21845 | +| 29 | -21846 | 0 | 10925 | 21845 | +| 29 | -21846 | 0 | 10926 | 21845 | +| 29 | -21846 | 0 | 10927 | 21845 | +| 29+ | 21845 | 1 | 10922 | -21846 | +| 30 | 21845 | 1 | 10922 | 21845 | +| 30+ | -21846 | 1 | 10923 | 21845 | +| 31 | -21846 | 1 | 10923 | -21846 | +| 31+ | -21846 | 0 | 10920 | 21845 | +| 32 | -21846 | 0 | 10920 | 21845 | +| 32 | -21846 | 0 | 10921 | 21845 | +| 32 | -21846 | 0 | 10922 | 21845 | +| 32 | -21846 | 0 | 10923 | -21846 | +| 32 | -21846 | 0 | 10924 | 21845 | +| 32 | -21846 | 0 | 10925 | 21845 | +| 32 | -21846 | 0 | 10926 | 21845 | +| 32 | -21846 | 0 | 10927 | 21845 | +| 32+ | 21845 | 1 | 10923 | -21846 | +| 33 | 21845 | 1 | 10923 | 21845 | +| 33+ | -21846 | 1 | 10924 | 21845 | +| 34 | -21846 | 1 | 10924 | -21846 | +| 34+ | -21846 | 0 | 10920 | 21845 | +| 35 | -21846 | 0 | 10920 | 21845 | +| 35 | -21846 | 0 | 10921 | 21845 | +| 35 | -21846 | 0 | 10922 | 21845 | +| 35 | -21846 | 0 | 10923 | 21845 | +| 35 | -21846 | 0 | 10924 | -21846 | +| 35 | -21846 | 0 | 10925 | 21845 | +| 35 | -21846 | 0 | 10926 | 21845 | +| 35 | -21846 | 0 | 10927 | 21845 | +| 35+ | 21845 | 1 | 10924 | -21846 | +| 36 | 21845 | 1 | 10924 | 21845 | +| 36+ | -21846 | 1 | 10925 | 21845 | +| 37 | -21846 | 1 | 10925 | -21846 | +| 37+ | -21846 | 0 | 10920 | 21845 | +| 38 | -21846 | 0 | 10920 | 21845 | +| 38 | -21846 | 0 | 10921 | 21845 | +| 38 | -21846 | 0 | 10922 | 21845 | +| 38 | -21846 | 0 | 10923 | 21845 | +| 38 | -21846 | 0 | 10924 | 21845 | +| 38 | -21846 | 0 | 10925 | -21846 | +| 38 | -21846 | 0 | 10926 | 21845 | +| 38 | -21846 | 0 | 10927 | 21845 | +| 38+ | 21845 | 1 | 10925 | -21846 | +| 39 | 21845 | 1 | 10925 | 21845 | +| 39+ | -21846 | 1 | 10926 | 21845 | +| 40 | -21846 | 1 | 10926 | -21846 | +| 40+ | -21846 | 0 | 10920 | 21845 | +| 41 | -21846 | 0 | 10920 | 21845 | +| 41 | -21846 | 0 | 10921 | 21845 | +| 41 | -21846 | 0 | 10922 | 21845 | +| 41 | -21846 | 0 | 10923 | 21845 | +| 41 | -21846 | 0 | 10924 | 21845 | +| 41 | -21846 | 0 | 10925 | 21845 | +| 41 | -21846 | 0 | 10926 | -21846 | +| 41 | -21846 | 0 | 10927 | 21845 | +| 41+ | 21845 | 1 | 10926 | -21846 | +| 42 | 21845 | 1 | 10926 | 21845 | +| 42+ | -21846 | 1 | 10927 | 21845 | +| 43 | -21846 | 1 | 10927 | -21846 | +| 43+ | -21846 | 0 | 10920 | 21845 | +| 44 | -21846 | 0 | 10920 | 21845 | +| 44 | -21846 | 0 | 10921 | 21845 | +| 44 | -21846 | 0 | 10922 | 21845 | +| 44 | -21846 | 0 | 10923 | 21845 | +| 44 | -21846 | 0 | 10924 | 21845 | +| 44 | -21846 | 0 | 10925 | 21845 | +| 44 | -21846 | 0 | 10926 | 21845 | +| 44 | -21846 | 0 | 10927 | -21846 | +| 44+ | 21845 | 1 | 10927 | -21846 | +| 45 | 21845 | 1 | 10927 | 21845 | +| 45+ | 21845 | 0 | 10920 | 21845 | +| 46 | 21845 | 0 | 10920 | 21845 | +| 46 | 21845 | 0 | 10921 | 21845 | +| 46 | 21845 | 0 | 10922 | 21845 | +| 46 | 21845 | 0 | 10923 | 21845 | +| 46 | 21845 | 0 | 10924 | 21845 | +| 46 | 21845 | 0 | 10925 | 21845 | +| 46 | 21845 | 0 | 10926 | 21845 | +| 46 | 21845 | 0 | 10927 | 21845 | +| 46+ | 21845 | 0 | 1365 | 0 | +| 47 | 21845 | 0 | 1365 | 0 | +| 47 | 21845 | 0 | 3413 | 0 | +| 47 | 21845 | 0 | 5461 | 0 | +| 47 | 21845 | 0 | 7509 | 0 | +| 47 | 21845 | 0 | 9557 | 0 | +| 47 | 21845 | 0 | 11605 | 0 | +| 47 | 21845 | 0 | 13653 | 0 | +| 47 | 21845 | 0 | 15701 | 0 | +| 47+ | 21845 | 1 | 1365 | 0 | +| 48 | 21845 | 1 | 1365 | 21845 | +| 48+ | 21845 | 1 | 3413 | 0 | +| 49 | 21845 | 1 | 3413 | 21845 | +| 49+ | 21845 | 1 | 5461 | 0 | +| 50 | 21845 | 1 | 5461 | 21845 | +| 50+ | 21845 | 1 | 7509 | 0 | +| 51 | 21845 | 1 | 7509 | 21845 | +| 51+ | 21845 | 1 | 9557 | 0 | +| 52 | 21845 | 1 | 9557 | 21845 | +| 52+ | 21845 | 1 | 11605 | 0 | +| 53 | 21845 | 1 | 11605 | 21845 | +| 53+ | 21845 | 1 | 13653 | 0 | +| 54 | 21845 | 1 | 13653 | 21845 | +| 54+ | 21845 | 1 | 15701 | 0 | +| 55 | 21845 | 1 | 15701 | 21845 | +| 55+ | 21845 | 0 | 1365 | 21845 | +| 56 | 21845 | 0 | 1365 | 21845 | +| 56 | 21845 | 0 | 3413 | 21845 | +| 56 | 21845 | 0 | 5461 | 21845 | +| 56 | 21845 | 0 | 7509 | 21845 | +| 56 | 21845 | 0 | 9557 | 21845 | +| 56 | 21845 | 0 | 11605 | 21845 | +| 56 | 21845 | 0 | 13653 | 21845 | +| 56 | 21845 | 0 | 15701 | 21845 | +| 56+ | -21846 | 1 | 1365 | 21845 | +| 57 | -21846 | 1 | 1365 | -21846 | +| 57+ | -21846 | 0 | 1365 | -21846 | +| 58 | -21846 | 0 | 1365 | -21846 | +| 58 | -21846 | 0 | 3413 | 21845 | +| 58 | -21846 | 0 | 5461 | 21845 | +| 58 | -21846 | 0 | 7509 | 21845 | +| 58 | -21846 | 0 | 9557 | 21845 | +| 58 | -21846 | 0 | 11605 | 21845 | +| 58 | -21846 | 0 | 13653 | 21845 | +| 58 | -21846 | 0 | 15701 | 21845 | +| 58+ | 21845 | 1 | 1365 | -21846 | +| 59 | 21845 | 1 | 1365 | 21845 | +| 59+ | -21846 | 1 | 3413 | 21845 | +| 60 | -21846 | 1 | 3413 | -21846 | +| 60+ | -21846 | 0 | 1365 | 21845 | +| 61 | -21846 | 0 | 1365 | 21845 | +| 61 | -21846 | 0 | 3413 | -21846 | +| 61 | -21846 | 0 | 5461 | 21845 | +| 61 | -21846 | 0 | 7509 | 21845 | +| 61 | -21846 | 0 | 9557 | 21845 | +| 61 | -21846 | 0 | 11605 | 21845 | +| 61 | -21846 | 0 | 13653 | 21845 | +| 61 | -21846 | 0 | 15701 | 21845 | +| 61+ | 21845 | 1 | 3413 | -21846 | +| 62 | 21845 | 1 | 3413 | 21845 | +| 62+ | -21846 | 1 | 5461 | 21845 | +| 63 | -21846 | 1 | 5461 | -21846 | +| 63+ | -21846 | 0 | 1365 | 21845 | +| 64 | -21846 | 0 | 1365 | 21845 | +| 64 | -21846 | 0 | 3413 | 21845 | +| 64 | -21846 | 0 | 5461 | -21846 | +| 64 | -21846 | 0 | 7509 | 21845 | +| 64 | -21846 | 0 | 9557 | 21845 | +| 64 | -21846 | 0 | 11605 | 21845 | +| 64 | -21846 | 0 | 13653 | 21845 | +| 64 | -21846 | 0 | 15701 | 21845 | +| 64+ | 21845 | 1 | 5461 | -21846 | +| 65 | 21845 | 1 | 5461 | 21845 | +| 65+ | -21846 | 1 | 7509 | 21845 | +| 66 | -21846 | 1 | 7509 | -21846 | +| 66+ | -21846 | 0 | 1365 | 21845 | +| 67 | -21846 | 0 | 1365 | 21845 | +| 67 | -21846 | 0 | 3413 | 21845 | +| 67 | -21846 | 0 | 5461 | 21845 | +| 67 | -21846 | 0 | 7509 | -21846 | +| 67 | -21846 | 0 | 9557 | 21845 | +| 67 | -21846 | 0 | 11605 | 21845 | +| 67 | -21846 | 0 | 13653 | 21845 | +| 67 | -21846 | 0 | 15701 | 21845 | +| 67+ | 21845 | 1 | 7509 | -21846 | +| 68 | 21845 | 1 | 7509 | 21845 | +| 68+ | -21846 | 1 | 9557 | 21845 | +| 69 | -21846 | 1 | 9557 | -21846 | +| 69+ | -21846 | 0 | 1365 | 21845 | +| 70 | -21846 | 0 | 1365 | 21845 | +| 70 | -21846 | 0 | 3413 | 21845 | +| 70 | -21846 | 0 | 5461 | 21845 | +| 70 | -21846 | 0 | 7509 | 21845 | +| 70 | -21846 | 0 | 9557 | -21846 | +| 70 | -21846 | 0 | 11605 | 21845 | +| 70 | -21846 | 0 | 13653 | 21845 | +| 70 | -21846 | 0 | 15701 | 21845 | +| 70+ | 21845 | 1 | 9557 | -21846 | +| 71 | 21845 | 1 | 9557 | 21845 | +| 71+ | -21846 | 1 | 11605 | 21845 | +| 72 | -21846 | 1 | 11605 | -21846 | +| 72+ | -21846 | 0 | 1365 | 21845 | +| 73 | -21846 | 0 | 1365 | 21845 | +| 73 | -21846 | 0 | 3413 | 21845 | +| 73 | -21846 | 0 | 5461 | 21845 | +| 73 | -21846 | 0 | 7509 | 21845 | +| 73 | -21846 | 0 | 9557 | 21845 | +| 73 | -21846 | 0 | 11605 | -21846 | +| 73 | -21846 | 0 | 13653 | 21845 | +| 73 | -21846 | 0 | 15701 | 21845 | +| 73+ | 21845 | 1 | 11605 | -21846 | +| 74 | 21845 | 1 | 11605 | 21845 | +| 74+ | -21846 | 1 | 13653 | 21845 | +| 75 | -21846 | 1 | 13653 | -21846 | +| 75+ | -21846 | 0 | 1365 | 21845 | +| 76 | -21846 | 0 | 1365 | 21845 | +| 76 | -21846 | 0 | 3413 | 21845 | +| 76 | -21846 | 0 | 5461 | 21845 | +| 76 | -21846 | 0 | 7509 | 21845 | +| 76 | -21846 | 0 | 9557 | 21845 | +| 76 | -21846 | 0 | 11605 | 21845 | +| 76 | -21846 | 0 | 13653 | -21846 | +| 76 | -21846 | 0 | 15701 | 21845 | +| 76+ | 21845 | 1 | 13653 | -21846 | +| 77 | 21845 | 1 | 13653 | 21845 | +| 77+ | -21846 | 1 | 15701 | 21845 | +| 78 | -21846 | 1 | 15701 | -21846 | +| 78+ | -21846 | 0 | 1365 | 21845 | +| 79 | -21846 | 0 | 1365 | 21845 | +| 79 | -21846 | 0 | 3413 | 21845 | +| 79 | -21846 | 0 | 5461 | 21845 | +| 79 | -21846 | 0 | 7509 | 21845 | +| 79 | -21846 | 0 | 9557 | 21845 | +| 79 | -21846 | 0 | 11605 | 21845 | +| 79 | -21846 | 0 | 13653 | 21845 | +| 79 | -21846 | 0 | 15701 | -21846 | +| 79+ | 21845 | 1 | 15701 | -21846 | +| 80 | 21845 | 1 | 15701 | 21845 | +| 80+ | 21845 | 0 | 1365 | 21845 | +| 81 | 21845 | 0 | 1365 | 21845 | +| 81 | 21845 | 0 | 3413 | 21845 | +| 81 | 21845 | 0 | 5461 | 21845 | +| 81 | 21845 | 0 | 7509 | 21845 | +| 81 | 21845 | 0 | 9557 | 21845 | +| 81 | 21845 | 0 | 11605 | 21845 | +| 81 | 21845 | 0 | 13653 | 21845 | +| 81 | 21845 | 0 | 15701 | 21845 | diff --git a/nand2tetris-suite/projects/03/b/RAM16K.hdl b/nand2tetris-suite/projects/03/b/RAM16K.hdl new file mode 100644 index 0000000..119a19e --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM16K.hdl @@ -0,0 +1,19 @@ +// 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/03/b/RAM16K.hdl + +/** + * Memory of 16K registers, each 16 bit-wide. Out holds the value + * stored at the memory location specified by address. If load==1, then + * the in value is loaded into the memory location specified by address + * (the loaded value will be emitted to out from the next time step onward). + */ + +CHIP RAM16K { + IN in[16], load, address[14]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/03/b/RAM16K.tst b/nand2tetris-suite/projects/03/b/RAM16K.tst new file mode 100644 index 0000000..e556ad4 --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM16K.tst @@ -0,0 +1,1026 @@ +// 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/03/b/RAM16K.tst + +load RAM16K.hdl, +output-file RAM16K.out, +compare-to RAM16K.cmp, +output-list time%S1.4.1 in%D1.6.1 load%B2.1.2 address%D2.5.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 4321, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 4321, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 12345, +set address 12345, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 4321, +eval, +output; + +set in 16383, +tick, +output; +tock, +output; + +set load 1, +set address 16383, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 12345, +eval, +output; + +set address 16383, +eval, +output; + + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +tick, +output, +tock, +output; +set address %B10101010101010, +tick, +output, +tock, +output; +set address %B10101010101011, +tick, +output, +tock, +output; +set address %B10101010101100, +tick, +output, +tock, +output; +set address %B10101010101101, +tick, +output, +tock, +output; +set address %B10101010101110, +tick, +output, +tock, +output; +set address %B10101010101111, +tick, +output, +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10101010101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + +set load 1, +set address %B10101010101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B10101010101000, +tick, +output; +tock, +output; +set address %B10101010101001, +eval, +output; +set address %B10101010101010, +eval, +output; +set address %B10101010101011, +eval, +output; +set address %B10101010101100, +eval, +output; +set address %B10101010101101, +eval, +output; +set address %B10101010101110, +eval, +output; +set address %B10101010101111, +eval, +output; + + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +tick, +output, +tock, +output; +set address %B01010101010101, +tick, +output, +tock, +output; +set address %B01110101010101, +tick, +output, +tock, +output; +set address %B10010101010101, +tick, +output, +tock, +output; +set address %B10110101010101, +tick, +output, +tock, +output; +set address %B11010101010101, +tick, +output, +tock, +output; +set address %B11110101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B00010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B00010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B00110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B00110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B01010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B01010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B01110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B01110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B10010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B10110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B10110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B11010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B11010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B11110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; + +set load 1, +set address %B11110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B00010101010101, +tick, +output; +tock, +output; +set address %B00110101010101, +eval, +output; +set address %B01010101010101, +eval, +output; +set address %B01110101010101, +eval, +output; +set address %B10010101010101, +eval, +output; +set address %B10110101010101, +eval, +output; +set address %B11010101010101, +eval, +output; +set address %B11110101010101, +eval, +output; diff --git a/nand2tetris-suite/projects/03/b/RAM4K.cmp b/nand2tetris-suite/projects/03/b/RAM4K.cmp new file mode 100644 index 0000000..a614796 --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM4K.cmp @@ -0,0 +1,320 @@ +| time | in |load |address | out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 1111 | 0 | 0 | 0 | +| 3 | 1111 | 0 | 0 | 0 | +| 3+ | 1111 | 1 | 1111 | 0 | +| 4 | 1111 | 1 | 1111 | 1111 | +| 4+ | 1111 | 0 | 0 | 0 | +| 5 | 1111 | 0 | 0 | 0 | +| 5+ | 3513 | 0 | 3513 | 0 | +| 6 | 3513 | 0 | 3513 | 0 | +| 6+ | 3513 | 1 | 3513 | 0 | +| 7 | 3513 | 1 | 3513 | 3513 | +| 7+ | 3513 | 0 | 3513 | 3513 | +| 8 | 3513 | 0 | 3513 | 3513 | +| 8 | 3513 | 0 | 1111 | 1111 | +| 8+ | 4095 | 0 | 1111 | 1111 | +| 9 | 4095 | 0 | 1111 | 1111 | +| 9+ | 4095 | 1 | 4095 | 0 | +| 10 | 4095 | 1 | 4095 | 4095 | +| 10+ | 4095 | 0 | 4095 | 4095 | +| 11 | 4095 | 0 | 4095 | 4095 | +| 11 | 4095 | 0 | 3513 | 3513 | +| 11 | 4095 | 0 | 4095 | 4095 | +| 11+ | 4095 | 0 | 2728 | 0 | +| 12 | 4095 | 0 | 2728 | 0 | +| 12 | 4095 | 0 | 2729 | 0 | +| 12 | 4095 | 0 | 2730 | 0 | +| 12 | 4095 | 0 | 2731 | 0 | +| 12 | 4095 | 0 | 2732 | 0 | +| 12 | 4095 | 0 | 2733 | 0 | +| 12 | 4095 | 0 | 2734 | 0 | +| 12 | 4095 | 0 | 2735 | 0 | +| 12+ | 21845 | 1 | 2728 | 0 | +| 13 | 21845 | 1 | 2728 | 21845 | +| 13+ | 21845 | 1 | 2729 | 0 | +| 14 | 21845 | 1 | 2729 | 21845 | +| 14+ | 21845 | 1 | 2730 | 0 | +| 15 | 21845 | 1 | 2730 | 21845 | +| 15+ | 21845 | 1 | 2731 | 0 | +| 16 | 21845 | 1 | 2731 | 21845 | +| 16+ | 21845 | 1 | 2732 | 0 | +| 17 | 21845 | 1 | 2732 | 21845 | +| 17+ | 21845 | 1 | 2733 | 0 | +| 18 | 21845 | 1 | 2733 | 21845 | +| 18+ | 21845 | 1 | 2734 | 0 | +| 19 | 21845 | 1 | 2734 | 21845 | +| 19+ | 21845 | 1 | 2735 | 0 | +| 20 | 21845 | 1 | 2735 | 21845 | +| 20+ | 21845 | 0 | 2728 | 21845 | +| 21 | 21845 | 0 | 2728 | 21845 | +| 21 | 21845 | 0 | 2729 | 21845 | +| 21 | 21845 | 0 | 2730 | 21845 | +| 21 | 21845 | 0 | 2731 | 21845 | +| 21 | 21845 | 0 | 2732 | 21845 | +| 21 | 21845 | 0 | 2733 | 21845 | +| 21 | 21845 | 0 | 2734 | 21845 | +| 21 | 21845 | 0 | 2735 | 21845 | +| 21+ | -21846 | 1 | 2728 | 21845 | +| 22 | -21846 | 1 | 2728 | -21846 | +| 22+ | -21846 | 0 | 2728 | -21846 | +| 23 | -21846 | 0 | 2728 | -21846 | +| 23 | -21846 | 0 | 2729 | 21845 | +| 23 | -21846 | 0 | 2730 | 21845 | +| 23 | -21846 | 0 | 2731 | 21845 | +| 23 | -21846 | 0 | 2732 | 21845 | +| 23 | -21846 | 0 | 2733 | 21845 | +| 23 | -21846 | 0 | 2734 | 21845 | +| 23 | -21846 | 0 | 2735 | 21845 | +| 23+ | 21845 | 1 | 2728 | -21846 | +| 24 | 21845 | 1 | 2728 | 21845 | +| 24+ | -21846 | 1 | 2729 | 21845 | +| 25 | -21846 | 1 | 2729 | -21846 | +| 25+ | -21846 | 0 | 2728 | 21845 | +| 26 | -21846 | 0 | 2728 | 21845 | +| 26 | -21846 | 0 | 2729 | -21846 | +| 26 | -21846 | 0 | 2730 | 21845 | +| 26 | -21846 | 0 | 2731 | 21845 | +| 26 | -21846 | 0 | 2732 | 21845 | +| 26 | -21846 | 0 | 2733 | 21845 | +| 26 | -21846 | 0 | 2734 | 21845 | +| 26 | -21846 | 0 | 2735 | 21845 | +| 26+ | 21845 | 1 | 2729 | -21846 | +| 27 | 21845 | 1 | 2729 | 21845 | +| 27+ | -21846 | 1 | 2730 | 21845 | +| 28 | -21846 | 1 | 2730 | -21846 | +| 28+ | -21846 | 0 | 2728 | 21845 | +| 29 | -21846 | 0 | 2728 | 21845 | +| 29 | -21846 | 0 | 2729 | 21845 | +| 29 | -21846 | 0 | 2730 | -21846 | +| 29 | -21846 | 0 | 2731 | 21845 | +| 29 | -21846 | 0 | 2732 | 21845 | +| 29 | -21846 | 0 | 2733 | 21845 | +| 29 | -21846 | 0 | 2734 | 21845 | +| 29 | -21846 | 0 | 2735 | 21845 | +| 29+ | 21845 | 1 | 2730 | -21846 | +| 30 | 21845 | 1 | 2730 | 21845 | +| 30+ | -21846 | 1 | 2731 | 21845 | +| 31 | -21846 | 1 | 2731 | -21846 | +| 31+ | -21846 | 0 | 2728 | 21845 | +| 32 | -21846 | 0 | 2728 | 21845 | +| 32 | -21846 | 0 | 2729 | 21845 | +| 32 | -21846 | 0 | 2730 | 21845 | +| 32 | -21846 | 0 | 2731 | -21846 | +| 32 | -21846 | 0 | 2732 | 21845 | +| 32 | -21846 | 0 | 2733 | 21845 | +| 32 | -21846 | 0 | 2734 | 21845 | +| 32 | -21846 | 0 | 2735 | 21845 | +| 32+ | 21845 | 1 | 2731 | -21846 | +| 33 | 21845 | 1 | 2731 | 21845 | +| 33+ | -21846 | 1 | 2732 | 21845 | +| 34 | -21846 | 1 | 2732 | -21846 | +| 34+ | -21846 | 0 | 2728 | 21845 | +| 35 | -21846 | 0 | 2728 | 21845 | +| 35 | -21846 | 0 | 2729 | 21845 | +| 35 | -21846 | 0 | 2730 | 21845 | +| 35 | -21846 | 0 | 2731 | 21845 | +| 35 | -21846 | 0 | 2732 | -21846 | +| 35 | -21846 | 0 | 2733 | 21845 | +| 35 | -21846 | 0 | 2734 | 21845 | +| 35 | -21846 | 0 | 2735 | 21845 | +| 35+ | 21845 | 1 | 2732 | -21846 | +| 36 | 21845 | 1 | 2732 | 21845 | +| 36+ | -21846 | 1 | 2733 | 21845 | +| 37 | -21846 | 1 | 2733 | -21846 | +| 37+ | -21846 | 0 | 2728 | 21845 | +| 38 | -21846 | 0 | 2728 | 21845 | +| 38 | -21846 | 0 | 2729 | 21845 | +| 38 | -21846 | 0 | 2730 | 21845 | +| 38 | -21846 | 0 | 2731 | 21845 | +| 38 | -21846 | 0 | 2732 | 21845 | +| 38 | -21846 | 0 | 2733 | -21846 | +| 38 | -21846 | 0 | 2734 | 21845 | +| 38 | -21846 | 0 | 2735 | 21845 | +| 38+ | 21845 | 1 | 2733 | -21846 | +| 39 | 21845 | 1 | 2733 | 21845 | +| 39+ | -21846 | 1 | 2734 | 21845 | +| 40 | -21846 | 1 | 2734 | -21846 | +| 40+ | -21846 | 0 | 2728 | 21845 | +| 41 | -21846 | 0 | 2728 | 21845 | +| 41 | -21846 | 0 | 2729 | 21845 | +| 41 | -21846 | 0 | 2730 | 21845 | +| 41 | -21846 | 0 | 2731 | 21845 | +| 41 | -21846 | 0 | 2732 | 21845 | +| 41 | -21846 | 0 | 2733 | 21845 | +| 41 | -21846 | 0 | 2734 | -21846 | +| 41 | -21846 | 0 | 2735 | 21845 | +| 41+ | 21845 | 1 | 2734 | -21846 | +| 42 | 21845 | 1 | 2734 | 21845 | +| 42+ | -21846 | 1 | 2735 | 21845 | +| 43 | -21846 | 1 | 2735 | -21846 | +| 43+ | -21846 | 0 | 2728 | 21845 | +| 44 | -21846 | 0 | 2728 | 21845 | +| 44 | -21846 | 0 | 2729 | 21845 | +| 44 | -21846 | 0 | 2730 | 21845 | +| 44 | -21846 | 0 | 2731 | 21845 | +| 44 | -21846 | 0 | 2732 | 21845 | +| 44 | -21846 | 0 | 2733 | 21845 | +| 44 | -21846 | 0 | 2734 | 21845 | +| 44 | -21846 | 0 | 2735 | -21846 | +| 44+ | 21845 | 1 | 2735 | -21846 | +| 45 | 21845 | 1 | 2735 | 21845 | +| 45+ | 21845 | 0 | 2728 | 21845 | +| 46 | 21845 | 0 | 2728 | 21845 | +| 46 | 21845 | 0 | 2729 | 21845 | +| 46 | 21845 | 0 | 2730 | 21845 | +| 46 | 21845 | 0 | 2731 | 21845 | +| 46 | 21845 | 0 | 2732 | 21845 | +| 46 | 21845 | 0 | 2733 | 21845 | +| 46 | 21845 | 0 | 2734 | 21845 | +| 46 | 21845 | 0 | 2735 | 21845 | +| 46+ | 21845 | 0 | 341 | 0 | +| 47 | 21845 | 0 | 341 | 0 | +| 47 | 21845 | 0 | 853 | 0 | +| 47 | 21845 | 0 | 1365 | 0 | +| 47 | 21845 | 0 | 1877 | 0 | +| 47 | 21845 | 0 | 2389 | 0 | +| 47 | 21845 | 0 | 2901 | 0 | +| 47 | 21845 | 0 | 3413 | 0 | +| 47 | 21845 | 0 | 3925 | 0 | +| 47+ | 21845 | 1 | 341 | 0 | +| 48 | 21845 | 1 | 341 | 21845 | +| 48+ | 21845 | 1 | 853 | 0 | +| 49 | 21845 | 1 | 853 | 21845 | +| 49+ | 21845 | 1 | 1365 | 0 | +| 50 | 21845 | 1 | 1365 | 21845 | +| 50+ | 21845 | 1 | 1877 | 0 | +| 51 | 21845 | 1 | 1877 | 21845 | +| 51+ | 21845 | 1 | 2389 | 0 | +| 52 | 21845 | 1 | 2389 | 21845 | +| 52+ | 21845 | 1 | 2901 | 0 | +| 53 | 21845 | 1 | 2901 | 21845 | +| 53+ | 21845 | 1 | 3413 | 0 | +| 54 | 21845 | 1 | 3413 | 21845 | +| 54+ | 21845 | 1 | 3925 | 0 | +| 55 | 21845 | 1 | 3925 | 21845 | +| 55+ | 21845 | 0 | 341 | 21845 | +| 56 | 21845 | 0 | 341 | 21845 | +| 56 | 21845 | 0 | 853 | 21845 | +| 56 | 21845 | 0 | 1365 | 21845 | +| 56 | 21845 | 0 | 1877 | 21845 | +| 56 | 21845 | 0 | 2389 | 21845 | +| 56 | 21845 | 0 | 2901 | 21845 | +| 56 | 21845 | 0 | 3413 | 21845 | +| 56 | 21845 | 0 | 3925 | 21845 | +| 56+ | -21846 | 1 | 341 | 21845 | +| 57 | -21846 | 1 | 341 | -21846 | +| 57+ | -21846 | 0 | 341 | -21846 | +| 58 | -21846 | 0 | 341 | -21846 | +| 58 | -21846 | 0 | 853 | 21845 | +| 58 | -21846 | 0 | 1365 | 21845 | +| 58 | -21846 | 0 | 1877 | 21845 | +| 58 | -21846 | 0 | 2389 | 21845 | +| 58 | -21846 | 0 | 2901 | 21845 | +| 58 | -21846 | 0 | 3413 | 21845 | +| 58 | -21846 | 0 | 3925 | 21845 | +| 58+ | 21845 | 1 | 341 | -21846 | +| 59 | 21845 | 1 | 341 | 21845 | +| 59+ | -21846 | 1 | 853 | 21845 | +| 60 | -21846 | 1 | 853 | -21846 | +| 60+ | -21846 | 0 | 341 | 21845 | +| 61 | -21846 | 0 | 341 | 21845 | +| 61 | -21846 | 0 | 853 | -21846 | +| 61 | -21846 | 0 | 1365 | 21845 | +| 61 | -21846 | 0 | 1877 | 21845 | +| 61 | -21846 | 0 | 2389 | 21845 | +| 61 | -21846 | 0 | 2901 | 21845 | +| 61 | -21846 | 0 | 3413 | 21845 | +| 61 | -21846 | 0 | 3925 | 21845 | +| 61+ | 21845 | 1 | 853 | -21846 | +| 62 | 21845 | 1 | 853 | 21845 | +| 62+ | -21846 | 1 | 1365 | 21845 | +| 63 | -21846 | 1 | 1365 | -21846 | +| 63+ | -21846 | 0 | 341 | 21845 | +| 64 | -21846 | 0 | 341 | 21845 | +| 64 | -21846 | 0 | 853 | 21845 | +| 64 | -21846 | 0 | 1365 | -21846 | +| 64 | -21846 | 0 | 1877 | 21845 | +| 64 | -21846 | 0 | 2389 | 21845 | +| 64 | -21846 | 0 | 2901 | 21845 | +| 64 | -21846 | 0 | 3413 | 21845 | +| 64 | -21846 | 0 | 3925 | 21845 | +| 64+ | 21845 | 1 | 1365 | -21846 | +| 65 | 21845 | 1 | 1365 | 21845 | +| 65+ | -21846 | 1 | 1877 | 21845 | +| 66 | -21846 | 1 | 1877 | -21846 | +| 66+ | -21846 | 0 | 341 | 21845 | +| 67 | -21846 | 0 | 341 | 21845 | +| 67 | -21846 | 0 | 853 | 21845 | +| 67 | -21846 | 0 | 1365 | 21845 | +| 67 | -21846 | 0 | 1877 | -21846 | +| 67 | -21846 | 0 | 2389 | 21845 | +| 67 | -21846 | 0 | 2901 | 21845 | +| 67 | -21846 | 0 | 3413 | 21845 | +| 67 | -21846 | 0 | 3925 | 21845 | +| 67+ | 21845 | 1 | 1877 | -21846 | +| 68 | 21845 | 1 | 1877 | 21845 | +| 68+ | -21846 | 1 | 2389 | 21845 | +| 69 | -21846 | 1 | 2389 | -21846 | +| 69+ | -21846 | 0 | 341 | 21845 | +| 70 | -21846 | 0 | 341 | 21845 | +| 70 | -21846 | 0 | 853 | 21845 | +| 70 | -21846 | 0 | 1365 | 21845 | +| 70 | -21846 | 0 | 1877 | 21845 | +| 70 | -21846 | 0 | 2389 | -21846 | +| 70 | -21846 | 0 | 2901 | 21845 | +| 70 | -21846 | 0 | 3413 | 21845 | +| 70 | -21846 | 0 | 3925 | 21845 | +| 70+ | 21845 | 1 | 2389 | -21846 | +| 71 | 21845 | 1 | 2389 | 21845 | +| 71+ | -21846 | 1 | 2901 | 21845 | +| 72 | -21846 | 1 | 2901 | -21846 | +| 72+ | -21846 | 0 | 341 | 21845 | +| 73 | -21846 | 0 | 341 | 21845 | +| 73 | -21846 | 0 | 853 | 21845 | +| 73 | -21846 | 0 | 1365 | 21845 | +| 73 | -21846 | 0 | 1877 | 21845 | +| 73 | -21846 | 0 | 2389 | 21845 | +| 73 | -21846 | 0 | 2901 | -21846 | +| 73 | -21846 | 0 | 3413 | 21845 | +| 73 | -21846 | 0 | 3925 | 21845 | +| 73+ | 21845 | 1 | 2901 | -21846 | +| 74 | 21845 | 1 | 2901 | 21845 | +| 74+ | -21846 | 1 | 3413 | 21845 | +| 75 | -21846 | 1 | 3413 | -21846 | +| 75+ | -21846 | 0 | 341 | 21845 | +| 76 | -21846 | 0 | 341 | 21845 | +| 76 | -21846 | 0 | 853 | 21845 | +| 76 | -21846 | 0 | 1365 | 21845 | +| 76 | -21846 | 0 | 1877 | 21845 | +| 76 | -21846 | 0 | 2389 | 21845 | +| 76 | -21846 | 0 | 2901 | 21845 | +| 76 | -21846 | 0 | 3413 | -21846 | +| 76 | -21846 | 0 | 3925 | 21845 | +| 76+ | 21845 | 1 | 3413 | -21846 | +| 77 | 21845 | 1 | 3413 | 21845 | +| 77+ | -21846 | 1 | 3925 | 21845 | +| 78 | -21846 | 1 | 3925 | -21846 | +| 78+ | -21846 | 0 | 341 | 21845 | +| 79 | -21846 | 0 | 341 | 21845 | +| 79 | -21846 | 0 | 853 | 21845 | +| 79 | -21846 | 0 | 1365 | 21845 | +| 79 | -21846 | 0 | 1877 | 21845 | +| 79 | -21846 | 0 | 2389 | 21845 | +| 79 | -21846 | 0 | 2901 | 21845 | +| 79 | -21846 | 0 | 3413 | 21845 | +| 79 | -21846 | 0 | 3925 | -21846 | +| 79+ | 21845 | 1 | 3925 | -21846 | +| 80 | 21845 | 1 | 3925 | 21845 | +| 80+ | 21845 | 0 | 341 | 21845 | +| 81 | 21845 | 0 | 341 | 21845 | +| 81 | 21845 | 0 | 853 | 21845 | +| 81 | 21845 | 0 | 1365 | 21845 | +| 81 | 21845 | 0 | 1877 | 21845 | +| 81 | 21845 | 0 | 2389 | 21845 | +| 81 | 21845 | 0 | 2901 | 21845 | +| 81 | 21845 | 0 | 3413 | 21845 | +| 81 | 21845 | 0 | 3925 | 21845 | diff --git a/nand2tetris-suite/projects/03/b/RAM4K.hdl b/nand2tetris-suite/projects/03/b/RAM4K.hdl new file mode 100644 index 0000000..1cee633 --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM4K.hdl @@ -0,0 +1,19 @@ +// 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/03/b/RAM4K.hdl + +/** + * Memory of 4K registers, each 16 bit-wide. Out holds the value + * stored at the memory location specified by address. If load==1, then + * the in value is loaded into the memory location specified by address + * (the loaded value will be emitted to out from the next time step onward). + */ + +CHIP RAM4K { + IN in[16], load, address[12]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/03/b/RAM4K.tst b/nand2tetris-suite/projects/03/b/RAM4K.tst new file mode 100644 index 0000000..7a5aa12 --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM4K.tst @@ -0,0 +1,1026 @@ +// 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/03/b/RAM4K.tst + +load RAM4K.hdl, +output-file RAM4K.out, +compare-to RAM4K.cmp, +output-list time%S1.4.1 in%D1.6.1 load%B2.1.2 address%D2.4.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 1111, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 1111, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 3513, +set address 3513, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 1111, +eval, +output; + +set in 4095, +tick, +output; +tock, +output; + +set load 1, +set address 4095, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 3513, +eval, +output; + +set address 4095, +eval, +output; + + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +tick, +output, +tock, +output; +set address %B101010101010, +tick, +output, +tock, +output; +set address %B101010101011, +tick, +output, +tock, +output; +set address %B101010101100, +tick, +output, +tock, +output; +set address %B101010101101, +tick, +output, +tock, +output; +set address %B101010101110, +tick, +output, +tock, +output; +set address %B101010101111, +tick, +output, +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101010101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + +set load 1, +set address %B101010101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B101010101000, +tick, +output; +tock, +output; +set address %B101010101001, +eval, +output; +set address %B101010101010, +eval, +output; +set address %B101010101011, +eval, +output; +set address %B101010101100, +eval, +output; +set address %B101010101101, +eval, +output; +set address %B101010101110, +eval, +output; +set address %B101010101111, +eval, +output; + + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +tick, +output, +tock, +output; +set address %B010101010101, +tick, +output, +tock, +output; +set address %B011101010101, +tick, +output, +tock, +output; +set address %B100101010101, +tick, +output, +tock, +output; +set address %B101101010101, +tick, +output, +tock, +output; +set address %B110101010101, +tick, +output, +tock, +output; +set address %B111101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B000101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B000101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B001101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B001101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B010101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B011101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B011101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B100101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B100101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B101101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B110101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B110101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B111101010101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; + +set load 1, +set address %B111101010101, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010101, +tick, +output; +tock, +output; +set address %B001101010101, +eval, +output; +set address %B010101010101, +eval, +output; +set address %B011101010101, +eval, +output; +set address %B100101010101, +eval, +output; +set address %B101101010101, +eval, +output; +set address %B110101010101, +eval, +output; +set address %B111101010101, +eval, +output; diff --git a/nand2tetris-suite/projects/03/b/RAM512.cmp b/nand2tetris-suite/projects/03/b/RAM512.cmp new file mode 100644 index 0000000..6f756ca --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM512.cmp @@ -0,0 +1,320 @@ +| time | in |load |address| out | +| 0+ | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 1+ | 0 | 1 | 0 | 0 | +| 2 | 0 | 1 | 0 | 0 | +| 2+ | 13099 | 0 | 0 | 0 | +| 3 | 13099 | 0 | 0 | 0 | +| 3+ | 13099 | 1 | 130 | 0 | +| 4 | 13099 | 1 | 130 | 13099 | +| 4+ | 13099 | 0 | 0 | 0 | +| 5 | 13099 | 0 | 0 | 0 | +| 5+ | 4729 | 0 | 472 | 0 | +| 6 | 4729 | 0 | 472 | 0 | +| 6+ | 4729 | 1 | 472 | 0 | +| 7 | 4729 | 1 | 472 | 4729 | +| 7+ | 4729 | 0 | 472 | 4729 | +| 8 | 4729 | 0 | 472 | 4729 | +| 8 | 4729 | 0 | 130 | 13099 | +| 8+ | 5119 | 0 | 130 | 13099 | +| 9 | 5119 | 0 | 130 | 13099 | +| 9+ | 5119 | 1 | 511 | 0 | +| 10 | 5119 | 1 | 511 | 5119 | +| 10+ | 5119 | 0 | 511 | 5119 | +| 11 | 5119 | 0 | 511 | 5119 | +| 11 | 5119 | 0 | 472 | 4729 | +| 11 | 5119 | 0 | 511 | 5119 | +| 11+ | 5119 | 0 | 168 | 0 | +| 12 | 5119 | 0 | 168 | 0 | +| 12 | 5119 | 0 | 169 | 0 | +| 12 | 5119 | 0 | 170 | 0 | +| 12 | 5119 | 0 | 171 | 0 | +| 12 | 5119 | 0 | 172 | 0 | +| 12 | 5119 | 0 | 173 | 0 | +| 12 | 5119 | 0 | 174 | 0 | +| 12 | 5119 | 0 | 175 | 0 | +| 12+ | 21845 | 1 | 168 | 0 | +| 13 | 21845 | 1 | 168 | 21845 | +| 13+ | 21845 | 1 | 169 | 0 | +| 14 | 21845 | 1 | 169 | 21845 | +| 14+ | 21845 | 1 | 170 | 0 | +| 15 | 21845 | 1 | 170 | 21845 | +| 15+ | 21845 | 1 | 171 | 0 | +| 16 | 21845 | 1 | 171 | 21845 | +| 16+ | 21845 | 1 | 172 | 0 | +| 17 | 21845 | 1 | 172 | 21845 | +| 17+ | 21845 | 1 | 173 | 0 | +| 18 | 21845 | 1 | 173 | 21845 | +| 18+ | 21845 | 1 | 174 | 0 | +| 19 | 21845 | 1 | 174 | 21845 | +| 19+ | 21845 | 1 | 175 | 0 | +| 20 | 21845 | 1 | 175 | 21845 | +| 20+ | 21845 | 0 | 168 | 21845 | +| 21 | 21845 | 0 | 168 | 21845 | +| 21 | 21845 | 0 | 169 | 21845 | +| 21 | 21845 | 0 | 170 | 21845 | +| 21 | 21845 | 0 | 171 | 21845 | +| 21 | 21845 | 0 | 172 | 21845 | +| 21 | 21845 | 0 | 173 | 21845 | +| 21 | 21845 | 0 | 174 | 21845 | +| 21 | 21845 | 0 | 175 | 21845 | +| 21+ | -21846 | 1 | 168 | 21845 | +| 22 | -21846 | 1 | 168 | -21846 | +| 22+ | -21846 | 0 | 168 | -21846 | +| 23 | -21846 | 0 | 168 | -21846 | +| 23 | -21846 | 0 | 169 | 21845 | +| 23 | -21846 | 0 | 170 | 21845 | +| 23 | -21846 | 0 | 171 | 21845 | +| 23 | -21846 | 0 | 172 | 21845 | +| 23 | -21846 | 0 | 173 | 21845 | +| 23 | -21846 | 0 | 174 | 21845 | +| 23 | -21846 | 0 | 175 | 21845 | +| 23+ | 21845 | 1 | 168 | -21846 | +| 24 | 21845 | 1 | 168 | 21845 | +| 24+ | -21846 | 1 | 169 | 21845 | +| 25 | -21846 | 1 | 169 | -21846 | +| 25+ | -21846 | 0 | 168 | 21845 | +| 26 | -21846 | 0 | 168 | 21845 | +| 26 | -21846 | 0 | 169 | -21846 | +| 26 | -21846 | 0 | 170 | 21845 | +| 26 | -21846 | 0 | 171 | 21845 | +| 26 | -21846 | 0 | 172 | 21845 | +| 26 | -21846 | 0 | 173 | 21845 | +| 26 | -21846 | 0 | 174 | 21845 | +| 26 | -21846 | 0 | 175 | 21845 | +| 26+ | 21845 | 1 | 169 | -21846 | +| 27 | 21845 | 1 | 169 | 21845 | +| 27+ | -21846 | 1 | 170 | 21845 | +| 28 | -21846 | 1 | 170 | -21846 | +| 28+ | -21846 | 0 | 168 | 21845 | +| 29 | -21846 | 0 | 168 | 21845 | +| 29 | -21846 | 0 | 169 | 21845 | +| 29 | -21846 | 0 | 170 | -21846 | +| 29 | -21846 | 0 | 171 | 21845 | +| 29 | -21846 | 0 | 172 | 21845 | +| 29 | -21846 | 0 | 173 | 21845 | +| 29 | -21846 | 0 | 174 | 21845 | +| 29 | -21846 | 0 | 175 | 21845 | +| 29+ | 21845 | 1 | 170 | -21846 | +| 30 | 21845 | 1 | 170 | 21845 | +| 30+ | -21846 | 1 | 171 | 21845 | +| 31 | -21846 | 1 | 171 | -21846 | +| 31+ | -21846 | 0 | 168 | 21845 | +| 32 | -21846 | 0 | 168 | 21845 | +| 32 | -21846 | 0 | 169 | 21845 | +| 32 | -21846 | 0 | 170 | 21845 | +| 32 | -21846 | 0 | 171 | -21846 | +| 32 | -21846 | 0 | 172 | 21845 | +| 32 | -21846 | 0 | 173 | 21845 | +| 32 | -21846 | 0 | 174 | 21845 | +| 32 | -21846 | 0 | 175 | 21845 | +| 32+ | 21845 | 1 | 171 | -21846 | +| 33 | 21845 | 1 | 171 | 21845 | +| 33+ | -21846 | 1 | 172 | 21845 | +| 34 | -21846 | 1 | 172 | -21846 | +| 34+ | -21846 | 0 | 168 | 21845 | +| 35 | -21846 | 0 | 168 | 21845 | +| 35 | -21846 | 0 | 169 | 21845 | +| 35 | -21846 | 0 | 170 | 21845 | +| 35 | -21846 | 0 | 171 | 21845 | +| 35 | -21846 | 0 | 172 | -21846 | +| 35 | -21846 | 0 | 173 | 21845 | +| 35 | -21846 | 0 | 174 | 21845 | +| 35 | -21846 | 0 | 175 | 21845 | +| 35+ | 21845 | 1 | 172 | -21846 | +| 36 | 21845 | 1 | 172 | 21845 | +| 36+ | -21846 | 1 | 173 | 21845 | +| 37 | -21846 | 1 | 173 | -21846 | +| 37+ | -21846 | 0 | 168 | 21845 | +| 38 | -21846 | 0 | 168 | 21845 | +| 38 | -21846 | 0 | 169 | 21845 | +| 38 | -21846 | 0 | 170 | 21845 | +| 38 | -21846 | 0 | 171 | 21845 | +| 38 | -21846 | 0 | 172 | 21845 | +| 38 | -21846 | 0 | 173 | -21846 | +| 38 | -21846 | 0 | 174 | 21845 | +| 38 | -21846 | 0 | 175 | 21845 | +| 38+ | 21845 | 1 | 173 | -21846 | +| 39 | 21845 | 1 | 173 | 21845 | +| 39+ | -21846 | 1 | 174 | 21845 | +| 40 | -21846 | 1 | 174 | -21846 | +| 40+ | -21846 | 0 | 168 | 21845 | +| 41 | -21846 | 0 | 168 | 21845 | +| 41 | -21846 | 0 | 169 | 21845 | +| 41 | -21846 | 0 | 170 | 21845 | +| 41 | -21846 | 0 | 171 | 21845 | +| 41 | -21846 | 0 | 172 | 21845 | +| 41 | -21846 | 0 | 173 | 21845 | +| 41 | -21846 | 0 | 174 | -21846 | +| 41 | -21846 | 0 | 175 | 21845 | +| 41+ | 21845 | 1 | 174 | -21846 | +| 42 | 21845 | 1 | 174 | 21845 | +| 42+ | -21846 | 1 | 175 | 21845 | +| 43 | -21846 | 1 | 175 | -21846 | +| 43+ | -21846 | 0 | 168 | 21845 | +| 44 | -21846 | 0 | 168 | 21845 | +| 44 | -21846 | 0 | 169 | 21845 | +| 44 | -21846 | 0 | 170 | 21845 | +| 44 | -21846 | 0 | 171 | 21845 | +| 44 | -21846 | 0 | 172 | 21845 | +| 44 | -21846 | 0 | 173 | 21845 | +| 44 | -21846 | 0 | 174 | 21845 | +| 44 | -21846 | 0 | 175 | -21846 | +| 44+ | 21845 | 1 | 175 | -21846 | +| 45 | 21845 | 1 | 175 | 21845 | +| 45+ | 21845 | 0 | 168 | 21845 | +| 46 | 21845 | 0 | 168 | 21845 | +| 46 | 21845 | 0 | 169 | 21845 | +| 46 | 21845 | 0 | 170 | 21845 | +| 46 | 21845 | 0 | 171 | 21845 | +| 46 | 21845 | 0 | 172 | 21845 | +| 46 | 21845 | 0 | 173 | 21845 | +| 46 | 21845 | 0 | 174 | 21845 | +| 46 | 21845 | 0 | 175 | 21845 | +| 46+ | 21845 | 0 | 42 | 0 | +| 47 | 21845 | 0 | 42 | 0 | +| 47 | 21845 | 0 | 106 | 0 | +| 47 | 21845 | 0 | 170 | 21845 | +| 47 | 21845 | 0 | 234 | 0 | +| 47 | 21845 | 0 | 298 | 0 | +| 47 | 21845 | 0 | 362 | 0 | +| 47 | 21845 | 0 | 426 | 0 | +| 47 | 21845 | 0 | 490 | 0 | +| 47+ | 21845 | 1 | 42 | 0 | +| 48 | 21845 | 1 | 42 | 21845 | +| 48+ | 21845 | 1 | 106 | 0 | +| 49 | 21845 | 1 | 106 | 21845 | +| 49+ | 21845 | 1 | 170 | 21845 | +| 50 | 21845 | 1 | 170 | 21845 | +| 50+ | 21845 | 1 | 234 | 0 | +| 51 | 21845 | 1 | 234 | 21845 | +| 51+ | 21845 | 1 | 298 | 0 | +| 52 | 21845 | 1 | 298 | 21845 | +| 52+ | 21845 | 1 | 362 | 0 | +| 53 | 21845 | 1 | 362 | 21845 | +| 53+ | 21845 | 1 | 426 | 0 | +| 54 | 21845 | 1 | 426 | 21845 | +| 54+ | 21845 | 1 | 490 | 0 | +| 55 | 21845 | 1 | 490 | 21845 | +| 55+ | 21845 | 0 | 42 | 21845 | +| 56 | 21845 | 0 | 42 | 21845 | +| 56 | 21845 | 0 | 106 | 21845 | +| 56 | 21845 | 0 | 170 | 21845 | +| 56 | 21845 | 0 | 234 | 21845 | +| 56 | 21845 | 0 | 298 | 21845 | +| 56 | 21845 | 0 | 362 | 21845 | +| 56 | 21845 | 0 | 426 | 21845 | +| 56 | 21845 | 0 | 490 | 21845 | +| 56+ | -21846 | 1 | 42 | 21845 | +| 57 | -21846 | 1 | 42 | -21846 | +| 57+ | -21846 | 0 | 42 | -21846 | +| 58 | -21846 | 0 | 42 | -21846 | +| 58 | -21846 | 0 | 106 | 21845 | +| 58 | -21846 | 0 | 170 | 21845 | +| 58 | -21846 | 0 | 234 | 21845 | +| 58 | -21846 | 0 | 298 | 21845 | +| 58 | -21846 | 0 | 362 | 21845 | +| 58 | -21846 | 0 | 426 | 21845 | +| 58 | -21846 | 0 | 490 | 21845 | +| 58+ | 21845 | 1 | 42 | -21846 | +| 59 | 21845 | 1 | 42 | 21845 | +| 59+ | -21846 | 1 | 106 | 21845 | +| 60 | -21846 | 1 | 106 | -21846 | +| 60+ | -21846 | 0 | 42 | 21845 | +| 61 | -21846 | 0 | 42 | 21845 | +| 61 | -21846 | 0 | 106 | -21846 | +| 61 | -21846 | 0 | 170 | 21845 | +| 61 | -21846 | 0 | 234 | 21845 | +| 61 | -21846 | 0 | 298 | 21845 | +| 61 | -21846 | 0 | 362 | 21845 | +| 61 | -21846 | 0 | 426 | 21845 | +| 61 | -21846 | 0 | 490 | 21845 | +| 61+ | 21845 | 1 | 106 | -21846 | +| 62 | 21845 | 1 | 106 | 21845 | +| 62+ | -21846 | 1 | 170 | 21845 | +| 63 | -21846 | 1 | 170 | -21846 | +| 63+ | -21846 | 0 | 42 | 21845 | +| 64 | -21846 | 0 | 42 | 21845 | +| 64 | -21846 | 0 | 106 | 21845 | +| 64 | -21846 | 0 | 170 | -21846 | +| 64 | -21846 | 0 | 234 | 21845 | +| 64 | -21846 | 0 | 298 | 21845 | +| 64 | -21846 | 0 | 362 | 21845 | +| 64 | -21846 | 0 | 426 | 21845 | +| 64 | -21846 | 0 | 490 | 21845 | +| 64+ | 21845 | 1 | 170 | -21846 | +| 65 | 21845 | 1 | 170 | 21845 | +| 65+ | -21846 | 1 | 234 | 21845 | +| 66 | -21846 | 1 | 234 | -21846 | +| 66+ | -21846 | 0 | 42 | 21845 | +| 67 | -21846 | 0 | 42 | 21845 | +| 67 | -21846 | 0 | 106 | 21845 | +| 67 | -21846 | 0 | 170 | 21845 | +| 67 | -21846 | 0 | 234 | -21846 | +| 67 | -21846 | 0 | 298 | 21845 | +| 67 | -21846 | 0 | 362 | 21845 | +| 67 | -21846 | 0 | 426 | 21845 | +| 67 | -21846 | 0 | 490 | 21845 | +| 67+ | 21845 | 1 | 234 | -21846 | +| 68 | 21845 | 1 | 234 | 21845 | +| 68+ | -21846 | 1 | 298 | 21845 | +| 69 | -21846 | 1 | 298 | -21846 | +| 69+ | -21846 | 0 | 42 | 21845 | +| 70 | -21846 | 0 | 42 | 21845 | +| 70 | -21846 | 0 | 106 | 21845 | +| 70 | -21846 | 0 | 170 | 21845 | +| 70 | -21846 | 0 | 234 | 21845 | +| 70 | -21846 | 0 | 298 | -21846 | +| 70 | -21846 | 0 | 362 | 21845 | +| 70 | -21846 | 0 | 426 | 21845 | +| 70 | -21846 | 0 | 490 | 21845 | +| 70+ | 21845 | 1 | 298 | -21846 | +| 71 | 21845 | 1 | 298 | 21845 | +| 71+ | -21846 | 1 | 362 | 21845 | +| 72 | -21846 | 1 | 362 | -21846 | +| 72+ | -21846 | 0 | 42 | 21845 | +| 73 | -21846 | 0 | 42 | 21845 | +| 73 | -21846 | 0 | 106 | 21845 | +| 73 | -21846 | 0 | 170 | 21845 | +| 73 | -21846 | 0 | 234 | 21845 | +| 73 | -21846 | 0 | 298 | 21845 | +| 73 | -21846 | 0 | 362 | -21846 | +| 73 | -21846 | 0 | 426 | 21845 | +| 73 | -21846 | 0 | 490 | 21845 | +| 73+ | 21845 | 1 | 362 | -21846 | +| 74 | 21845 | 1 | 362 | 21845 | +| 74+ | -21846 | 1 | 426 | 21845 | +| 75 | -21846 | 1 | 426 | -21846 | +| 75+ | -21846 | 0 | 42 | 21845 | +| 76 | -21846 | 0 | 42 | 21845 | +| 76 | -21846 | 0 | 106 | 21845 | +| 76 | -21846 | 0 | 170 | 21845 | +| 76 | -21846 | 0 | 234 | 21845 | +| 76 | -21846 | 0 | 298 | 21845 | +| 76 | -21846 | 0 | 362 | 21845 | +| 76 | -21846 | 0 | 426 | -21846 | +| 76 | -21846 | 0 | 490 | 21845 | +| 76+ | 21845 | 1 | 426 | -21846 | +| 77 | 21845 | 1 | 426 | 21845 | +| 77+ | -21846 | 1 | 490 | 21845 | +| 78 | -21846 | 1 | 490 | -21846 | +| 78+ | -21846 | 0 | 42 | 21845 | +| 79 | -21846 | 0 | 42 | 21845 | +| 79 | -21846 | 0 | 106 | 21845 | +| 79 | -21846 | 0 | 170 | 21845 | +| 79 | -21846 | 0 | 234 | 21845 | +| 79 | -21846 | 0 | 298 | 21845 | +| 79 | -21846 | 0 | 362 | 21845 | +| 79 | -21846 | 0 | 426 | 21845 | +| 79 | -21846 | 0 | 490 | -21846 | +| 79+ | 21845 | 1 | 490 | -21846 | +| 80 | 21845 | 1 | 490 | 21845 | +| 80+ | 21845 | 0 | 42 | 21845 | +| 81 | 21845 | 0 | 42 | 21845 | +| 81 | 21845 | 0 | 106 | 21845 | +| 81 | 21845 | 0 | 170 | 21845 | +| 81 | 21845 | 0 | 234 | 21845 | +| 81 | 21845 | 0 | 298 | 21845 | +| 81 | 21845 | 0 | 362 | 21845 | +| 81 | 21845 | 0 | 426 | 21845 | +| 81 | 21845 | 0 | 490 | 21845 | diff --git a/nand2tetris-suite/projects/03/b/RAM512.hdl b/nand2tetris-suite/projects/03/b/RAM512.hdl new file mode 100644 index 0000000..6c40f28 --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM512.hdl @@ -0,0 +1,19 @@ +// This file is part of the materials accompanying the book +// "The Elements of Computing Systems" by Nisan and Schocken, +// MIT Press. Book site: www.idc.ac.il/tecs +// File name: projects/03/b/RAM512.hdl + +/** + * Memory of 512 registers, each 16 bit-wide. Out holds the value + * stored at the memory location specified by address. If load==1, then + * the in value is loaded into the memory location specified by address + * (the loaded value will be emitted to out from the next time step onward). + */ + +CHIP RAM512 { + IN in[16], load, address[9]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/03/b/RAM512.tst b/nand2tetris-suite/projects/03/b/RAM512.tst new file mode 100644 index 0000000..4ec6fc2 --- /dev/null +++ b/nand2tetris-suite/projects/03/b/RAM512.tst @@ -0,0 +1,1027 @@ +// 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/03/b/RAM512.tst + +load RAM512.hdl, +output-file RAM512.out, +compare-to RAM512.cmp, +output-list time%S1.4.1 in%D1.6.1 load%B2.1.2 address%D2.3.2 out%D1.6.1; + +set in 0, +set load 0, +set address 0, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set in 13099, +set load 0, +tick, +output; +tock, +output; + +set load 1, +set address 130, +tick, +output; +tock, +output; + +set load 0, +set address 0, +tick, +output; +tock, +output; + +set in 4729, +set address 472, +tick, +output; +tock, +output; + +set load 1, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 130, +eval, +output; + +set in 5119, +tick, +output; +tock, +output; + +set load 1, +set address 511, +tick, +output; +tock, +output; + +set load 0, +tick, +output; +tock, +output; + +set address 472, +eval, +output; + +set address 511, +eval, +output; + + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +tick, +output, +tock, +output; +set address %B010101010, +tick, +output, +tock, +output; +set address %B010101011, +tick, +output, +tock, +output; +set address %B010101100, +tick, +output, +tock, +output; +set address %B010101101, +tick, +output, +tock, +output; +set address %B010101110, +tick, +output, +tock, +output; +set address %B010101111, +tick, +output, +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101000, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101000, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101001, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101001, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101011, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101011, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101100, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101100, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101101, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101101, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101110, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101110, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101111, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + +set load 1, +set address %B010101111, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B010101000, +tick, +output; +tock, +output; +set address %B010101001, +eval, +output; +set address %B010101010, +eval, +output; +set address %B010101011, +eval, +output; +set address %B010101100, +eval, +output; +set address %B010101101, +eval, +output; +set address %B010101110, +eval, +output; +set address %B010101111, +eval, +output; + + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set in %B0101010101010101, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +tick, +output, +tock, +output; +set address %B010101010, +tick, +output, +tock, +output; +set address %B011101010, +tick, +output, +tock, +output; +set address %B100101010, +tick, +output, +tock, +output; +set address %B101101010, +tick, +output, +tock, +output; +set address %B110101010, +tick, +output, +tock, +output; +set address %B111101010, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B000101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B000101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B001101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B001101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B010101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B010101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B011101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B011101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B100101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B100101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B101101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B101101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B110101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B110101010, +set in %B0101010101010101, +tick, +output, +tock, +output; +set address %B111101010, +set in %B1010101010101010, +tick, +output; +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + +set load 1, +set address %B111101010, +set in %B0101010101010101, +tick, +output, +tock, +output; + +set load 0, +set address %B000101010, +tick, +output; +tock, +output; +set address %B001101010, +eval, +output; +set address %B010101010, +eval, +output; +set address %B011101010, +eval, +output; +set address %B100101010, +eval, +output; +set address %B101101010, +eval, +output; +set address %B110101010, +eval, +output; +set address %B111101010, +eval, +output; + diff --git a/nand2tetris-suite/projects/04/fill/Fill.asm b/nand2tetris-suite/projects/04/fill/Fill.asm new file mode 100644 index 0000000..8f24a95 --- /dev/null +++ b/nand2tetris-suite/projects/04/fill/Fill.asm @@ -0,0 +1,14 @@ +// 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/04/Fill.asm + +// Runs an infinite loop that listens to the keyboard input. +// When a key is pressed (any key), the program blackens the screen, +// i.e. writes "black" in every pixel; +// the screen should remain fully black as long as the key is pressed. +// When no key is pressed, the program clears the screen, i.e. writes +// "white" in every pixel; +// the screen should remain fully clear as long as no key is pressed. + +// Put your code here. \ No newline at end of file diff --git a/nand2tetris-suite/projects/04/fill/Fill.tst b/nand2tetris-suite/projects/04/fill/Fill.tst new file mode 100644 index 0000000..e8bb385 --- /dev/null +++ b/nand2tetris-suite/projects/04/fill/Fill.tst @@ -0,0 +1,11 @@ +// 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/04/fill/Fill.tst + +load Fill.asm; +echo "Make sure that 'No Animation' is selected. Then, select the keyboard, press any key for some time, and inspect the screen."; + +repeat { + ticktock; +} diff --git a/nand2tetris-suite/projects/04/fill/FillAutomatic.cmp b/nand2tetris-suite/projects/04/fill/FillAutomatic.cmp new file mode 100644 index 0000000..a71db27 --- /dev/null +++ b/nand2tetris-suite/projects/04/fill/FillAutomatic.cmp @@ -0,0 +1,4 @@ +|RAM[16384]|RAM[17648]|RAM[18349]|RAM[19444]|RAM[20771]|RAM[21031]|RAM[22596]|RAM[23754]|RAM[24575]| +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | diff --git a/nand2tetris-suite/projects/04/fill/FillAutomatic.tst b/nand2tetris-suite/projects/04/fill/FillAutomatic.tst new file mode 100644 index 0000000..fbc29a0 --- /dev/null +++ b/nand2tetris-suite/projects/04/fill/FillAutomatic.tst @@ -0,0 +1,37 @@ +// 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/04/fill/FillAutomatic + +// This script can be used to test the Fill program automatically, +// rather than interactively. Specifically, the script sets the keyboard +// memory map (RAM[24576]) to 0, 1, and then again to 0. This simulates the +// acts of leaving the keyboard untouched, pressing some key, and then releasing +// the key. After each on of these simulated events, the script outputs the values +// of some selected registers from the screen memory map (RAM[16384]-RAM[24576]). +// This is done in order to test that these registers are set to 000...0 or 111....1, +// as mandated by how the Fill program should react to the keyboard events. + +load Fill.asm, +output-file FillAutomatic.out, +compare-to FillAutomatic.cmp, +output-list RAM[16384]%D2.6.2 RAM[17648]%D2.6.2 RAM[18349]%D2.6.2 RAM[19444]%D2.6.2 RAM[20771]%D2.6.2 RAM[21031]%D2.6.2 RAM[22596]%D2.6.2 RAM[23754]%D2.6.2 RAM[24575]%D2.6.2; + +set RAM[24576] 0, // the keyboard is untouched +repeat 1000000 { + ticktock; +} +output; // test that the screen is white + +set RAM[24576] 1, // a keyboard key is pressed +repeat 1000000 { + ticktock; +} +output; // test that the screen is black + +set RAM[24576] 0, // they keyboard in untouched +repeat 1000000 { + ticktock; +} +output; // test that the screen is white + diff --git a/nand2tetris-suite/projects/04/mult/Mult.asm b/nand2tetris-suite/projects/04/mult/Mult.asm new file mode 100644 index 0000000..d49da5c --- /dev/null +++ b/nand2tetris-suite/projects/04/mult/Mult.asm @@ -0,0 +1,12 @@ +// 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/04/Mult.asm + +// Multiplies R0 and R1 and stores the result in R2. +// (R0, R1, R2 refer to RAM[0], RAM[1], and RAM[2], respectively.) +// +// This program only needs to handle arguments that satisfy +// R0 >= 0, R1 >= 0, and R0*R1 < 32768. + +// Put your code here. \ No newline at end of file diff --git a/nand2tetris-suite/projects/04/mult/Mult.cmp b/nand2tetris-suite/projects/04/mult/Mult.cmp new file mode 100644 index 0000000..296b5fb --- /dev/null +++ b/nand2tetris-suite/projects/04/mult/Mult.cmp @@ -0,0 +1,7 @@ +| RAM[0] | RAM[1] | RAM[2] | +| 0 | 0 | 0 | +| 1 | 0 | 0 | +| 0 | 2 | 0 | +| 3 | 1 | 3 | +| 2 | 4 | 8 | +| 6 | 7 | 42 | \ No newline at end of file diff --git a/nand2tetris-suite/projects/04/mult/Mult.tst b/nand2tetris-suite/projects/04/mult/Mult.tst new file mode 100644 index 0000000..9bf4fa8 --- /dev/null +++ b/nand2tetris-suite/projects/04/mult/Mult.tst @@ -0,0 +1,74 @@ +// 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/04/mult/Mult.tst + +load Mult.asm, +output-file Mult.out, +compare-to Mult.cmp, +output-list RAM[0]%D2.6.2 RAM[1]%D2.6.2 RAM[2]%D2.6.2; + +set RAM[0] 0, // Set test arguments +set RAM[1] 0, +set RAM[2] -1; // Test that program initialized product to 0 +repeat 20 { + ticktock; +} +set RAM[0] 0, // Restore arguments in case program used them as loop counter +set RAM[1] 0, +output; + +set PC 0, +set RAM[0] 1, // Set test arguments +set RAM[1] 0, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 50 { + ticktock; +} +set RAM[0] 1, // Restore arguments in case program used them as loop counter +set RAM[1] 0, +output; + +set PC 0, +set RAM[0] 0, // Set test arguments +set RAM[1] 2, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 80 { + ticktock; +} +set RAM[0] 0, // Restore arguments in case program used them as loop counter +set RAM[1] 2, +output; + +set PC 0, +set RAM[0] 3, // Set test arguments +set RAM[1] 1, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 120 { + ticktock; +} +set RAM[0] 3, // Restore arguments in case program used them as loop counter +set RAM[1] 1, +output; + +set PC 0, +set RAM[0] 2, // Set test arguments +set RAM[1] 4, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 150 { + ticktock; +} +set RAM[0] 2, // Restore arguments in case program used them as loop counter +set RAM[1] 4, +output; + +set PC 0, +set RAM[0] 6, // Set test arguments +set RAM[1] 7, +set RAM[2] -1; // Ensure that program initialized product to 0 +repeat 210 { + ticktock; +} +set RAM[0] 6, // Restore arguments in case program used them as loop counter +set RAM[1] 7, +output; diff --git a/nand2tetris-suite/projects/05/Add.hack b/nand2tetris-suite/projects/05/Add.hack new file mode 100644 index 0000000..fe5969d --- /dev/null +++ b/nand2tetris-suite/projects/05/Add.hack @@ -0,0 +1,6 @@ +0000000000000010 +1110110000010000 +0000000000000011 +1110000010010000 +0000000000000000 +1110001100001000 diff --git a/nand2tetris-suite/projects/05/CPU-external.cmp b/nand2tetris-suite/projects/05/CPU-external.cmp new file mode 100644 index 0000000..58f43bd --- /dev/null +++ b/nand2tetris-suite/projects/05/CPU-external.cmp @@ -0,0 +1,93 @@ +|time| inM | instruction |reset| outM |writeM |addre| pc | +|0+ | 0|0011000000111001| 0 |*******| 0 | 0| 0| +|1 | 0|0011000000111001| 0 |*******| 0 |12345| 1| +|1+ | 0|1110110000010000| 0 |*******| 0 |12345| 1| +|2 | 0|1110110000010000| 0 |*******| 0 |12345| 2| +|2+ | 0|0101101110100000| 0 |*******| 0 |12345| 2| +|3 | 0|0101101110100000| 0 |*******| 0 |23456| 3| +|3+ | 0|1110000111010000| 0 |*******| 0 |23456| 3| +|4 | 0|1110000111010000| 0 |*******| 0 |23456| 4| +|4+ | 0|0000001111101000| 0 |*******| 0 |23456| 4| +|5 | 0|0000001111101000| 0 |*******| 0 | 1000| 5| +|5+ | 0|1110001100001000| 0 | 11111| 1 | 1000| 5| +|6 | 0|1110001100001000| 0 | 11111| 1 | 1000| 6| +|6+ | 0|0000001111101001| 0 |*******| 0 | 1000| 6| +|7 | 0|0000001111101001| 0 |*******| 0 | 1001| 7| +|7+ | 0|1110001110011000| 0 | 11110| 1 | 1001| 7| +|8 | 0|1110001110011000| 0 | 11109| 1 | 1001| 8| +|8+ | 0|0000001111101000| 0 |*******| 0 | 1001| 8| +|9 | 0|0000001111101000| 0 |*******| 0 | 1000| 9| +|9+ | 11111|1111010011010000| 0 |*******| 0 | 1000| 9| +|10 | 11111|1111010011010000| 0 |*******| 0 | 1000| 10| +|10+ | 11111|0000000000001110| 0 |*******| 0 | 1000| 10| +|11 | 11111|0000000000001110| 0 |*******| 0 | 14| 11| +|11+ | 11111|1110001100000100| 0 |*******| 0 | 14| 11| +|12 | 11111|1110001100000100| 0 |*******| 0 | 14| 14| +|12+ | 11111|0000001111100111| 0 |*******| 0 | 14| 14| +|13 | 11111|0000001111100111| 0 |*******| 0 | 999| 15| +|13+ | 11111|1110110111100000| 0 |*******| 0 | 999| 15| +|14 | 11111|1110110111100000| 0 |*******| 0 | 1000| 16| +|14+ | 11111|1110001100001000| 0 | -1| 1 | 1000| 16| +|15 | 11111|1110001100001000| 0 | -1| 1 | 1000| 17| +|15+ | 11111|0000000000010101| 0 |*******| 0 | 1000| 17| +|16 | 11111|0000000000010101| 0 |*******| 0 | 21| 18| +|16+ | 11111|1110011111000010| 0 |*******| 0 | 21| 18| +|17 | 11111|1110011111000010| 0 |*******| 0 | 21| 21| +|17+ | 11111|0000000000000010| 0 |*******| 0 | 21| 21| +|18 | 11111|0000000000000010| 0 |*******| 0 | 2| 22| +|18+ | 11111|1110000010010000| 0 |*******| 0 | 2| 22| +|19 | 11111|1110000010010000| 0 |*******| 0 | 2| 23| +|19+ | 11111|0000001111101000| 0 |*******| 0 | 2| 23| +|20 | 11111|0000001111101000| 0 |*******| 0 | 1000| 24| +|20+ | 11111|1110111010010000| 0 |*******| 0 | 1000| 24| +|21 | 11111|1110111010010000| 0 |*******| 0 | 1000| 25| +|21+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 25| +|22 | 11111|1110001100000001| 0 |*******| 0 | 1000| 26| +|22+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 26| +|23 | 11111|1110001100000010| 0 |*******| 0 | 1000| 27| +|23+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 27| +|24 | 11111|1110001100000011| 0 |*******| 0 | 1000| 28| +|24+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 28| +|25 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| +|25+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| +|26 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| +|26+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|27 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|27+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|28 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|28+ | 11111|1110101010010000| 0 |*******| 0 | 1000| 1000| +|29 | 11111|1110101010010000| 0 |*******| 0 | 1000| 1001| +|29+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| +|30 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1002| +|30+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1002| +|31 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| +|31+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| +|32 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| +|32+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| +|33 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| +|33+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| +|34 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1002| +|34+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1002| +|35 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|35+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|36 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|36+ | 11111|1110111111010000| 0 |*******| 0 | 1000| 1000| +|37 | 11111|1110111111010000| 0 |*******| 0 | 1000| 1001| +|37+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| +|38 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1000| +|38+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| +|39 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1001| +|39+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1001| +|40 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| +|40+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| +|41 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| +|41+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| +|42 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| +|42+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| +|43 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1001| +|43+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1001| +|44 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| +|44+ | 11111|1110001100000111| 1 |*******| 0 | 1000| 1000| +|45 | 11111|1110001100000111| 1 |*******| 0 | 1000| 0| +|45+ | 11111|0111111111111111| 0 |*******| 0 | 1000| 0| +|46 | 11111|0111111111111111| 0 |*******| 0 |32767| 1| diff --git a/nand2tetris-suite/projects/05/CPU-external.tst b/nand2tetris-suite/projects/05/CPU-external.tst new file mode 100644 index 0000000..5aa0295 --- /dev/null +++ b/nand2tetris-suite/projects/05/CPU-external.tst @@ -0,0 +1,150 @@ +// 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/05/CPU-external.tst + +load CPU.hdl, +output-file CPU-external.out, +compare-to CPU-external.cmp, +output-list time%S0.4.0 inM%D0.6.0 instruction%B0.16.0 reset%B2.1.2 outM%D1.6.0 writeM%B3.1.3 addressM%D0.5.0 pc%D0.5.0; + + +set instruction %B0011000000111001, // @12345 +tick, output, tock, output; + +set instruction %B1110110000010000, // D=A +tick, output, tock, output; + +set instruction %B0101101110100000, // @23456 +tick, output, tock, output; + +set instruction %B1110000111010000, // D=A-D +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1110001100001000, // M=D +tick, output, tock, output; + +set instruction %B0000001111101001, // @1001 +tick, output, tock, output; + +set instruction %B1110001110011000, // MD=D-1 +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1111010011010000, // D=D-M +set inM 11111, +tick, output, tock, output; + +set instruction %B0000000000001110, // @14 +tick, output, tock, output; + +set instruction %B1110001100000100, // D;jlt +tick, output, tock, output; + +set instruction %B0000001111100111, // @999 +tick, output, tock, output; + +set instruction %B1110110111100000, // A=A+1 +tick, output, tock, output; + +set instruction %B1110001100001000, // M=D +tick, output, tock, output; + +set instruction %B0000000000010101, // @21 +tick, output, tock, output; + +set instruction %B1110011111000010, // D+1;jeq +tick, output, tock, output; + +set instruction %B0000000000000010, // @2 +tick, output, tock, output; + +set instruction %B1110000010010000, // D=D+A +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1110111010010000, // D=-1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110101010010000, // D=0 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110111111010000, // D=1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set reset 1; +tick, output, tock, output; + +set instruction %B0111111111111111, // @32767 +set reset 0; +tick, output, tock, output; diff --git a/nand2tetris-suite/projects/05/CPU.cmp b/nand2tetris-suite/projects/05/CPU.cmp new file mode 100644 index 0000000..8025e61 --- /dev/null +++ b/nand2tetris-suite/projects/05/CPU.cmp @@ -0,0 +1,97 @@ +|time| inM | instruction |reset| outM |writeM |addre| pc |DRegiste| +|0+ | 0|0011000000111001| 0 |*******| 0 | 0| 0| 0 | +|1 | 0|0011000000111001| 0 |*******| 0 |12345| 1| 0 | +|1+ | 0|1110110000010000| 0 |*******| 0 |12345| 1| 12345 | +|2 | 0|1110110000010000| 0 |*******| 0 |12345| 2| 12345 | +|2+ | 0|0101101110100000| 0 |*******| 0 |12345| 2| 12345 | +|3 | 0|0101101110100000| 0 |*******| 0 |23456| 3| 12345 | +|3+ | 0|1110000111110000| 0 |*******| 0 |23456| 3| 11111 | +|4 | 0|1110000111110000| 0 |*******| 0 |11111| 4| 11111 | +|4+ | 0|0000001111101011| 0 |*******| 0 |11111| 4| 11111 | +|5 | 0|0000001111101011| 0 |*******| 0 | 1003| 5| 11111 | +|5+ | 0|1110001100001000| 0 | 11111| 1 | 1003| 5| 11111 | +|6 | 0|1110001100001000| 0 | 11111| 1 | 1003| 6| 11111 | +|6+ | 0|0000001111101100| 0 |*******| 0 | 1003| 6| 11111 | +|7 | 0|0000001111101100| 0 |*******| 0 | 1004| 7| 11111 | +|7+ | 0|1110001110011000| 0 | 11110| 1 | 1004| 7| 11110 | +|8 | 0|1110001110011000| 0 | 11109| 1 | 1004| 8| 11110 | +|8+ | 0|0000001111101000| 0 |*******| 0 | 1004| 8| 11110 | +|9 | 0|0000001111101000| 0 |*******| 0 | 1000| 9| 11110 | +|9+ | 11111|1111010011110000| 0 |*******| 0 | 1000| 9| -1 | +|10 | 11111|1111010011110000| 0 |*******| 0 |32767| 10| -1 | +|10+ | 11111|0000000000001110| 0 |*******| 0 |32767| 10| -1 | +|11 | 11111|0000000000001110| 0 |*******| 0 | 14| 11| -1 | +|11+ | 11111|1110001100000100| 0 |*******| 0 | 14| 11| -1 | +|12 | 11111|1110001100000100| 0 |*******| 0 | 14| 14| -1 | +|12+ | 11111|0000001111100111| 0 |*******| 0 | 14| 14| -1 | +|13 | 11111|0000001111100111| 0 |*******| 0 | 999| 15| -1 | +|13+ | 11111|1111110111100000| 0 |*******| 0 | 999| 15| -1 | +|14 | 11111|1111110111100000| 0 |*******| 0 |11112| 16| -1 | +|14+ | 11111|1110001100101000| 0 | -1| 1 |11112| 16| -1 | +|15 | 11111|1110001100101000| 0 | -1| 1 |32767| 17| -1 | +|15+ | 11111|0000000000010101| 0 |*******| 0 |32767| 17| -1 | +|16 | 11111|0000000000010101| 0 |*******| 0 | 21| 18| -1 | +|16+ | 11111|1110011111000010| 0 |*******| 0 | 21| 18| -1 | +|17 | 11111|1110011111000010| 0 |*******| 0 | 21| 21| -1 | +|17+ | 11111|0000000000000010| 0 |*******| 0 | 21| 21| -1 | +|18 | 11111|0000000000000010| 0 |*******| 0 | 2| 22| -1 | +|18+ | 11111|1110000010111000| 0 | 1| 1 | 2| 22| 1 | +|19 | 11111|1110000010111000| 0 | 2| 1 | 1| 23| 1 | +|19+ | 11111|1111110111001000| 0 | 11112| 1 | 1| 23| 1 | +|20 | 11111|1111110111001000| 0 | 11112| 1 | 1| 24| 1 | +|20+ | 11111|1111110010101000| 0 | 11110| 1 | 1| 24| 1 | +|21 | 11111|1111110010101000| 0 | 11110| 1 |11110| 25| 1 | +|21+ | 11111|0000001111101000| 0 |*******| 0 |11110| 25| 1 | +|22 | 11111|0000001111101000| 0 |*******| 0 | 1000| 26| 1 | +|22+ | 11111|1110111010010000| 0 |*******| 0 | 1000| 26| -1 | +|23 | 11111|1110111010010000| 0 |*******| 0 | 1000| 27| -1 | +|23+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 27| -1 | +|24 | 11111|1110001100000001| 0 |*******| 0 | 1000| 28| -1 | +|24+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 28| -1 | +|25 | 11111|1110001100000010| 0 |*******| 0 | 1000| 29| -1 | +|25+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 29| -1 | +|26 | 11111|1110001100000011| 0 |*******| 0 | 1000| 30| -1 | +|26+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 30| -1 | +|27 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| -1 | +|27+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 | +|28 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 | +|28+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 | +|29 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 | +|29+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 | +|30 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 | +|30+ | 11111|1110101010010000| 0 |*******| 0 | 1000| 1000| 0 | +|31 | 11111|1110101010010000| 0 |*******| 0 | 1000| 1001| 0 | +|31+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 0 | +|32 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1002| 0 | +|32+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1002| 0 | +|33 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 0 | +|33+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 | +|34 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 | +|34+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 0 | +|35 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 0 | +|35+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 0 | +|36 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1002| 0 | +|36+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1002| 0 | +|37 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 0 | +|37+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 | +|38 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 | +|38+ | 11111|1110111111010000| 0 |*******| 0 | 1000| 1000| 1 | +|39 | 11111|1110111111010000| 0 |*******| 0 | 1000| 1001| 1 | +|39+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 1 | +|40 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1000| 1 | +|40+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 1 | +|41 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1001| 1 | +|41+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1001| 1 | +|42 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 1 | +|42+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 1 | +|43 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 1 | +|43+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 1 | +|44 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| 1 | +|44+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 1 | +|45 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1001| 1 | +|45+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1001| 1 | +|46 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 1 | +|46+ | 11111|1110001100000111| 1 |*******| 0 | 1000| 1000| 1 | +|47 | 11111|1110001100000111| 1 |*******| 0 | 1000| 0| 1 | +|47+ | 11111|0111111111111111| 0 |*******| 0 | 1000| 0| 1 | +|48 | 11111|0111111111111111| 0 |*******| 0 |32767| 1| 1 | diff --git a/nand2tetris-suite/projects/05/CPU.hdl b/nand2tetris-suite/projects/05/CPU.hdl new file mode 100644 index 0000000..7b73ca0 --- /dev/null +++ b/nand2tetris-suite/projects/05/CPU.hdl @@ -0,0 +1,43 @@ +// 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/05/CPU.hdl + +/** + * The Hack CPU (Central Processing unit), consisting of an ALU, + * two registers named A and D, and a program counter named PC. + * The CPU is designed to fetch and execute instructions written in + * the Hack machine language. In particular, functions as follows: + * Executes the inputted instruction according to the Hack machine + * language specification. The D and A in the language specification + * refer to CPU-resident registers, while M refers to the external + * memory location addressed by A, i.e. to Memory[A]. The inM input + * holds the value of this location. If the current instruction needs + * to write a value to M, the value is placed in outM, the address + * of the target location is placed in the addressM output, and the + * writeM control bit is asserted. (When writeM==0, any value may + * appear in outM). The outM and writeM outputs are combinational: + * they are affected instantaneously by the execution of the current + * instruction. The addressM and pc outputs are clocked: although they + * are affected by the execution of the current instruction, they commit + * to their new values only in the next time step. If reset==1 then the + * CPU jumps to address 0 (i.e. pc is set to 0 in next time step) rather + * than to the address resulting from executing the current instruction. + */ + +CHIP CPU { + + IN inM[16], // M value input (M = contents of RAM[A]) + instruction[16], // Instruction for execution + reset; // Signals whether to re-start the current + // program (reset==1) or continue executing + // the current program (reset==0). + + OUT outM[16], // M value output + writeM, // Write to M? + addressM[15], // Address in data memory (of M) + pc[15]; // address of next instruction + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/05/CPU.tst b/nand2tetris-suite/projects/05/CPU.tst new file mode 100644 index 0000000..680a292 --- /dev/null +++ b/nand2tetris-suite/projects/05/CPU.tst @@ -0,0 +1,156 @@ +// 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/05/CPU.tst + +load CPU.hdl, +output-file CPU.out, +compare-to CPU.cmp, +output-list time%S0.4.0 inM%D0.6.0 instruction%B0.16.0 reset%B2.1.2 outM%D1.6.0 writeM%B3.1.3 addressM%D0.5.0 pc%D0.5.0 DRegister[]%D1.6.1; + + +set instruction %B0011000000111001, // @12345 +tick, output, tock, output; + +set instruction %B1110110000010000, // D=A +tick, output, tock, output; + +set instruction %B0101101110100000, // @23456 +tick, output, tock, output; + +set instruction %B1110000111110000, // AD=A-D +tick, output, tock, output; + +set instruction %B0000001111101011, // @1003 +tick, output, tock, output; + +set instruction %B1110001100001000, // M=D +tick, output, tock, output; + +set instruction %B0000001111101100, // @1004 +tick, output, tock, output; + +set instruction %B1110001110011000, // MD=D-1 +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1111010011110000, // AD=D-M +set inM 11111, +tick, output, tock, output; + +set instruction %B0000000000001110, // @14 +tick, output, tock, output; + +set instruction %B1110001100000100, // D;jlt +tick, output, tock, output; + +set instruction %B0000001111100111, // @999 +tick, output, tock, output; + +set instruction %B1111110111100000, // A=M+1 +tick, output, tock, output; + +set instruction %B1110001100101000, // AM=D +tick, output, tock, output; + +set instruction %B0000000000010101, // @21 +tick, output, tock, output; + +set instruction %B1110011111000010, // D+1;jeq +tick, output, tock, output; + +set instruction %B0000000000000010, // @2 +tick, output, tock, output; + +set instruction %B1110000010111000, // AMD=D+A +tick, output, tock, output; + +set instruction %B1111110111001000, // M=M+1 +tick, output, tock, output; + +set instruction %B1111110010101000, // AM=M-1 +tick, output, tock, output; + +set instruction %B0000001111101000, // @1000 +tick, output, tock, output; + +set instruction %B1110111010010000, // D=-1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110101010010000, // D=0 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set instruction %B1110111111010000, // D=1 +tick, output, tock, output; + +set instruction %B1110001100000001, // D;JGT +tick, output, tock, output; + +set instruction %B1110001100000010, // D;JEQ +tick, output, tock, output; + +set instruction %B1110001100000011, // D;JGE +tick, output, tock, output; + +set instruction %B1110001100000100, // D;JLT +tick, output, tock, output; + +set instruction %B1110001100000101, // D;JNE +tick, output, tock, output; + +set instruction %B1110001100000110, // D;JLE +tick, output, tock, output; + +set instruction %B1110001100000111, // D;JMP +tick, output, tock, output; + +set reset 1; +tick, output, tock, output; + +set instruction %B0111111111111111, // @32767 +set reset 0; +tick, output, tock, output; diff --git a/nand2tetris-suite/projects/05/Computer.hdl b/nand2tetris-suite/projects/05/Computer.hdl new file mode 100644 index 0000000..22f9b48 --- /dev/null +++ b/nand2tetris-suite/projects/05/Computer.hdl @@ -0,0 +1,23 @@ +// 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/05/Computer.hdl + +/** + * The HACK computer, including CPU, ROM and RAM. + * When reset is 0, the program stored in the computer's ROM executes. + * When reset is 1, the execution of the program restarts. + * Thus, to start a program's execution, reset must be pushed "up" (1) + * and "down" (0). From this point onward the user is at the mercy of + * the software. In particular, depending on the program's code, the + * screen may show some output and the user may be able to interact + * with the computer via the keyboard. + */ + +CHIP Computer { + + IN reset; + + PARTS: + // Put your code here: +} diff --git a/nand2tetris-suite/projects/05/ComputerAdd-external.cmp b/nand2tetris-suite/projects/05/ComputerAdd-external.cmp new file mode 100644 index 0000000..a3a8eaf --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerAdd-external.cmp @@ -0,0 +1,15 @@ +| time |reset|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | 0 | +| 3 | 0 | 0 | 0 | 0 | +| 4 | 0 | 0 | 0 | 0 | +| 5 | 0 | 0 | 0 | 0 | +| 6 | 0 | 5 | 0 | 0 | +| 7 | 1 | 0 | 0 | 0 | +| 8 | 0 | 0 | 0 | 0 | +| 9 | 0 | 0 | 0 | 0 | +| 10 | 0 | 0 | 0 | 0 | +| 11 | 0 | 0 | 0 | 0 | +| 12 | 0 | 0 | 0 | 0 | +| 13 | 0 | 5 | 0 | 0 | diff --git a/nand2tetris-suite/projects/05/ComputerAdd-external.tst b/nand2tetris-suite/projects/05/ComputerAdd-external.tst new file mode 100644 index 0000000..09cc1a7 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerAdd-external.tst @@ -0,0 +1,32 @@ +// 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/05/ComputerAdd-external.tst + +load Computer.hdl, +output-file ComputerAdd-external.out, +compare-to ComputerAdd-external.cmp, +output-list time%S1.4.1 reset%B2.1.2 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Load a program written in the Hack machine language. +// The program adds the two constants 2 and 3 and writes the result in RAM[0]. +ROM32K load Add.hack, +output; + +// First run (at the beginning PC=0) +repeat 6 { + tick, tock, output; +} + +// Reset the PC +set reset 1, +set RAM16K[0] 0, +tick, tock, output; + + +// Second run, to check that the PC was reset correctly. +set reset 0, + +repeat 6 { + tick, tock, output; +} diff --git a/nand2tetris-suite/projects/05/ComputerAdd.cmp b/nand2tetris-suite/projects/05/ComputerAdd.cmp new file mode 100644 index 0000000..f295464 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerAdd.cmp @@ -0,0 +1,15 @@ +| time |reset|ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 0 | 0 | 0| 0 | 0 | 0 | +| 1 | 0 | 2 | 0 | 1| 0 | 0 | 0 | +| 2 | 0 | 2 | 2 | 2| 0 | 0 | 0 | +| 3 | 0 | 3 | 2 | 3| 0 | 0 | 0 | +| 4 | 0 | 3 | 5 | 4| 0 | 0 | 0 | +| 5 | 0 | 0 | 5 | 5| 0 | 0 | 0 | +| 6 | 0 | 0 | 5 | 6| 5 | 0 | 0 | +| 7 | 1 | 0 | 5 | 0| 0 | 0 | 0 | +| 8 | 0 | 2 | 5 | 1| 0 | 0 | 0 | +| 9 | 0 | 2 | 2 | 2| 0 | 0 | 0 | +| 10 | 0 | 3 | 2 | 3| 0 | 0 | 0 | +| 11 | 0 | 3 | 5 | 4| 0 | 0 | 0 | +| 12 | 0 | 0 | 5 | 5| 0 | 0 | 0 | +| 13 | 0 | 0 | 5 | 6| 5 | 0 | 0 | diff --git a/nand2tetris-suite/projects/05/ComputerAdd.tst b/nand2tetris-suite/projects/05/ComputerAdd.tst new file mode 100644 index 0000000..27f4411 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerAdd.tst @@ -0,0 +1,32 @@ +// 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/05/ComputerAdd.tst + +load Computer.hdl, +output-file ComputerAdd.out, +compare-to ComputerAdd.cmp, +output-list time%S1.4.1 reset%B2.1.2 ARegister[0]%D1.7.1 DRegister[0]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Load a program written in the Hack machine language. +// The program adds the two constants 2 and 3 and writes the result in RAM[0]. +ROM32K load Add.hack, +output; + +// First run (at the beginning PC=0) +repeat 6 { + tick, tock, output; +} + +// Reset the PC +set reset 1, +set RAM16K[0] 0, +tick, tock, output; + + +// Second run, to check that the PC was reset correctly. +set reset 0, + +repeat 6 { + tick, tock, output; +} diff --git a/nand2tetris-suite/projects/05/ComputerMax-external.cmp b/nand2tetris-suite/projects/05/ComputerMax-external.cmp new file mode 100644 index 0000000..f864733 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerMax-external.cmp @@ -0,0 +1,28 @@ +| time |reset|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 3 | 5 | 0 | +| 1 | 0 | 3 | 5 | 0 | +| 2 | 0 | 3 | 5 | 0 | +| 3 | 0 | 3 | 5 | 0 | +| 4 | 0 | 3 | 5 | 0 | +| 5 | 0 | 3 | 5 | 0 | +| 6 | 0 | 3 | 5 | 0 | +| 7 | 0 | 3 | 5 | 0 | +| 8 | 0 | 3 | 5 | 0 | +| 9 | 0 | 3 | 5 | 0 | +| 10 | 0 | 3 | 5 | 0 | +| 11 | 0 | 3 | 5 | 0 | +| 12 | 0 | 3 | 5 | 5 | +| 13 | 0 | 3 | 5 | 5 | +| 14 | 0 | 3 | 5 | 5 | +| 15 | 1 | 3 | 5 | 5 | +| 15 | 0 | 23456 | 12345 | 5 | +| 16 | 0 | 23456 | 12345 | 5 | +| 17 | 0 | 23456 | 12345 | 5 | +| 18 | 0 | 23456 | 12345 | 5 | +| 19 | 0 | 23456 | 12345 | 5 | +| 20 | 0 | 23456 | 12345 | 5 | +| 21 | 0 | 23456 | 12345 | 5 | +| 22 | 0 | 23456 | 12345 | 5 | +| 23 | 0 | 23456 | 12345 | 5 | +| 24 | 0 | 23456 | 12345 | 5 | +| 25 | 0 | 23456 | 12345 | 23456 | diff --git a/nand2tetris-suite/projects/05/ComputerMax-external.tst b/nand2tetris-suite/projects/05/ComputerMax-external.tst new file mode 100644 index 0000000..52b6bef --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerMax-external.tst @@ -0,0 +1,38 @@ +// 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/05/ComputerMax-external.tst + +load Computer.hdl, +output-file ComputerMax-external.out, +compare-to ComputerMax-external.cmp, +output-list time%S1.4.1 reset%B2.1.2 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Load a program written in the Hack machine language. +// The program computes the maximum of RAM[0] and RAM[1] +// and writes the result in RAM[2]. +ROM32K load Max.hack, + +// first run: compute max(3,5) +set RAM16K[0] 3, +set RAM16K[1] 5, +output; + +repeat 14 { + tick, tock, output; +} + +// reset the PC +set reset 1, +tick, tock, output; + +// second run: compute max(23456,12345) +set reset 0, +set RAM16K[0] 23456, +set RAM16K[1] 12345, +output; + +// The run on these inputs needs less cycles (different branching) +repeat 10 { + tick, tock, output; +} diff --git a/nand2tetris-suite/projects/05/ComputerMax.cmp b/nand2tetris-suite/projects/05/ComputerMax.cmp new file mode 100644 index 0000000..42276cd --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerMax.cmp @@ -0,0 +1,28 @@ +| time |reset|ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 0 | 0 | 0| 3 | 5 | 0 | +| 1 | 0 | 0 | 0 | 1| 3 | 5 | 0 | +| 2 | 0 | 0 | 3 | 2| 3 | 5 | 0 | +| 3 | 0 | 1 | 3 | 3| 3 | 5 | 0 | +| 4 | 0 | 1 | -2 | 4| 3 | 5 | 0 | +| 5 | 0 | 10 | -2 | 5| 3 | 5 | 0 | +| 6 | 0 | 10 | -2 | 6| 3 | 5 | 0 | +| 7 | 0 | 1 | -2 | 7| 3 | 5 | 0 | +| 8 | 0 | 1 | 5 | 8| 3 | 5 | 0 | +| 9 | 0 | 12 | 5 | 9| 3 | 5 | 0 | +| 10 | 0 | 12 | 5 | 12| 3 | 5 | 0 | +| 11 | 0 | 2 | 5 | 13| 3 | 5 | 0 | +| 12 | 0 | 2 | 5 | 14| 3 | 5 | 5 | +| 13 | 0 | 14 | 5 | 15| 3 | 5 | 5 | +| 14 | 0 | 14 | 5 | 14| 3 | 5 | 5 | +| 15 | 1 | 14 | 5 | 0| 3 | 5 | 5 | +| 15 | 0 | 14 | 5 | 0| 23456 | 12345 | 5 | +| 16 | 0 | 0 | 5 | 1| 23456 | 12345 | 5 | +| 17 | 0 | 0 | 23456 | 2| 23456 | 12345 | 5 | +| 18 | 0 | 1 | 23456 | 3| 23456 | 12345 | 5 | +| 19 | 0 | 1 | 11111 | 4| 23456 | 12345 | 5 | +| 20 | 0 | 10 | 11111 | 5| 23456 | 12345 | 5 | +| 21 | 0 | 10 | 11111 | 10| 23456 | 12345 | 5 | +| 22 | 0 | 0 | 11111 | 11| 23456 | 12345 | 5 | +| 23 | 0 | 0 | 23456 | 12| 23456 | 12345 | 5 | +| 24 | 0 | 2 | 23456 | 13| 23456 | 12345 | 5 | +| 25 | 0 | 2 | 23456 | 14| 23456 | 12345 | 23456 | diff --git a/nand2tetris-suite/projects/05/ComputerMax.tst b/nand2tetris-suite/projects/05/ComputerMax.tst new file mode 100644 index 0000000..e090754 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerMax.tst @@ -0,0 +1,39 @@ +// 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/05/ComputerMax.tst + +load Computer.hdl, +output-file ComputerMax.out, +compare-to ComputerMax.cmp, +output-list time%S1.4.1 reset%B2.1.2 ARegister[]%D1.7.1 DRegister[]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Load a program written in the Hack machine language. +// The program computes the maximum of RAM[0] and RAM[1] +// and writes the result in RAM[2]. + +ROM32K load Max.hack, + +// first run: compute max(3,5) +set RAM16K[0] 3, +set RAM16K[1] 5, +output; + +repeat 14 { + tick, tock, output; +} + +// reset the PC +set reset 1, +tick, tock, output; + +// second run: compute max(23456,12345) +set reset 0, +set RAM16K[0] 23456, +set RAM16K[1] 12345, +output; + +// The run on these inputs needs less cycles (different branching) +repeat 10 { + tick, tock, output; +} diff --git a/nand2tetris-suite/projects/05/ComputerRect-external.cmp b/nand2tetris-suite/projects/05/ComputerRect-external.cmp new file mode 100644 index 0000000..f276922 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerRect-external.cmp @@ -0,0 +1,65 @@ +| time | +| 0 | +| 1 | +| 2 | +| 3 | +| 4 | +| 5 | +| 6 | +| 7 | +| 8 | +| 9 | +| 10 | +| 11 | +| 12 | +| 13 | +| 14 | +| 15 | +| 16 | +| 17 | +| 18 | +| 19 | +| 20 | +| 21 | +| 22 | +| 23 | +| 24 | +| 25 | +| 26 | +| 27 | +| 28 | +| 29 | +| 30 | +| 31 | +| 32 | +| 33 | +| 34 | +| 35 | +| 36 | +| 37 | +| 38 | +| 39 | +| 40 | +| 41 | +| 42 | +| 43 | +| 44 | +| 45 | +| 46 | +| 47 | +| 48 | +| 49 | +| 50 | +| 51 | +| 52 | +| 53 | +| 54 | +| 55 | +| 56 | +| 57 | +| 58 | +| 59 | +| 60 | +| 61 | +| 62 | +| 63 | diff --git a/nand2tetris-suite/projects/05/ComputerRect-external.tst b/nand2tetris-suite/projects/05/ComputerRect-external.tst new file mode 100644 index 0000000..f9102f7 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerRect-external.tst @@ -0,0 +1,26 @@ +// 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/05/ComputerRect-external.tst + +load Computer.hdl, +output-file ComputerRect-external.out, +compare-to ComputerRect-external.cmp, +output-list time%S1.4.1; + +// Load a program written in the Hack machine language. +// The program draws a rectangle of width 16 pixels and +// length RAM[0] at the top left of the screen. +ROM32K load Rect.hack, + +echo "Before you run this script, select the 'Screen' option from the 'View' menu"; + +echo "A small rectangle should be drawn at the top left of the screen (the 'Screen' option of the 'View' menu should be selected.)"; + +// draw a rectangle 16 pixels wide and 4 pixels long +set RAM16K[0] 4, +output; + +repeat 63 { + tick, tock, output; +} diff --git a/nand2tetris-suite/projects/05/ComputerRect.cmp b/nand2tetris-suite/projects/05/ComputerRect.cmp new file mode 100644 index 0000000..a6b5cc9 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerRect.cmp @@ -0,0 +1,65 @@ +| time |ARegister|DRegister|PC[]|RAM16K[0]|RAM16K[1]|RAM16K[2]| +| 0 | 0 | 0 | 0| 4 | 0 | 0 | +| 1 | 0 | 0 | 1| 4 | 0 | 0 | +| 2 | 0 | 4 | 2| 4 | 0 | 0 | +| 3 | 23 | 4 | 3| 4 | 0 | 0 | +| 4 | 23 | 4 | 4| 4 | 0 | 0 | +| 5 | 16 | 4 | 5| 4 | 0 | 0 | +| 6 | 16 | 4 | 6| 4 | 0 | 0 | +| 7 | 16384 | 4 | 7| 4 | 0 | 0 | +| 8 | 16384 | 16384 | 8| 4 | 0 | 0 | +| 9 | 17 | 16384 | 9| 4 | 0 | 0 | +| 10 | 17 | 16384 | 10| 4 | 0 | 0 | +| 11 | 17 | 16384 | 11| 4 | 0 | 0 | +| 12 | 16384 | 16384 | 12| 4 | 0 | 0 | +| 13 | 16384 | 16384 | 13| 4 | 0 | 0 | +| 14 | 17 | 16384 | 14| 4 | 0 | 0 | +| 15 | 17 | 16384 | 15| 4 | 0 | 0 | +| 16 | 32 | 16384 | 16| 4 | 0 | 0 | +| 17 | 32 | 16416 | 17| 4 | 0 | 0 | +| 18 | 17 | 16416 | 18| 4 | 0 | 0 | +| 19 | 17 | 16416 | 19| 4 | 0 | 0 | +| 20 | 16 | 16416 | 20| 4 | 0 | 0 | +| 21 | 16 | 3 | 21| 4 | 0 | 0 | +| 22 | 10 | 3 | 22| 4 | 0 | 0 | +| 23 | 10 | 3 | 10| 4 | 0 | 0 | +| 24 | 17 | 3 | 11| 4 | 0 | 0 | +| 25 | 16416 | 3 | 12| 4 | 0 | 0 | +| 26 | 16416 | 3 | 13| 4 | 0 | 0 | +| 27 | 17 | 3 | 14| 4 | 0 | 0 | +| 28 | 17 | 16416 | 15| 4 | 0 | 0 | +| 29 | 32 | 16416 | 16| 4 | 0 | 0 | +| 30 | 32 | 16448 | 17| 4 | 0 | 0 | +| 31 | 17 | 16448 | 18| 4 | 0 | 0 | +| 32 | 17 | 16448 | 19| 4 | 0 | 0 | +| 33 | 16 | 16448 | 20| 4 | 0 | 0 | +| 34 | 16 | 2 | 21| 4 | 0 | 0 | +| 35 | 10 | 2 | 22| 4 | 0 | 0 | +| 36 | 10 | 2 | 10| 4 | 0 | 0 | +| 37 | 17 | 2 | 11| 4 | 0 | 0 | +| 38 | 16448 | 2 | 12| 4 | 0 | 0 | +| 39 | 16448 | 2 | 13| 4 | 0 | 0 | +| 40 | 17 | 2 | 14| 4 | 0 | 0 | +| 41 | 17 | 16448 | 15| 4 | 0 | 0 | +| 42 | 32 | 16448 | 16| 4 | 0 | 0 | +| 43 | 32 | 16480 | 17| 4 | 0 | 0 | +| 44 | 17 | 16480 | 18| 4 | 0 | 0 | +| 45 | 17 | 16480 | 19| 4 | 0 | 0 | +| 46 | 16 | 16480 | 20| 4 | 0 | 0 | +| 47 | 16 | 1 | 21| 4 | 0 | 0 | +| 48 | 10 | 1 | 22| 4 | 0 | 0 | +| 49 | 10 | 1 | 10| 4 | 0 | 0 | +| 50 | 17 | 1 | 11| 4 | 0 | 0 | +| 51 | 16480 | 1 | 12| 4 | 0 | 0 | +| 52 | 16480 | 1 | 13| 4 | 0 | 0 | +| 53 | 17 | 1 | 14| 4 | 0 | 0 | +| 54 | 17 | 16480 | 15| 4 | 0 | 0 | +| 55 | 32 | 16480 | 16| 4 | 0 | 0 | +| 56 | 32 | 16512 | 17| 4 | 0 | 0 | +| 57 | 17 | 16512 | 18| 4 | 0 | 0 | +| 58 | 17 | 16512 | 19| 4 | 0 | 0 | +| 59 | 16 | 16512 | 20| 4 | 0 | 0 | +| 60 | 16 | 0 | 21| 4 | 0 | 0 | +| 61 | 10 | 0 | 22| 4 | 0 | 0 | +| 62 | 10 | 0 | 23| 4 | 0 | 0 | +| 63 | 23 | 0 | 24| 4 | 0 | 0 | diff --git a/nand2tetris-suite/projects/05/ComputerRect.tst b/nand2tetris-suite/projects/05/ComputerRect.tst new file mode 100644 index 0000000..b1e2126 --- /dev/null +++ b/nand2tetris-suite/projects/05/ComputerRect.tst @@ -0,0 +1,26 @@ +// 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/05/ComputerRect.tst + +load Computer.hdl, +output-file ComputerRect.out, +compare-to ComputerRect.cmp, +output-list time%S1.4.1 ARegister[]%D1.7.1 DRegister[]%D1.7.1 PC[]%D0.4.0 RAM16K[0]%D1.7.1 RAM16K[1]%D1.7.1 RAM16K[2]%D1.7.1; + +// Load a program written in the Hack machine language. +// The program draws a rectangle of width 16 pixels and +// length RAM[0] at the top left of the screen. +ROM32K load Rect.hack, + +echo "Before you run this script, select the 'Screen' option from the 'View' menu"; + +echo "A small rectangle should be drawn at the top left of the screen (the 'Screen' option of the 'View' menu should be selected.)"; + +// Draws a rectangle 16 pixels wide and 4 pixels long +set RAM16K[0] 4, +output; + +repeat 63 { + tick, tock, output; +} diff --git a/nand2tetris-suite/projects/05/Max.hack b/nand2tetris-suite/projects/05/Max.hack new file mode 100644 index 0000000..2e04a8d --- /dev/null +++ b/nand2tetris-suite/projects/05/Max.hack @@ -0,0 +1,16 @@ +0000000000000000 +1111110000010000 +0000000000000001 +1111010011010000 +0000000000001010 +1110001100000001 +0000000000000001 +1111110000010000 +0000000000001100 +1110101010000111 +0000000000000000 +1111110000010000 +0000000000000010 +1110001100001000 +0000000000001110 +1110101010000111 diff --git a/nand2tetris-suite/projects/05/Memory.cmp b/nand2tetris-suite/projects/05/Memory.cmp new file mode 100644 index 0000000..2f4c727 --- /dev/null +++ b/nand2tetris-suite/projects/05/Memory.cmp @@ -0,0 +1,68 @@ +| in |load | address | out | +| 12345 | 1 | 010000000000000 | 0 | +| 12345 | 1 | 010000000000000 | 12345 | +| 12345 | 1 | 100000000000000 | 0 | +| 12345 | 1 | 100000000000000 | 12345 | +| -1 | 1 | 000000000000000 | 0 | +| -1 | 1 | 000000000000000 | -1 | +| 9999 | 0 | 000000000000000 | -1 | +| 9999 | 0 | 000000000000000 | -1 | +| 9999 | 0 | 010000000000000 | 12345 | +| 9999 | 0 | 100000000000000 | 12345 | +| 12345 | 1 | 000000000000000 | -1 | +| 12345 | 1 | 000000000000000 | 12345 | +| 12345 | 1 | 100000000000000 | 12345 | +| 12345 | 1 | 100000000000000 | 12345 | +| 2222 | 1 | 010000000000000 | 12345 | +| 2222 | 1 | 010000000000000 | 2222 | +| 9999 | 0 | 010000000000000 | 2222 | +| 9999 | 0 | 010000000000000 | 2222 | +| 9999 | 0 | 000000000000000 | 12345 | +| 9999 | 0 | 100000000000000 | 12345 | +| 9999 | 0 | 000000000000001 | 0 | +| 9999 | 0 | 000000000000010 | 0 | +| 9999 | 0 | 000000000000100 | 0 | +| 9999 | 0 | 000000000001000 | 0 | +| 9999 | 0 | 000000000010000 | 0 | +| 9999 | 0 | 000000000100000 | 0 | +| 9999 | 0 | 000000001000000 | 0 | +| 9999 | 0 | 000000010000000 | 0 | +| 9999 | 0 | 000000100000000 | 0 | +| 9999 | 0 | 000001000000000 | 0 | +| 9999 | 0 | 000010000000000 | 0 | +| 9999 | 0 | 000100000000000 | 0 | +| 9999 | 0 | 001000000000000 | 0 | +| 9999 | 0 | 010000000000000 | 2222 | +| 1234 | 1 | 001001000110100 | 0 | +| 1234 | 1 | 001001000110100 | 1234 | +| 1234 | 0 | 010001000110100 | 0 | +| 1234 | 0 | 110001000110100 | 0 | +| 2345 | 1 | 010001101000101 | 0 | +| 2345 | 1 | 010001101000101 | 2345 | +| 2345 | 0 | 000001101000101 | 0 | +| 2345 | 0 | 100001101000101 | 0 | +| 0 | 1 | 100000000000000 | 12345 | +| 0 | 1 | 100000000000000 | 0 | +| 0 | 1 | 110000000000000 | 75 | +| 12345 | 1 | 000111111001111 | 0 | +| 12345 | 1 | 000111111001111 | 12345 | +| 12345 | 1 | 010111111001111 | 0 | +| 12345 | 1 | 010111111001111 | 12345 | +| -1 | 1 | 100111111001111 | -1 | +| -1 | 1 | 101000001001111 | -1 | +| -1 | 1 | 000111111001111 | 12345 | +| -1 | 1 | 010111111001111 | 12345 | +| -1 | 0 | 100111111001110 | 0 | +| -1 | 0 | 100111111001101 | 0 | +| -1 | 0 | 100111111001011 | 0 | +| -1 | 0 | 100111111000111 | 0 | +| -1 | 0 | 100111111011111 | 0 | +| -1 | 0 | 100111111101111 | 0 | +| -1 | 0 | 100111110001111 | 0 | +| -1 | 0 | 100111101001111 | 0 | +| -1 | 0 | 100111011001111 | 0 | +| -1 | 0 | 100110111001111 | 0 | +| -1 | 0 | 100101111001111 | 0 | +| -1 | 0 | 100011111001111 | 0 | +| -1 | 0 | 101111111001111 | 0 | +| -1 | 0 | 110000000000000 | 89 | diff --git a/nand2tetris-suite/projects/05/Memory.hdl b/nand2tetris-suite/projects/05/Memory.hdl new file mode 100644 index 0000000..62a4fd2 --- /dev/null +++ b/nand2tetris-suite/projects/05/Memory.hdl @@ -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/05/Memory.hdl + +/** + * The complete address space of the Hack computer's memory, + * including RAM and memory-mapped I/O. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = Memory[address(t)](t) + * Write: if load(t-1) then Memory[address(t-1)](t) = in(t-1) + * In words: the chip always outputs the value stored at the memory + * location specified by address. If load==1, the in value is loaded + * into the memory location specified by address. This value becomes + * available through the out output from the next time step onward. + * Address space rules: + * Only the upper 16K+8K+1 words of the Memory chip are used. + * Access to address>0x6000 is invalid. Access to any address in + * the range 0x4000-0x5FFF results in accessing the screen memory + * map. Access to address 0x6000 results in accessing the keyboard + * memory map. The behavior in these addresses is described in the + * Screen and Keyboard chip specifications given in the book. + */ + +CHIP Memory { + IN in[16], load, address[15]; + OUT out[16]; + + PARTS: + // Put your code here: +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/05/Memory.tst b/nand2tetris-suite/projects/05/Memory.tst new file mode 100644 index 0000000..e88a704 --- /dev/null +++ b/nand2tetris-suite/projects/05/Memory.tst @@ -0,0 +1,191 @@ +// 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/05/Memory.tst + +load Memory.hdl, +output-file Memory.out, +compare-to Memory.cmp, +output-list in%D1.6.1 load%B2.1.2 address%B1.15.1 out%D1.6.1; + +echo "Before you run this script, select the 'Screen' option from the 'View' menu"; + + +// There is an interesting design error that has shown up in several students' +// Memory.hdl files that causes zeros to be written in the corresponding offset +// in the inactive memory segments to the actual write. To detect this, the +// test must not only look for writes into the wrong segment, but changes. +// The following initialization writes a signal number into the memory where +// the bad writes may occur. + +//// Set RAM[2000], RAM[4000] = 12345 (for following overwrite test) +set in 12345, set load 1, set address %X2000, tick, output; tock, output; +set address %X4000, tick, output; tock, output; + + +set in -1, // Set RAM[0] = -1 +set load 1, +set address 0, +tick, +output; +tock, +output; + +set in 9999, // RAM[0] holds value +set load 0, +tick, +output; +tock, +output; + +set address %X2000, // Did not also write to upper RAM or Screen +eval, +output; +set address %X4000, +eval, +output; + + +//// Set RAM[0], RAM[4000] = 12345 (for following overwrite test) +set in 12345, set load 1, set address %X0000, tick, output; tock, output; +set address %X4000, tick, output; tock, output; + + +set in 2222, // Set RAM[2000] = 2222 +set load 1, +set address %X2000, +tick, +output; +tock, +output; + +set in 9999, // RAM[2000] holds value +set load 0, +tick, +output; +tock, +output; + +set address 0, // Did not also write to lower RAM or Screen +eval, +output; +set address %X4000, +eval, +output; + +set load 0, // Low order address bits connected +set address %X0001, eval, output; +set address %X0002, eval, output; +set address %X0004, eval, output; +set address %X0008, eval, output; +set address %X0010, eval, output; +set address %X0020, eval, output; +set address %X0040, eval, output; +set address %X0080, eval, output; +set address %X0100, eval, output; +set address %X0200, eval, output; +set address %X0400, eval, output; +set address %X0800, eval, output; +set address %X1000, eval, output; +set address %X2000, eval, output; + +set address %X1234, // RAM[1234] = 1234 +set in 1234, +set load 1, +tick, +output; +tock, +output; + +set load 0, +set address %X2234, // Did not also write to upper RAM or Screen +eval, output; +set address %X6234, +eval, output; + +set address %X2345, // RAM[2345] = 2345 +set in 2345, +set load 1, +tick, +output; +tock, +output; + +set load 0, +set address %X0345, // Did not also write to lower RAM or Screen +eval, output; +set address %X4345, +eval, output; + + +//// Clear the overwrite detection value from the screen +set in 0, set load 1, set address %X4000, tick, output; tock, output; + + +// Keyboard test + +set address 24576, +echo "Click the Keyboard icon and hold down the 'K' key (uppercase) until you see the next message (it should appear shortly after that) ...", +// It's important to keep holding the key down since if the system is busy, +// the memory will zero itself before being outputted. + +while out <> 75 { + tick, tock, // tick, tock prevents hang if sync. parts used in KB path. +} + +clear-echo, +output; + +// Screen test + +//// Set RAM[0FCF], RAM[2FCF] = 12345 (for following overwrite test) +set in 12345, set load 1, set address %X0FCF, tick, output; tock, output; +set address %X2FCF, tick, output; tock, output; + +set load 1, +set in -1, +set address %X4FCF, +tick, +tock, +output, + +set address %X504F, +tick, +tock, +output; + +set address %X0FCF, // Did not also write to lower or upper RAM +eval, +output; +set address %X2FCF, +eval, +output; + +set load 0, // Low order address bits connected +set address %X4FCE, eval, output; +set address %X4FCD, eval, output; +set address %X4FCB, eval, output; +set address %X4FC7, eval, output; +set address %X4FDF, eval, output; +set address %X4FEF, eval, output; +set address %X4F8F, eval, output; +set address %X4F4F, eval, output; +set address %X4ECF, eval, output; +set address %X4DCF, eval, output; +set address %X4BCF, eval, output; +set address %X47CF, eval, output; +set address %X5FCF, eval, output; + + +set load 0, +set address 24576, +echo "Make sure you see ONLY two horizontal lines in the middle of the screen. Hold down 'Y' (uppercase) until you see the next message ...", +// It's important to keep holding the key down since if the system is busy, +// the memory will zero itself before being outputted. + +while out <> 89 { + tick, tock, // tick, tock prevents hang if sync. parts used in KB path. +} + +clear-echo, +output; diff --git a/nand2tetris-suite/projects/05/Rect.hack b/nand2tetris-suite/projects/05/Rect.hack new file mode 100644 index 0000000..ee017ab --- /dev/null +++ b/nand2tetris-suite/projects/05/Rect.hack @@ -0,0 +1,25 @@ +0000000000000000 +1111110000010000 +0000000000010111 +1110001100000110 +0000000000010000 +1110001100001000 +0100000000000000 +1110110000010000 +0000000000010001 +1110001100001000 +0000000000010001 +1111110000100000 +1110111010001000 +0000000000010001 +1111110000010000 +0000000000100000 +1110000010010000 +0000000000010001 +1110001100001000 +0000000000010000 +1111110010011000 +0000000000001010 +1110001100000001 +0000000000010111 +1110101010000111 diff --git a/nand2tetris-suite/projects/06/add/Add.asm b/nand2tetris-suite/projects/06/add/Add.asm new file mode 100644 index 0000000..3d4ec46 --- /dev/null +++ b/nand2tetris-suite/projects/06/add/Add.asm @@ -0,0 +1,13 @@ +// 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/06/add/Add.asm + +// Computes R0 = 2 + 3 (R0 refers to RAM[0]) + +@2 +D=A +@3 +D=D+A +@0 +M=D diff --git a/nand2tetris-suite/projects/06/max/Max.asm b/nand2tetris-suite/projects/06/max/Max.asm new file mode 100644 index 0000000..b62c138 --- /dev/null +++ b/nand2tetris-suite/projects/06/max/Max.asm @@ -0,0 +1,26 @@ +// 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/06/max/Max.asm + +// Computes R2 = max(R0, R1) (R0,R1,R2 refer to RAM[0],RAM[1],RAM[2]) + + @R0 + D=M // D = first number + @R1 + D=D-M // D = first number - second number + @OUTPUT_FIRST + D;JGT // if D>0 (first is greater) goto output_first + @R1 + D=M // D = second number + @OUTPUT_D + 0;JMP // goto output_d +(OUTPUT_FIRST) + @R0 + D=M // D = first number +(OUTPUT_D) + @R2 + M=D // M[2] = D (greatest number) +(INFINITE_LOOP) + @INFINITE_LOOP + 0;JMP // infinite loop diff --git a/nand2tetris-suite/projects/06/max/MaxL.asm b/nand2tetris-suite/projects/06/max/MaxL.asm new file mode 100644 index 0000000..fc3ccbf --- /dev/null +++ b/nand2tetris-suite/projects/06/max/MaxL.asm @@ -0,0 +1,23 @@ +// 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/06/max/MaxL.asm + +// Symbol-less version of the Max.asm program. + +@0 +D=M +@1 +D=D-M +@10 +D;JGT +@1 +D=M +@12 +0;JMP +@0 +D=M +@2 +M=D +@14 +0;JMP diff --git a/nand2tetris-suite/projects/06/pong/Pong.asm b/nand2tetris-suite/projects/06/pong/Pong.asm new file mode 100644 index 0000000..79691f0 --- /dev/null +++ b/nand2tetris-suite/projects/06/pong/Pong.asm @@ -0,0 +1,28375 @@ +// 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/06/pong/Pong.asm + +// The Pong game program was originally written in the high-level Jack language. +// The Jack code was then translated by the Jack compiler into VM code. +// The VM code was then translated by the VM translator into the Hack +// assembly code shown here. + +@256 +D=A +@SP +M=D +@133 +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_EQ +D;JNE +@SP +A=M-1 +M=-1 +(END_EQ) +@R15 +A=M +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_GT +D;JLE +@SP +A=M-1 +M=-1 +(END_GT) +@R15 +A=M +0;JMP +@R15 +M=D +@SP +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@END_LT +D;JGE +@SP +A=M-1 +M=-1 +(END_LT) +@R15 +A=M +0;JMP +@5 +D=A +@LCL +A=M-D +D=M +@R13 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +D=A +@SP +M=D+1 +@LCL +D=M +@R14 +AM=D-1 +D=M +@THAT +M=D +@R14 +AM=M-1 +D=M +@THIS +M=D +@R14 +AM=M-1 +D=M +@ARG +M=D +@R14 +AM=M-1 +D=M +@LCL +M=D +@R13 +A=M +0;JMP +@SP +A=M +M=D +@LCL +D=M +@SP +AM=M+1 +M=D +@ARG +D=M +@SP +AM=M+1 +M=D +@THIS +D=M +@SP +AM=M+1 +M=D +@THAT +D=M +@SP +AM=M+1 +M=D +@4 +D=A +@R13 +D=D+M +@SP +D=M-D +@ARG +M=D +@SP +MD=M+1 +@LCL +M=D +@R14 +A=M +0;JMP +@0 +D=A +@R13 +M=D +@sys.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL0 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL0) +(ball.new) +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL1 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL1) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +D=M +@11 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@12 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +D=M +@13 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL2 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL2) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL3 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL3) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.show) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL4 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL4) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL5 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL5) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.hide) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL6 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL6) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL7 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL7) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.draw) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL8 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL8) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.getleft) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.getright) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(ball.setdestination) +@3 +D=A +(LOOP_ball.setdestination) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ball.setdestination +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL9 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL9) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL10 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL10) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT0 +D=A +@38 +0;JMP +(RET_ADDRESS_LT0) +@THIS +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.setdestination$if_true0 +D;JNE +@ball.setdestination$if_false0 +0;JMP +(ball.setdestination$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT1 +D=A +@38 +0;JMP +(RET_ADDRESS_LT1) +@THIS +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT2 +D=A +@38 +0;JMP +(RET_ADDRESS_LT2) +@THIS +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ball.setdestination$if_end0 +0;JMP +(ball.setdestination$if_false0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT3 +D=A +@38 +0;JMP +(RET_ADDRESS_LT3) +@THIS +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT4 +D=A +@38 +0;JMP +(RET_ADDRESS_LT4) +@THIS +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +(ball.setdestination$if_end0) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL11 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL11) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL12 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL12) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL13 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL13) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ball.move) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.hide +D=A +@R14 +M=D +@RET_ADDRESS_CALL14 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL14) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT5 +D=A +@38 +0;JMP +(RET_ADDRESS_LT5) +@SP +AM=M-1 +D=M +@ball.move$if_true0 +D;JNE +@ball.move$if_false0 +0;JMP +(ball.move$if_true0) +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.move$if_end0 +0;JMP +(ball.move$if_false0) +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true1 +D;JNE +@ball.move$if_false1 +0;JMP +(ball.move$if_true1) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true2 +D;JNE +@ball.move$if_false2 +0;JMP +(ball.move$if_true2) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ball.move$if_end2 +0;JMP +(ball.move$if_false2) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_end2) +@ball.move$if_end1 +0;JMP +(ball.move$if_false1) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true3 +D;JNE +@ball.move$if_false3 +0;JMP +(ball.move$if_true3) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ball.move$if_end3 +0;JMP +(ball.move$if_false3) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_end3) +(ball.move$if_end1) +(ball.move$if_end0) +@THIS +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true4 +D;JNE +@ball.move$if_false4 +0;JMP +(ball.move$if_true4) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true5 +D;JNE +@ball.move$if_false5 +0;JMP +(ball.move$if_true5) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ball.move$if_end5 +0;JMP +(ball.move$if_false5) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_end5) +@ball.move$if_end4 +0;JMP +(ball.move$if_false4) +@THIS +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ball.move$if_true6 +D;JNE +@ball.move$if_false6 +0;JMP +(ball.move$if_true6) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ball.move$if_end6 +0;JMP +(ball.move$if_false6) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_end6) +(ball.move$if_end4) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT0 +D=A +@22 +0;JMP +(RET_ADDRESS_GT0) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true7 +D;JNE +@ball.move$if_false7 +0;JMP +(ball.move$if_true7) +@SP +M=M+1 +A=M-1 +M=1 +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_false7) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT6 +D=A +@38 +0;JMP +(RET_ADDRESS_LT6) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true8 +D;JNE +@ball.move$if_false8 +0;JMP +(ball.move$if_true8) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(ball.move$if_false8) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@12 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT1 +D=A +@22 +0;JMP +(RET_ADDRESS_GT1) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true9 +D;JNE +@ball.move$if_false9 +0;JMP +(ball.move$if_true9) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@12 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_false9) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@13 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT7 +D=A +@38 +0;JMP +(RET_ADDRESS_LT7) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ball.move$if_true10 +D;JNE +@ball.move$if_false10 +0;JMP +(ball.move$if_true10) +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@14 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@THIS +D=M +@13 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(ball.move$if_false10) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL15 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL15) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ball.bounce) +@5 +D=A +(LOOP_ball.bounce) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ball.bounce +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL16 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL16) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL17 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL17) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ0 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ0) +@SP +AM=M-1 +D=M +@ball.bounce$if_true0 +D;JNE +@ball.bounce$if_false0 +0;JMP +(ball.bounce$if_true0) +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.bounce$if_end0 +0;JMP +(ball.bounce$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT8 +D=A +@38 +0;JMP +(RET_ADDRESS_LT8) +@SP +A=M-1 +M=!M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ1 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ1) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT9 +D=A +@38 +0;JMP +(RET_ADDRESS_LT9) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_EQ2 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ2) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@ball.bounce$if_true1 +D;JNE +@ball.bounce$if_false1 +0;JMP +(ball.bounce$if_true1) +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ball.bounce$if_end1 +0;JMP +(ball.bounce$if_false1) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +(ball.bounce$if_end1) +(ball.bounce$if_end0) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ3 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ3) +@SP +AM=M-1 +D=M +@ball.bounce$if_true2 +D;JNE +@ball.bounce$if_false2 +0;JMP +(ball.bounce$if_true2) +@506 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL18 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL18) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL19 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL19) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL20 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL20) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ball.bounce$if_end2 +0;JMP +(ball.bounce$if_false2) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ4 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ4) +@SP +AM=M-1 +D=M +@ball.bounce$if_true3 +D;JNE +@ball.bounce$if_false3 +0;JMP +(ball.bounce$if_true3) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL21 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL21) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL22 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL22) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL23 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL23) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ball.bounce$if_end3 +0;JMP +(ball.bounce$if_false3) +@THIS +D=M +@14 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ5 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ5) +@SP +AM=M-1 +D=M +@ball.bounce$if_true4 +D;JNE +@ball.bounce$if_false4 +0;JMP +(ball.bounce$if_true4) +@250 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL24 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL24) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL25 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL25) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL26 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL26) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ball.bounce$if_end4 +0;JMP +(ball.bounce$if_false4) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL27 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL27) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL28 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL28) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL29 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL29) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(ball.bounce$if_end4) +(ball.bounce$if_end3) +(ball.bounce$if_end2) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@ball.setdestination +D=A +@R14 +M=D +@RET_ADDRESS_CALL30 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL30) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.new) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL31 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL31) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL32 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL32) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(bat.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL33 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL33) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.show) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL34 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL34) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL35 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL35) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.hide) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL36 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL36) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.draw +D=A +@R14 +M=D +@RET_ADDRESS_CALL37 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL37) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.draw) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL38 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL38) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.setdirection) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.getleft) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(bat.getright) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(bat.setwidth) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.hide +D=A +@R14 +M=D +@RET_ADDRESS_CALL39 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL39) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.show +D=A +@R14 +M=D +@RET_ADDRESS_CALL40 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL40) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(bat.move) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_EQ6 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ6) +@SP +AM=M-1 +D=M +@bat.move$if_true0 +D;JNE +@bat.move$if_false0 +0;JMP +(bat.move$if_true0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT10 +D=A +@38 +0;JMP +(RET_ADDRESS_LT10) +@SP +AM=M-1 +D=M +@bat.move$if_true1 +D;JNE +@bat.move$if_false1 +0;JMP +(bat.move$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(bat.move$if_false1) +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL41 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL41) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL42 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL42) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL43 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL43) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL44 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL44) +@SP +AM=M-1 +D=M +@R5 +M=D +@bat.move$if_end0 +0;JMP +(bat.move$if_false0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT2 +D=A +@22 +0;JMP +(RET_ADDRESS_GT2) +@SP +AM=M-1 +D=M +@bat.move$if_true2 +D;JNE +@bat.move$if_false2 +0;JMP +(bat.move$if_true2) +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +(bat.move$if_false2) +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL45 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL45) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL46 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL46) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@1 +D=A +@R13 +M=D +@screen.setcolor +D=A +@R14 +M=D +@RET_ADDRESS_CALL47 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL47) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL48 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL48) +@SP +AM=M-1 +D=M +@R5 +M=D +(bat.move$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(main.main) +@SP +AM=M+1 +A=A-1 +M=0 +@0 +D=A +@R13 +M=D +@ponggame.newinstance +D=A +@R14 +M=D +@RET_ADDRESS_CALL49 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL49) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@ponggame.getinstance +D=A +@R14 +M=D +@RET_ADDRESS_CALL50 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL50) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.run +D=A +@R14 +M=D +@RET_ADDRESS_CALL51 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL51) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL52 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL52) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.new) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL53 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL53) +@SP +AM=M-1 +D=M +@THIS +M=D +@0 +D=A +@R13 +M=D +@screen.clearscreen +D=A +@R14 +M=D +@RET_ADDRESS_CALL54 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL54) +@SP +AM=M-1 +D=M +@R5 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@230 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@229 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@bat.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL55 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL55) +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@253 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@222 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@229 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@R13 +M=D +@ball.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL56 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL56) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@400 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@3 +D=A +@R13 +M=D +@ball.setdestination +D=A +@R14 +M=D +@RET_ADDRESS_CALL57 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL57) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@238 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@240 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawrectangle +D=A +@R14 +M=D +@RET_ADDRESS_CALL58 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL58) +@SP +AM=M-1 +D=M +@R5 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL59 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL59) +@SP +AM=M-1 +D=M +@R5 +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL60 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL60) +@83 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL61 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL61) +@99 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL62 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL62) +@111 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL63 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL63) +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL64 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL64) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL65 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL65) +@58 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL66 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL66) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL67 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL67) +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL68 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL68) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL69 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL69) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ponggame.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL70 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL70) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL71 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL71) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL72 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL72) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.newinstance) +@0 +D=A +@R13 +M=D +@ponggame.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL73 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL73) +@SP +AM=M-1 +D=M +@ponggame.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.getinstance) +@ponggame.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(ponggame.run) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +(ponggame.run$while_exp0) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end0 +D;JNE +(ponggame.run$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ7 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ7) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end1 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL74 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL74) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL75 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL75) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.moveball +D=A +@R14 +M=D +@RET_ADDRESS_CALL76 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL76) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$while_exp1 +0;JMP +(ponggame.run$while_end1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@130 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ8 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ8) +@SP +AM=M-1 +D=M +@ponggame.run$if_true0 +D;JNE +@ponggame.run$if_false0 +0;JMP +(ponggame.run$if_true0) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@2 +D=A +@R13 +M=D +@bat.setdirection +D=A +@R14 +M=D +@RET_ADDRESS_CALL77 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL77) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$if_end0 +0;JMP +(ponggame.run$if_false0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@132 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ9 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ9) +@SP +AM=M-1 +D=M +@ponggame.run$if_true1 +D;JNE +@ponggame.run$if_false1 +0;JMP +(ponggame.run$if_true1) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@bat.setdirection +D=A +@R14 +M=D +@RET_ADDRESS_CALL78 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL78) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$if_end1 +0;JMP +(ponggame.run$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@140 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ10 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ10) +@SP +AM=M-1 +D=M +@ponggame.run$if_true2 +D;JNE +@ponggame.run$if_false2 +0;JMP +(ponggame.run$if_true2) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +(ponggame.run$if_false2) +(ponggame.run$if_end1) +(ponggame.run$if_end0) +(ponggame.run$while_exp2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ11 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ11) +@SP +A=M-1 +M=!M +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.run$while_end2 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL79 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL79) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL80 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL80) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ponggame.moveball +D=A +@R14 +M=D +@RET_ADDRESS_CALL81 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL81) +@SP +AM=M-1 +D=M +@R5 +M=D +@ponggame.run$while_exp2 +0;JMP +(ponggame.run$while_end2) +@ponggame.run$while_exp0 +0;JMP +(ponggame.run$while_end0) +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ponggame.run$if_true3 +D;JNE +@ponggame.run$if_false3 +0;JMP +(ponggame.run$if_true3) +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL82 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL82) +@SP +AM=M-1 +D=M +@R5 +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL83 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL83) +@71 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL84 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL84) +@97 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL85 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL85) +@109 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL86 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL86) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL87 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL87) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL88 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL88) +@79 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL89 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL89) +@118 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL90 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL90) +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL91 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL91) +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL92 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL92) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL93 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL93) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.run$if_false3) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(ponggame.moveball) +@5 +D=A +(LOOP_ponggame.moveball) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_ponggame.moveball +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.move +D=A +@R14 +M=D +@RET_ADDRESS_CALL94 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL94) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT3 +D=A +@22 +0;JMP +(RET_ADDRESS_GT3) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ12 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ12) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true0 +D;JNE +@ponggame.moveball$if_false0 +0;JMP +(ponggame.moveball$if_true0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.getleft +D=A +@R14 +M=D +@RET_ADDRESS_CALL95 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL95) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@bat.getright +D=A +@R14 +M=D +@RET_ADDRESS_CALL96 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL96) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.getleft +D=A +@R14 +M=D +@RET_ADDRESS_CALL97 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL97) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@ball.getright +D=A +@R14 +M=D +@RET_ADDRESS_CALL98 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL98) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ13 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ13) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true1 +D;JNE +@ponggame.moveball$if_false1 +0;JMP +(ponggame.moveball$if_true1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT4 +D=A +@22 +0;JMP +(RET_ADDRESS_GT4) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT11 +D=A +@38 +0;JMP +(RET_ADDRESS_LT11) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +M=D +@THIS +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true2 +D;JNE +@ponggame.moveball$if_false2 +0;JMP +(ponggame.moveball$if_true2) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_LT12 +D=A +@38 +0;JMP +(RET_ADDRESS_LT12) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true3 +D;JNE +@ponggame.moveball$if_false3 +0;JMP +(ponggame.moveball$if_true3) +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ponggame.moveball$if_end3 +0;JMP +(ponggame.moveball$if_false3) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@RET_ADDRESS_GT5 +D=A +@22 +0;JMP +(RET_ADDRESS_GT5) +@SP +AM=M-1 +D=M +@ponggame.moveball$if_true4 +D;JNE +@ponggame.moveball$if_false4 +0;JMP +(ponggame.moveball$if_true4) +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(ponggame.moveball$if_false4) +(ponggame.moveball$if_end3) +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@bat.setwidth +D=A +@R14 +M=D +@RET_ADDRESS_CALL99 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL99) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@output.movecursor +D=A +@R14 +M=D +@RET_ADDRESS_CALL100 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL100) +@SP +AM=M-1 +D=M +@R5 +M=D +@THIS +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printint +D=A +@R14 +M=D +@RET_ADDRESS_CALL101 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL101) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.moveball$if_false2) +(ponggame.moveball$if_false1) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@ball.bounce +D=A +@R14 +M=D +@RET_ADDRESS_CALL102 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL102) +@SP +AM=M-1 +D=M +@R5 +M=D +(ponggame.moveball$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(array.new) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT6 +D=A +@22 +0;JMP +(RET_ADDRESS_GT6) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@array.new$if_true0 +D;JNE +@array.new$if_false0 +0;JMP +(array.new$if_true0) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL103 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL103) +@SP +AM=M-1 +D=M +@R5 +M=D +(array.new$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL104 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL104) +@54 +0;JMP +(array.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL105 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL105) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(keyboard.init) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(keyboard.keypressed) +@24576 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.peek +D=A +@R14 +M=D +@RET_ADDRESS_CALL106 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL106) +@54 +0;JMP +(keyboard.readchar) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@SP +M=M+1 +A=M-1 +M=0 +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL107 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL107) +@SP +AM=M-1 +D=M +@R5 +M=D +(keyboard.readchar$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ14 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ14) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT7 +D=A +@22 +0;JMP +(RET_ADDRESS_GT7) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readchar$while_end0 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.keypressed +D=A +@R14 +M=D +@RET_ADDRESS_CALL108 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL108) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT8 +D=A +@22 +0;JMP +(RET_ADDRESS_GT8) +@SP +AM=M-1 +D=M +@keyboard.readchar$if_true0 +D;JNE +@keyboard.readchar$if_false0 +0;JMP +(keyboard.readchar$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(keyboard.readchar$if_false0) +@keyboard.readchar$while_exp0 +0;JMP +(keyboard.readchar$while_end0) +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL109 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL109) +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL110 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL110) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL111 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL111) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(keyboard.readline) +@5 +D=A +(LOOP_keyboard.readline) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_keyboard.readline +D;JGT +@80 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL112 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL112) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL113 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL113) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@string.newline +D=A +@R14 +M=D +@RET_ADDRESS_CALL114 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL114) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL115 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL115) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(keyboard.readline$while_exp0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readline$while_end0 +D;JNE +@0 +D=A +@R13 +M=D +@keyboard.readchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL116 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL116) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ15 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ15) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@keyboard.readline$if_true0 +D;JNE +@keyboard.readline$if_false0 +0;JMP +(keyboard.readline$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ16 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ16) +@SP +AM=M-1 +D=M +@keyboard.readline$if_true1 +D;JNE +@keyboard.readline$if_false1 +0;JMP +(keyboard.readline$if_true1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.eraselastchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL117 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL117) +@SP +AM=M-1 +D=M +@R5 +M=D +@keyboard.readline$if_end1 +0;JMP +(keyboard.readline$if_false1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL118 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL118) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(keyboard.readline$if_end1) +(keyboard.readline$if_false0) +@keyboard.readline$while_exp0 +0;JMP +(keyboard.readline$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(keyboard.readint) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@keyboard.readline +D=A +@R14 +M=D +@RET_ADDRESS_CALL119 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL119) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.intvalue +D=A +@R14 +M=D +@RET_ADDRESS_CALL120 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL120) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL121 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL121) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.init) +@SP +AM=M+1 +A=A-1 +M=0 +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL122 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL122) +@SP +AM=M-1 +D=M +@math.1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL123 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL123) +@SP +AM=M-1 +D=M +@math.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(math.init$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT13 +D=A +@38 +0;JMP +(RET_ADDRESS_LT13) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.init$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@math.init$while_exp0 +0;JMP +(math.init$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(math.abs) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT14 +D=A +@38 +0;JMP +(RET_ADDRESS_LT14) +@SP +AM=M-1 +D=M +@math.abs$if_true0 +D;JNE +@math.abs$if_false0 +0;JMP +(math.abs$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.abs$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.multiply) +@5 +D=A +(LOOP_math.multiply) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.multiply +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT15 +D=A +@38 +0;JMP +(RET_ADDRESS_LT15) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT9 +D=A +@22 +0;JMP +(RET_ADDRESS_GT9) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT10 +D=A +@22 +0;JMP +(RET_ADDRESS_GT10) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT16 +D=A +@38 +0;JMP +(RET_ADDRESS_LT16) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL124 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL124) +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL125 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL125) +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT17 +D=A +@38 +0;JMP +(RET_ADDRESS_LT17) +@SP +AM=M-1 +D=M +@math.multiply$if_true0 +D;JNE +@math.multiply$if_false0 +0;JMP +(math.multiply$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.multiply$if_false0) +(math.multiply$while_exp0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT18 +D=A +@38 +0;JMP +(RET_ADDRESS_LT18) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.multiply$while_end0 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT11 +D=A +@22 +0;JMP +(RET_ADDRESS_GT11) +@SP +AM=M-1 +D=M +@math.multiply$if_true1 +D;JNE +@math.multiply$if_false1 +0;JMP +(math.multiply$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(math.multiply$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@math.multiply$while_exp0 +0;JMP +(math.multiply$while_end0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@math.multiply$if_true2 +D;JNE +@math.multiply$if_false2 +0;JMP +(math.multiply$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.multiply$if_false2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.divide) +@4 +D=A +(LOOP_math.divide) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.divide +D;JGT +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ17 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ17) +@SP +AM=M-1 +D=M +@math.divide$if_true0 +D;JNE +@math.divide$if_false0 +0;JMP +(math.divide$if_true0) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL126 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL126) +@SP +AM=M-1 +D=M +@R5 +M=D +(math.divide$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT19 +D=A +@38 +0;JMP +(RET_ADDRESS_LT19) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT12 +D=A +@22 +0;JMP +(RET_ADDRESS_GT12) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT13 +D=A +@22 +0;JMP +(RET_ADDRESS_GT13) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT20 +D=A +@38 +0;JMP +(RET_ADDRESS_LT20) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL127 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL127) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL128 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL128) +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.divide$while_exp0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$while_end0 +D;JNE +@32767 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT21 +D=A +@38 +0;JMP +(RET_ADDRESS_LT21) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true1 +D;JNE +@math.divide$if_false1 +0;JMP +(math.divide$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT14 +D=A +@22 +0;JMP +(RET_ADDRESS_GT14) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true2 +D;JNE +@math.divide$if_false2 +0;JMP +(math.divide$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.divide$if_false2) +(math.divide$if_false1) +@math.divide$while_exp0 +0;JMP +(math.divide$while_end0) +(math.divide$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT15 +D=A +@22 +0;JMP +(RET_ADDRESS_GT15) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT16 +D=A +@22 +0;JMP +(RET_ADDRESS_GT16) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.divide$if_true3 +D;JNE +@math.divide$if_false3 +0;JMP +(math.divide$if_true3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(math.divide$if_false3) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@math.divide$while_exp1 +0;JMP +(math.divide$while_end1) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@math.divide$if_true4 +D;JNE +@math.divide$if_false4 +0;JMP +(math.divide$if_true4) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(math.divide$if_false4) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.sqrt) +@4 +D=A +(LOOP_math.sqrt) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_math.sqrt +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT22 +D=A +@38 +0;JMP +(RET_ADDRESS_LT22) +@SP +AM=M-1 +D=M +@math.sqrt$if_true0 +D;JNE +@math.sqrt$if_false0 +0;JMP +(math.sqrt$if_true0) +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL129 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL129) +@SP +AM=M-1 +D=M +@R5 +M=D +(math.sqrt$if_false0) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(math.sqrt$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT17 +D=A +@22 +0;JMP +(RET_ADDRESS_GT17) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@math.sqrt$while_end0 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@math.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL130 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL130) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT18 +D=A +@22 +0;JMP +(RET_ADDRESS_GT18) +@SP +A=M-1 +M=!M +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT23 +D=A +@38 +0;JMP +(RET_ADDRESS_LT23) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@math.sqrt$if_true1 +D;JNE +@math.sqrt$if_false1 +0;JMP +(math.sqrt$if_true1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(math.sqrt$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@math.sqrt$while_exp0 +0;JMP +(math.sqrt$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.max) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT19 +D=A +@22 +0;JMP +(RET_ADDRESS_GT19) +@SP +AM=M-1 +D=M +@math.max$if_true0 +D;JNE +@math.max$if_false0 +0;JMP +(math.max$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.max$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(math.min) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT24 +D=A +@38 +0;JMP +(RET_ADDRESS_LT24) +@SP +AM=M-1 +D=M +@math.min$if_true0 +D;JNE +@math.min$if_false0 +0;JMP +(math.min$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(math.min$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(memory.init) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@memory.0 +M=D +@2048 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@14334 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@2049 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@2050 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(memory.peek) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(memory.poke) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@memory.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(memory.alloc) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@RET_ADDRESS_LT25 +D=A +@38 +0;JMP +(RET_ADDRESS_LT25) +@SP +AM=M-1 +D=M +@memory.alloc$if_true0 +D;JNE +@memory.alloc$if_false0 +0;JMP +(memory.alloc$if_true0) +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL131 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL131) +@SP +AM=M-1 +D=M +@R5 +M=D +(memory.alloc$if_false0) +@2048 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(memory.alloc$while_exp0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT26 +D=A +@38 +0;JMP +(RET_ADDRESS_LT26) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@memory.alloc$while_end0 +D;JNE +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@memory.alloc$while_exp0 +0;JMP +(memory.alloc$while_end0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@16379 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT20 +D=A +@22 +0;JMP +(RET_ADDRESS_GT20) +@SP +AM=M-1 +D=M +@memory.alloc$if_true1 +D;JNE +@memory.alloc$if_false1 +0;JMP +(memory.alloc$if_true1) +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL132 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL132) +@SP +AM=M-1 +D=M +@R5 +M=D +(memory.alloc$if_false1) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_GT21 +D=A +@22 +0;JMP +(RET_ADDRESS_GT21) +@SP +AM=M-1 +D=M +@memory.alloc$if_true2 +D;JNE +@memory.alloc$if_false2 +0;JMP +(memory.alloc$if_true2) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_EQ18 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ18) +@SP +AM=M-1 +D=M +@memory.alloc$if_true3 +D;JNE +@memory.alloc$if_false3 +0;JMP +(memory.alloc$if_true3) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.alloc$if_end3 +0;JMP +(memory.alloc$if_false3) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.alloc$if_end3) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.alloc$if_false2) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +(memory.dealloc) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ19 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ19) +@SP +AM=M-1 +D=M +@memory.dealloc$if_true0 +D;JNE +@memory.dealloc$if_false0 +0;JMP +(memory.dealloc$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.dealloc$if_end0 +0;JMP +(memory.dealloc$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@RET_ADDRESS_EQ20 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ20) +@SP +AM=M-1 +D=M +@memory.dealloc$if_true1 +D;JNE +@memory.dealloc$if_false1 +0;JMP +(memory.dealloc$if_true1) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@memory.dealloc$if_end1 +0;JMP +(memory.dealloc$if_false1) +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(memory.dealloc$if_end1) +(memory.dealloc$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.init) +@16384 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.4 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.0 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL133 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL133) +@SP +AM=M-1 +D=M +@output.3 +M=D +@0 +D=A +@R13 +M=D +@output.initmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL134 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL134) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@output.createshiftedmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL135 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL135) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.initmap) +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL136 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL136) +@SP +AM=M-1 +D=M +@output.5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL137 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL137) +@SP +AM=M-1 +D=M +@R5 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL138 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL138) +@SP +AM=M-1 +D=M +@R5 +M=D +@33 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL139 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL139) +@SP +AM=M-1 +D=M +@R5 +M=D +@34 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL140 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL140) +@SP +AM=M-1 +D=M +@R5 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL141 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL141) +@SP +AM=M-1 +D=M +@R5 +M=D +@36 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL142 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL142) +@SP +AM=M-1 +D=M +@R5 +M=D +@37 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL143 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL143) +@SP +AM=M-1 +D=M +@R5 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL144 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL144) +@SP +AM=M-1 +D=M +@R5 +M=D +@39 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL145 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL145) +@SP +AM=M-1 +D=M +@R5 +M=D +@40 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL146 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL146) +@SP +AM=M-1 +D=M +@R5 +M=D +@41 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL147 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL147) +@SP +AM=M-1 +D=M +@R5 +M=D +@42 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL148 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL148) +@SP +AM=M-1 +D=M +@R5 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL149 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL149) +@SP +AM=M-1 +D=M +@R5 +M=D +@44 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL150 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL150) +@SP +AM=M-1 +D=M +@R5 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL151 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL151) +@SP +AM=M-1 +D=M +@R5 +M=D +@46 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL152 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL152) +@SP +AM=M-1 +D=M +@R5 +M=D +@47 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL153 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL153) +@SP +AM=M-1 +D=M +@R5 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL154 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL154) +@SP +AM=M-1 +D=M +@R5 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL155 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL155) +@SP +AM=M-1 +D=M +@R5 +M=D +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL156 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL156) +@SP +AM=M-1 +D=M +@R5 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL157 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL157) +@SP +AM=M-1 +D=M +@R5 +M=D +@52 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@26 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL158 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL158) +@SP +AM=M-1 +D=M +@R5 +M=D +@53 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL159 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL159) +@SP +AM=M-1 +D=M +@R5 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL160 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL160) +@SP +AM=M-1 +D=M +@R5 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL161 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL161) +@SP +AM=M-1 +D=M +@R5 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL162 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL162) +@SP +AM=M-1 +D=M +@R5 +M=D +@57 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL163 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL163) +@SP +AM=M-1 +D=M +@R5 +M=D +@58 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL164 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL164) +@SP +AM=M-1 +D=M +@R5 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL165 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL165) +@SP +AM=M-1 +D=M +@R5 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL166 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL166) +@SP +AM=M-1 +D=M +@R5 +M=D +@61 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL167 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL167) +@SP +AM=M-1 +D=M +@R5 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL168 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL168) +@SP +AM=M-1 +D=M +@R5 +M=D +@64 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL169 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL169) +@SP +AM=M-1 +D=M +@R5 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL170 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL170) +@SP +AM=M-1 +D=M +@R5 +M=D +@65 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL171 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL171) +@SP +AM=M-1 +D=M +@R5 +M=D +@66 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL172 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL172) +@SP +AM=M-1 +D=M +@R5 +M=D +@67 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL173 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL173) +@SP +AM=M-1 +D=M +@R5 +M=D +@68 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL174 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL174) +@SP +AM=M-1 +D=M +@R5 +M=D +@69 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL175 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL175) +@SP +AM=M-1 +D=M +@R5 +M=D +@70 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL176 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL176) +@SP +AM=M-1 +D=M +@R5 +M=D +@71 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@44 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL177 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL177) +@SP +AM=M-1 +D=M +@R5 +M=D +@72 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL178 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL178) +@SP +AM=M-1 +D=M +@R5 +M=D +@73 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL179 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL179) +@SP +AM=M-1 +D=M +@R5 +M=D +@74 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL180 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL180) +@SP +AM=M-1 +D=M +@R5 +M=D +@75 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL181 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL181) +@SP +AM=M-1 +D=M +@R5 +M=D +@76 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL182 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL182) +@SP +AM=M-1 +D=M +@R5 +M=D +@77 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@33 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL183 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL183) +@SP +AM=M-1 +D=M +@R5 +M=D +@78 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL184 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL184) +@SP +AM=M-1 +D=M +@R5 +M=D +@79 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL185 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL185) +@SP +AM=M-1 +D=M +@R5 +M=D +@80 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL186 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL186) +@SP +AM=M-1 +D=M +@R5 +M=D +@81 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@59 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL187 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL187) +@SP +AM=M-1 +D=M +@R5 +M=D +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL188 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL188) +@SP +AM=M-1 +D=M +@R5 +M=D +@83 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL189 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL189) +@SP +AM=M-1 +D=M +@R5 +M=D +@84 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL190 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL190) +@SP +AM=M-1 +D=M +@R5 +M=D +@85 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL191 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL191) +@SP +AM=M-1 +D=M +@R5 +M=D +@86 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL192 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL192) +@SP +AM=M-1 +D=M +@R5 +M=D +@87 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL193 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL193) +@SP +AM=M-1 +D=M +@R5 +M=D +@88 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL194 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL194) +@SP +AM=M-1 +D=M +@R5 +M=D +@89 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL195 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL195) +@SP +AM=M-1 +D=M +@R5 +M=D +@90 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@49 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@35 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL196 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL196) +@SP +AM=M-1 +D=M +@R5 +M=D +@91 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL197 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL197) +@SP +AM=M-1 +D=M +@R5 +M=D +@92 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=1 +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL198 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL198) +@SP +AM=M-1 +D=M +@R5 +M=D +@93 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL199 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL199) +@SP +AM=M-1 +D=M +@R5 +M=D +@94 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL200 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL200) +@SP +AM=M-1 +D=M +@R5 +M=D +@95 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL201 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL201) +@SP +AM=M-1 +D=M +@R5 +M=D +@96 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL202 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL202) +@SP +AM=M-1 +D=M +@R5 +M=D +@97 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL203 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL203) +@SP +AM=M-1 +D=M +@R5 +M=D +@98 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL204 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL204) +@SP +AM=M-1 +D=M +@R5 +M=D +@99 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL205 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL205) +@SP +AM=M-1 +D=M +@R5 +M=D +@100 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@60 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL206 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL206) +@SP +AM=M-1 +D=M +@R5 +M=D +@101 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL207 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL207) +@SP +AM=M-1 +D=M +@R5 +M=D +@102 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL208 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL208) +@SP +AM=M-1 +D=M +@R5 +M=D +@103 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL209 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL209) +@SP +AM=M-1 +D=M +@R5 +M=D +@104 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL210 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL210) +@SP +AM=M-1 +D=M +@R5 +M=D +@105 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL211 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL211) +@SP +AM=M-1 +D=M +@R5 +M=D +@106 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL212 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL212) +@SP +AM=M-1 +D=M +@R5 +M=D +@107 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL213 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL213) +@SP +AM=M-1 +D=M +@R5 +M=D +@108 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL214 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL214) +@SP +AM=M-1 +D=M +@R5 +M=D +@109 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@43 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL215 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL215) +@SP +AM=M-1 +D=M +@R5 +M=D +@110 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL216 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL216) +@SP +AM=M-1 +D=M +@R5 +M=D +@111 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL217 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL217) +@SP +AM=M-1 +D=M +@R5 +M=D +@112 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL218 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL218) +@SP +AM=M-1 +D=M +@R5 +M=D +@113 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL219 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL219) +@SP +AM=M-1 +D=M +@R5 +M=D +@114 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@29 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@55 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL220 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL220) +@SP +AM=M-1 +D=M +@R5 +M=D +@115 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL221 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL221) +@SP +AM=M-1 +D=M +@R5 +M=D +@116 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@28 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL222 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL222) +@SP +AM=M-1 +D=M +@R5 +M=D +@117 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL223 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL223) +@SP +AM=M-1 +D=M +@R5 +M=D +@118 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL224 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL224) +@SP +AM=M-1 +D=M +@R5 +M=D +@119 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL225 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL225) +@SP +AM=M-1 +D=M +@R5 +M=D +@120 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@30 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL226 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL226) +@SP +AM=M-1 +D=M +@R5 +M=D +@121 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@62 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@24 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL227 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL227) +@SP +AM=M-1 +D=M +@R5 +M=D +@122 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@27 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@51 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL228 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL228) +@SP +AM=M-1 +D=M +@R5 +M=D +@123 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL229 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL229) +@SP +AM=M-1 +D=M +@R5 +M=D +@124 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL230 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL230) +@SP +AM=M-1 +D=M +@R5 +M=D +@125 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@56 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL231 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL231) +@SP +AM=M-1 +D=M +@R5 +M=D +@126 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@38 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@25 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@SP +M=M+1 +A=M-1 +M=0 +@12 +D=A +@R13 +M=D +@output.create +D=A +@R14 +M=D +@RET_ADDRESS_CALL232 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL232) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.create) +@SP +AM=M+1 +A=A-1 +M=0 +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL233 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL233) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@4 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +D=M +@11 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.createshiftedmap) +@4 +D=A +(LOOP_output.createshiftedmap) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_output.createshiftedmap +D;JGT +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL234 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL234) +@SP +AM=M-1 +D=M +@output.6 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(output.createshiftedmap$while_exp0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@127 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT27 +D=A +@38 +0;JMP +(RET_ADDRESS_LT27) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.createshiftedmap$while_end0 +D;JNE +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL235 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL235) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.6 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(output.createshiftedmap$while_exp1) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT28 +D=A +@38 +0;JMP +(RET_ADDRESS_LT28) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.createshiftedmap$while_end1 +D;JNE +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL236 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL236) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@output.createshiftedmap$while_exp1 +0;JMP +(output.createshiftedmap$while_end1) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ21 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ21) +@SP +AM=M-1 +D=M +@output.createshiftedmap$if_true0 +D;JNE +@output.createshiftedmap$if_false0 +0;JMP +(output.createshiftedmap$if_true0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@output.createshiftedmap$if_end0 +0;JMP +(output.createshiftedmap$if_false0) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(output.createshiftedmap$if_end0) +@output.createshiftedmap$while_exp0 +0;JMP +(output.createshiftedmap$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.getmap) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT29 +D=A +@38 +0;JMP +(RET_ADDRESS_LT29) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@126 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT22 +D=A +@22 +0;JMP +(RET_ADDRESS_GT22) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@output.getmap$if_true0 +D;JNE +@output.getmap$if_false0 +0;JMP +(output.getmap$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +(output.getmap$if_false0) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.getmap$if_true1 +D;JNE +@output.getmap$if_false1 +0;JMP +(output.getmap$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@output.getmap$if_end1 +0;JMP +(output.getmap$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.6 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(output.getmap$if_end1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(output.drawchar) +@4 +D=A +(LOOP_output.drawchar) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_output.drawchar +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.getmap +D=A +@R14 +M=D +@RET_ADDRESS_CALL237 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL237) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(output.drawchar$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@11 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT30 +D=A +@38 +0;JMP +(RET_ADDRESS_LT30) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.drawchar$while_end0 +D;JNE +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.drawchar$if_true0 +D;JNE +@output.drawchar$if_false0 +0;JMP +(output.drawchar$if_true0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@output.drawchar$if_end0 +0;JMP +(output.drawchar$if_false0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +(output.drawchar$if_end0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.4 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@output.drawchar$while_exp0 +0;JMP +(output.drawchar$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.movecursor) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT31 +D=A +@38 +0;JMP +(RET_ADDRESS_LT31) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@22 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT23 +D=A +@22 +0;JMP +(RET_ADDRESS_GT23) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT32 +D=A +@38 +0;JMP +(RET_ADDRESS_LT32) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@63 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT24 +D=A +@22 +0;JMP +(RET_ADDRESS_GT24) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@output.movecursor$if_true0 +D;JNE +@output.movecursor$if_false0 +0;JMP +(output.movecursor$if_true0) +@20 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL238 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL238) +@SP +AM=M-1 +D=M +@R5 +M=D +(output.movecursor$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL239 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL239) +@SP +AM=M-1 +D=M +@output.0 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@352 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL240 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL240) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL241 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL241) +@RET_ADDRESS_EQ22 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ22) +@SP +AM=M-1 +D=M +@output.2 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL242 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL242) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@0 +D=A +@R13 +M=D +@string.newline +D=A +@R14 +M=D +@RET_ADDRESS_CALL243 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL243) +@RET_ADDRESS_EQ23 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ23) +@SP +AM=M-1 +D=M +@output.printchar$if_true0 +D;JNE +@output.printchar$if_false0 +0;JMP +(output.printchar$if_true0) +@0 +D=A +@R13 +M=D +@output.println +D=A +@R14 +M=D +@RET_ADDRESS_CALL244 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL244) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end0 +0;JMP +(output.printchar$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@0 +D=A +@R13 +M=D +@string.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL245 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL245) +@RET_ADDRESS_EQ24 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ24) +@SP +AM=M-1 +D=M +@output.printchar$if_true1 +D;JNE +@output.printchar$if_false1 +0;JMP +(output.printchar$if_true1) +@0 +D=A +@R13 +M=D +@output.backspace +D=A +@R14 +M=D +@RET_ADDRESS_CALL246 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL246) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end1 +0;JMP +(output.printchar$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL247 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL247) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.printchar$if_true2 +D;JNE +@output.printchar$if_false2 +0;JMP +(output.printchar$if_true2) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.printchar$if_false2) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ25 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ25) +@SP +AM=M-1 +D=M +@output.printchar$if_true3 +D;JNE +@output.printchar$if_false3 +0;JMP +(output.printchar$if_true3) +@0 +D=A +@R13 +M=D +@output.println +D=A +@R14 +M=D +@RET_ADDRESS_CALL248 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL248) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.printchar$if_end3 +0;JMP +(output.printchar$if_false3) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +(output.printchar$if_end3) +(output.printchar$if_end1) +(output.printchar$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printstring) +@SP +A=M +M=0 +AD=A+1 +M=0 +@SP +M=D+1 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.length +D=A +@R14 +M=D +@RET_ADDRESS_CALL249 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL249) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(output.printstring$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT33 +D=A +@38 +0;JMP +(RET_ADDRESS_LT33) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.printstring$while_end0 +D;JNE +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.charat +D=A +@R14 +M=D +@RET_ADDRESS_CALL250 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL250) +@1 +D=A +@R13 +M=D +@output.printchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL251 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL251) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@output.printstring$while_exp0 +0;JMP +(output.printstring$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.printint) +@output.3 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.setint +D=A +@R14 +M=D +@RET_ADDRESS_CALL252 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL252) +@SP +AM=M-1 +D=M +@R5 +M=D +@output.3 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL253 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL253) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.println) +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@352 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@8128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ26 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ26) +@SP +AM=M-1 +D=M +@output.println$if_true0 +D;JNE +@output.println$if_false0 +0;JMP +(output.println$if_true0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.println$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(output.backspace) +@output.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.backspace$if_true0 +D;JNE +@output.backspace$if_false0 +0;JMP +(output.backspace$if_true0) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT25 +D=A +@22 +0;JMP +(RET_ADDRESS_GT25) +@SP +AM=M-1 +D=M +@output.backspace$if_true1 +D;JNE +@output.backspace$if_false1 +0;JMP +(output.backspace$if_true1) +@output.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +@output.backspace$if_end1 +0;JMP +(output.backspace$if_false1) +@31 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.0 +M=D +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ27 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ27) +@SP +AM=M-1 +D=M +@output.backspace$if_true2 +D;JNE +@output.backspace$if_false2 +0;JMP +(output.backspace$if_true2) +@8128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.backspace$if_false2) +@output.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@321 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@output.1 +M=D +(output.backspace$if_end1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@output.2 +M=D +@output.backspace$if_end0 +0;JMP +(output.backspace$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@output.2 +M=D +(output.backspace$if_end0) +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.drawchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL254 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL254) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.init) +@SP +AM=M+1 +A=A-1 +M=0 +@16384 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.2 +M=D +@17 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL255 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL255) +@SP +AM=M-1 +D=M +@screen.0 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(screen.init$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT34 +D=A +@38 +0;JMP +(RET_ADDRESS_LT34) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.init$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@screen.init$while_exp0 +0;JMP +(screen.init$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.clearscreen) +@SP +AM=M+1 +A=A-1 +M=0 +(screen.clearscreen$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@8192 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT35 +D=A +@38 +0;JMP +(RET_ADDRESS_LT35) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.clearscreen$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.clearscreen$while_exp0 +0;JMP +(screen.clearscreen$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.updatelocation) +@screen.2 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.updatelocation$if_true0 +D;JNE +@screen.updatelocation$if_false0 +0;JMP +(screen.updatelocation$if_true0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@screen.updatelocation$if_end0 +0;JMP +(screen.updatelocation$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +(screen.updatelocation$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.setcolor) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.2 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawpixel) +@3 +D=A +(LOOP_screen.drawpixel) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawpixel +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT36 +D=A +@38 +0;JMP +(RET_ADDRESS_LT36) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT26 +D=A +@22 +0;JMP +(RET_ADDRESS_GT26) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT37 +D=A +@38 +0;JMP +(RET_ADDRESS_LT37) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT27 +D=A +@22 +0;JMP +(RET_ADDRESS_GT27) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawpixel$if_true0 +D;JNE +@screen.drawpixel$if_false0 +0;JMP +(screen.drawpixel$if_true0) +@7 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL256 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL256) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawpixel$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL257 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL257) +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL258 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL258) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL259 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL259) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL260 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL260) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawconditional) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawconditional$if_true0 +D;JNE +@screen.drawconditional$if_false0 +0;JMP +(screen.drawconditional$if_true0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.drawpixel +D=A +@R14 +M=D +@RET_ADDRESS_CALL261 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL261) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawconditional$if_end0 +0;JMP +(screen.drawconditional$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.drawpixel +D=A +@R14 +M=D +@RET_ADDRESS_CALL262 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL262) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawconditional$if_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawline) +@11 +D=A +(LOOP_screen.drawline) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawline +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT38 +D=A +@38 +0;JMP +(RET_ADDRESS_LT38) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT28 +D=A +@22 +0;JMP +(RET_ADDRESS_GT28) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT39 +D=A +@38 +0;JMP +(RET_ADDRESS_LT39) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT29 +D=A +@22 +0;JMP +(RET_ADDRESS_GT29) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawline$if_true0 +D;JNE +@screen.drawline$if_false0 +0;JMP +(screen.drawline$if_true0) +@8 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL263 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL263) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawline$if_false0) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL264 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL264) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@R13 +M=D +@math.abs +D=A +@R14 +M=D +@RET_ADDRESS_CALL265 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL265) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT40 +D=A +@38 +0;JMP +(RET_ADDRESS_LT40) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT41 +D=A +@38 +0;JMP +(RET_ADDRESS_LT41) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +M=!M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT42 +D=A +@38 +0;JMP +(RET_ADDRESS_LT42) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawline$if_true1 +D;JNE +@screen.drawline$if_false1 +0;JMP +(screen.drawline$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +A=A+1 +A=A+1 +M=D +(screen.drawline$if_false1) +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawline$if_true2 +D;JNE +@screen.drawline$if_false2 +0;JMP +(screen.drawline$if_true2) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT30 +D=A +@22 +0;JMP +(RET_ADDRESS_GT30) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@screen.drawline$if_end2 +0;JMP +(screen.drawline$if_false2) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT31 +D=A +@22 +0;JMP +(RET_ADDRESS_GT31) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +(screen.drawline$if_end2) +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL266 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL266) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL267 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL267) +@LCL +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL268 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL268) +@LCL +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@screen.drawconditional +D=A +@R14 +M=D +@RET_ADDRESS_CALL269 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL269) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawline$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT43 +D=A +@38 +0;JMP +(RET_ADDRESS_LT43) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawline$while_end0 +D;JNE +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT44 +D=A +@38 +0;JMP +(RET_ADDRESS_LT44) +@SP +AM=M-1 +D=M +@screen.drawline$if_true3 +D;JNE +@screen.drawline$if_false3 +0;JMP +(screen.drawline$if_true3) +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@screen.drawline$if_end3 +0;JMP +(screen.drawline$if_false3) +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@screen.drawline$if_true4 +D;JNE +@screen.drawline$if_false4 +0;JMP +(screen.drawline$if_true4) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawline$if_end4 +0;JMP +(screen.drawline$if_false4) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawline$if_end4) +(screen.drawline$if_end3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@3 +D=A +@R13 +M=D +@screen.drawconditional +D=A +@R14 +M=D +@RET_ADDRESS_CALL270 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL270) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawline$while_exp0 +0;JMP +(screen.drawline$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawrectangle) +@9 +D=A +(LOOP_screen.drawrectangle) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawrectangle +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT32 +D=A +@22 +0;JMP +(RET_ADDRESS_GT32) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT33 +D=A +@22 +0;JMP +(RET_ADDRESS_GT33) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT45 +D=A +@38 +0;JMP +(RET_ADDRESS_LT45) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT34 +D=A +@22 +0;JMP +(RET_ADDRESS_GT34) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT46 +D=A +@38 +0;JMP +(RET_ADDRESS_LT46) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT35 +D=A +@22 +0;JMP +(RET_ADDRESS_GT35) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawrectangle$if_true0 +D;JNE +@screen.drawrectangle$if_false0 +0;JMP +(screen.drawrectangle$if_true0) +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL271 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL271) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawrectangle$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL272 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL272) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL273 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL273) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL274 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL274) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL275 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL275) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL276 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL276) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +(screen.drawrectangle$while_exp0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT36 +D=A +@22 +0;JMP +(RET_ADDRESS_GT36) +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawrectangle$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ28 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ28) +@SP +AM=M-1 +D=M +@screen.drawrectangle$if_true1 +D;JNE +@screen.drawrectangle$if_false1 +0;JMP +(screen.drawrectangle$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL277 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL277) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawrectangle$if_end1 +0;JMP +(screen.drawrectangle$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL278 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL278) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawrectangle$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT47 +D=A +@38 +0;JMP +(RET_ADDRESS_LT47) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawrectangle$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL279 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL279) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawrectangle$while_exp1 +0;JMP +(screen.drawrectangle$while_end1) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL280 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL280) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawrectangle$if_end1) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawrectangle$while_exp0 +0;JMP +(screen.drawrectangle$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawhorizontal) +@11 +D=A +(LOOP_screen.drawhorizontal) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawhorizontal +D;JGT +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.min +D=A +@R14 +M=D +@RET_ADDRESS_CALL281 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL281) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.max +D=A +@R14 +M=D +@RET_ADDRESS_CALL282 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL282) +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT37 +D=A +@22 +0;JMP +(RET_ADDRESS_GT37) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@256 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT48 +D=A +@38 +0;JMP +(RET_ADDRESS_LT48) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@512 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT49 +D=A +@38 +0;JMP +(RET_ADDRESS_LT49) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@RET_ADDRESS_GT38 +D=A +@22 +0;JMP +(RET_ADDRESS_GT38) +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +AM=M-1 +D=M +@screen.drawhorizontal$if_true0 +D;JNE +@screen.drawhorizontal$if_false0 +0;JMP +(screen.drawhorizontal$if_true0) +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@2 +D=A +@R13 +M=D +@math.max +D=A +@R14 +M=D +@RET_ADDRESS_CALL283 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL283) +@LCL +D=M +@7 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.min +D=A +@R14 +M=D +@RET_ADDRESS_CALL284 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL284) +@LCL +D=M +@8 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL285 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL285) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +D=M +@7 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL286 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL286) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@9 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL287 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL287) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +D=M +@8 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL288 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL288) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +D=M +@10 +D=D+A +@R13 +M=D +@SP +AM=M-1 +D=M +@R13 +A=M +M=D +@LCL +D=M +@9 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@10 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@screen.0 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@32 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL289 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL289) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@6 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ29 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ29) +@SP +AM=M-1 +D=M +@screen.drawhorizontal$if_true1 +D;JNE +@screen.drawhorizontal$if_false1 +0;JMP +(screen.drawhorizontal$if_true1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL290 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL290) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawhorizontal$if_end1 +0;JMP +(screen.drawhorizontal$if_false1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@5 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL291 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL291) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(screen.drawhorizontal$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT50 +D=A +@38 +0;JMP +(RET_ADDRESS_LT50) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawhorizontal$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +A=M-1 +D=!M +M=D+1 +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL292 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL292) +@SP +AM=M-1 +D=M +@R5 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@screen.drawhorizontal$while_exp0 +0;JMP +(screen.drawhorizontal$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@screen.updatelocation +D=A +@R14 +M=D +@RET_ADDRESS_CALL293 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL293) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawhorizontal$if_end1) +(screen.drawhorizontal$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawsymetric) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL294 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL294) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL295 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL295) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL296 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL296) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@R13 +M=D +@screen.drawhorizontal +D=A +@R14 +M=D +@RET_ADDRESS_CALL297 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL297) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(screen.drawcircle) +@3 +D=A +(LOOP_screen.drawcircle) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_screen.drawcircle +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT51 +D=A +@38 +0;JMP +(RET_ADDRESS_LT51) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT39 +D=A +@22 +0;JMP +(RET_ADDRESS_GT39) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT52 +D=A +@38 +0;JMP +(RET_ADDRESS_LT52) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT40 +D=A +@22 +0;JMP +(RET_ADDRESS_GT40) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true0 +D;JNE +@screen.drawcircle$if_false0 +0;JMP +(screen.drawcircle$if_true0) +@12 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL298 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL298) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT53 +D=A +@38 +0;JMP +(RET_ADDRESS_LT53) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT41 +D=A +@22 +0;JMP +(RET_ADDRESS_GT41) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT54 +D=A +@38 +0;JMP +(RET_ADDRESS_LT54) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@255 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT42 +D=A +@22 +0;JMP +(RET_ADDRESS_GT42) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true1 +D;JNE +@screen.drawcircle$if_false1 +0;JMP +(screen.drawcircle$if_true1) +@13 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL299 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL299) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$if_false1) +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawsymetric +D=A +@R14 +M=D +@RET_ADDRESS_CALL300 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL300) +@SP +AM=M-1 +D=M +@R5 +M=D +(screen.drawcircle$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT43 +D=A +@22 +0;JMP +(RET_ADDRESS_GT43) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@screen.drawcircle$while_end0 +D;JNE +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT55 +D=A +@38 +0;JMP +(RET_ADDRESS_LT55) +@SP +AM=M-1 +D=M +@screen.drawcircle$if_true2 +D;JNE +@screen.drawcircle$if_false2 +0;JMP +(screen.drawcircle$if_true2) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL301 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL301) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@screen.drawcircle$if_end2 +0;JMP +(screen.drawcircle$if_false2) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL302 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL302) +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@5 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(screen.drawcircle$if_end2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@4 +D=A +@R13 +M=D +@screen.drawsymetric +D=A +@R14 +M=D +@RET_ADDRESS_CALL303 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL303) +@SP +AM=M-1 +D=M +@R5 +M=D +@screen.drawcircle$while_exp0 +0;JMP +(screen.drawcircle$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.new) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.alloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL304 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL304) +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT56 +D=A +@38 +0;JMP +(RET_ADDRESS_LT56) +@SP +AM=M-1 +D=M +@string.new$if_true0 +D;JNE +@string.new$if_false0 +0;JMP +(string.new$if_true0) +@14 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL305 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL305) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.new$if_false0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT44 +D=A +@22 +0;JMP +(RET_ADDRESS_GT44) +@SP +AM=M-1 +D=M +@string.new$if_true1 +D;JNE +@string.new$if_false1 +0;JMP +(string.new$if_true1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL306 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL306) +@SP +AM=M-1 +D=M +@THIS +A=M+1 +M=D +(string.new$if_false1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.dispose) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT45 +D=A +@22 +0;JMP +(RET_ADDRESS_GT45) +@SP +AM=M-1 +D=M +@string.dispose$if_true0 +D;JNE +@string.dispose$if_false0 +0;JMP +(string.dispose$if_true0) +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL307 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL307) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.dispose$if_false0) +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@memory.dealloc +D=A +@R14 +M=D +@RET_ADDRESS_CALL308 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL308) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.length) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.charat) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT57 +D=A +@38 +0;JMP +(RET_ADDRESS_LT57) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT46 +D=A +@22 +0;JMP +(RET_ADDRESS_GT46) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ30 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ30) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@string.charat$if_true0 +D;JNE +@string.charat$if_false0 +0;JMP +(string.charat$if_true0) +@15 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL309 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL309) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.charat$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.setcharat) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT58 +D=A +@38 +0;JMP +(RET_ADDRESS_LT58) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT47 +D=A +@22 +0;JMP +(RET_ADDRESS_GT47) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ31 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ31) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +AM=M-1 +D=M +@string.setcharat$if_true0 +D;JNE +@string.setcharat$if_false0 +0;JMP +(string.setcharat$if_true0) +@16 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL310 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL310) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setcharat$if_false0) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.appendchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ32 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ32) +@SP +AM=M-1 +D=M +@string.appendchar$if_true0 +D;JNE +@string.appendchar$if_false0 +0;JMP +(string.appendchar$if_true0) +@17 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL311 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL311) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.appendchar$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@THIS +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.eraselastchar) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ33 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ33) +@SP +AM=M-1 +D=M +@string.eraselastchar$if_true0 +D;JNE +@string.eraselastchar$if_false0 +0;JMP +(string.eraselastchar$if_true0) +@18 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL312 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL312) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.eraselastchar$if_false0) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.intvalue) +@5 +D=A +(LOOP_string.intvalue) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_string.intvalue +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ34 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ34) +@SP +AM=M-1 +D=M +@string.intvalue$if_true0 +D;JNE +@string.intvalue$if_false0 +0;JMP +(string.intvalue$if_true0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.intvalue$if_false0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_EQ35 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ35) +@SP +AM=M-1 +D=M +@string.intvalue$if_true1 +D;JNE +@string.intvalue$if_false1 +0;JMP +(string.intvalue$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.intvalue$if_false1) +(string.intvalue$while_exp0) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT59 +D=A +@38 +0;JMP +(RET_ADDRESS_LT59) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D&M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.intvalue$while_end0 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT60 +D=A +@38 +0;JMP +(RET_ADDRESS_LT60) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@9 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_GT48 +D=A +@22 +0;JMP +(RET_ADDRESS_GT48) +@SP +AM=M-1 +D=M +A=A-1 +M=D|M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.intvalue$if_true2 +D;JNE +@string.intvalue$if_false2 +0;JMP +(string.intvalue$if_true2) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL313 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL313) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.intvalue$if_false2) +@string.intvalue$while_exp0 +0;JMP +(string.intvalue$while_end0) +@LCL +D=M +@4 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.intvalue$if_true3 +D;JNE +@string.intvalue$if_false3 +0;JMP +(string.intvalue$if_true3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(string.intvalue$if_false3) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.setint) +@4 +D=A +(LOOP_string.setint) +D=D-1 +@SP +AM=M+1 +A=A-1 +M=0 +@LOOP_string.setint +D;JGT +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THIS +M=D +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ36 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ36) +@SP +AM=M-1 +D=M +@string.setint$if_true0 +D;JNE +@string.setint$if_false0 +0;JMP +(string.setint$if_true0) +@19 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL314 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL314) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setint$if_false0) +@6 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL315 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL315) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT61 +D=A +@38 +0;JMP +(RET_ADDRESS_LT61) +@SP +AM=M-1 +D=M +@string.setint$if_true1 +D;JNE +@string.setint$if_false1 +0;JMP +(string.setint$if_true1) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@LCL +A=M+1 +A=A+1 +A=A+1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +A=M-1 +D=!M +M=D+1 +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +(string.setint$if_false1) +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +(string.setint$while_exp0) +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT49 +D=A +@22 +0;JMP +(RET_ADDRESS_GT49) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.setint$while_end0 +D;JNE +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.divide +D=A +@R14 +M=D +@RET_ADDRESS_CALL316 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL316) +@SP +AM=M-1 +D=M +@LCL +A=M+1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@ARG +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@10 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@math.multiply +D=A +@R14 +M=D +@RET_ADDRESS_CALL317 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL317) +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@LCL +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@ARG +A=M+1 +M=D +@string.setint$while_exp0 +0;JMP +(string.setint$while_end0) +@LCL +D=M +@3 +A=D+A +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@string.setint$if_true2 +D;JNE +@string.setint$if_false2 +0;JMP +(string.setint$if_true2) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@45 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(string.setint$if_false2) +@THIS +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT62 +D=A +@38 +0;JMP +(RET_ADDRESS_LT62) +@SP +AM=M-1 +D=M +@string.setint$if_true3 +D;JNE +@string.setint$if_false3 +0;JMP +(string.setint$if_true3) +@19 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL318 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL318) +@SP +AM=M-1 +D=M +@R5 +M=D +(string.setint$if_false3) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_EQ37 +D=A +@6 +0;JMP +(RET_ADDRESS_EQ37) +@SP +AM=M-1 +D=M +@string.setint$if_true4 +D;JNE +@string.setint$if_false4 +0;JMP +(string.setint$if_true4) +@SP +M=M+1 +A=M-1 +M=0 +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@string.setint$if_end4 +0;JMP +(string.setint$if_false4) +@SP +M=M+1 +A=M-1 +M=0 +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +(string.setint$while_exp1) +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@RET_ADDRESS_LT63 +D=A +@38 +0;JMP +(RET_ADDRESS_LT63) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@string.setint$while_end1 +D;JNE +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THAT +M=D +@THAT +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +AM=M-1 +D=M +@THAT +M=D +@R5 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@THAT +A=M +M=D +@THIS +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=D+M +@SP +AM=M-1 +D=M +@THIS +A=M+1 +A=A+1 +M=D +@string.setint$while_exp1 +0;JMP +(string.setint$while_end1) +(string.setint$if_end4) +@LCL +A=M+1 +A=A+1 +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@array.dispose +D=A +@R14 +M=D +@RET_ADDRESS_CALL319 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL319) +@SP +AM=M-1 +D=M +@R5 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(string.newline) +@128 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.backspace) +@129 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(string.doublequote) +@34 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +(sys.init) +@0 +D=A +@R13 +M=D +@memory.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL320 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL320) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@math.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL321 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL321) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@screen.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL322 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL322) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@output.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL323 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL323) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@keyboard.init +D=A +@R14 +M=D +@RET_ADDRESS_CALL324 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL324) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@main.main +D=A +@R14 +M=D +@RET_ADDRESS_CALL325 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL325) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@sys.halt +D=A +@R14 +M=D +@RET_ADDRESS_CALL326 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL326) +@SP +AM=M-1 +D=M +@R5 +M=D +(sys.halt) +(sys.halt$while_exp0) +@SP +M=M+1 +A=M-1 +M=0 +@SP +A=M-1 +M=!M +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.halt$while_end0 +D;JNE +@sys.halt$while_exp0 +0;JMP +(sys.halt$while_end0) +(sys.wait) +@SP +AM=M+1 +A=A-1 +M=0 +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_LT64 +D=A +@38 +0;JMP +(RET_ADDRESS_LT64) +@SP +AM=M-1 +D=M +@sys.wait$if_true0 +D;JNE +@sys.wait$if_false0 +0;JMP +(sys.wait$if_true0) +@SP +M=M+1 +A=M-1 +M=1 +@1 +D=A +@R13 +M=D +@sys.error +D=A +@R14 +M=D +@RET_ADDRESS_CALL327 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL327) +@SP +AM=M-1 +D=M +@R5 +M=D +(sys.wait$if_false0) +(sys.wait$while_exp0) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT50 +D=A +@22 +0;JMP +(RET_ADDRESS_GT50) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.wait$while_end0 +D;JNE +@50 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +(sys.wait$while_exp1) +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=0 +@RET_ADDRESS_GT51 +D=A +@22 +0;JMP +(RET_ADDRESS_GT51) +@SP +A=M-1 +M=!M +@SP +AM=M-1 +D=M +@sys.wait$while_end1 +D;JNE +@LCL +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@LCL +A=M +M=D +@sys.wait$while_exp1 +0;JMP +(sys.wait$while_end1) +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@SP +M=M+1 +A=M-1 +M=1 +@SP +AM=M-1 +D=M +A=A-1 +M=M-D +@SP +AM=M-1 +D=M +@ARG +A=M +M=D +@sys.wait$while_exp0 +0;JMP +(sys.wait$while_end0) +@SP +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +(sys.error) +@3 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@string.new +D=A +@R14 +M=D +@RET_ADDRESS_CALL328 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL328) +@69 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL329 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL329) +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL330 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL330) +@82 +D=A +@SP +AM=M+1 +A=A-1 +M=D +@2 +D=A +@R13 +M=D +@string.appendchar +D=A +@R14 +M=D +@RET_ADDRESS_CALL331 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL331) +@1 +D=A +@R13 +M=D +@output.printstring +D=A +@R14 +M=D +@RET_ADDRESS_CALL332 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL332) +@SP +AM=M-1 +D=M +@R5 +M=D +@ARG +A=M +D=M +@SP +AM=M+1 +A=A-1 +M=D +@1 +D=A +@R13 +M=D +@output.printint +D=A +@R14 +M=D +@RET_ADDRESS_CALL333 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL333) +@SP +AM=M-1 +D=M +@R5 +M=D +@0 +D=A +@R13 +M=D +@sys.halt +D=A +@R14 +M=D +@RET_ADDRESS_CALL334 +D=A +@95 +0;JMP +(RET_ADDRESS_CALL334) +@SP +AM=M-1 +D=M +@R5 +M=D diff --git a/nand2tetris-suite/projects/06/pong/PongL.asm b/nand2tetris-suite/projects/06/pong/PongL.asm new file mode 100644 index 0000000..17c1044 --- /dev/null +++ b/nand2tetris-suite/projects/06/pong/PongL.asm @@ -0,0 +1,27490 @@ +// 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/06/pong/PongL.asm + +// Symbol-less version of the Pong.asm program. + +@256 +D=A +@0 +M=D +@133 +0;JMP +@15 +M=D +@0 +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@19 +D;JNE +@0 +A=M-1 +M=-1 +@15 +A=M +0;JMP +@15 +M=D +@0 +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@35 +D;JLE +@0 +A=M-1 +M=-1 +@15 +A=M +0;JMP +@15 +M=D +@0 +AM=M-1 +D=M +A=A-1 +D=M-D +M=0 +@51 +D;JGE +@0 +A=M-1 +M=-1 +@15 +A=M +0;JMP +@5 +D=A +@1 +A=M-D +D=M +@13 +M=D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +D=A +@0 +M=D+1 +@1 +D=M +@14 +AM=D-1 +D=M +@4 +M=D +@14 +AM=M-1 +D=M +@3 +M=D +@14 +AM=M-1 +D=M +@2 +M=D +@14 +AM=M-1 +D=M +@1 +M=D +@13 +A=M +0;JMP +@0 +A=M +M=D +@1 +D=M +@0 +AM=M+1 +M=D +@2 +D=M +@0 +AM=M+1 +M=D +@3 +D=M +@0 +AM=M+1 +M=D +@4 +D=M +@0 +AM=M+1 +M=D +@4 +D=A +@13 +D=D+M +@0 +D=M-D +@2 +M=D +@0 +MD=M+1 +@1 +M=D +@14 +A=M +0;JMP +@0 +D=A +@13 +M=D +@27058 +D=A +@14 +M=D +@145 +D=A +@95 +0;JMP +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@163 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@10 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=M +@11 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@12 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=M +@13 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@387 +D=A +@14 +M=D +@333 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@376 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@418 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@514 +D=A +@14 +M=D +@441 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@480 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@514 +D=A +@14 +M=D +@503 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@588 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +@3 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@654 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@747 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@774 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@798 +D=A +@38 +0;JMP +@3 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@826 +D;JNE +@930 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@886 +D=A +@38 +0;JMP +@3 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@916 +D=A +@38 +0;JMP +@3 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@991 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@948 +D=A +@38 +0;JMP +@3 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@979 +D=A +@38 +0;JMP +@3 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@1016 +D=A +@95 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@1062 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@1109 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@452 +D=A +@14 +M=D +@1156 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1178 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@1185 +D;JNE +@1219 +0;JMP +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1401 +0;JMP +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1267 +D;JNE +@1335 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1283 +D;JNE +@1309 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@1333 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@1401 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1351 +D;JNE +@1377 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@1401 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1417 +D;JNE +@1485 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1433 +D;JNE +@1459 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@1483 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@1551 +0;JMP +@3 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1501 +D;JNE +@1527 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@1551 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1571 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1581 +D;JNE +@1612 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@11 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1632 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1642 +D;JNE +@1675 +0;JMP +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@11 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@12 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1695 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1705 +D;JNE +@1738 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@12 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@13 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1758 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1768 +D;JNE +@1801 +0;JMP +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@14 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@3 +D=M +@13 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@387 +D=A +@14 +M=D +@1819 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@1837 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@1882 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@1916 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1939 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@1946 +D;JNE +@1963 +0;JMP +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2086 +0;JMP +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1979 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1997 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@2018 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@2042 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@2054 +D;JNE +@2071 +0;JMP +@20 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2086 +0;JMP +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@2103 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@2110 +D;JNE +@2227 +0;JMP +@506 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2153 +D=A +@95 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2173 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2214 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2616 +0;JMP +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2246 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@2253 +D;JNE +@2364 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2290 +D=A +@95 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2310 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2351 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2616 +0;JMP +@3 +D=M +@14 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2383 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@2390 +D;JNE +@2507 +0;JMP +@250 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2432 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2453 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2494 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2616 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2543 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@2564 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@2605 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@13 +M=D +@652 +D=A +@14 +M=D +@2648 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@2677 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2827 +D=A +@14 +M=D +@2773 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@2816 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@2858 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2954 +D=A +@14 +M=D +@2881 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@2920 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2954 +D=A +@14 +M=D +@2943 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3033 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2892 +D=A +@14 +M=D +@3163 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2827 +D=A +@14 +M=D +@3200 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@3240 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@3247 +D;JNE +@3525 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3286 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@3293 +D;JNE +@3303 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3319 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3424 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3448 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3518 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3831 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3579 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@3586 +D;JNE +@3611 +0;JMP +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3627 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3706 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@1 +D=A +@13 +M=D +@20889 +D=A +@14 +M=D +@3730 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@3826 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@0 +D=A +@13 +M=D +@4508 +D=A +@14 +M=D +@3853 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@4531 +D=A +@14 +M=D +@3870 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@4539 +D=A +@14 +M=D +@3895 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@4419 +D=A +@14 +M=D +@3919 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@3948 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@0 +D=A +@13 +M=D +@20598 +D=A +@14 +M=D +@3965 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@230 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@229 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@2659 +D=A +@14 +M=D +@4026 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@253 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@222 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@229 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@13 +M=D +@145 +D=A +@14 +M=D +@4076 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@400 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3 +D=A +@13 +M=D +@652 +D=A +@14 +M=D +@4111 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@238 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@240 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@22354 +D=A +@14 +M=D +@4150 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@22 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@2 +D=A +@13 +M=D +@19350 +D=A +@14 +M=D +@4177 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@4200 +D=A +@95 +0;JMP +@83 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4218 +D=A +@95 +0;JMP +@99 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4236 +D=A +@95 +0;JMP +@111 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4254 +D=A +@95 +0;JMP +@114 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4272 +D=A +@95 +0;JMP +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4290 +D=A +@95 +0;JMP +@58 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4308 +D=A +@95 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4326 +D=A +@95 +0;JMP +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@4344 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@4356 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@2786 +D=A +@14 +M=D +@4450 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@346 +D=A +@14 +M=D +@4474 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@4497 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +D=A +@13 +M=D +@3930 +D=A +@14 +M=D +@4520 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@16 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@16 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@4943 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@4590 +D=A +@6 +0;JMP +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@4682 +D;JNE +@0 +D=A +@13 +M=D +@5924 +D=A +@14 +M=D +@4627 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3211 +D=A +@14 +M=D +@4652 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5191 +D=A +@14 +M=D +@4675 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4575 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@130 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4699 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@4706 +D;JNE +@4736 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@2 +D=A +@13 +M=D +@3044 +D=A +@14 +M=D +@4729 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4831 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@132 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4753 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@4760 +D;JNE +@4792 +0;JMP +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@3044 +D=A +@14 +M=D +@4785 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4831 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@140 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4809 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@4816 +D;JNE +@4831 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@4846 +D=A +@6 +0;JMP +@0 +A=M-1 +M=!M +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@4941 +D;JNE +@0 +D=A +@13 +M=D +@5924 +D=A +@14 +M=D +@4886 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3211 +D=A +@14 +M=D +@4911 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5191 +D=A +@14 +M=D +@4934 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@4831 +0;JMP +@4555 +0;JMP +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4959 +D;JNE +@5185 +0;JMP +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@19350 +D=A +@14 +M=D +@4983 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@5006 +D=A +@95 +0;JMP +@71 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5024 +D=A +@95 +0;JMP +@97 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5042 +D=A +@95 +0;JMP +@109 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5060 +D=A +@95 +0;JMP +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5078 +D=A +@95 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5096 +D=A +@95 +0;JMP +@79 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5114 +D=A +@95 +0;JMP +@118 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5132 +D=A +@95 +0;JMP +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5150 +D=A +@95 +0;JMP +@114 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@5168 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@5180 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@5193 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@1126 +D=A +@14 +M=D +@5231 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@5254 +D=A +@22 +0;JMP +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5275 +D=A +@6 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@5290 +D;JNE +@5802 +0;JMP +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3078 +D=A +@14 +M=D +@5337 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@3099 +D=A +@14 +M=D +@5362 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@599 +D=A +@14 +M=D +@5388 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@620 +D=A +@14 +M=D +@5415 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@5442 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@5449 +D;JNE +@5771 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5469 +D=A +@22 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@5490 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +M=D +@3 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@5522 +D;JNE +@5771 +0;JMP +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@5553 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@5560 +D;JNE +@5576 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@5625 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@5608 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@5615 +D;JNE +@5625 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@3133 +D=A +@14 +M=D +@5684 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@22 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@19350 +D=A +@14 +M=D +@5740 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19981 +D=A +@14 +M=D +@5766 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@1835 +D=A +@14 +M=D +@5797 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@5823 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@5833 +D;JNE +@5856 +0;JMP +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@5851 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@5875 +D=A +@95 +0;JMP +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@5907 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@24576 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8558 +D=A +@14 +M=D +@5942 +D=A +@95 +0;JMP +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@0 +M=M+1 +A=M-1 +M=0 +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@5967 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@5987 +D=A +@6 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6002 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6070 +D;JNE +@0 +D=A +@13 +M=D +@5924 +D=A +@14 +M=D +@6027 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6048 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@6055 +D;JNE +@6068 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@5972 +0;JMP +@0 +D=A +@13 +M=D +@27042 +D=A +@14 +M=D +@6082 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@6094 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@6118 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@6134 +D;JGT +@80 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@6159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@6186 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@27034 +D=A +@14 +M=D +@6203 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@0 +D=A +@13 +M=D +@27042 +D=A +@14 +M=D +@6221 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6404 +D;JNE +@0 +D=A +@13 +M=D +@5944 +D=A +@14 +M=D +@6260 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6284 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6312 +D;JNE +@6402 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6331 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@6338 +D;JNE +@6366 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25801 +D=A +@14 +M=D +@6359 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@6402 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@6394 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@6228 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6132 +D=A +@14 +M=D +@6441 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25889 +D=A +@14 +M=D +@6466 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25252 +D=A +@14 +M=D +@6491 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@6527 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@17 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@6550 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@18 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6613 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@6768 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@6596 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6789 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@6796 +D;JNE +@6813 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@6824 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6846 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6861 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6881 +D=A +@22 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@6896 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@6934 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@6959 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@6983 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@6990 +D;JNE +@7029 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7048 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7245 +D;JNE +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +M=M+1 +A=M-1 +M=0 +@7108 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@7115 +D;JNE +@7192 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@7029 +0;JMP +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@7261 +D;JNE +@7278 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@7289 +D;JGT +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7311 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@7318 +D;JNE +@7341 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@7336 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7356 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7371 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7391 +D=A +@22 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@7406 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@7457 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@7498 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7841 +D;JNE +@32767 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7599 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7626 +D;JNE +@7839 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7790 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7817 +D;JNE +@7839 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@7504 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@7860 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@8039 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@7909 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@7919 +D;JNE +@8015 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@17 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@7841 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@8054 +D;JNE +@8071 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@8082 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@8104 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@8111 +D;JNE +@8134 +0;JMP +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@8129 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@8165 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@8348 +D;JNE +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@8249 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8275 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@8294 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@8309 +D;JNE +@8324 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@8146 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8377 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@8384 +D;JNE +@8397 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8424 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@8431 +D;JNE +@8444 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@19 +M=D +@2048 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@14334 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@2049 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2050 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@19 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@8662 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@8669 +D;JNE +@8692 +0;JMP +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@8687 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2048 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8743 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@8787 +D;JNE +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@8704 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@16379 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@8816 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@8823 +D;JNE +@8846 +0;JMP +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@8841 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@8896 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@8903 +D;JNE +@9295 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@9056 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@9063 +D;JNE +@9147 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9227 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@9458 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@9465 +D;JNE +@9556 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9848 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@9717 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@9724 +D;JNE +@9782 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9848 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@16384 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@20 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@23 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@9915 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@24 +M=D +@0 +D=A +@13 +M=D +@9960 +D=A +@14 +M=D +@9932 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@18456 +D=A +@14 +M=D +@9949 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@127 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@9978 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@25 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10061 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10128 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@33 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10211 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@34 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10284 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10367 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@36 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10454 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@37 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10535 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@38 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10620 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@39 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10693 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@40 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10778 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@41 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10863 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@42 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@10940 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11017 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@44 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11090 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@46 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11230 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@47 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11309 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11394 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11479 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11564 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11649 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@52 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@26 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11734 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@53 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11819 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11904 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@11989 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12074 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@57 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@58 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12234 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12311 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12392 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@61 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12463 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12544 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@64 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12629 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12712 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@65 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12797 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@66 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12882 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@67 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@12967 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@68 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13052 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@69 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13137 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@70 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13222 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@71 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@44 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13307 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@72 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13392 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@73 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13477 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@74 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13562 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@75 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13647 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@76 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13732 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@77 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@33 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13817 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@78 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13902 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@79 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@13987 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@80 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14072 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@81 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@59 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14159 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@82 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14244 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@83 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14329 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@84 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14414 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@85 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14499 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@86 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14584 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@87 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14669 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@88 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14754 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@89 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14839 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@90 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@49 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@35 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@14924 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@91 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15009 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@92 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=1 +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15088 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@93 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15173 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@94 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15246 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@95 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15315 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@96 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15388 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@97 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15467 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@98 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15552 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@99 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15631 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@100 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@60 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15716 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@101 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15795 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@102 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@38 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15880 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@103 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@15963 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@104 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16048 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@105 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16131 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@106 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16216 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@107 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16301 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@108 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16386 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@109 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@43 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16465 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@110 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16544 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@111 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16623 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@112 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16704 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@113 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16785 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@114 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@55 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16864 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@115 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@16943 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@116 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@28 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17028 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@117 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17107 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@118 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17186 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@119 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17265 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@120 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@30 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17344 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@121 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@62 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17425 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@122 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@51 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17504 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@123 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17589 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@124 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17674 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@125 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@56 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17759 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@126 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@38 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@0 +M=M+1 +A=M-1 +M=0 +@12 +D=A +@13 +M=D +@17843 +D=A +@14 +M=D +@17832 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@17865 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@4 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +D=M +@11 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@18458 +D;JGT +@127 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@18483 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@26 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@127 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18517 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@18859 +D;JNE +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@18580 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18665 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@18795 +D;JNE +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@256 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@18745 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@18646 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@18811 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@18818 +D;JNE +@18833 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@18857 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@18499 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18886 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@126 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@18903 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@18915 +D;JNE +@18925 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@18938 +D;JNE +@18976 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@19012 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@19023 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@18865 +D=A +@14 +M=D +@19049 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@11 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19085 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@19344 +D;JNE +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@19106 +D;JNE +@19161 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@256 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@19210 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@20 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@19068 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@19365 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19382 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@19402 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@63 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19424 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@19436 +D;JNE +@19459 +0;JMP +@20 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@19454 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@19484 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@23 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@352 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@19520 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@22 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@19572 +D=A +@95 +0;JMP +@19576 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@21 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19021 +D=A +@14 +M=D +@19599 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +D=A +@13 +M=D +@27034 +D=A +@14 +M=D +@19629 +D=A +@95 +0;JMP +@19633 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@19640 +D;JNE +@19659 +0;JMP +@0 +D=A +@13 +M=D +@20040 +D=A +@14 +M=D +@19652 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@19844 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +D=A +@13 +M=D +@27042 +D=A +@14 +M=D +@19678 +D=A +@95 +0;JMP +@19682 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@19689 +D;JNE +@19708 +0;JMP +@0 +D=A +@13 +M=D +@20134 +D=A +@14 +M=D +@19701 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@19844 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19021 +D=A +@14 +M=D +@19727 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@19748 +D;JNE +@19788 +0;JMP +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@23 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@22 +M=D +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@19804 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@19811 +D;JNE +@19830 +0;JMP +@0 +D=A +@13 +M=D +@20040 +D=A +@14 +M=D +@19823 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@19844 +0;JMP +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +A=M +M=0 +AD=A+1 +M=0 +@0 +M=D+1 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25339 +D=A +@14 +M=D +@19876 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@19900 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@19975 +D;JNE +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25361 +D=A +@14 +M=D +@19934 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19610 +D=A +@14 +M=D +@19946 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@19882 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@24 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@26291 +D=A +@14 +M=D +@20006 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@24 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@20029 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@352 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@23 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8128 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20110 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@20117 +D;JNE +@20128 +0;JMP +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@21 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@20147 +D;JNE +@20288 +0;JMP +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@20161 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@20168 +D;JNE +@20210 +0;JMP +@23 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@23 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@22 +M=D +@20277 +0;JMP +@31 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@23 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20237 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@20244 +D;JNE +@20255 +0;JMP +@8128 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22 +M=D +@22 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@321 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@22 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@21 +M=D +@20300 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@21 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19021 +D=A +@14 +M=D +@20318 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@16384 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@27 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@28 +M=D +@17 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@20374 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@29 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20437 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@20592 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@20420 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@8192 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20619 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@20695 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@20602 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@28 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@20714 +D;JNE +@20798 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@20883 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@27 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@28 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@20909 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@20931 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20948 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@20968 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@20990 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@21002 +D;JNE +@21025 +0;JMP +@7 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@21020 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@21050 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21088 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21124 +D=A +@95 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@21193 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@21219 +D;JNE +@21252 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20907 +D=A +@14 +M=D +@21245 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@21283 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20907 +D=A +@14 +M=D +@21278 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@11 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@21291 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@21313 +D=A +@38 +0;JMP +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@21331 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@21351 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@21375 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@21387 +D;JNE +@21410 +0;JMP +@8 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@21405 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@21442 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=A +@13 +M=D +@6774 +D=A +@14 +M=D +@21483 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21511 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21551 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +M=!M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21587 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@21604 +D;JNE +@21698 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@21714 +D;JNE +@21844 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21830 +D=A +@22 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@21922 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@21910 +D=A +@22 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21948 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@21998 +D=A +@95 +0;JMP +@1 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22050 +D=A +@95 +0;JMP +@1 +D=M +@10 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@13 +M=D +@21204 +D=A +@14 +M=D +@22097 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22122 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@22348 +D;JNE +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22147 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@22154 +D;JNE +@22189 +0;JMP +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@22284 +0;JMP +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@22238 +D;JNE +@22262 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@22284 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +D=A +@13 +M=D +@21204 +D=A +@14 +M=D +@22341 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@22102 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@9 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@22356 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22382 +D=A +@22 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22402 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22422 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@22445 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22465 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@22489 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@22501 +D;JNE +@22524 +0;JMP +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@22519 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@22549 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22591 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@22634 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22678 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@22835 +D=A +@95 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@22905 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@23245 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@22958 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@22965 +D;JNE +@23014 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23007 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@23184 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23042 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@23087 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@23151 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23122 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@23069 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23179 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@22885 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@11 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@23253 +D;JGT +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@8406 +D=A +@14 +M=D +@23287 +D=A +@95 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@8359 +D=A +@14 +M=D +@23326 +D=A +@95 +0;JMP +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@23357 +D=A +@22 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@256 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@23374 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@512 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@23398 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@23424 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +AM=M-1 +D=M +@23436 +D;JNE +@24145 +0;JMP +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@2 +D=A +@13 +M=D +@8359 +D=A +@14 +M=D +@23461 +D=A +@95 +0;JMP +@1 +D=M +@7 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@8406 +D=A +@14 +M=D +@23500 +D=A +@95 +0;JMP +@1 +D=M +@8 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@23539 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +D=M +@7 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@23579 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@9 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@23623 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +D=M +@8 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@23665 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +D=M +@10 +D=D+A +@13 +M=D +@0 +AM=M-1 +D=M +@13 +A=M +M=D +@1 +D=M +@9 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@10 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@29 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@32 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@23820 +D=A +@95 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@6 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@23915 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@23922 +D;JNE +@23971 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23964 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@24145 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@5 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@23999 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@24046 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@24110 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +A=M-1 +D=!M +M=D+1 +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@24081 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@24026 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@20701 +D=A +@14 +M=D +@24140 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24224 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24302 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24381 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@13 +M=D +@23251 +D=A +@14 +M=D +@24460 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@24473 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@24495 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24512 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@24532 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24554 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@24566 +D;JNE +@24589 +0;JMP +@12 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@24584 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +M=M+1 +A=M-1 +M=0 +@24617 +D=A +@38 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@511 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24647 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +M=M+1 +A=M-1 +M=0 +@24680 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@255 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@24715 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@24727 +D;JNE +@24750 +0;JMP +@13 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@24745 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@24151 +D=A +@14 +M=D +@24828 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@24851 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@25099 +D;JNE +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@24875 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@24882 +D;JNE +@24940 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@24915 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@25030 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@24985 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@5 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@4 +D=A +@13 +M=D +@24151 +D=A +@14 +M=D +@25092 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@24833 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@8643 +D=A +@14 +M=D +@25123 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25143 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@25150 +D;JNE +@25173 +0;JMP +@14 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25168 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25188 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@25195 +D;JNE +@25220 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@25214 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@3 +A=M+1 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25279 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +@25286 +D;JNE +@25310 +0;JMP +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5877 +D=A +@14 +M=D +@25305 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@9357 +D=A +@14 +M=D +@25328 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25388 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25407 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25431 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@25443 +D;JNE +@25466 +0;JMP +@15 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25461 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25526 +D=A +@38 +0;JMP +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25545 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25569 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +AM=M-1 +D=M +@25581 +D;JNE +@25604 +0;JMP +@16 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25599 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@25690 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25697 +D;JNE +@25720 +0;JMP +@17 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25715 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25829 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25836 +D;JNE +@25859 +0;JMP +@18 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@25854 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@5 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@25891 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@25926 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25933 +D;JNE +@25939 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@25992 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@25999 +D;JNE +@26025 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +A=A+1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26044 +D=A +@38 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D&M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@26249 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26131 +D=A +@38 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@9 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@26149 +D=A +@22 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=D|M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@26181 +D;JNE +@26247 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@26206 +D=A +@95 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@26025 +0;JMP +@1 +D=M +@4 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@26265 +D;JNE +@26282 +0;JMP +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@4 +D=A +D=D-1 +@0 +AM=M+1 +A=A-1 +M=0 +@26293 +D;JGT +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@3 +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26327 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@26334 +D;JNE +@26357 +0;JMP +@19 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@26352 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@6 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5808 +D=A +@14 +M=D +@26375 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26397 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@26404 +D;JNE +@26436 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@1 +A=M+1 +A=A+1 +A=A+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +A=M-1 +D=!M +M=D+1 +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26464 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@26630 +D;JNE +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@7287 +D=A +@14 +M=D +@26497 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@1 +A=M+1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@10 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@6822 +D=A +@14 +M=D +@26561 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@2 +A=M+1 +M=D +@26449 +0;JMP +@1 +D=M +@3 +A=D+A +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@26646 +D;JNE +@26716 +0;JMP +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@45 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@3 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26734 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@26741 +D;JNE +@26764 +0;JMP +@19 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@26759 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@26779 +D=A +@6 +0;JMP +@0 +AM=M-1 +D=M +@26786 +D;JNE +@26843 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@48 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@27003 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@26873 +D=A +@38 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27003 +D;JNE +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@4 +M=D +@4 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@5 +M=D +@0 +AM=M-1 +D=M +@4 +M=D +@5 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@4 +A=M +M=D +@3 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=D+M +@0 +AM=M-1 +D=M +@3 +A=M+1 +A=A+1 +M=D +@26854 +0;JMP +@1 +A=M+1 +A=A+1 +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@5877 +D=A +@14 +M=D +@27023 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@128 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@129 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@34 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@54 +0;JMP +@0 +D=A +@13 +M=D +@8453 +D=A +@14 +M=D +@27070 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@6505 +D=A +@14 +M=D +@27087 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@20329 +D=A +@14 +M=D +@27104 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@9854 +D=A +@14 +M=D +@27121 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@5918 +D=A +@14 +M=D +@27138 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@3837 +D=A +@14 +M=D +@27155 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@27177 +D=A +@14 +M=D +@27172 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@0 +A=M-1 +M=!M +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27194 +D;JNE +@27177 +0;JMP +@0 +AM=M+1 +A=A-1 +M=0 +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@27213 +D=A +@38 +0;JMP +@0 +AM=M-1 +D=M +@27220 +D;JNE +@27241 +0;JMP +@0 +M=M+1 +A=M-1 +M=1 +@1 +D=A +@13 +M=D +@27353 +D=A +@14 +M=D +@27236 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@27256 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27347 +D;JNE +@50 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=0 +@27291 +D=A +@22 +0;JMP +@0 +A=M-1 +M=!M +@0 +AM=M-1 +D=M +@27323 +D;JNE +@1 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@1 +A=M +M=D +@27276 +0;JMP +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@0 +M=M+1 +A=M-1 +M=1 +@0 +AM=M-1 +D=M +A=A-1 +M=M-D +@0 +AM=M-1 +D=M +@2 +A=M +M=D +@27241 +0;JMP +@0 +M=M+1 +A=M-1 +M=0 +@54 +0;JMP +@3 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@25105 +D=A +@14 +M=D +@27371 +D=A +@95 +0;JMP +@69 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@27389 +D=A +@95 +0;JMP +@82 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@27407 +D=A +@95 +0;JMP +@82 +D=A +@0 +AM=M+1 +A=A-1 +M=D +@2 +D=A +@13 +M=D +@25659 +D=A +@14 +M=D +@27425 +D=A +@95 +0;JMP +@1 +D=A +@13 +M=D +@19850 +D=A +@14 +M=D +@27437 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@2 +A=M +D=M +@0 +AM=M+1 +A=A-1 +M=D +@1 +D=A +@13 +M=D +@19981 +D=A +@14 +M=D +@27461 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D +@0 +D=A +@13 +M=D +@27177 +D=A +@14 +M=D +@27478 +D=A +@95 +0;JMP +@0 +AM=M-1 +D=M +@5 +M=D diff --git a/nand2tetris-suite/projects/06/rect/Rect.asm b/nand2tetris-suite/projects/06/rect/Rect.asm new file mode 100644 index 0000000..6cbbaeb --- /dev/null +++ b/nand2tetris-suite/projects/06/rect/Rect.asm @@ -0,0 +1,35 @@ +// 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/06/rect/Rect.asm + +// Draws a rectangle at the top-left corner of the screen. +// The rectangle is 16 pixels wide and R0 pixels high. + + @0 + D=M + @INFINITE_LOOP + D;JLE + @counter + M=D + @SCREEN + D=A + @address + M=D +(LOOP) + @address + A=M + M=-1 + @address + D=M + @32 + D=D+A + @address + M=D + @counter + MD=M-1 + @LOOP + D;JGT +(INFINITE_LOOP) + @INFINITE_LOOP + 0;JMP diff --git a/nand2tetris-suite/projects/06/rect/RectL.asm b/nand2tetris-suite/projects/06/rect/RectL.asm new file mode 100644 index 0000000..e97c09b --- /dev/null +++ b/nand2tetris-suite/projects/06/rect/RectL.asm @@ -0,0 +1,32 @@ +// 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/06/rect/RectL.asm + +// Symbol-less version of the Rect.asm program. + +@0 +D=M +@23 +D;JLE +@16 +M=D +@16384 +D=A +@17 +M=D +@17 +A=M +M=-1 +@17 +D=M +@32 +D=D+A +@17 +M=D +@16 +MD=M-1 +@10 +D;JGT +@23 +0;JMP diff --git a/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.cmp b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.cmp new file mode 100644 index 0000000..538454b --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.cmp @@ -0,0 +1,2 @@ +|RAM[256]|RAM[300]|RAM[401]|RAM[402]|RAM[3006|RAM[3012|RAM[3015|RAM[11] | +| 472 | 10 | 21 | 22 | 36 | 42 | 45 | 510 | diff --git a/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.tst b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.tst new file mode 100644 index 0000000..fa6d9a6 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.tst @@ -0,0 +1,25 @@ +// 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.tst + +load BasicTest.asm, +output-file BasicTest.out, +compare-to BasicTest.cmp, +output-list RAM[256]%D1.6.1 RAM[300]%D1.6.1 RAM[401]%D1.6.1 + RAM[402]%D1.6.1 RAM[3006]%D1.6.1 RAM[3012]%D1.6.1 + RAM[3015]%D1.6.1 RAM[11]%D1.6.1; + +set RAM[0] 256, // stack pointer +set RAM[1] 300, // base address of the local segment +set RAM[2] 400, // base address of the argument segment +set RAM[3] 3000, // base address of the this segment +set RAM[4] 3010, // base address of the that segment + +repeat 600 { // enough cycles to complete the execution + ticktock; +} + +// Outputs the stack base and some values +// from the tested memory segments +output; diff --git a/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.vm b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTest.vm new file mode 100644 index 0000000..b2f9343 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/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/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst new file mode 100644 index 0000000..24e9090 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst @@ -0,0 +1,25 @@ +// 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/BasicTestVME.tst + +load BasicTest.vm, +output-file BasicTest.out, +compare-to BasicTest.cmp, +output-list RAM[256]%D1.6.1 RAM[300]%D1.6.1 RAM[401]%D1.6.1 + RAM[402]%D1.6.1 RAM[3006]%D1.6.1 RAM[3012]%D1.6.1 + RAM[3015]%D1.6.1 RAM[11]%D1.6.1; + +set sp 256, // stack pointer +set local 300, // base address of the local segment +set argument 400, // base address of the argument segment +set this 3000, // base address of the this segment +set that 3010, // base address of the that segment + +repeat 25 { // BasicTest.vm has 25 instructions + vmstep; +} + +// Outputs the stack base and some values +// from the tested memory segments +output; diff --git a/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.cmp b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.cmp new file mode 100644 index 0000000..b59fa97 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.cmp @@ -0,0 +1,2 @@ +|RAM[256]| RAM[3] | RAM[4] |RAM[3032|RAM[3046| +| 6084 | 3030 | 3040 | 32 | 46 | diff --git a/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.tst b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.tst new file mode 100644 index 0000000..cd5515d --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.tst @@ -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/07/MemoryAccess/PointerTest/PointerTest.tst + +load PointerTest.asm, +output-file PointerTest.out, +compare-to PointerTest.cmp, +output-list RAM[256]%D1.6.1 RAM[3]%D1.6.1 + RAM[4]%D1.6.1 RAM[3032]%D1.6.1 RAM[3046]%D1.6.1; + +set RAM[0] 256, // initializes the stack pointer + +repeat 450 { // enough cycles to complete the execution + ticktock; +} + +// outputs the stack base, this, that, and +// some values from the the this and that segments +output; diff --git a/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.vm b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTest.vm new file mode 100644 index 0000000..5b0a109 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/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/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTestVME.tst b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTestVME.tst new file mode 100644 index 0000000..1b395c2 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/PointerTest/PointerTestVME.tst @@ -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/07/MemoryAccess/PointerTest/PointerTestVME.tst + +load PointerTest.vm, +output-file PointerTest.out, +compare-to PointerTest.cmp, +output-list RAM[256]%D1.6.1 RAM[3]%D1.6.1 RAM[4]%D1.6.1 + RAM[3032]%D1.6.1 RAM[3046]%D1.6.1; + +set RAM[0] 256, // initializes the stack pointer + +repeat 15 { // PointerTest.vm has 15 instructions + vmstep; +} + +// outputs the stack base, this, that, and +// some values from the the this and that segments +output; diff --git a/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.cmp b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.cmp new file mode 100644 index 0000000..29f4bf0 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.cmp @@ -0,0 +1,2 @@ +|RAM[256]| +| 1110 | diff --git a/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.tst b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.tst new file mode 100644 index 0000000..1f23d66 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.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/07/MemoryAccess/StaticTest/StaticTest.tst + +load StaticTest.asm, +output-file StaticTest.out, +compare-to StaticTest.cmp, +output-list RAM[256]%D1.6.1; + +set RAM[0] 256, // initializes the stack pointer + +repeat 200 { // enough cycles to complete the execution + ticktock; +} + +output; // the stack base diff --git a/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.vm b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTest.vm new file mode 100644 index 0000000..65b4f6f --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/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/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTestVME.tst b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTestVME.tst new file mode 100644 index 0000000..52882a4 --- /dev/null +++ b/nand2tetris-suite/projects/07/MemoryAccess/StaticTest/StaticTestVME.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/07/MemoryAccess/StaticTest/StaticTestVME.tst + +load StaticTest.vm, +output-file StaticTest.out, +compare-to StaticTest.cmp, +output-list RAM[256]%D1.6.1; + +set sp 256, // initializes the stack pointer + +repeat 11 { // StaticTest.vm has 11 instructions + vmstep; +} + +output; // the stack base diff --git a/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp new file mode 100644 index 0000000..7a3585b --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp @@ -0,0 +1,2 @@ +| RAM[0] | RAM[256] | +| 257 | 15 | diff --git a/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.tst b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.tst new file mode 100644 index 0000000..02dece3 --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.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/07/StackArithmetic/SimpleAdd/SimpleAdd.tst + +load SimpleAdd.asm, +output-file SimpleAdd.out, +compare-to SimpleAdd.cmp, +output-list RAM[0]%D2.6.2 RAM[256]%D2.6.2; + +set RAM[0] 256, // initializes the stack pointer + +repeat 60 { // enough cycles to complete the execution + ticktock; +} + +output; // the stack pointer and the stack base diff --git a/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm new file mode 100644 index 0000000..cfd4ee9 --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/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/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst new file mode 100644 index 0000000..5010f4f --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.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/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst + +load SimpleAdd.vm, +output-file SimpleAdd.out, +compare-to SimpleAdd.cmp, +output-list RAM[0]%D2.6.2 RAM[256]%D2.6.2; + +set RAM[0] 256, // initializes the stack pointer + +repeat 3 { // SimpleAdd.vm has 3 instructions + vmstep; +} + +output; // the stack pointer and the stack base diff --git a/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.cmp b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.cmp new file mode 100644 index 0000000..f90fa1b --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.cmp @@ -0,0 +1,4 @@ +| RAM[0] | RAM[256] | RAM[257] | RAM[258] | RAM[259] | RAM[260] | +| 266 | -1 | 0 | 0 | 0 | -1 | +| RAM[261] | RAM[262] | RAM[263] | RAM[264] | RAM[265] | +| 0 | -1 | 0 | 0 | -91 | diff --git a/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.tst b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.tst new file mode 100644 index 0000000..f9c5396 --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.tst @@ -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/StackArithmetic/StackTest/StackTest.tst + +load StackTest.asm, +output-file StackTest.out, +compare-to StackTest.cmp, +output-list RAM[0]%D2.6.2 + RAM[256]%D2.6.2 RAM[257]%D2.6.2 RAM[258]%D2.6.2 RAM[259]%D2.6.2 RAM[260]%D2.6.2; + +set RAM[0] 256, // initializes the stack pointer + +repeat 1000 { // enough cycles to complete the execution + ticktock; +} + +// outputs the stack pointer (RAM[0]) and +// the stack contents: RAM[256]-RAM[265] +output; +output-list RAM[261]%D2.6.2 RAM[262]%D2.6.2 RAM[263]%D2.6.2 RAM[264]%D2.6.2 RAM[265]%D2.6.2; +output; diff --git a/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.vm b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTest.vm new file mode 100644 index 0000000..bfe78e0 --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/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/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTestVME.tst b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTestVME.tst new file mode 100644 index 0000000..b66bd05 --- /dev/null +++ b/nand2tetris-suite/projects/07/StackArithmetic/StackTest/StackTestVME.tst @@ -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/StackArithmetic/StackTest/StackTestVME.tst + +load StackTest.vm, +output-file StackTest.out, +compare-to StackTest.cmp, +output-list RAM[0]%D2.6.2 + RAM[256]%D2.6.2 RAM[257]%D2.6.2 RAM[258]%D2.6.2 RAM[259]%D2.6.2 RAM[260]%D2.6.2; + +set RAM[0] 256, // initializes the stack pointer + +repeat 38 { // StackTest.vm consists of 38 instructions + vmstep; +} + +// outputs the stack pointer (RAM[0]) and +// the stack contents: RAM[256]-RAM[265] +output; +output-list RAM[261]%D2.6.2 RAM[262]%D2.6.2 RAM[263]%D2.6.2 RAM[264]%D2.6.2 RAM[265]%D2.6.2; +output; diff --git a/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp b/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp new file mode 100644 index 0000000..d667834 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp @@ -0,0 +1,2 @@ +| RAM[0] |RAM[261]| +| 262 | 3 | diff --git a/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst b/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst new file mode 100644 index 0000000..1f907b1 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst b/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst new file mode 100644 index 0000000..87c0920 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/Main.vm b/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/Main.vm new file mode 100644 index 0000000..55e5ad2 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/Sys.vm b/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/Sys.vm new file mode 100644 index 0000000..f3965c9 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/FibonacciElement/Sys.vm @@ -0,0 +1,15 @@ +// 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/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.cmp b/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.cmp new file mode 100644 index 0000000..9200202 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.html b/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.html new file mode 100644 index 0000000..0d8534d --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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 NestedCall.asm, sets up the stack to simulate the bootstrap's call to Sys.init(), then +begins execution at the beginning of NestedCall.asm. If the bootstrap is not present, the program begins +running with Sys.init() since it is the first function in Sys.vm. +

+If NestedCall.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 LCL, ARG, THIS and THAT pointers to -1, -2, -3 and -4. + +

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.main() 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/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.tst b/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCall.tst new file mode 100644 index 0000000..70e5523 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCallStack.html b/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCallStack.html new file mode 100644 index 0000000..70582b6 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCallStack.html @@ -0,0 +1,306 @@ + + + + + NestedCall.tst — Stack Frames + + + + + + + +
+ + + + + + + + + + + +
Bootstrap init
Pointers
0256SP
1-1LCL
2-2ARG
3-3THIS
4-4THAT
Stack
256???←SP

+ This is how my boot­strap code initial­izes the pointers before calling Sys.init(). +

+ Setting the LCL, ARG, THIS and THAT point­ers to known illegal values helps identify + when a pointer is used before it is initial­ized. +

+ (If you are running the NestedCall test with­out boot­strap code, you will not see this state.)

+
+ + + + + + + + + + + + + + + + +
Entry to Sys.init()
Pointers
0261SP
1261LCL
2256ARG
3-3THIS
4-4THAT
Stack
256*Return IP←ARG
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261???←LCL, SP

+ This is how NestedCall.tst initial­izes the pointers and stack. This is what RAM looks + like after my boot­strap calls Sys.init(). +

+ (If your VM trans­lation includes the boot­strap, the -1 through -4 values may be + different if your boot­strap initial­izes them.)

+
+ + + + + + + + + + + + + + + + + + + + +
Entry to Sys.main()
Pointers
0266SP
1266LCL
2261ARG
34000THIS
45000THAT
Stack
256*Return IP
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261*Return IP←ARG
262261Saved LCL
263256Saved ARGSys.main
2644000Saved THIS frame
2655000Saved THAT
266???←LCL, SP
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
After Sys.main() prologue
Pointers
0271SP
1266LCL
2261ARG
34000THIS
45000THAT
Stack
256*Return IP
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261*Return IP←ARG
262261Saved LCL
263256Saved ARGSys.main
2644000Saved THIS frame
2655000Saved THAT
2660local 0←LCL
2670local 1
2680local 2
2690local 3
2700local 4
271???←SP

+ The function prologue is the assembly language code generated for the + "function" VM command. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Entry to Sys.add12(123)
Pointers
0277SP
1277LCL
2271ARG
34001THIS
45001THAT
Stack
256*Return IP
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261*Return IP
262261Saved LCL
263256Saved ARGSys.main
2644000Saved THIS frame
2655000Saved THAT
2660local 0
267200local 1
26840local 2
2696local 3
2700local 4
271123argument 0←ARG
272*Return IP
273266Saved LCLSys.add12
274261Saved ARG frame
2754001Saved THIS
2765001Saved THAT
277???←LCL, SP
+
+ +

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Before Sys.add12() return
Pointers
0278SP
1277LCL
2271ARG
34002THIS
45002THAT
Stack
256*Return IP
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261*Return IP
262261Saved LCL
263256Saved ARGSys.main
2644000Saved THIS frame
2655000Saved THAT
2660local 0
267200local 1
26840local 2
2696local 3
2700local 4
271123argument 0←ARG
272*Return IP
273266Saved LCLSys.add12
274261Saved ARG frame
2754001Saved THIS
2765001Saved THAT
277135Return value←LCL
278???←SP
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
After Sys.add12() return
Pointers
0272SP
1266LCL
2261ARG
34001THIS
45001THAT
Stack
256*Return IP
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261*Return IP←ARG
262261Saved LCL
263256Saved ARGSys.main
2644000Saved THIS frame
2655000Saved THAT
2660local 0←LCL
267200local 1
26840local 2
2696local 3
2700local 4
271135Return value
272???←SP
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Before Sys.main() return
Pointers
0272SP
1266LCL
2261ARG
34001THIS
45001THAT
Stack
256*Return IP
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261*Return IP←ARG
262261Saved LCL
263256Saved ARGSys.main
2644000Saved THIS frame
2655000Saved THAT
2660local 0←LCL
267200local 1
26840local 2
2696local 3
2700local 4
271246Return value
272???←SP
+
+ + + + + + + + + + + + + + + + +
After Sys.main() return
Pointers
0262SP
1261LCL
2256ARG
34000THIS
45000THAT
Stack
256*Return IP←ARG
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261246Return value←LCL
262???←SP
+
+ + + + + + + + + + + + + + + +
In Sys.init() halt loop
Pointers
0261SP
1261LCL
2256ARG
34000THIS
45000THAT
Stack
256*Return IP←ARG
257-1Saved LCL
258-2Saved ARGSys.init
259-3Saved THIS frame
260-4Saved THAT
261???←LCL, SP
+
+ + + \ No newline at end of file diff --git a/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCallVME.tst b/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/NestedCallVME.tst new file mode 100644 index 0000000..2c689b8 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/Sys.vm b/nand2tetris-suite/projects/08/FunctionCalls/NestedCall/Sys.vm new file mode 100644 index 0000000..8b0b003 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp b/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp new file mode 100644 index 0000000..c3ea911 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst b/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst new file mode 100644 index 0000000..c7b5905 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm b/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm new file mode 100644 index 0000000..d64a34f --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst b/nand2tetris-suite/projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst new file mode 100644 index 0000000..c9267ee --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Class1.vm b/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Class1.vm new file mode 100644 index 0000000..c463537 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Class2.vm b/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Class2.vm new file mode 100644 index 0000000..94f2946 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp b/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp new file mode 100644 index 0000000..5589f1e --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp @@ -0,0 +1,2 @@ +| RAM[0] |RAM[261]|RAM[262]| +| 263 | -2 | 8 | diff --git a/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTest.tst b/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTest.tst new file mode 100644 index 0000000..1b9194e --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst b/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst new file mode 100644 index 0000000..130ba66 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Sys.vm b/nand2tetris-suite/projects/08/FunctionCalls/StaticsTest/Sys.vm new file mode 100644 index 0000000..3708322 --- /dev/null +++ b/nand2tetris-suite/projects/08/FunctionCalls/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 diff --git a/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp new file mode 100644 index 0000000..00d35d2 --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp @@ -0,0 +1,2 @@ +| RAM[0] |RAM[256]| +| 257 | 6 | diff --git a/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst new file mode 100644 index 0000000..50ca118 --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst @@ -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/ProgramFlow/BasicLoop/BasicLoop.tst + +load BasicLoop.asm, +output-file BasicLoop.out, +compare-to BasicLoop.cmp, +output-list RAM[0]%D1.6.1 RAM[256]%D1.6.1; + +set RAM[0] 256, +set RAM[1] 300, +set RAM[2] 400, +set RAM[400] 3, + +repeat 600 { + ticktock; +} + +output; diff --git a/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.vm b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoop.vm new file mode 100644 index 0000000..dc5a92f --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/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/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst new file mode 100644 index 0000000..237fdff --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst @@ -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/ProgramFlow/BasicLoop/BasicLoopVME.tst + +load BasicLoop.vm, +output-file BasicLoop.out, +compare-to BasicLoop.cmp, +output-list RAM[0]%D1.6.1 RAM[256]%D1.6.1; + +set sp 256, +set local 300, +set argument 400, +set argument[0] 3, + +repeat 33 { + vmstep; +} + +output; diff --git a/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp new file mode 100644 index 0000000..c262a4b --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp @@ -0,0 +1,2 @@ +|RAM[3000]|RAM[3001]|RAM[3002]|RAM[3003]|RAM[3004]|RAM[3005]| +| 0 | 1 | 1 | 2 | 3 | 5 | diff --git a/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst new file mode 100644 index 0000000..07df2b9 --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst @@ -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/FibonacciSeries/FibonacciSeries.tst + +load FibonacciSeries.asm, +output-file FibonacciSeries.out, +compare-to FibonacciSeries.cmp, +output-list RAM[3000]%D1.6.2 RAM[3001]%D1.6.2 RAM[3002]%D1.6.2 + RAM[3003]%D1.6.2 RAM[3004]%D1.6.2 RAM[3005]%D1.6.2; + +set RAM[0] 256, +set RAM[1] 300, +set RAM[2] 400, +set RAM[400] 6, +set RAM[401] 3000, + +repeat 1100 { + ticktock; +} + +output; diff --git a/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm new file mode 100644 index 0000000..6a643b6 --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/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/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst new file mode 100644 index 0000000..243f31b --- /dev/null +++ b/nand2tetris-suite/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst @@ -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/FibonacciSeries/FibonacciSeriesVME.tst + +load FibonacciSeries.vm, +output-file FibonacciSeries.out, +compare-to FibonacciSeries.cmp, +output-list RAM[3000]%D1.6.2 RAM[3001]%D1.6.2 RAM[3002]%D1.6.2 + RAM[3003]%D1.6.2 RAM[3004]%D1.6.2 RAM[3005]%D1.6.2; + +set sp 256, +set local 300, +set argument 400, +set argument[0] 6, +set argument[1] 3000, + +repeat 73 { + vmstep; +} + +output; diff --git a/nand2tetris-suite/projects/09/Average/Main.jack b/nand2tetris-suite/projects/09/Average/Main.jack new file mode 100644 index 0000000..a359602 --- /dev/null +++ b/nand2tetris-suite/projects/09/Average/Main.jack @@ -0,0 +1,27 @@ +// 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/09/Average/Main.jack + +// Inputs some numbers and computes their average +class Main { + function void main() { + var Array a; + var int length; + var int i, sum; + + let length = Keyboard.readInt("How many numbers? "); + let a = Array.new(length); // constructs the array + + let i = 0; + while (i < length) { + let a[i] = Keyboard.readInt("Enter a number: "); + let sum = sum + a[i]; + let i = i + 1; + } + + do Output.printString("The average is "); + do Output.printInt(sum / length); + return; + } +} diff --git a/nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.html b/nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.html new file mode 100644 index 0000000..fdb9e0b --- /dev/null +++ b/nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.html @@ -0,0 +1,200 @@ + + + + Sokoban Bitmap Editor + + + +

IDC Herzliya / Efi Arazi School of Computer Science / Digital Systems Construction, Spring 2011 / Project 09 / Golan Parashi

+

Sokoban Bitmap Editor

+

This javascript applicaiton is used to generate highly optimized jack code for drawing a 16x16 bitmap to the screen.

+

Using the mouse, click the desired cell to mark/unmark it. You may use 90 degrees rotation and vertical mirroring by
+ clicking the appropriate buttons.

+

When you are finished drawing, you may select function type and enter function's name.

+

+ + + + + + + + + + + + + + +
BitmapGenerated Jack Code
+
+ + + + + + + +
Function Type:
+ +
Function Name:
+
+
+ + + + +
+ + + + \ No newline at end of file diff --git a/nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.iml b/nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.iml new file mode 100644 index 0000000..ef582b1 --- /dev/null +++ b/nand2tetris-suite/projects/09/BitmapEditor/BitmapEditor.iml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/nand2tetris-suite/projects/09/Fraction/Fraction.jack b/nand2tetris-suite/projects/09/Fraction/Fraction.jack new file mode 100644 index 0000000..c86f0a5 --- /dev/null +++ b/nand2tetris-suite/projects/09/Fraction/Fraction.jack @@ -0,0 +1,65 @@ +// 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/09/Fraction/Fraction.jack + +/** Represents the Fraction type and related operations. */ +class Fraction { + field int numerator, denominator; // field = property = member variable. + + /** Constructs a (reduced) fraction from the given numerator and denominator. */ + constructor Fraction new(int x, int y) { + let numerator = x; + let denominator = y; + do reduce(); // reduces the fraction + return this; // a constructor is expected to return a reference to the new object + } + + // Reduces this fraction. + method void reduce() { + var int g; + let g = Fraction.gcd(numerator, denominator); + if (g > 1) { + let numerator = numerator / g; + let denominator = denominator / g; + } + return; + } + + /** Accessors. */ + method int getNumerator() { return numerator; } + method int getDenominator() { return denominator; } + + /** Returns the sum of this fraction and the other one. */ + method Fraction plus(Fraction other) { + var int sum; + let sum = (numerator * other.getDenominator()) + (other.getNumerator() * denominator); + return Fraction.new(sum, denominator * other.getDenominator()); + } + + // More fraction-related methods (minus, times, div, etc.) can be added here. + + /** Disposes this fraction. */ + method void dispose() { + do Memory.deAlloc(this); // uses an OS routine to recycle the memory held by the object + return; + } + + /** Prints this fraction in the format x/y. */ + method void print() { + do Output.printInt(numerator); + do Output.printString("/"); + do Output.printInt(denominator); + return; + } + + // Computes the greatest common divisor of the given integers. + function int gcd(int a, int b) { + var int r; + while (~(b = 0)) { // applies Euclid's algorithm + let r = a - (b * (a / b)); // r = remainder of the integer division a/b + let a = b; let b = r; + } + return a; + } +} diff --git a/nand2tetris-suite/projects/09/Fraction/Main.jack b/nand2tetris-suite/projects/09/Fraction/Main.jack new file mode 100644 index 0000000..43ddece --- /dev/null +++ b/nand2tetris-suite/projects/09/Fraction/Main.jack @@ -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/09/Fraction/Main.jack + +// Computes the sum of 2/3 and 1/5. +class Main { + function void main() { + var Fraction a, b, c; + let a = Fraction.new(2,3); + let b = Fraction.new(1,5); + let c = a.plus(b); // Computes c = a + b + do c.print(); // Prints "13/15" + return; + } +} diff --git a/nand2tetris-suite/projects/09/HelloWorld/Main.jack b/nand2tetris-suite/projects/09/HelloWorld/Main.jack new file mode 100644 index 0000000..446b21b --- /dev/null +++ b/nand2tetris-suite/projects/09/HelloWorld/Main.jack @@ -0,0 +1,14 @@ +// 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/09/HelloWorld/Main.jack + +/** Hello World program. */ +class Main { + function void main() { + /* Prints some text using the standard library. */ + do Output.printString("Hello world!"); + do Output.println(); // New line + return; + } +} diff --git a/nand2tetris-suite/projects/09/Jack OS API.pdf b/nand2tetris-suite/projects/09/Jack OS API.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e653e8609ec1daace1dfde510364cb49669efb9e GIT binary patch literal 108857 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 z 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%0AAFfX8jJ^phAKRdKso0g+Yq)dQ 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 literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/projects/09/List/List.jack b/nand2tetris-suite/projects/09/List/List.jack new file mode 100644 index 0000000..c62fe28 --- /dev/null +++ b/nand2tetris-suite/projects/09/List/List.jack @@ -0,0 +1,46 @@ +// 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/09/List/List.jack + +/** Represents a linked list of integers. */ +class List { + field int data; // a list consists of a data field, + field List next; // followed by a list + + /* Creates a List. */ + constructor List new(int car, List cdr) { + let data = car; // the identifiers car and cdr are used in + let next = cdr; // memory of the Lisp programming language + return this; + } + + /** Accessors. */ + method int getData() { return data; } + method int getNext() { return next; } + + /** Prints this list. */ + method void print() { + var List current; // initializes current to the first item + let current = this; // of this list + while (~(current = null)) { + do Output.printInt(current.getData()); + do Output.printChar(32); // prints a space + let current = current.getNext(); + } + return; + } + + /** Disposes this List by recursively disposing its tail. */ + method void dispose() { + if (~(next = null)) { + do next.dispose(); + } + // Uses an OS routine to recycle this object. + do Memory.deAlloc(this); + return; + } + + // More list processing methods can come here. + +} diff --git a/nand2tetris-suite/projects/09/List/Main.jack b/nand2tetris-suite/projects/09/List/Main.jack new file mode 100644 index 0000000..824eb6f --- /dev/null +++ b/nand2tetris-suite/projects/09/List/Main.jack @@ -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/09/List/Main.jack + +/** Demonstrates the use of the List abstraction. */ +class Main { + function void main() { + // Creates and uses the list (2,3,5). + var List v; + let v = List.new(5,null); + let v = List.new(2,List.new(3,v)); + do v.print(); // prints 2 3 5 + do v.dispose(); // disposes the list + return; + } +} diff --git a/nand2tetris-suite/projects/09/Square/Main.jack b/nand2tetris-suite/projects/09/Square/Main.jack new file mode 100644 index 0000000..8311cc2 --- /dev/null +++ b/nand2tetris-suite/projects/09/Square/Main.jack @@ -0,0 +1,15 @@ +// 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/09/Square/Main.jack + +/** Initializes a new Square Dance game and starts running it. */ +class Main { + function void main() { + var SquareGame game; + let game = SquareGame.new(); + do game.run(); + do game.dispose(); + return; + } +} diff --git a/nand2tetris-suite/projects/09/Square/Square.jack b/nand2tetris-suite/projects/09/Square/Square.jack new file mode 100644 index 0000000..38066e5 --- /dev/null +++ b/nand2tetris-suite/projects/09/Square/Square.jack @@ -0,0 +1,108 @@ +// 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/09/Square/Square.jack + +/** Implements a graphical square. */ +class Square { + + field int x, y; // screen location of the square's top-left corner + field int size; // length of this square, in pixels + + /** Constructs a new square with a given location and size. */ + constructor Square new(int Ax, int Ay, int Asize) { + let x = Ax; + let y = Ay; + let size = Asize; + do draw(); + return this; + } + + /** Disposes this square. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Draws the square on the screen. */ + method void draw() { + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Erases the square from the screen. */ + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Increments the square size by 2 pixels. */ + method void incSize() { + if (((y + size) < 254) & ((x + size) < 510)) { + do erase(); + let size = size + 2; + do draw(); + } + return; + } + + /** Decrements the square size by 2 pixels. */ + method void decSize() { + if (size > 2) { + do erase(); + let size = size - 2; + do draw(); + } + return; + } + + /** Moves the square up by 2 pixels. */ + method void moveUp() { + if (y > 1) { + do Screen.setColor(false); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + let y = y - 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + 1); + } + return; + } + + /** Moves the square down by 2 pixels. */ + method void moveDown() { + if ((y + size) < 254) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + 1); + let y = y + 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + } + return; + } + + /** Moves the square left by 2 pixels. */ + method void moveLeft() { + if (x > 1) { + do Screen.setColor(false); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + let x = x - 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + 1, y + size); + } + return; + } + + /** Moves the square right by 2 pixels. */ + method void moveRight() { + if ((x + size) < 510) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + 1, y + size); + let x = x + 2; + do Screen.setColor(true); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + } + return; + } +} diff --git a/nand2tetris-suite/projects/09/Square/SquareGame.jack b/nand2tetris-suite/projects/09/Square/SquareGame.jack new file mode 100644 index 0000000..02393e2 --- /dev/null +++ b/nand2tetris-suite/projects/09/Square/SquareGame.jack @@ -0,0 +1,79 @@ +// 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/09/Square/SquareGame.jack + +/** + * Implements the Square Dance game. + * This simple game allows the user to move a black square around + * the screen, and change the square's size during the movement. + * When the game starts, a square of 30 by 30 pixels is shown at the + * top-left corner of the screen. The user controls the square as follows. + * The 4 arrow keys are used to move the square up, down, left, and right. + * The 'z' and 'x' keys are used, respectively, to decrement and increment + * the square's size. The 'q' key is used to quit the game. + */ + +class SquareGame { + field Square square; // the square of this game + field int direction; // the square's current direction: + // 0=none, 1=up, 2=down, 3=left, 4=right + + /** Constructs a new Square Game. */ + constructor SquareGame new() { + // Creates a 30 by 30 pixels square and positions it at the top-left + // of the screen. + let square = Square.new(0, 0, 30); + let direction = 0; // initial state is no movement + return this; + } + + /** Disposes this game. */ + method void dispose() { + do square.dispose(); + do Memory.deAlloc(this); + return; + } + + /** Moves the square in the current direction. */ + method void moveSquare() { + if (direction = 1) { do square.moveUp(); } + if (direction = 2) { do square.moveDown(); } + if (direction = 3) { do square.moveLeft(); } + if (direction = 4) { do square.moveRight(); } + do Sys.wait(5); // delays the next movement + return; + } + + /** Runs the game: handles the user's inputs and moves the square accordingly */ + method void run() { + var char key; // the key currently pressed by the user + var boolean exit; + let exit = false; + + while (~exit) { + // waits for a key to be pressed + while (key = 0) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + if (key = 81) { let exit = true; } // q key + if (key = 90) { do square.decSize(); } // z key + if (key = 88) { do square.incSize(); } // x key + if (key = 131) { let direction = 1; } // up arrow + if (key = 133) { let direction = 2; } // down arrow + if (key = 130) { let direction = 3; } // left arrow + if (key = 132) { let direction = 4; } // right arrow + + // waits for the key to be released + while (~(key = 0)) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + } // while + return; + } +} + + + diff --git a/nand2tetris-suite/projects/10/ArrayTest/Main.jack b/nand2tetris-suite/projects/10/ArrayTest/Main.jack new file mode 100644 index 0000000..aa237b1 --- /dev/null +++ b/nand2tetris-suite/projects/10/ArrayTest/Main.jack @@ -0,0 +1,38 @@ +// 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/10/ArrayTest/Main.jack + +// (identical to projects/09/Average/Main.jack) + +/** Computes the average of a sequence of integers. */ +class Main { + function void main() { + var Array a; + var int length; + var int i, sum; + + let length = Keyboard.readInt("HOW MANY NUMBERS? "); + let a = Array.new(length); + let i = 0; + + while (i < length) { + let a[i] = Keyboard.readInt("ENTER THE NEXT NUMBER: "); + let i = i + 1; + } + + let i = 0; + let sum = 0; + + while (i < length) { + let sum = sum + a[i]; + let i = i + 1; + } + + do Output.printString("THE AVERAGE IS: "); + do Output.printInt(sum / length); + do Output.println(); + + return; + } +} diff --git a/nand2tetris-suite/projects/10/ArrayTest/Main.xml b/nand2tetris-suite/projects/10/ArrayTest/Main.xml new file mode 100644 index 0000000..0ea96df --- /dev/null +++ b/nand2tetris-suite/projects/10/ArrayTest/Main.xml @@ -0,0 +1,286 @@ + + class + Main + { + + function + void + main + ( + + + ) + + { + + var + Array + a + ; + + + var + int + length + ; + + + var + int + i + , + sum + ; + + + + let + length + = + + + Keyboard + . + readInt + ( + + + + HOW MANY NUMBERS? + + + + ) + + + ; + + + let + a + = + + + Array + . + new + ( + + + + length + + + + ) + + + ; + + + let + i + = + + + 0 + + + ; + + + while + ( + + + i + + < + + length + + + ) + { + + + let + a + [ + + + i + + + ] + = + + + Keyboard + . + readInt + ( + + + + ENTER THE NEXT NUMBER: + + + + ) + + + ; + + + let + i + = + + + i + + + + + 1 + + + ; + + + } + + + let + i + = + + + 0 + + + ; + + + let + sum + = + + + 0 + + + ; + + + while + ( + + + i + + < + + length + + + ) + { + + + let + sum + = + + + sum + + + + + a + [ + + + i + + + ] + + + ; + + + let + i + = + + + i + + + + + 1 + + + ; + + + } + + + do + Output + . + printString + ( + + + + THE AVERAGE IS: + + + + ) + ; + + + do + Output + . + printInt + ( + + + + sum + + / + + length + + + + ) + ; + + + do + Output + . + println + ( + + + ) + ; + + + return + ; + + + } + + + } + diff --git a/nand2tetris-suite/projects/10/ArrayTest/MainT.xml b/nand2tetris-suite/projects/10/ArrayTest/MainT.xml new file mode 100644 index 0000000..68721ec --- /dev/null +++ b/nand2tetris-suite/projects/10/ArrayTest/MainT.xml @@ -0,0 +1,142 @@ + + class + Main + { + function + void + main + ( + ) + { + var + Array + a + ; + var + int + length + ; + var + int + i + , + sum + ; + let + length + = + Keyboard + . + readInt + ( + HOW MANY NUMBERS? + ) + ; + let + a + = + Array + . + new + ( + length + ) + ; + let + i + = + 0 + ; + while + ( + i + < + length + ) + { + let + a + [ + i + ] + = + Keyboard + . + readInt + ( + ENTER THE NEXT NUMBER: + ) + ; + let + i + = + i + + + 1 + ; + } + let + i + = + 0 + ; + let + sum + = + 0 + ; + while + ( + i + < + length + ) + { + let + sum + = + sum + + + a + [ + i + ] + ; + let + i + = + i + + + 1 + ; + } + do + Output + . + printString + ( + THE AVERAGE IS: + ) + ; + do + Output + . + printInt + ( + sum + / + length + ) + ; + do + Output + . + println + ( + ) + ; + return + ; + } + } + diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/Main.jack b/nand2tetris-suite/projects/10/ExpressionLessSquare/Main.jack new file mode 100644 index 0000000..94764ad --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/Main.jack @@ -0,0 +1,28 @@ +// 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/10/ExpressionLessSquare/Main.jack + +/** Expressionless version of projects/10/Square/Main.jack. */ + +class Main { + static boolean test; // Added for testing -- there is no static keyword + // in the Square files. + + function void main() { + var SquareGame game; + let game = game; + do game.run(); + do game.dispose(); + return; + } + + function void more() { // Added to test Jack syntax that is not used in + var boolean b; // the Square files. + if (b) { + } + else { // There is no else keyword in the Square files. + } + return; + } +} diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/Main.xml b/nand2tetris-suite/projects/10/ExpressionLessSquare/Main.xml new file mode 100644 index 0000000..f71a0ef --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/Main.xml @@ -0,0 +1,114 @@ + + class + Main + { + + static + boolean + test + ; + + + function + void + main + ( + + + ) + + { + + var + SquareGame + game + ; + + + + let + game + = + + + game + + + ; + + + do + game + . + run + ( + + + ) + ; + + + do + game + . + dispose + ( + + + ) + ; + + + return + ; + + + } + + + + function + void + more + ( + + + ) + + { + + var + boolean + b + ; + + + + if + ( + + + b + + + ) + { + + + } + else + { + + + } + + + return + ; + + + } + + + } + diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/MainT.xml b/nand2tetris-suite/projects/10/ExpressionLessSquare/MainT.xml new file mode 100644 index 0000000..441dfed --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/MainT.xml @@ -0,0 +1,64 @@ + + class + Main + { + static + boolean + test + ; + function + void + main + ( + ) + { + var + SquareGame + game + ; + let + game + = + game + ; + do + game + . + run + ( + ) + ; + do + game + . + dispose + ( + ) + ; + return + ; + } + function + void + more + ( + ) + { + var + boolean + b + ; + if + ( + b + ) + { + } + else + { + } + return + ; + } + } + diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/Square.jack b/nand2tetris-suite/projects/10/ExpressionLessSquare/Square.jack new file mode 100644 index 0000000..33a54ad --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/Square.jack @@ -0,0 +1,99 @@ +// 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/10/ExpressionLessSquare/Square.jack + +/** Expressionless version of projects/10/Square/Square.jack. */ + +class Square { + + field int x, y; + field int size; + + constructor Square new(int Ax, int Ay, int Asize) { + let x = Ax; + let y = Ay; + let size = Asize; + do draw(); + return x; + } + + method void dispose() { + do Memory.deAlloc(this); + return; + } + + method void draw() { + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + return; + } + + method void erase() { + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + return; + } + + method void incSize() { + if (x) { + do erase(); + let size = size; + do draw(); + } + return; + } + + method void decSize() { + if (size) { + do erase(); + let size = size; + do draw(); + } + return; + } + + method void moveUp() { + if (y) { + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + let y = y; + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + } + return; + } + + method void moveDown() { + if (y) { + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + let y = y; + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + } + return; + } + + method void moveLeft() { + if (x) { + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + let x = x; + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + } + return; + } + + method void moveRight() { + if (x) { + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + let x = x; + do Screen.setColor(x); + do Screen.drawRectangle(x, y, x, y); + } + return; + } +} diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/Square.xml b/nand2tetris-suite/projects/10/ExpressionLessSquare/Square.xml new file mode 100644 index 0000000..ed0e6ec --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/Square.xml @@ -0,0 +1,967 @@ + + class + Square + { + + field + int + x + , + y + ; + + + field + int + size + ; + + + constructor + Square + new + ( + + int + Ax + , + int + Ay + , + int + Asize + + ) + + { + + + let + x + = + + + Ax + + + ; + + + let + y + = + + + Ay + + + ; + + + let + size + = + + + Asize + + + ; + + + do + draw + ( + + + ) + ; + + + return + + + x + + + ; + + + } + + + + method + void + dispose + ( + + + ) + + { + + + do + Memory + . + deAlloc + ( + + + + this + + + + ) + ; + + + return + ; + + + } + + + + method + void + draw + ( + + + ) + + { + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + return + ; + + + } + + + + method + void + erase + ( + + + ) + + { + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + return + ; + + + } + + + + method + void + incSize + ( + + + ) + + { + + + if + ( + + + x + + + ) + { + + + do + erase + ( + + + ) + ; + + + let + size + = + + + size + + + ; + + + do + draw + ( + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + decSize + ( + + + ) + + { + + + if + ( + + + size + + + ) + { + + + do + erase + ( + + + ) + ; + + + let + size + = + + + size + + + ; + + + do + draw + ( + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveUp + ( + + + ) + + { + + + if + ( + + + y + + + ) + { + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + let + y + = + + + y + + + ; + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveDown + ( + + + ) + + { + + + if + ( + + + y + + + ) + { + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + let + y + = + + + y + + + ; + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveLeft + ( + + + ) + + { + + + if + ( + + + x + + + ) + { + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + let + x + = + + + x + + + ; + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveRight + ( + + + ) + + { + + + if + ( + + + x + + + ) + { + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + let + x + = + + + x + + + ; + + + do + Screen + . + setColor + ( + + + + x + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + , + + + y + + + + ) + ; + + + } + + + return + ; + + + } + + + } + diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.jack b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.jack new file mode 100644 index 0000000..2866f0d --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.jack @@ -0,0 +1,60 @@ +// 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/10/ExpressionLessSquare/SquareGame.jack + +/** Expressionless version of projects/10/Square/SquareGame.jack. */ + +class SquareGame { + field Square square; + field int direction; + + constructor SquareGame new() { + let square = square; + let direction = direction; + return square; + } + + method void dispose() { + do square.dispose(); + do Memory.deAlloc(square); + return; + } + + method void moveSquare() { + if (direction) { do square.moveUp(); } + if (direction) { do square.moveDown(); } + if (direction) { do square.moveLeft(); } + if (direction) { do square.moveRight(); } + do Sys.wait(direction); + return; + } + + method void run() { + var char key; + var boolean exit; + + let exit = key; + while (exit) { + while (key) { + let key = key; + do moveSquare(); + } + + if (key) { let exit = exit; } + if (key) { do square.decSize(); } + if (key) { do square.incSize(); } + if (key) { let direction = exit; } + if (key) { let direction = key; } + if (key) { let direction = square; } + if (key) { let direction = direction; } + + while (key) { + let key = key; + do moveSquare(); + } + } + return; + } +} + diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.xml b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.xml new file mode 100644 index 0000000..288c6cd --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGame.xml @@ -0,0 +1,544 @@ + + class + SquareGame + { + + field + Square + square + ; + + + field + int + direction + ; + + + constructor + SquareGame + new + ( + + + ) + + { + + + let + square + = + + + square + + + ; + + + let + direction + = + + + direction + + + ; + + + return + + + square + + + ; + + + } + + + + method + void + dispose + ( + + + ) + + { + + + do + square + . + dispose + ( + + + ) + ; + + + do + Memory + . + deAlloc + ( + + + + square + + + + ) + ; + + + return + ; + + + } + + + + method + void + moveSquare + ( + + + ) + + { + + + if + ( + + + direction + + + ) + { + + + do + square + . + moveUp + ( + + + ) + ; + + + } + + + if + ( + + + direction + + + ) + { + + + do + square + . + moveDown + ( + + + ) + ; + + + } + + + if + ( + + + direction + + + ) + { + + + do + square + . + moveLeft + ( + + + ) + ; + + + } + + + if + ( + + + direction + + + ) + { + + + do + square + . + moveRight + ( + + + ) + ; + + + } + + + do + Sys + . + wait + ( + + + + direction + + + + ) + ; + + + return + ; + + + } + + + + method + void + run + ( + + + ) + + { + + var + char + key + ; + + + var + boolean + exit + ; + + + + let + exit + = + + + key + + + ; + + + while + ( + + + exit + + + ) + { + + + while + ( + + + key + + + ) + { + + + let + key + = + + + key + + + ; + + + do + moveSquare + ( + + + ) + ; + + + } + + + if + ( + + + key + + + ) + { + + + let + exit + = + + + exit + + + ; + + + } + + + if + ( + + + key + + + ) + { + + + do + square + . + decSize + ( + + + ) + ; + + + } + + + if + ( + + + key + + + ) + { + + + do + square + . + incSize + ( + + + ) + ; + + + } + + + if + ( + + + key + + + ) + { + + + let + direction + = + + + exit + + + ; + + + } + + + if + ( + + + key + + + ) + { + + + let + direction + = + + + key + + + ; + + + } + + + if + ( + + + key + + + ) + { + + + let + direction + = + + + square + + + ; + + + } + + + if + ( + + + key + + + ) + { + + + let + direction + = + + + direction + + + ; + + + } + + + while + ( + + + key + + + ) + { + + + let + key + = + + + key + + + ; + + + do + moveSquare + ( + + + ) + ; + + + } + + + } + + + return + ; + + + } + + + } + diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGameT.xml b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGameT.xml new file mode 100644 index 0000000..278a8a9 --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareGameT.xml @@ -0,0 +1,268 @@ + + class + SquareGame + { + field + Square + square + ; + field + int + direction + ; + constructor + SquareGame + new + ( + ) + { + let + square + = + square + ; + let + direction + = + direction + ; + return + square + ; + } + method + void + dispose + ( + ) + { + do + square + . + dispose + ( + ) + ; + do + Memory + . + deAlloc + ( + square + ) + ; + return + ; + } + method + void + moveSquare + ( + ) + { + if + ( + direction + ) + { + do + square + . + moveUp + ( + ) + ; + } + if + ( + direction + ) + { + do + square + . + moveDown + ( + ) + ; + } + if + ( + direction + ) + { + do + square + . + moveLeft + ( + ) + ; + } + if + ( + direction + ) + { + do + square + . + moveRight + ( + ) + ; + } + do + Sys + . + wait + ( + direction + ) + ; + return + ; + } + method + void + run + ( + ) + { + var + char + key + ; + var + boolean + exit + ; + let + exit + = + key + ; + while + ( + exit + ) + { + while + ( + key + ) + { + let + key + = + key + ; + do + moveSquare + ( + ) + ; + } + if + ( + key + ) + { + let + exit + = + exit + ; + } + if + ( + key + ) + { + do + square + . + decSize + ( + ) + ; + } + if + ( + key + ) + { + do + square + . + incSize + ( + ) + ; + } + if + ( + key + ) + { + let + direction + = + exit + ; + } + if + ( + key + ) + { + let + direction + = + key + ; + } + if + ( + key + ) + { + let + direction + = + square + ; + } + if + ( + key + ) + { + let + direction + = + direction + ; + } + while + ( + key + ) + { + let + key + = + key + ; + do + moveSquare + ( + ) + ; + } + } + return + ; + } + } + diff --git a/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareT.xml b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareT.xml new file mode 100644 index 0000000..cd03a1e --- /dev/null +++ b/nand2tetris-suite/projects/10/ExpressionLessSquare/SquareT.xml @@ -0,0 +1,449 @@ + + class + Square + { + field + int + x + , + y + ; + field + int + size + ; + constructor + Square + new + ( + int + Ax + , + int + Ay + , + int + Asize + ) + { + let + x + = + Ax + ; + let + y + = + Ay + ; + let + size + = + Asize + ; + do + draw + ( + ) + ; + return + x + ; + } + method + void + dispose + ( + ) + { + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + method + void + draw + ( + ) + { + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + return + ; + } + method + void + erase + ( + ) + { + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + return + ; + } + method + void + incSize + ( + ) + { + if + ( + x + ) + { + do + erase + ( + ) + ; + let + size + = + size + ; + do + draw + ( + ) + ; + } + return + ; + } + method + void + decSize + ( + ) + { + if + ( + size + ) + { + do + erase + ( + ) + ; + let + size + = + size + ; + do + draw + ( + ) + ; + } + return + ; + } + method + void + moveUp + ( + ) + { + if + ( + y + ) + { + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + let + y + = + y + ; + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + } + return + ; + } + method + void + moveDown + ( + ) + { + if + ( + y + ) + { + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + let + y + = + y + ; + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + } + return + ; + } + method + void + moveLeft + ( + ) + { + if + ( + x + ) + { + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + let + x + = + x + ; + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + } + return + ; + } + method + void + moveRight + ( + ) + { + if + ( + x + ) + { + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + let + x + = + x + ; + do + Screen + . + setColor + ( + x + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + , + y + ) + ; + } + return + ; + } + } + diff --git a/nand2tetris-suite/projects/10/Square/Main.jack b/nand2tetris-suite/projects/10/Square/Main.jack new file mode 100644 index 0000000..a6fd2c2 --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/Main.jack @@ -0,0 +1,36 @@ +// 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/10/Square/Main.jack + +// (derived from projects/09/Square/Main.jack, with testing additions) + +/** Initializes a new Square Dance game and starts running it. */ +class Main { + static boolean test; // Added for testing -- there is no static keyword + // in the Square files. + function void main() { + var SquareGame game; + let game = SquareGame.new(); + do game.run(); + do game.dispose(); + return; + } + + function void more() { // Added to test Jack syntax that is not used in + var int i, j; // the Square files. + var String s; + var Array a; + if (false) { + let s = "string constant"; + let s = null; + let a[1] = a[2]; + } + else { // There is no else keyword in the Square files. + let i = i * (-j); + let j = j / (-2); // note: unary negate constant 2 + let i = i | j; + } + return; + } +} diff --git a/nand2tetris-suite/projects/10/Square/Main.xml b/nand2tetris-suite/projects/10/Square/Main.xml new file mode 100644 index 0000000..8796fa9 --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/Main.xml @@ -0,0 +1,244 @@ + + class + Main + { + + static + boolean + test + ; + + + function + void + main + ( + + + ) + + { + + var + SquareGame + game + ; + + + + let + game + = + + + SquareGame + . + new + ( + + + ) + + + ; + + + do + game + . + run + ( + + + ) + ; + + + do + game + . + dispose + ( + + + ) + ; + + + return + ; + + + } + + + + function + void + more + ( + + + ) + + { + + var + int + i + , + j + ; + + + var + String + s + ; + + + var + Array + a + ; + + + + if + ( + + + false + + + ) + { + + + let + s + = + + + string constant + + + ; + + + let + s + = + + + null + + + ; + + + let + a + [ + + + 1 + + + ] + = + + + a + [ + + + 2 + + + ] + + + ; + + + } + else + { + + + let + i + = + + + i + + * + + ( + + + - + + j + + + + ) + + + ; + + + let + j + = + + + j + + / + + ( + + + - + + 2 + + + + ) + + + ; + + + let + i + = + + + i + + | + + j + + + ; + + + } + + + return + ; + + + } + + + } + diff --git a/nand2tetris-suite/projects/10/Square/MainT.xml b/nand2tetris-suite/projects/10/Square/MainT.xml new file mode 100644 index 0000000..bc92200 --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/MainT.xml @@ -0,0 +1,126 @@ + + class + Main + { + static + boolean + test + ; + function + void + main + ( + ) + { + var + SquareGame + game + ; + let + game + = + SquareGame + . + new + ( + ) + ; + do + game + . + run + ( + ) + ; + do + game + . + dispose + ( + ) + ; + return + ; + } + function + void + more + ( + ) + { + var + int + i + , + j + ; + var + String + s + ; + var + Array + a + ; + if + ( + false + ) + { + let + s + = + string constant + ; + let + s + = + null + ; + let + a + [ + 1 + ] + = + a + [ + 2 + ] + ; + } + else + { + let + i + = + i + * + ( + - + j + ) + ; + let + j + = + j + / + ( + - + 2 + ) + ; + let + i + = + i + | + j + ; + } + return + ; + } + } + diff --git a/nand2tetris-suite/projects/10/Square/Square.jack b/nand2tetris-suite/projects/10/Square/Square.jack new file mode 100644 index 0000000..3faf24f --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/Square.jack @@ -0,0 +1,110 @@ +// 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/10/Square/Square.jack + +// (same as projects/09/Square/Square.jack) + +/** Implements a graphical square. */ +class Square { + + field int x, y; // screen location of the square's top-left corner + field int size; // length of this square, in pixels + + /** Constructs a new square with a given location and size. */ + constructor Square new(int Ax, int Ay, int Asize) { + let x = Ax; + let y = Ay; + let size = Asize; + do draw(); + return this; + } + + /** Disposes this square. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Draws the square on the screen. */ + method void draw() { + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Erases the square from the screen. */ + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Increments the square size by 2 pixels. */ + method void incSize() { + if (((y + size) < 254) & ((x + size) < 510)) { + do erase(); + let size = size + 2; + do draw(); + } + return; + } + + /** Decrements the square size by 2 pixels. */ + method void decSize() { + if (size > 2) { + do erase(); + let size = size - 2; + do draw(); + } + return; + } + + /** Moves the square up by 2 pixels. */ + method void moveUp() { + if (y > 1) { + do Screen.setColor(false); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + let y = y - 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + 1); + } + return; + } + + /** Moves the square down by 2 pixels. */ + method void moveDown() { + if ((y + size) < 254) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + 1); + let y = y + 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + } + return; + } + + /** Moves the square left by 2 pixels. */ + method void moveLeft() { + if (x > 1) { + do Screen.setColor(false); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + let x = x - 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + 1, y + size); + } + return; + } + + /** Moves the square right by 2 pixels. */ + method void moveRight() { + if ((x + size) < 510) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + 1, y + size); + let x = x + 2; + do Screen.setColor(true); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + } + return; + } +} diff --git a/nand2tetris-suite/projects/10/Square/Square.xml b/nand2tetris-suite/projects/10/Square/Square.xml new file mode 100644 index 0000000..ff5f235 --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/Square.xml @@ -0,0 +1,1211 @@ + + class + Square + { + + field + int + x + , + y + ; + + + field + int + size + ; + + + constructor + Square + new + ( + + int + Ax + , + int + Ay + , + int + Asize + + ) + + { + + + let + x + = + + + Ax + + + ; + + + let + y + = + + + Ay + + + ; + + + let + size + = + + + Asize + + + ; + + + do + draw + ( + + + ) + ; + + + return + + + this + + + ; + + + } + + + + method + void + dispose + ( + + + ) + + { + + + do + Memory + . + deAlloc + ( + + + + this + + + + ) + ; + + + return + ; + + + } + + + + method + void + draw + ( + + + ) + + { + + + do + Screen + . + setColor + ( + + + + true + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + + + size + + + , + + + y + + + + + size + + + + ) + ; + + + return + ; + + + } + + + + method + void + erase + ( + + + ) + + { + + + do + Screen + . + setColor + ( + + + + false + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + + + size + + + , + + + y + + + + + size + + + + ) + ; + + + return + ; + + + } + + + + method + void + incSize + ( + + + ) + + { + + + if + ( + + + ( + + + ( + + + y + + + + + size + + + ) + + < + + 254 + + + ) + + & + + ( + + + ( + + + x + + + + + size + + + ) + + < + + 510 + + + ) + + + ) + { + + + do + erase + ( + + + ) + ; + + + let + size + = + + + size + + + + + 2 + + + ; + + + do + draw + ( + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + decSize + ( + + + ) + + { + + + if + ( + + + size + + > + + 2 + + + ) + { + + + do + erase + ( + + + ) + ; + + + let + size + = + + + size + + - + + 2 + + + ; + + + do + draw + ( + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveUp + ( + + + ) + + { + + + if + ( + + + y + + > + + 1 + + + ) + { + + + do + Screen + . + setColor + ( + + + + false + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + ( + + + y + + + + + size + + + ) + + - + + 1 + + + , + + + x + + + + + size + + + , + + + y + + + + + size + + + + ) + ; + + + let + y + = + + + y + + - + + 2 + + + ; + + + do + Screen + . + setColor + ( + + + + true + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + + + size + + + , + + + y + + + + + 1 + + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveDown + ( + + + ) + + { + + + if + ( + + + ( + + + y + + + + + size + + + ) + + < + + 254 + + + ) + { + + + do + Screen + . + setColor + ( + + + + false + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + + + size + + + , + + + y + + + + + 1 + + + + ) + ; + + + let + y + = + + + y + + + + + 2 + + + ; + + + do + Screen + . + setColor + ( + + + + true + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + ( + + + y + + + + + size + + + ) + + - + + 1 + + + , + + + x + + + + + size + + + , + + + y + + + + + size + + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveLeft + ( + + + ) + + { + + + if + ( + + + x + + > + + 1 + + + ) + { + + + do + Screen + . + setColor + ( + + + + false + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + ( + + + x + + + + + size + + + ) + + - + + 1 + + + , + + + y + + + , + + + x + + + + + size + + + , + + + y + + + + + size + + + + ) + ; + + + let + x + = + + + x + + - + + 2 + + + ; + + + do + Screen + . + setColor + ( + + + + true + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + + + 1 + + + , + + + y + + + + + size + + + + ) + ; + + + } + + + return + ; + + + } + + + + method + void + moveRight + ( + + + ) + + { + + + if + ( + + + ( + + + x + + + + + size + + + ) + + < + + 510 + + + ) + { + + + do + Screen + . + setColor + ( + + + + false + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + x + + + , + + + y + + + , + + + x + + + + + 1 + + + , + + + y + + + + + size + + + + ) + ; + + + let + x + = + + + x + + + + + 2 + + + ; + + + do + Screen + . + setColor + ( + + + + true + + + + ) + ; + + + do + Screen + . + drawRectangle + ( + + + + ( + + + x + + + + + size + + + ) + + - + + 1 + + + , + + + y + + + , + + + x + + + + + size + + + , + + + y + + + + + size + + + + ) + ; + + + } + + + return + ; + + + } + + + } + diff --git a/nand2tetris-suite/projects/10/Square/SquareGame.jack b/nand2tetris-suite/projects/10/Square/SquareGame.jack new file mode 100644 index 0000000..4f71b16 --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/SquareGame.jack @@ -0,0 +1,81 @@ +// 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/10/Square/SquareGame.jack + +// (same as projects/09/Square/SquareGame.jack) + +/** + * Implements the Square Dance game. + * This simple game allows the user to move a black square around + * the screen, and change the square's size during the movement. + * When the game starts, a square of 30 by 30 pixels is shown at the + * top-left corner of the screen. The user controls the square as follows. + * The 4 arrow keys are used to move the square up, down, left, and right. + * The 'z' and 'x' keys are used, respectively, to decrement and increment + * the square's size. The 'q' key is used to quit the game. + */ + +class SquareGame { + field Square square; // the square of this game + field int direction; // the square's current direction: + // 0=none, 1=up, 2=down, 3=left, 4=right + + /** Constructs a new Square Game. */ + constructor SquareGame new() { + // Creates a 30 by 30 pixels square and positions it at the top-left + // of the screen. + let square = Square.new(0, 0, 30); + let direction = 0; // initial state is no movement + return this; + } + + /** Disposes this game. */ + method void dispose() { + do square.dispose(); + do Memory.deAlloc(this); + return; + } + + /** Moves the square in the current direction. */ + method void moveSquare() { + if (direction = 1) { do square.moveUp(); } + if (direction = 2) { do square.moveDown(); } + if (direction = 3) { do square.moveLeft(); } + if (direction = 4) { do square.moveRight(); } + do Sys.wait(5); // delays the next movement + return; + } + + /** Runs the game: handles the user's inputs and moves the square accordingly */ + method void run() { + var char key; // the key currently pressed by the user + var boolean exit; + let exit = false; + + while (~exit) { + // waits for a key to be pressed + while (key = 0) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + if (key = 81) { let exit = true; } // q key + if (key = 90) { do square.decSize(); } // z key + if (key = 88) { do square.incSize(); } // x key + if (key = 131) { let direction = 1; } // up arrow + if (key = 133) { let direction = 2; } // down arrow + if (key = 130) { let direction = 3; } // left arrow + if (key = 132) { let direction = 4; } // right arrow + + // waits for the key to be released + while (~(key = 0)) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + } // while + return; + } +} + + + diff --git a/nand2tetris-suite/projects/10/Square/SquareGame.xml b/nand2tetris-suite/projects/10/Square/SquareGame.xml new file mode 100644 index 0000000..ed3ab6e --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/SquareGame.xml @@ -0,0 +1,643 @@ + + class + SquareGame + { + + field + Square + square + ; + + + field + int + direction + ; + + + constructor + SquareGame + new + ( + + + ) + + { + + + let + square + = + + + Square + . + new + ( + + + + 0 + + + , + + + 0 + + + , + + + 30 + + + + ) + + + ; + + + let + direction + = + + + 0 + + + ; + + + return + + + this + + + ; + + + } + + + + method + void + dispose + ( + + + ) + + { + + + do + square + . + dispose + ( + + + ) + ; + + + do + Memory + . + deAlloc + ( + + + + this + + + + ) + ; + + + return + ; + + + } + + + + method + void + moveSquare + ( + + + ) + + { + + + if + ( + + + direction + + = + + 1 + + + ) + { + + + do + square + . + moveUp + ( + + + ) + ; + + + } + + + if + ( + + + direction + + = + + 2 + + + ) + { + + + do + square + . + moveDown + ( + + + ) + ; + + + } + + + if + ( + + + direction + + = + + 3 + + + ) + { + + + do + square + . + moveLeft + ( + + + ) + ; + + + } + + + if + ( + + + direction + + = + + 4 + + + ) + { + + + do + square + . + moveRight + ( + + + ) + ; + + + } + + + do + Sys + . + wait + ( + + + + 5 + + + + ) + ; + + + return + ; + + + } + + + + method + void + run + ( + + + ) + + { + + var + char + key + ; + + + var + boolean + exit + ; + + + + let + exit + = + + + false + + + ; + + + while + ( + + + ~ + + exit + + + + ) + { + + + while + ( + + + key + + = + + 0 + + + ) + { + + + let + key + = + + + Keyboard + . + keyPressed + ( + + + ) + + + ; + + + do + moveSquare + ( + + + ) + ; + + + } + + + if + ( + + + key + + = + + 81 + + + ) + { + + + let + exit + = + + + true + + + ; + + + } + + + if + ( + + + key + + = + + 90 + + + ) + { + + + do + square + . + decSize + ( + + + ) + ; + + + } + + + if + ( + + + key + + = + + 88 + + + ) + { + + + do + square + . + incSize + ( + + + ) + ; + + + } + + + if + ( + + + key + + = + + 131 + + + ) + { + + + let + direction + = + + + 1 + + + ; + + + } + + + if + ( + + + key + + = + + 133 + + + ) + { + + + let + direction + = + + + 2 + + + ; + + + } + + + if + ( + + + key + + = + + 130 + + + ) + { + + + let + direction + = + + + 3 + + + ; + + + } + + + if + ( + + + key + + = + + 132 + + + ) + { + + + let + direction + = + + + 4 + + + ; + + + } + + + while + ( + + + ~ + + ( + + + key + + = + + 0 + + + ) + + + + ) + { + + + let + key + = + + + Keyboard + . + keyPressed + ( + + + ) + + + ; + + + do + moveSquare + ( + + + ) + ; + + + } + + + } + + + return + ; + + + } + + + } + diff --git a/nand2tetris-suite/projects/10/Square/SquareGameT.xml b/nand2tetris-suite/projects/10/Square/SquareGameT.xml new file mode 100644 index 0000000..3136af2 --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/SquareGameT.xml @@ -0,0 +1,315 @@ + + class + SquareGame + { + field + Square + square + ; + field + int + direction + ; + constructor + SquareGame + new + ( + ) + { + let + square + = + Square + . + new + ( + 0 + , + 0 + , + 30 + ) + ; + let + direction + = + 0 + ; + return + this + ; + } + method + void + dispose + ( + ) + { + do + square + . + dispose + ( + ) + ; + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + method + void + moveSquare + ( + ) + { + if + ( + direction + = + 1 + ) + { + do + square + . + moveUp + ( + ) + ; + } + if + ( + direction + = + 2 + ) + { + do + square + . + moveDown + ( + ) + ; + } + if + ( + direction + = + 3 + ) + { + do + square + . + moveLeft + ( + ) + ; + } + if + ( + direction + = + 4 + ) + { + do + square + . + moveRight + ( + ) + ; + } + do + Sys + . + wait + ( + 5 + ) + ; + return + ; + } + method + void + run + ( + ) + { + var + char + key + ; + var + boolean + exit + ; + let + exit + = + false + ; + while + ( + ~ + exit + ) + { + while + ( + key + = + 0 + ) + { + let + key + = + Keyboard + . + keyPressed + ( + ) + ; + do + moveSquare + ( + ) + ; + } + if + ( + key + = + 81 + ) + { + let + exit + = + true + ; + } + if + ( + key + = + 90 + ) + { + do + square + . + decSize + ( + ) + ; + } + if + ( + key + = + 88 + ) + { + do + square + . + incSize + ( + ) + ; + } + if + ( + key + = + 131 + ) + { + let + direction + = + 1 + ; + } + if + ( + key + = + 133 + ) + { + let + direction + = + 2 + ; + } + if + ( + key + = + 130 + ) + { + let + direction + = + 3 + ; + } + if + ( + key + = + 132 + ) + { + let + direction + = + 4 + ; + } + while + ( + ~ + ( + key + = + 0 + ) + ) + { + let + key + = + Keyboard + . + keyPressed + ( + ) + ; + do + moveSquare + ( + ) + ; + } + } + return + ; + } + } + diff --git a/nand2tetris-suite/projects/10/Square/SquareT.xml b/nand2tetris-suite/projects/10/Square/SquareT.xml new file mode 100644 index 0000000..69a8ca0 --- /dev/null +++ b/nand2tetris-suite/projects/10/Square/SquareT.xml @@ -0,0 +1,561 @@ + + class + Square + { + field + int + x + , + y + ; + field + int + size + ; + constructor + Square + new + ( + int + Ax + , + int + Ay + , + int + Asize + ) + { + let + x + = + Ax + ; + let + y + = + Ay + ; + let + size + = + Asize + ; + do + draw + ( + ) + ; + return + this + ; + } + method + void + dispose + ( + ) + { + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + method + void + draw + ( + ) + { + do + Screen + . + setColor + ( + true + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + size + , + y + + + size + ) + ; + return + ; + } + method + void + erase + ( + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + size + , + y + + + size + ) + ; + return + ; + } + method + void + incSize + ( + ) + { + if + ( + ( + ( + y + + + size + ) + < + 254 + ) + & + ( + ( + x + + + size + ) + < + 510 + ) + ) + { + do + erase + ( + ) + ; + let + size + = + size + + + 2 + ; + do + draw + ( + ) + ; + } + return + ; + } + method + void + decSize + ( + ) + { + if + ( + size + > + 2 + ) + { + do + erase + ( + ) + ; + let + size + = + size + - + 2 + ; + do + draw + ( + ) + ; + } + return + ; + } + method + void + moveUp + ( + ) + { + if + ( + y + > + 1 + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + Screen + . + drawRectangle + ( + x + , + ( + y + + + size + ) + - + 1 + , + x + + + size + , + y + + + size + ) + ; + let + y + = + y + - + 2 + ; + do + Screen + . + setColor + ( + true + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + size + , + y + + + 1 + ) + ; + } + return + ; + } + method + void + moveDown + ( + ) + { + if + ( + ( + y + + + size + ) + < + 254 + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + size + , + y + + + 1 + ) + ; + let + y + = + y + + + 2 + ; + do + Screen + . + setColor + ( + true + ) + ; + do + Screen + . + drawRectangle + ( + x + , + ( + y + + + size + ) + - + 1 + , + x + + + size + , + y + + + size + ) + ; + } + return + ; + } + method + void + moveLeft + ( + ) + { + if + ( + x + > + 1 + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + Screen + . + drawRectangle + ( + ( + x + + + size + ) + - + 1 + , + y + , + x + + + size + , + y + + + size + ) + ; + let + x + = + x + - + 2 + ; + do + Screen + . + setColor + ( + true + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + 1 + , + y + + + size + ) + ; + } + return + ; + } + method + void + moveRight + ( + ) + { + if + ( + ( + x + + + size + ) + < + 510 + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + 1 + , + y + + + size + ) + ; + let + x + = + x + + + 2 + ; + do + Screen + . + setColor + ( + true + ) + ; + do + Screen + . + drawRectangle + ( + ( + x + + + size + ) + - + 1 + , + y + , + x + + + size + , + y + + + size + ) + ; + } + return + ; + } + } + diff --git a/nand2tetris-suite/projects/11/Average/Main.jack b/nand2tetris-suite/projects/11/Average/Main.jack new file mode 100644 index 0000000..d560bf1 --- /dev/null +++ b/nand2tetris-suite/projects/11/Average/Main.jack @@ -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/11/Average/Main.jack + +// (Same as projects/09/Average/Main.jack) + +// Inputs some numbers and computes their average +class Main { + function void main() { + var Array a; + var int length; + var int i, sum; + + let length = Keyboard.readInt("How many numbers? "); + let a = Array.new(length); // constructs the array + + let i = 0; + while (i < length) { + let a[i] = Keyboard.readInt("Enter a number: "); + let sum = sum + a[i]; + let i = i + 1; + } + + do Output.printString("The average is "); + do Output.printInt(sum / length); + return; + } +} diff --git a/nand2tetris-suite/projects/11/ComplexArrays/Main.jack b/nand2tetris-suite/projects/11/ComplexArrays/Main.jack new file mode 100644 index 0000000..fe51c20 --- /dev/null +++ b/nand2tetris-suite/projects/11/ComplexArrays/Main.jack @@ -0,0 +1,70 @@ +// 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/11/ComplexArrays/Main.jack + +/** + * Performs several complex array processing tests. + * For each test, the expected result is printed, along with the + * actual result. In each test, the two results should be equal. + */ +class Main { + + function void main() { + var Array a, b, c; + + let a = Array.new(10); + let b = Array.new(5); + let c = Array.new(1); + + let a[3] = 2; + let a[4] = 8; + let a[5] = 4; + let b[a[3]] = a[3] + 3; // b[2] = 5 + let a[b[a[3]]] = a[a[5]] * b[((7 - a[3]) - Main.double(2)) + 1]; // a[5] = 8 * 5 = 40 + let c[0] = null; + let c = c[0]; + + do Output.printString("Test 1: expected result: 5; actual result: "); + do Output.printInt(b[2]); + do Output.println(); + do Output.printString("Test 2: expected result: 40; actual result: "); + do Output.printInt(a[5]); + do Output.println(); + do Output.printString("Test 3: expected result: 0; actual result: "); + do Output.printInt(c); + do Output.println(); + + let c = null; + + if (c = null) { + do Main.fill(a, 10); + let c = a[3]; + let c[1] = 33; + let c = a[7]; + let c[1] = 77; + let b = a[3]; + let b[1] = b[1] + c[1]; // b[1] = 33 + 77 = 110; + } + + do Output.printString("Test 4: expected result: 77; actual result: "); + do Output.printInt(c[1]); + do Output.println(); + do Output.printString("Test 5: expected result: 110; actual result: "); + do Output.printInt(b[1]); + do Output.println(); + return; + } + + function int double(int a) { + return a * 2; + } + + function void fill(Array a, int size) { + while (size > 0) { + let size = size - 1; + let a[size] = Array.new(3); + } + return; + } +} diff --git a/nand2tetris-suite/projects/11/ConvertToBin/Main.jack b/nand2tetris-suite/projects/11/ConvertToBin/Main.jack new file mode 100644 index 0000000..e627486 --- /dev/null +++ b/nand2tetris-suite/projects/11/ConvertToBin/Main.jack @@ -0,0 +1,82 @@ +// 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/11/ConvertToBin/Main.jack + +/** + * Unpacks a 16-bit number into its binary representation: + * Takes the 16-bit number stored in RAM[8000] and stores its individual + * bits in RAM[8001..8016] (each location will contain 0 or 1). + * Before the conversion, RAM[8001]..RAM[8016] are initialized to -1. + * + * The program should be tested as follows: + * 1) Load the program into the supplied VM emulator + * 2) Put some value in RAM[8000] + * 3) Switch to "no animation" + * 4) Run the program (give it enough time to run) + * 5) Stop the program + * 6) Check that RAM[8001]..RAM[8016] contains the correct binary result, and + * that none of these memory locations contains -1. + */ +class Main { + + /** + * Initializes RAM[8001]..RAM[8016] to -1, + * and converts the value in RAM[8000] to binary. + */ + function void main() { + var int value; + do Main.fillMemory(8001, 16, -1); // sets RAM[8001]..RAM[8016] to -1 + let value = Memory.peek(8000); // reads a value from RAM[8000] + do Main.convert(value); // performs the conversion + return; + } + + /** Converts the given decimal value to binary, and puts + * the resulting bits in RAM[8001]..RAM[8016]. */ + function void convert(int value) { + var int mask, position; + var boolean loop; + + let loop = true; + while (loop) { + let position = position + 1; + let mask = Main.nextMask(mask); + + if (~(position > 16)) { + + if (~((value & mask) = 0)) { + do Memory.poke(8000 + position, 1); + } + else { + do Memory.poke(8000 + position, 0); + } + } + else { + let loop = false; + } + } + return; + } + + /** Returns the next mask (the mask that should follow the given mask). */ + function int nextMask(int mask) { + if (mask = 0) { + return 1; + } + else { + return mask * 2; + } + } + + /** Fills 'length' consecutive memory locations with 'value', + * starting at 'startAddress'. */ + function void fillMemory(int startAddress, int length, int value) { + while (length > 0) { + do Memory.poke(startAddress, value); + let length = length - 1; + let startAddress = startAddress + 1; + } + return; + } +} diff --git a/nand2tetris-suite/projects/11/Pong/Ball.jack b/nand2tetris-suite/projects/11/Pong/Ball.jack new file mode 100644 index 0000000..02e47f9 --- /dev/null +++ b/nand2tetris-suite/projects/11/Pong/Ball.jack @@ -0,0 +1,203 @@ +// 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/11/Pong/Ball.jack + +/** + * A graphical ball. Characterized by a screen location and distance of + * last destination. Has methods for drawing, erasing and moving on the screen. + * The ball is displayed as a filled, 6-by-6 pixles rectangle. + */ +class Ball { + + field int x, y; // the ball's screen location (in pixels) + field int lengthx, lengthy; // distance of last destination (in pixels) + + field int d, straightD, diagonalD; // used for straight line movement computation + field boolean invert, positivex, positivey; // (same) + + field int leftWall, rightWall, topWall, bottomWall; // wall locations + + field int wall; // last wall that the ball was bounced off of + + /** Constructs a new ball with the given initial location and wall locations. */ + constructor Ball new(int Ax, int Ay, + int AleftWall, int ArightWall, int AtopWall, int AbottomWall) { + let x = Ax; + let y = Ay; + let leftWall = AleftWall; + let rightWall = ArightWall - 6; // -6 for ball size + let topWall = AtopWall; + let bottomWall = AbottomWall - 6; // -6 for ball size + let wall = 0; + do show(); + return this; + } + + /** Deallocates the Ball's memory. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Shows the ball. */ + method void show() { + do Screen.setColor(true); + do draw(); + return; + } + + /** Hides the ball. */ + method void hide() { + do Screen.setColor(false); + do draw(); + return; + } + + /** Draws the ball. */ + method void draw() { + do Screen.drawRectangle(x, y, x + 5, y + 5); + return; + } + + /** Returns the ball's left edge. */ + method int getLeft() { + return x; + } + + /** Returns the ball's right edge. */ + method int getRight() { + return x + 5; + } + + /** Computes and sets the ball's destination. */ + method void setDestination(int destx, int desty) { + var int dx, dy, temp; + let lengthx = destx - x; + let lengthy = desty - y; + let dx = Math.abs(lengthx); + let dy = Math.abs(lengthy); + let invert = (dx < dy); + + if (invert) { + let temp = dx; // swap dx, dy + let dx = dy; + let dy = temp; + let positivex = (y < desty); + let positivey = (x < destx); + } + else { + let positivex = (x < destx); + let positivey = (y < desty); + } + + let d = (2 * dy) - dx; + let straightD = 2 * dy; + let diagonalD = 2 * (dy - dx); + + return; + } + + /** + * Moves the ball one unit towards its destination. + * If the ball has reached a wall, returns 0. + * Else, returns a value according to the wall: + * 1 (left wall), 2 (right wall), 3 (top wall), 4 (bottom wall). + */ + method int move() { + + do hide(); + + if (d < 0) { let d = d + straightD; } + else { + let d = d + diagonalD; + + if (positivey) { + if (invert) { let x = x + 4; } + else { let y = y + 4; } + } + else { + if (invert) { let x = x - 4; } + else { let y = y - 4; } + } + } + + if (positivex) { + if (invert) { let y = y + 4; } + else { let x = x + 4; } + } + else { + if (invert) { let y = y - 4; } + else { let x = x - 4; } + } + + if (~(x > leftWall)) { + let wall = 1; + let x = leftWall; + } + if (~(x < rightWall)) { + let wall = 2; + let x = rightWall; + } + if (~(y > topWall)) { + let wall = 3; + let y = topWall; + } + if (~(y < bottomWall)) { + let wall = 4; + let y = bottomWall; + } + + do show(); + + return wall; + } + + /** + * Bounces off the current wall: sets the new destination + * of the ball according to the ball's angle and the given + * bouncing direction (-1/0/1=left/center/right or up/center/down). + */ + method void bounce(int bouncingDirection) { + var int newx, newy, divLengthx, divLengthy, factor; + + // dividing by 10 first since results are too big + let divLengthx = lengthx / 10; + let divLengthy = lengthy / 10; + if (bouncingDirection = 0) { let factor = 10; } + else { + if (((~(lengthx < 0)) & (bouncingDirection = 1)) | ((lengthx < 0) & (bouncingDirection = (-1)))) { + let factor = 20; // bounce direction is in ball direction + } + else { let factor = 5; } // bounce direction is against ball direction + } + + if (wall = 1) { + let newx = 506; + let newy = (divLengthy * (-50)) / divLengthx; + let newy = y + (newy * factor); + } + else { + if (wall = 2) { + let newx = 0; + let newy = (divLengthy * 50) / divLengthx; + let newy = y + (newy * factor); + } + else { + if (wall = 3) { + let newy = 250; + let newx = (divLengthx * (-25)) / divLengthy; + let newx = x + (newx * factor); + } + else { // assumes wall = 4 + let newy = 0; + let newx = (divLengthx * 25) / divLengthy; + let newx = x + (newx * factor); + } + } + } + + do setDestination(newx, newy); + return; + } +} diff --git a/nand2tetris-suite/projects/11/Pong/Bat.jack b/nand2tetris-suite/projects/11/Pong/Bat.jack new file mode 100644 index 0000000..340760f --- /dev/null +++ b/nand2tetris-suite/projects/11/Pong/Bat.jack @@ -0,0 +1,103 @@ +// 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/11/Pong/Bat.jack + +/** + * A graphical Pong bat. + * Displayed as a filled horizontal rectangle that has + * a screen location, a width and a height. + * Has methods for drawing, erasing, moving left and right, + * and changing its width (to make the hitting action more challenging). + * This class should have been called "paddle", following the + * standard Pong terminology. But, unaware of this terminology, + * we called it "bat", and then decided to stick to it. + */ +class Bat { + + field int x, y; // the bat's screen location + field int width, height; // the bat's width and height + field int direction; // direction of the bat's movement (1 = left, 2 = right) + + /** Constructs a new bat with the given location and width. */ + constructor Bat new(int Ax, int Ay, int Awidth, int Aheight) { + let x = Ax; + let y = Ay; + let width = Awidth; + let height = Aheight; + let direction = 2; + do show(); + return this; + } + + /** Deallocates the object's memory. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Shows the bat. */ + method void show() { + do Screen.setColor(true); + do draw(); + return; + } + + /** Hides the bat. */ + method void hide() { + do Screen.setColor(false); + do draw(); + return; + } + + /** Draws the bat. */ + method void draw() { + do Screen.drawRectangle(x, y, x + width, y + height); + return; + } + + /** Sets the bat's direction (0=stop, 1=left, 2=right). */ + method void setDirection(int Adirection) { + let direction = Adirection; + return; + } + + /** Returns the bat's left edge. */ + method int getLeft() { + return x; + } + + /** Returns the bat's right edge. */ + method int getRight() { + return x + width; + } + + /** Sets the bat's width. */ + method void setWidth(int Awidth) { + do hide(); + let width = Awidth; + do show(); + return; + } + + /** Moves the bat one step in the bat's direction. */ + method void move() { + if (direction = 1) { + let x = x - 4; + if (x < 0) { let x = 0; } + do Screen.setColor(false); + do Screen.drawRectangle((x + width) + 1, y, (x + width) + 4, y + height); + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + 3, y + height); + } + else { + let x = x + 4; + if ((x + width) > 511) { let x = 511 - width; } + do Screen.setColor(false); + do Screen.drawRectangle(x - 4, y, x - 1, y + height); + do Screen.setColor(true); + do Screen.drawRectangle((x + width) - 3, y, x + width, y + height); + } + return; + } +} diff --git a/nand2tetris-suite/projects/11/Pong/Main.jack b/nand2tetris-suite/projects/11/Pong/Main.jack new file mode 100644 index 0000000..45e2dd2 --- /dev/null +++ b/nand2tetris-suite/projects/11/Pong/Main.jack @@ -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/11/Pong/Main.jack + +/** + * The main class of the Pong game. + */ +class Main { + + /** Initializes a Pong game and starts running it. */ + function void main() { + var PongGame game; + do PongGame.newInstance(); + let game = PongGame.getInstance(); + do game.run(); + do game.dispose(); + return; + } +} diff --git a/nand2tetris-suite/projects/11/Pong/PongGame.jack b/nand2tetris-suite/projects/11/Pong/PongGame.jack new file mode 100644 index 0000000..7e1ae4c --- /dev/null +++ b/nand2tetris-suite/projects/11/Pong/PongGame.jack @@ -0,0 +1,137 @@ +// 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/11/Pong/PongGame.jack + +/** + * Represents a Pong game. + */ +class PongGame { + + static PongGame instance; // the singelton, a Pong game instance + field Bat bat; // the bat + field Ball ball; // the ball + field int wall; // the current wall that the ball is bouncing off of. + field boolean exit; // true when the game is over + field int score; // the current score. + field int lastWall; // the last wall that the ball bounced off of. + + // The current width of the bat + field int batWidth; + + /** Constructs a new Pong game. */ + constructor PongGame new() { + do Screen.clearScreen(); + let batWidth = 50; // initial bat size + let bat = Bat.new(230, 229, batWidth, 7); + let ball = Ball.new(253, 222, 0, 511, 0, 229); + do ball.setDestination(400,0); + do Screen.drawRectangle(0, 238, 511, 240); + do Output.moveCursor(22,0); + do Output.printString("Score: 0"); + + let exit = false; + let score = 0; + let wall = 0; + let lastWall = 0; + + return this; + } + + /** Deallocates the object's memory. */ + method void dispose() { + do bat.dispose(); + do ball.dispose(); + do Memory.deAlloc(this); + return; + } + + /** Creates an instance of Pong game, and stores it. */ + function void newInstance() { + let instance = PongGame.new(); + return; + } + + /** Returns the single instance of this Pong game. */ + function PongGame getInstance() { + return instance; + } + + /** Starts the game, and andles inputs from the user that control + * the bat's movement direction. */ + method void run() { + var char key; + + while (~exit) { + // waits for a key to be pressed. + while ((key = 0) & (~exit)) { + let key = Keyboard.keyPressed(); + do bat.move(); + do moveBall(); + do Sys.wait(50); + } + + if (key = 130) { do bat.setDirection(1); } + else { + if (key = 132) { do bat.setDirection(2); } + else { + if (key = 140) { let exit = true; } + } + } + + // Waits for the key to be released. + while ((~(key = 0)) & (~exit)) { + let key = Keyboard.keyPressed(); + do bat.move(); + do moveBall(); + do Sys.wait(50); + } + } + + if (exit) { + do Output.moveCursor(10,27); + do Output.printString("Game Over"); + } + + return; + } + + /** + * Handles ball movement, including bouncing. + * If the ball bounces off a wall, finds its new direction. + * If the ball bounces off the bat, increases the score by one + * and shrinks the bat's size, to make the game more challenging. + */ + method void moveBall() { + var int bouncingDirection, batLeft, batRight, ballLeft, ballRight; + + let wall = ball.move(); + + if ((wall > 0) & (~(wall = lastWall))) { + let lastWall = wall; + let bouncingDirection = 0; + let batLeft = bat.getLeft(); + let batRight = bat.getRight(); + let ballLeft = ball.getLeft(); + let ballRight = ball.getRight(); + + if (wall = 4) { + let exit = (batLeft > ballRight) | (batRight < ballLeft); + if (~exit) { + if (ballRight < (batLeft + 10)) { let bouncingDirection = -1; } + else { + if (ballLeft > (batRight - 10)) { let bouncingDirection = 1; } + } + + let batWidth = batWidth - 2; + do bat.setWidth(batWidth); + let score = score + 1; + do Output.moveCursor(22,7); + do Output.printInt(score); + } + } + do ball.bounce(bouncingDirection); + } + return; + } +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/11/Seven/Main.jack b/nand2tetris-suite/projects/11/Seven/Main.jack new file mode 100644 index 0000000..067402e --- /dev/null +++ b/nand2tetris-suite/projects/11/Seven/Main.jack @@ -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/11/Seven/Main.jack + +/** + * Computes the value of 1 + (2 * 3) and prints the result + * at the top-left of the screen. + */ +class Main { + + function void main() { + do Output.printInt(1 + (2 * 3)); + return; + } + +} diff --git a/nand2tetris-suite/projects/11/Square/Main.jack b/nand2tetris-suite/projects/11/Square/Main.jack new file mode 100644 index 0000000..0753893 --- /dev/null +++ b/nand2tetris-suite/projects/11/Square/Main.jack @@ -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/11/Square/Main.jack + +// (same as projects/09/Square/Main.jack) + +/** Initializes a new Square Dance game and starts running it. */ +class Main { + function void main() { + var SquareGame game; + let game = SquareGame.new(); + do game.run(); + do game.dispose(); + return; + } +} diff --git a/nand2tetris-suite/projects/11/Square/Square.jack b/nand2tetris-suite/projects/11/Square/Square.jack new file mode 100644 index 0000000..5a92838 --- /dev/null +++ b/nand2tetris-suite/projects/11/Square/Square.jack @@ -0,0 +1,110 @@ +// 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/11/Square/Square.jack + +// (same as projects/09/Square/Square.jack) + +/** Implements a graphical square. */ +class Square { + + field int x, y; // screen location of the square's top-left corner + field int size; // length of this square, in pixels + + /** Constructs a new square with a given location and size. */ + constructor Square new(int Ax, int Ay, int Asize) { + let x = Ax; + let y = Ay; + let size = Asize; + do draw(); + return this; + } + + /** Disposes this square. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Draws the square on the screen. */ + method void draw() { + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Erases the square from the screen. */ + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + size); + return; + } + + /** Increments the square size by 2 pixels. */ + method void incSize() { + if (((y + size) < 254) & ((x + size) < 510)) { + do erase(); + let size = size + 2; + do draw(); + } + return; + } + + /** Decrements the square size by 2 pixels. */ + method void decSize() { + if (size > 2) { + do erase(); + let size = size - 2; + do draw(); + } + return; + } + + /** Moves the square up by 2 pixels. */ + method void moveUp() { + if (y > 1) { + do Screen.setColor(false); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + let y = y - 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + size, y + 1); + } + return; + } + + /** Moves the square down by 2 pixels. */ + method void moveDown() { + if ((y + size) < 254) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + size, y + 1); + let y = y + 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, (y + size) - 1, x + size, y + size); + } + return; + } + + /** Moves the square left by 2 pixels. */ + method void moveLeft() { + if (x > 1) { + do Screen.setColor(false); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + let x = x - 2; + do Screen.setColor(true); + do Screen.drawRectangle(x, y, x + 1, y + size); + } + return; + } + + /** Moves the square right by 2 pixels. */ + method void moveRight() { + if ((x + size) < 510) { + do Screen.setColor(false); + do Screen.drawRectangle(x, y, x + 1, y + size); + let x = x + 2; + do Screen.setColor(true); + do Screen.drawRectangle((x + size) - 1, y, x + size, y + size); + } + return; + } +} diff --git a/nand2tetris-suite/projects/11/Square/SquareGame.jack b/nand2tetris-suite/projects/11/Square/SquareGame.jack new file mode 100644 index 0000000..4fe7e39 --- /dev/null +++ b/nand2tetris-suite/projects/11/Square/SquareGame.jack @@ -0,0 +1,81 @@ +// 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/11/Square/SquareGame.jack + +// (same as projects/09/Square/SquareGame.jack) + +/** + * Implements the Square Dance game. + * This simple game allows the user to move a black square around + * the screen, and change the square's size during the movement. + * When the game starts, a square of 30 by 30 pixels is shown at the + * top-left corner of the screen. The user controls the square as follows. + * The 4 arrow keys are used to move the square up, down, left, and right. + * The 'z' and 'x' keys are used, respectively, to decrement and increment + * the square's size. The 'q' key is used to quit the game. + */ + +class SquareGame { + field Square square; // the square of this game + field int direction; // the square's current direction: + // 0=none, 1=up, 2=down, 3=left, 4=right + + /** Constructs a new Square Game. */ + constructor SquareGame new() { + // Creates a 30 by 30 pixels square and positions it at the top-left + // of the screen. + let square = Square.new(0, 0, 30); + let direction = 0; // initial state is no movement + return this; + } + + /** Disposes this game. */ + method void dispose() { + do square.dispose(); + do Memory.deAlloc(this); + return; + } + + /** Moves the square in the current direction. */ + method void moveSquare() { + if (direction = 1) { do square.moveUp(); } + if (direction = 2) { do square.moveDown(); } + if (direction = 3) { do square.moveLeft(); } + if (direction = 4) { do square.moveRight(); } + do Sys.wait(5); // delays the next movement + return; + } + + /** Runs the game: handles the user's inputs and moves the square accordingly */ + method void run() { + var char key; // the key currently pressed by the user + var boolean exit; + let exit = false; + + while (~exit) { + // waits for a key to be pressed + while (key = 0) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + if (key = 81) { let exit = true; } // q key + if (key = 90) { do square.decSize(); } // z key + if (key = 88) { do square.incSize(); } // x key + if (key = 131) { let direction = 1; } // up arrow + if (key = 133) { let direction = 2; } // down arrow + if (key = 130) { let direction = 3; } // left arrow + if (key = 132) { let direction = 4; } // right arrow + + // waits for the key to be released + while (~(key = 0)) { + let key = Keyboard.keyPressed(); + do moveSquare(); + } + } // while + return; + } +} + + + diff --git a/nand2tetris-suite/projects/12/Array.jack b/nand2tetris-suite/projects/12/Array.jack new file mode 100644 index 0000000..ee31129 --- /dev/null +++ b/nand2tetris-suite/projects/12/Array.jack @@ -0,0 +1,23 @@ +// 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/12/Array.jack + +/** + * Represents an array. + * In the Jack language, arrays are instances of the Array class. + * Once declared, the array entries can be accessed using the usual + * syntax arr[i]. Each array entry can hold a primitive data type as + * well as any object type. Different array entries can have different + * data types. + */ +class Array { + + /** Constructs a new Array of the given size. */ + function Array new(int size) { + } + + /** Disposes this array. */ + method void dispose() { + } +} diff --git a/nand2tetris-suite/projects/12/ArrayTest/ArrayTest.cmp b/nand2tetris-suite/projects/12/ArrayTest/ArrayTest.cmp new file mode 100644 index 0000000..d1a9798 --- /dev/null +++ b/nand2tetris-suite/projects/12/ArrayTest/ArrayTest.cmp @@ -0,0 +1,2 @@ +|RAM[8000]|RAM[8001]|RAM[8002]|RAM[8003]| +| 222 | 122 | 100 | 10 | diff --git a/nand2tetris-suite/projects/12/ArrayTest/ArrayTest.tst b/nand2tetris-suite/projects/12/ArrayTest/ArrayTest.tst new file mode 100644 index 0000000..89934b9 --- /dev/null +++ b/nand2tetris-suite/projects/12/ArrayTest/ArrayTest.tst @@ -0,0 +1,15 @@ +// 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/12/ArrayTest/ArrayTest.tst + +load, +output-file ArrayTest.out, +compare-to ArrayTest.cmp, +output-list RAM[8000]%D2.6.1 RAM[8001]%D2.6.1 RAM[8002]%D2.6.1 RAM[8003]%D2.6.1; + +repeat 1000000 { + vmstep; +} + +output; diff --git a/nand2tetris-suite/projects/12/ArrayTest/Main.jack b/nand2tetris-suite/projects/12/ArrayTest/Main.jack new file mode 100644 index 0000000..439770a --- /dev/null +++ b/nand2tetris-suite/projects/12/ArrayTest/Main.jack @@ -0,0 +1,40 @@ +// 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/12/ArrayTest/Main.jack + +/** Test program for the OS Array class. */ +class Main { + + /** Performs several Array manipulations. */ + function void main() { + var Array r; // stores test results + var Array a, b, c; + + let r = 8000; + + let a = Array.new(3); + let a[2] = 222; + let r[0] = a[2]; // RAM[8000] = 222 + + let b = Array.new(3); + let b[1] = a[2] - 100; + let r[1] = b[1]; // RAM[8001] = 122 + + let c = Array.new(500); + let c[499] = a[2] - b[1]; + let r[2] = c[499]; // RAM[8002] = 100 + + do a.dispose(); + do b.dispose(); + + let b = Array.new(3); + let b[0] = c[499] - 90; + let r[3] = b[0]; // RAM[8003] = 10 + + do c.dispose(); + do b.dispose(); + + return; + } +} diff --git a/nand2tetris-suite/projects/12/Keyboard.jack b/nand2tetris-suite/projects/12/Keyboard.jack new file mode 100644 index 0000000..03e1031 --- /dev/null +++ b/nand2tetris-suite/projects/12/Keyboard.jack @@ -0,0 +1,62 @@ +// 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/12/Keyboard.jack + +/** + * A library for handling user input from the keyboard. + */ +class Keyboard { + + /** Initializes the keyboard. */ + function void init() { + } + + /** + * Returns the character of the currently pressed key on the keyboard; + * if no key is currently pressed, returns 0. + * + * Recognizes all ASCII characters, as well as the following keys: + * new line = 128 = String.newline() + * backspace = 129 = String.backspace() + * left arrow = 130 + * up arrow = 131 + * right arrow = 132 + * down arrow = 133 + * home = 134 + * End = 135 + * page up = 136 + * page down = 137 + * insert = 138 + * delete = 139 + * ESC = 140 + * F1 - F12 = 141 - 152 + */ + function char keyPressed() { + } + + /** + * Waits until a key is pressed on the keyboard and released, + * then echoes the key to the screen, and returns the character + * of the pressed key. + */ + function char readChar() { + } + + /** + * Displays the message on the screen, reads from the keyboard the entered + * text until a newline character is detected, echoes the text to the screen, + * and returns its value. Also handles user backspaces. + */ + function String readLine(String message) { + } + + /** + * Displays the message on the screen, reads from the keyboard the entered + * text until a newline character is detected, echoes the text to the screen, + * and returns its integer value (until the first non-digit character in the + * entered text is detected). Also handles user backspaces. + */ + function int readInt(String message) { + } +} diff --git a/nand2tetris-suite/projects/12/KeyboardTest/KeyboardTestOutput.gif b/nand2tetris-suite/projects/12/KeyboardTest/KeyboardTestOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..944983aaf1c0559b1b10f02987fe7574dc0a5bdd GIT binary patch literal 12048 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 F`X7nb_ul{j literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/projects/12/KeyboardTest/Main.jack b/nand2tetris-suite/projects/12/KeyboardTest/Main.jack new file mode 100644 index 0000000..e89182c --- /dev/null +++ b/nand2tetris-suite/projects/12/KeyboardTest/Main.jack @@ -0,0 +1,93 @@ +// 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/12/KeyboardTest/Main.jack + +/** Test program for the OS Keyboard class. */ +class Main { + + /** Gets input from the user and verifies its contents. */ + function void main() { + var char c, key; + var String s; + var int i; + var boolean ok; + + let ok = false; + do Output.printString("keyPressed test:"); + do Output.println(); + while (~ok) { + do Output.printString("Please press the 'Page Down' key"); + while (key = 0) { + let key = Keyboard.keyPressed(); + } + let c = key; + while (~(key = 0)) { + let key = Keyboard.keyPressed(); + } + + do Output.println(); + + if (c = 137) { + do Output.printString("ok"); + do Output.println(); + let ok = true; + } + } + + let ok = false; + do Output.printString("readChar test:"); + do Output.println(); + do Output.printString("(Verify that the pressed character is echoed to the screen)"); + do Output.println(); + while (~ok) { + do Output.printString("Please press the number '3': "); + let c = Keyboard.readChar(); + + do Output.println(); + + if (c = 51) { + do Output.printString("ok"); + do Output.println(); + let ok = true; + } + } + + let ok = false; + do Output.printString("readLine test:"); + do Output.println(); + do Output.printString("(Verify echo and usage of 'backspace')"); + do Output.println(); + while (~ok) { + let s = Keyboard.readLine("Please type 'JACK' and press enter: "); + + if (s.length() = 4) { + if ((s.charAt(0) = 74) & (s.charAt(1) = 65) & (s.charAt(2) = 67) & (s.charAt(3) = 75)) { + do Output.printString("ok"); + do Output.println(); + let ok = true; + } + } + } + + let ok = false; + do Output.printString("readInt test:"); + do Output.println(); + do Output.printString("(Verify echo and usage of 'backspace')"); + do Output.println(); + while (~ok) { + let i = Keyboard.readInt("Please type '-32123' and press enter: "); + + if (i = (-32123)) { + do Output.printString("ok"); + do Output.println(); + let ok = true; + } + } + + do Output.println(); + do Output.printString("Test completed successfully"); + + return; + } +} diff --git a/nand2tetris-suite/projects/12/Math.jack b/nand2tetris-suite/projects/12/Math.jack new file mode 100644 index 0000000..a57f023 --- /dev/null +++ b/nand2tetris-suite/projects/12/Math.jack @@ -0,0 +1,47 @@ +// 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/12/Math.jack + +/** + * A library of commonly used mathematical functions. + * Note: Jack compilers implement multiplication and division using OS method calls. + */ +class Math { + + /** Initializes the library. */ + function void init() { + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + } + + /** Returns the product of x and y. + * When a Jack compiler detects the multiplication operator '*' in the + * program's code, it handles it by invoking this method. In other words, + * the Jack expressions x*y and multiply(x,y) return the same value. + */ + function int multiply(int x, int y) { + } + + /** Returns the integer part of x/y. + * When a Jack compiler detects the multiplication operator '/' in the + * program's code, it handles it by invoking this method. In other words, + * the Jack expressions x/y and divide(x,y) return the same value. + */ + function int divide(int x, int y) { + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + } + + /** Returns the greater number. */ + function int max(int a, int b) { + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + } +} diff --git a/nand2tetris-suite/projects/12/MathTest/Main.jack b/nand2tetris-suite/projects/12/MathTest/Main.jack new file mode 100644 index 0000000..de5cec2 --- /dev/null +++ b/nand2tetris-suite/projects/12/MathTest/Main.jack @@ -0,0 +1,35 @@ +// 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/12/MathTest/Main.jack + +/** Test program for the OS Math class. */ +class Main { + + /** Performs various mathematical operations, using calls to the Math class methods. */ + function void main() { + var Array r; // stores the test results; + + let r = 8000; + + let r[0] = 2 * 3; // 6 + let r[1] = r[0] * (-30); // 6 * (-30) = -180 + let r[2] = r[1] * 100; // (-180) * 100 = -18000 + let r[3] = 1 * r[2]; // 1 * (-18000) = -18000 + let r[4] = r[3] * 0; // 0 + + let r[5] = 9 / 3; // 3 + let r[6] = (-18000) / 6; // -3000 + let r[7] = 32766 / (-32767); // 0 + + let r[8] = Math.sqrt(9); // 3 + let r[9] = Math.sqrt(32767); // 181 + + let r[10] = Math.min(345, 123); // 123 + let r[11] = Math.max(123, -345); // 123 + let r[12] = Math.abs(27); // 27 + let r[13] = Math.abs(-32767); // 32767 + + return; + } +} diff --git a/nand2tetris-suite/projects/12/MathTest/MathTest.cmp b/nand2tetris-suite/projects/12/MathTest/MathTest.cmp new file mode 100644 index 0000000..703c1be --- /dev/null +++ b/nand2tetris-suite/projects/12/MathTest/MathTest.cmp @@ -0,0 +1,2 @@ +|RAM[8000]|RAM[8001]|RAM[8002]|RAM[8003]|RAM[8004]|RAM[8005]|RAM[8006]|RAM[8007]|RAM[8008]|RAM[8009]|RAM[8010]|RAM[8011]|RAM[8012]|RAM[8013]| +| 6 | -180 | -18000 | -18000 | 0 | 3 | -3000 | 0 | 3 | 181 | 123 | 123 | 27 | 32767 | diff --git a/nand2tetris-suite/projects/12/MathTest/MathTest.tst b/nand2tetris-suite/projects/12/MathTest/MathTest.tst new file mode 100644 index 0000000..127dbb4 --- /dev/null +++ b/nand2tetris-suite/projects/12/MathTest/MathTest.tst @@ -0,0 +1,15 @@ +// 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/12/MathTest/MathTest.tst + +load, +output-file MathTest.out, +compare-to MathTest.cmp, +output-list RAM[8000]%D2.6.1 RAM[8001]%D2.6.1 RAM[8002]%D2.6.1 RAM[8003]%D2.6.1 RAM[8004]%D2.6.1 RAM[8005]%D2.6.1 RAM[8006]%D2.6.1 RAM[8007]%D2.6.1 RAM[8008]%D2.6.1 RAM[8009]%D2.6.1 RAM[8010]%D2.6.1 RAM[8011]%D2.6.1 RAM[8012]%D2.6.1 RAM[8013]%D2.6.1; + +repeat 1000000 { + vmstep; +} + +output; diff --git a/nand2tetris-suite/projects/12/Memory.jack b/nand2tetris-suite/projects/12/Memory.jack new file mode 100644 index 0000000..941eec1 --- /dev/null +++ b/nand2tetris-suite/projects/12/Memory.jack @@ -0,0 +1,34 @@ +// 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/12/Memory.jack + +/** + * This library provides two services: direct access to the computer's main + * memory (RAM), and allocation and recycling of memory blocks. The Hack RAM + * consists of 32,768 words, each holding a 16-bit binary number. + */ +class Memory { + + /** Initializes the class. */ + function void init() { + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + } +} diff --git a/nand2tetris-suite/projects/12/MemoryTest/Main.jack b/nand2tetris-suite/projects/12/MemoryTest/Main.jack new file mode 100644 index 0000000..a9817f4 --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/Main.jack @@ -0,0 +1,53 @@ +// 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/12/MemoryTest/Main.jack + +/** Test program for the OS Memory class. */ +class Main { + + /** Performs various memory manipulations. */ + function void main() { + var int temp, err; + var Array a, b, c; + + do Memory.poke(8000, 333); // RAM[8000] = 333 + let temp = Memory.peek(8000); + do Memory.poke(8001, temp + 1); // RAM[8001] = 334 + + let a = Array.new(3); // uses Memory.alloc + let a[2] = 222; + do Memory.poke(8002, a[2]); // RAM[8002] = 222 + + let err = 0; + let b = Array.new(3); + let b[1] = a[2] - 100; + if (b = a) { // Fail compare if b = a + let err = 1; } + do Memory.poke(8003, b[1] + err); // RAM[8003] = 122 + + let err = 0; + let c = Array.new(500); + let c[499] = a[2] - b[1]; + if (c = a) { // Fail compare if c = a + let err = 1; } + if (c = b) { // Fail compare if c = b + let err = err + 10; } + do Memory.poke(8004, c[499]+err); // RAM[8004] = 100 + + do a.dispose(); // uses Memory.deAlloc + do b.dispose(); + + let err = 0; + let b = Array.new(3); + let b[0] = c[499] - 90; + if (b = c) { // Fail compare if b = c + let err = 1; } + do Memory.poke(8005, b[0] + err); // RAM[8005] = 10 + + do c.dispose(); + do b.dispose(); + + return; + } +} diff --git a/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/Main.jack b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/Main.jack new file mode 100644 index 0000000..de439d0 --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/Main.jack @@ -0,0 +1,183 @@ +// 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/12/MemoryTest/Main.jack + +/** Test program for the OS Memory class. */ +class Main { + + /** Test Memory.peek(), poke(), alloc() and deAlloc(). + * + * This test is also a diagnostic. RAM[17000] is incremented before and + * after every call so that the failure point can be accurately determined + * when using command line testing. Return values from all alloc() calls + * are also stored in the test results to aid debugging. + */ + function void main() { + var int temp; + var Array a, b, c, out; + + let out = 17000; // Address where test results will be stored. + + // Test poke() and peek(). + + let out[0] = 10; // poke test + do Memory.poke(out + 1, 333); // RAM[17001] = 333 + + let out[0] = 11; // peek test + let temp = Memory.peek(out + 1); + let out[2] = temp + 1; // RAM[17002] = 334 + let out[0] = 12; // peek/poke test complete + + // Allocate a memory block. + // Validate that the returned block is entirely within the heap, + // Test aborts if the block is not valid. + + let out[0] = 20; + let a = Memory.alloc(20); + let out[3] = a; // RAM[17003] = block address + + let out[0] = 21; + do Main.checkRange(a, 20); + let out[0] = 22; + + // Allocate a SMALLER memory block. + // Validate that the returned block is entirely within the heap, + // and that it does not overlap block 'a'. + // Test aborts if the block is not valid or overlaps. + // + // Common failure: first block was not removed from free list so space + // for this block was found within the first block. + + let out[0] = 30; + let b = Memory.alloc(3); + let out[4] = b; // RAM[17004] = block address + + let out[0] = 31; + do Main.checkRange(b, 3); + let out[0] = 32; + do Main.checkOverlap(b, 3, a, 3); + let out[0] = 33; + + // Allocate a memory block. + // Validate that the returned block is entirely within the heap, + // and that it does not overlap blocks 'a' or 'b'. + // Test aborts if the block is not valid or overlaps. + + let out[0] = 40; + let c = Memory.alloc(500); + let out[5] = c; // RAM[17005] = block address + + let out[0] = 41; + do Main.checkRange(c, 500); + let out[0] = 42; + do Main.checkOverlap(c, 500, a, 3); + let out[0] = 43; + do Main.checkOverlap(c, 500, b, 3); + let out[0] = 44; + + // Deallocate blocks 'a' and 'b', retaining 'c'. + // + // Common failure: free list corrupted by deAlloc(). + + let out[0] = 50; + do Memory.deAlloc(a); + + let out[0] = 51; + do Memory.deAlloc(b); + let out[0] = 52; + + // Allocate a memory block. + // Validate that the returned block is entirely within the heap, + // and that it does not overlap blocks 'c'. + // Test aborts if the block is not valid or overlaps. + // + // Common failure: free list corrupted by deAlloc(). + + let out[0] = 60; + let b = Memory.alloc(3); + let out[6] = b; // RAM[17006] = block address + + let out[0] = 61; + do Main.checkRange(b, 3); + let out[0] = 62; + do Main.checkOverlap(b, 3, c, 500); + let out[0] = 63; + + // Deallocate blocks 'b' and 'c'. + + let out[0] = 70; + do Memory.deAlloc(c); + + let out[0] = 71; + do Memory.deAlloc(b); + let out[0] = 72; + + // Test that deallocated blocks are placed on the free list and can + // be reused. + + let out[0] = 70; + let a = Memory.alloc(8000); + let out[7] = a; // RAM[17007] = block address + + let out[0] = 71; + do Main.checkRange(a, 8000); + + let out[0] = 72; + do Memory.deAlloc(a); + + let out[0] = 73; + let a = Memory.alloc(7000); + + let out[0] = 74; + do Main.checkRange(a, 7000); + + let out[0] = 75; + do Memory.deAlloc(a); + let out[8] = a; // RAM[17008] = block address + + // Test complete. + let out[0] = 100; + + // At this point all allocated blocks have been deallocated. + // + // You can inspect the free list and confirm that all of the heap is + // contained in the free segments. + // + // If you implemented defragmentation in dealloc(), the free list + // should contain only one segment, consisting of the entire heap. + + return; + } + + + /** Check that block a(a_len) is in the heap. + * + * If the block begins or ends outside of the heap, calls Sys.halt() + */ + function void checkRange(int a, int a_len) { + var int a_high; + let a_high = (a + a_len)-1; + if ((a < 2048) | ((a_high) > 16383)) { + // Block is not entirely within heap. + do Sys.halt(); + } + return; + } + + /** Check that block a(a_len) does not overlap block b(b_len). + * Assumes that both blocks have been range checked. + * + * If the blocks overlap, calls Sys.halt() + */ + function void checkOverlap(int a, int a_len, int b, int b_len) { + var int a_high, b_high; + let a_high = (a + a_len)-1; + let b_high = (b + b_len)-1; + if ( ~ ((a > b_high) | (a_high < b))) { + // Block overlaps excluded range. + do Sys.halt(); + } + return; + } +} diff --git a/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp new file mode 100644 index 0000000..808e2ce --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp @@ -0,0 +1,2 @@ +|RAM[17000|RAM[17001|RAM[17002|RAM[17003|RAM[17004|RAM[17005|RAM[17006|RAM[17007|RAM[17008| +| 100 | 333 | 334 |*********|*********|*********|*********|*********|*********| diff --git a/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst new file mode 100644 index 0000000..94cd921 --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/MemoryDiag.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/12/MemoryTest/MemoryDiag/MemoryDiag.tst + +echo "At the end of this test it is normal to see some pixels set on the screen"; +load, +output-file MemoryDiag.out, +compare-to MemoryDiag.cmp, +output-list RAM[17000]%D2.6.1 RAM[17001]%D2.6.1 RAM[17002]%D2.6.1 + RAM[17003]%D2.6.1 RAM[17004]%D2.6.1 RAM[17005]%D2.6.1 RAM[17006]%D2.6.1 + RAM[17007]%D2.6.1 RAM[17008]%D2.6.1; + +repeat 1000000 { + vmstep; +} + +output; diff --git a/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/README.html b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/README.html new file mode 100644 index 0000000..587847e --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/MemoryDiag/README.html @@ -0,0 +1,55 @@ + +

MemoryDiag is both a pass/fail test and a diagnostic.

+

+MemoryDiag tests the following: +

    +
  1. Memory.peek() and Memory.poke() read from and write to the specified memory address.
  2. +
  3. Memory.alloc() returns RAM blocks that are fully contained within the heap address range 2048-16383.
  4. +
  5. Memory.alloc() does not return RAM blocks that overlap each other.
  6. +
  7. RAM blocks deallocated by Memory.deAlloc() are made available for Memory.alloc() to reuse.
  8. +
+The block reuse test allocates and deallocates an 8000 word block. It then tries to allocates a 7000 word block which must be allocated from the deallocated 8000 word block. If the 8000 word block is not available for reuse, there will only be about 6300 words available in the heap so you will get an ERR6. +

+At the end of this test it is normal to see some pixels set on the screen. This is because the results of the test are written to RAM[17000] – RAM[17008] which is in the Screen memory. MemoryDiag does not put its results in the first 16K of RAM because it must not interfere with the Memory.jack that is being tested. + + +

Using MemoryDiag as a diagnostic

+ +RAM[17000] is set to a unique value before every system call and address validation. This allows the exact failure location in the test to be identified when automated testing is used. At the end of the test, RAM[17000] is set to 100. +

+When the test fails to compare, look at the MemoryDiag.out file and note the RAM[17000] value. This is the test step that failed. Look through the Main.jack code and find the corresponding
+  let out[0] = step;
+statement. The function immediately following this statement is where the failure occurred. +

+For example, if RAM[17000] is 51, the
+  do Memory.deAlloc(b);
+call did not return. Either there was a simulation error like a bad address or deAlloc() got stuck in a loop. + + +

Sample MemoryDiag output files

+ +Note that RAM[17003] – RAM[17008] are "don't care" values in the MemoryDiag.cmp file. +

+Supplied Memory.vm passes: +

+|RAM[17000|RAM[17001|RAM[17002|RAM[17003|RAM[17004|RAM[17005|RAM[17006|RAM[17007|RAM[17008|
+|     100 |     333 |     334 |    2050 |    2072 |    2077 |    2050 |    2050 |    2050 |
+
+Memory.Jack using the Coursera implementation passes: +
+|RAM[17000|RAM[17001|RAM[17002|RAM[17003|RAM[17004|RAM[17005|RAM[17006|RAM[17007|RAM[17008|
+|     100 |     333 |     334 |   16364 |   16359 |   15857 |   15852 |    7850 |    8850 |
+
+Broken Memory.jack fails (alloc() returns duplicate block address): +
+|RAM[17000|RAM[17001|RAM[17002|RAM[17003|RAM[17004|RAM[17005|RAM[17006|RAM[17007|RAM[17008|
+|      32 |     333 |     334 |    2050 |    2050 |       0 |       0 |       0 |       0 |
+
+Broken Memory.jack fails (deAlloc() does not recycle memory blocks): +
+|RAM[17000|RAM[17001|RAM[17002|RAM[17003|RAM[17004|RAM[17005|RAM[17006|RAM[17007|RAM[17008|
+|      73 |     333 |     334 |   16364 |   16359 |   15857 |   15852 |    7850 |       0 |
+
+ + +

\ No newline at end of file diff --git a/nand2tetris-suite/projects/12/MemoryTest/MemoryTest.cmp b/nand2tetris-suite/projects/12/MemoryTest/MemoryTest.cmp new file mode 100644 index 0000000..057958b --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/MemoryTest.cmp @@ -0,0 +1,2 @@ +|RAM[8000]|RAM[8001]|RAM[8002]|RAM[8003]|RAM[8004]|RAM[8005]| +| 333 | 334 | 222 | 122 | 100 | 10 | diff --git a/nand2tetris-suite/projects/12/MemoryTest/MemoryTest.tst b/nand2tetris-suite/projects/12/MemoryTest/MemoryTest.tst new file mode 100644 index 0000000..1da34fd --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/MemoryTest.tst @@ -0,0 +1,15 @@ +// 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/12/MemoryTest/MemoryTest.tst + +load, +output-file MemoryTest.out, +compare-to MemoryTest.cmp, +output-list RAM[8000]%D2.6.1 RAM[8001]%D2.6.1 RAM[8002]%D2.6.1 RAM[8003]%D2.6.1 RAM[8004]%D2.6.1 RAM[8005]%D2.6.1; + +repeat 1000000 { + vmstep; +} + +output; diff --git a/nand2tetris-suite/projects/12/MemoryTest/README.txt b/nand2tetris-suite/projects/12/MemoryTest/README.txt new file mode 100644 index 0000000..15ad0c8 --- /dev/null +++ b/nand2tetris-suite/projects/12/MemoryTest/README.txt @@ -0,0 +1,9 @@ +There are some specific wrong values that indicate that your Memory.jack +returned identical pointers to allocated segments. Look at Main.jack to +see where the pointers a, b and c are used. + +RAM[8003] = 123 b = a +RAM[8004] = 101 c = a +RAM[8004] = 110 c = b +RAM[8004] = 111 c = a and c = b +RAM[8005] = 11 new b = c diff --git a/nand2tetris-suite/projects/12/Output.jack b/nand2tetris-suite/projects/12/Output.jack new file mode 100644 index 0000000..18e3382 --- /dev/null +++ b/nand2tetris-suite/projects/12/Output.jack @@ -0,0 +1,203 @@ +// 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/12/Output.jack + +/** + * A library of functions for writing text on the screen. + * The Hack physical screen consists of 512 rows of 256 pixels each. + * The library uses a fixed font, in which each character is displayed + * within a frame which is 11 pixels high (including 1 pixel for inter-line + * spacing) and 8 pixels wide (including 2 pixels for inter-character spacing). + * The resulting grid accommodates 23 rows (indexed 0..22, top to bottom) + * of 64 characters each (indexed 0..63, left to right). The top left + * character position on the screen is indexed (0,0). A cursor, implemented + * as a small filled square, indicates where the next character will be displayed. + */ +class Output { + + // Character map for displaying characters + static Array charMaps; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + } + + // Initializes the character map array + function void initMap() { + var int i; + + let charMaps = Array.new(127); + + // Black square, used for displaying non-printable characters. + do Output.create(0,63,63,63,63,63,63,63,63,63,0,0); + + // Assigns the bitmap for each character in the charachter set. + // The first parameter is the character index, the next 11 numbers + // are the values of each row in the frame that represents this character. + do Output.create(32,0,0,0,0,0,0,0,0,0,0,0); // + do Output.create(33,12,30,30,30,12,12,0,12,12,0,0); // ! + do Output.create(34,54,54,20,0,0,0,0,0,0,0,0); // " + do Output.create(35,0,18,18,63,18,18,63,18,18,0,0); // # + do Output.create(36,12,30,51,3,30,48,51,30,12,12,0); // $ + do Output.create(37,0,0,35,51,24,12,6,51,49,0,0); // % + do Output.create(38,12,30,30,12,54,27,27,27,54,0,0); // & + do Output.create(39,12,12,6,0,0,0,0,0,0,0,0); // ' + do Output.create(40,24,12,6,6,6,6,6,12,24,0,0); // ( + do Output.create(41,6,12,24,24,24,24,24,12,6,0,0); // ) + do Output.create(42,0,0,0,51,30,63,30,51,0,0,0); // * + do Output.create(43,0,0,0,12,12,63,12,12,0,0,0); // + + do Output.create(44,0,0,0,0,0,0,0,12,12,6,0); // , + do Output.create(45,0,0,0,0,0,63,0,0,0,0,0); // - + do Output.create(46,0,0,0,0,0,0,0,12,12,0,0); // . + do Output.create(47,0,0,32,48,24,12,6,3,1,0,0); // / + + do Output.create(48,12,30,51,51,51,51,51,30,12,0,0); // 0 + do Output.create(49,12,14,15,12,12,12,12,12,63,0,0); // 1 + do Output.create(50,30,51,48,24,12,6,3,51,63,0,0); // 2 + do Output.create(51,30,51,48,48,28,48,48,51,30,0,0); // 3 + do Output.create(52,16,24,28,26,25,63,24,24,60,0,0); // 4 + do Output.create(53,63,3,3,31,48,48,48,51,30,0,0); // 5 + do Output.create(54,28,6,3,3,31,51,51,51,30,0,0); // 6 + do Output.create(55,63,49,48,48,24,12,12,12,12,0,0); // 7 + do Output.create(56,30,51,51,51,30,51,51,51,30,0,0); // 8 + do Output.create(57,30,51,51,51,62,48,48,24,14,0,0); // 9 + + do Output.create(58,0,0,12,12,0,0,12,12,0,0,0); // : + do Output.create(59,0,0,12,12,0,0,12,12,6,0,0); // ; + do Output.create(60,0,0,24,12,6,3,6,12,24,0,0); // < + do Output.create(61,0,0,0,63,0,0,63,0,0,0,0); // = + do Output.create(62,0,0,3,6,12,24,12,6,3,0,0); // > + do Output.create(64,30,51,51,59,59,59,27,3,30,0,0); // @ + do Output.create(63,30,51,51,24,12,12,0,12,12,0,0); // ? + + do Output.create(65,0,0,0,0,0,0,0,0,0,0,0); // A ** TO BE FILLED ** + do Output.create(66,31,51,51,51,31,51,51,51,31,0,0); // B + do Output.create(67,28,54,35,3,3,3,35,54,28,0,0); // C + do Output.create(68,15,27,51,51,51,51,51,27,15,0,0); // D + do Output.create(69,63,51,35,11,15,11,35,51,63,0,0); // E + do Output.create(70,63,51,35,11,15,11,3,3,3,0,0); // F + do Output.create(71,28,54,35,3,59,51,51,54,44,0,0); // G + do Output.create(72,51,51,51,51,63,51,51,51,51,0,0); // H + do Output.create(73,30,12,12,12,12,12,12,12,30,0,0); // I + do Output.create(74,60,24,24,24,24,24,27,27,14,0,0); // J + do Output.create(75,51,51,51,27,15,27,51,51,51,0,0); // K + do Output.create(76,3,3,3,3,3,3,35,51,63,0,0); // L + do Output.create(77,33,51,63,63,51,51,51,51,51,0,0); // M + do Output.create(78,51,51,55,55,63,59,59,51,51,0,0); // N + do Output.create(79,30,51,51,51,51,51,51,51,30,0,0); // O + do Output.create(80,31,51,51,51,31,3,3,3,3,0,0); // P + do Output.create(81,30,51,51,51,51,51,63,59,30,48,0);// Q + do Output.create(82,31,51,51,51,31,27,51,51,51,0,0); // R + do Output.create(83,30,51,51,6,28,48,51,51,30,0,0); // S + do Output.create(84,63,63,45,12,12,12,12,12,30,0,0); // T + do Output.create(85,51,51,51,51,51,51,51,51,30,0,0); // U + do Output.create(86,51,51,51,51,51,30,30,12,12,0,0); // V + do Output.create(87,51,51,51,51,51,63,63,63,18,0,0); // W + do Output.create(88,51,51,30,30,12,30,30,51,51,0,0); // X + do Output.create(89,51,51,51,51,30,12,12,12,30,0,0); // Y + do Output.create(90,63,51,49,24,12,6,35,51,63,0,0); // Z + + do Output.create(91,30,6,6,6,6,6,6,6,30,0,0); // [ + do Output.create(92,0,0,1,3,6,12,24,48,32,0,0); // \ + do Output.create(93,30,24,24,24,24,24,24,24,30,0,0); // ] + do Output.create(94,8,28,54,0,0,0,0,0,0,0,0); // ^ + do Output.create(95,0,0,0,0,0,0,0,0,0,63,0); // _ + do Output.create(96,6,12,24,0,0,0,0,0,0,0,0); // ` + + do Output.create(97,0,0,0,14,24,30,27,27,54,0,0); // a + do Output.create(98,3,3,3,15,27,51,51,51,30,0,0); // b + do Output.create(99,0,0,0,30,51,3,3,51,30,0,0); // c + do Output.create(100,48,48,48,60,54,51,51,51,30,0,0); // d + do Output.create(101,0,0,0,30,51,63,3,51,30,0,0); // e + do Output.create(102,28,54,38,6,15,6,6,6,15,0,0); // f + do Output.create(103,0,0,30,51,51,51,62,48,51,30,0); // g + do Output.create(104,3,3,3,27,55,51,51,51,51,0,0); // h + do Output.create(105,12,12,0,14,12,12,12,12,30,0,0); // i + do Output.create(106,48,48,0,56,48,48,48,48,51,30,0); // j + do Output.create(107,3,3,3,51,27,15,15,27,51,0,0); // k + do Output.create(108,14,12,12,12,12,12,12,12,30,0,0); // l + do Output.create(109,0,0,0,29,63,43,43,43,43,0,0); // m + do Output.create(110,0,0,0,29,51,51,51,51,51,0,0); // n + do Output.create(111,0,0,0,30,51,51,51,51,30,0,0); // o + do Output.create(112,0,0,0,30,51,51,51,31,3,3,0); // p + do Output.create(113,0,0,0,30,51,51,51,62,48,48,0); // q + do Output.create(114,0,0,0,29,55,51,3,3,7,0,0); // r + do Output.create(115,0,0,0,30,51,6,24,51,30,0,0); // s + do Output.create(116,4,6,6,15,6,6,6,54,28,0,0); // t + do Output.create(117,0,0,0,27,27,27,27,27,54,0,0); // u + do Output.create(118,0,0,0,51,51,51,51,30,12,0,0); // v + do Output.create(119,0,0,0,51,51,51,63,63,18,0,0); // w + do Output.create(120,0,0,0,51,30,12,12,30,51,0,0); // x + do Output.create(121,0,0,0,51,51,51,62,48,24,15,0); // y + do Output.create(122,0,0,0,63,27,12,6,51,63,0,0); // z + + do Output.create(123,56,12,12,12,7,12,12,12,56,0,0); // { + do Output.create(124,12,12,12,12,12,12,12,12,12,0,0); // | + do Output.create(125,7,12,12,12,56,12,12,12,7,0,0); // } + do Output.create(126,38,45,25,0,0,0,0,0,0,0,0); // ~ + + return; + } + + // Creates the character map array of the given character index, using the given values. + function void create(int index, int a, int b, int c, int d, int e, + int f, int g, int h, int i, int j, int k) { + var Array map; + + let map = Array.new(11); + let charMaps[index] = map; + + let map[0] = a; + let map[1] = b; + let map[2] = c; + let map[3] = d; + let map[4] = e; + let map[5] = f; + let map[6] = g; + let map[7] = h; + let map[8] = i; + let map[9] = j; + let map[10] = k; + + return; + } + + // Returns the character map (array of size 11) of the given character. + // If the given character is invalid or non-printable, returns the + // character map of a black square. + function Array getMap(char c) { + if ((c < 32) | (c > 126)) { + let c = 0; + } + return charMaps[c]; + } + + /** Moves the cursor to the j-th column of the i-th row, + * and erases the character displayed there. */ + function void moveCursor(int i, int j) { + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + } + + /** Moves the cursor one column back. */ + function void backSpace() { + } +} diff --git a/nand2tetris-suite/projects/12/OutputTest/Main.jack b/nand2tetris-suite/projects/12/OutputTest/Main.jack new file mode 100644 index 0000000..f243068 --- /dev/null +++ b/nand2tetris-suite/projects/12/OutputTest/Main.jack @@ -0,0 +1,42 @@ +// 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/12/OutputTest/Main.jack + +/** Test program for the OS Output class. */ +class Main { + + /** Outputs the entire character set to the screen using all the + * methods of the Output class. */ + function void main() { + var String s; + + let s = String.new(1); + do s.appendChar(String.doubleQuote()); + + do Output.moveCursor(0, 63); + do Output.printChar(66); + do Output.moveCursor(22, 0); + do Output.printChar(67); + do Output.moveCursor(22, 63); + do Output.printChar(68); + do Output.printChar(65); + + do Output.moveCursor(2, 0); + do Output.printString("0123456789"); + do Output.println(); + + do Output.printString("ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz"); + do Output.println(); + + do Output.printString("!#$%&'()*+,-./:;<=>?@[\]^_`{|}~"); + do Output.printString(s); + do Output.println(); + + do Output.printInt(-12345); + do Output.backSpace(); + do Output.printInt(6789); + + return; + } +} diff --git a/nand2tetris-suite/projects/12/OutputTest/OutputTestOutput.gif b/nand2tetris-suite/projects/12/OutputTest/OutputTestOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8ec2c087f7817b026f37825cdd9870ebef4ee45 GIT binary patch literal 6184 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 M5UY8lAPF$~4}^9c-v9sr literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/projects/12/String.jack b/nand2tetris-suite/projects/12/String.jack new file mode 100644 index 0000000..228d71c --- /dev/null +++ b/nand2tetris-suite/projects/12/String.jack @@ -0,0 +1,64 @@ +// 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/12/String.jack + +/** + * Represents character strings. In addition for constructing and disposing + * strings, the class features methods for getting and setting individual + * characters of the string, for erasing the string's last character, + * for appending a character to the string's end, and more typical + * string-oriented operations. + */ +class String { + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + } + + /** Disposes this string. */ + method void dispose() { + } + + /** Returns the current length of this string. */ + method int length() { + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + } + + /** Returns the new line character. */ + function char newLine() { + } + + /** Returns the backspace character. */ + function char backSpace() { + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + } +} diff --git a/nand2tetris-suite/projects/12/StringTest/Main.jack b/nand2tetris-suite/projects/12/StringTest/Main.jack new file mode 100644 index 0000000..2848548 --- /dev/null +++ b/nand2tetris-suite/projects/12/StringTest/Main.jack @@ -0,0 +1,83 @@ +// 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/12/StringTest/Main.jack + +/** Test program for the OS String class. */ +class Main { + + /** Performs various string manipulations and displays their results. */ + function void main() { + var String s; + var String i; + + let s = String.new(0); // a zero-capacity string should be supported + do s.dispose(); + + let s = String.new(6); // capacity 6, make sure that length 5 is displayed + let s = s.appendChar(97); + let s = s.appendChar(98); + let s = s.appendChar(99); + let s = s.appendChar(100); + let s = s.appendChar(101); + do Output.printString("new,appendChar: "); + do Output.printString(s); // new, appendChar: abcde + do Output.println(); + + let i = String.new(6); + do i.setInt(12345); + do Output.printString("setInt: "); + do Output.printString(i); // setInt: 12345 + do Output.println(); + + do i.setInt(-32767); + do Output.printString("setInt: "); + do Output.printString(i); // setInt: -32767 + do Output.println(); + + do Output.printString("length: "); + do Output.printInt(s.length()); // length: 5 + do Output.println(); + + do Output.printString("charAt[2]: "); + do Output.printInt(s.charAt(2)); // charAt[2]: 99 + do Output.println(); + + do s.setCharAt(2, 45); + do Output.printString("setCharAt(2,'-'): "); + do Output.printString(s); // setCharAt(2,'-'): ab-de + do Output.println(); + + do s.eraseLastChar(); + do Output.printString("eraseLastChar: "); + do Output.printString(s); // eraseLastChar: ab-d + do Output.println(); + + let s = "456"; + do Output.printString("intValue: "); + do Output.printInt(s.intValue()); // intValue: 456 + do Output.println(); + + let s = "-32123"; + do Output.printString("intValue: "); + do Output.printInt(s.intValue()); // intValue: -32123 + do Output.println(); + + do Output.printString("backSpace: "); + do Output.printInt(String.backSpace()); // backSpace: 129 + do Output.println(); + + do Output.printString("doubleQuote: "); + do Output.printInt(String.doubleQuote());// doubleQuote: 34 + do Output.println(); + + do Output.printString("newLine: "); + do Output.printInt(String.newLine()); // newLine: 128 + do Output.println(); + + do i.dispose(); + do s.dispose(); + + return; + } +} diff --git a/nand2tetris-suite/projects/12/StringTest/StringTestOutput.gif b/nand2tetris-suite/projects/12/StringTest/StringTestOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c2932c07fc2fd63f3e73b9cb6ece86b71ccd4b3 GIT binary patch literal 8126 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≻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 YHZvr3!QZP7Z3t&zmuh42C}9160Cv8dQ~&?~ literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/projects/12/Sys.jack b/nand2tetris-suite/projects/12/Sys.jack new file mode 100644 index 0000000..bee6f67 --- /dev/null +++ b/nand2tetris-suite/projects/12/Sys.jack @@ -0,0 +1,27 @@ +// 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/12/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + } + + /** Halts the program execution. */ + function void halt() { + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + } +} diff --git a/nand2tetris-suite/projects/12/SysTest/Main.jack b/nand2tetris-suite/projects/12/SysTest/Main.jack new file mode 100644 index 0000000..a153b25 --- /dev/null +++ b/nand2tetris-suite/projects/12/SysTest/Main.jack @@ -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/12/SysTest/Main.jack + +/** Test program for the OS Sys class. */ +class Main { + + /** Tests the wait method of the Sys class. */ + function void main() { + var char key; + + do Output.printString("Wait test:"); + do Output.println(); + do Output.printString("Press any key. After 2 seconds, another message will be printed:"); + + while (key = 0) { + let key = Keyboard.keyPressed(); + } + while (~(key = 0)) { + let key = Keyboard.keyPressed(); + } + + do Sys.wait(2000); + + do Output.println(); + do Output.printString("Time is up. Make sure that 2 seconds elapsed."); + + return; + } +} diff --git a/nand2tetris-suite/projects/13/more fun to go.txt b/nand2tetris-suite/projects/13/more fun to go.txt new file mode 100644 index 0000000..a7f066e --- /dev/null +++ b/nand2tetris-suite/projects/13/more fun to go.txt @@ -0,0 +1,9 @@ +See Chapter 13. It's your call! + +And, if you develop something cool, please let us know about it. + +We hope that you enjoyed the course! + +-- Noam and Shimon + +www.nand2tetris.org \ No newline at end of file diff --git a/nand2tetris-suite/projects/demo/Xor.cmp b/nand2tetris-suite/projects/demo/Xor.cmp new file mode 100644 index 0000000..a1e07b2 --- /dev/null +++ b/nand2tetris-suite/projects/demo/Xor.cmp @@ -0,0 +1,5 @@ +| a | b | out | +| 0 | 0 | 0 | +| 0 | 1 | 1 | +| 1 | 0 | 1 | +| 1 | 1 | 0 | diff --git a/nand2tetris-suite/projects/demo/Xor.hdl b/nand2tetris-suite/projects/demo/Xor.hdl new file mode 100644 index 0000000..db49351 --- /dev/null +++ b/nand2tetris-suite/projects/demo/Xor.hdl @@ -0,0 +1,25 @@ +// 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/demo/Xor.hdl + +/** + * Exclusive-or gate: true if either a is true and b is false, or + * a is false and b is true; false otherwise. + * QUESTION: how can the simulator execute this program properly without + * HDL implementations of the underlying Not, And, and Or chip-parts? + * Answer: since the demo folder contains no Not.hdl, And.hdl and Or.hdl + * files, the simulator reverts to using their built-in implementations. + */ + +CHIP Xor { + IN a, b; + OUT out; + + PARTS: + Not (in=a, out=nota); + Not (in=b, out=notb); + And (a=a, b=notb, out=x); + And (a=nota, b=b, out=y); + Or (a=x, b=y, out=out); +} \ No newline at end of file diff --git a/nand2tetris-suite/projects/demo/Xor.out b/nand2tetris-suite/projects/demo/Xor.out new file mode 100644 index 0000000..e69de29 diff --git a/nand2tetris-suite/projects/demo/Xor.tst b/nand2tetris-suite/projects/demo/Xor.tst new file mode 100644 index 0000000..658cbe5 --- /dev/null +++ b/nand2tetris-suite/projects/demo/Xor.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/01/Xor.tst + +load Xor.hdl, +output-file Xor.out, +compare-to Xor.cmp, +output-list a%B3.1.3 b%B3.1.3 out%B3.1.3; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output; diff --git a/nand2tetris-suite/tools/Assembler.bat b/nand2tetris-suite/tools/Assembler.bat new file mode 100644 index 0000000..93260ec --- /dev/null +++ b/nand2tetris-suite/tools/Assembler.bat @@ -0,0 +1,27 @@ +@echo off + +rem $Id: Assembler.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo Assembler Starts the assembler in interactive mode. + echo Assembler FILE[.asm] Assembles FILE.asm to FILE.hack. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Compilers.jar;bin/lib/AssemblerGUI.jar;bin/lib/TranslatorsGUI.jar" ^ + HackAssemblerMain +) else ( + echo Assembling "%_arg1%" + java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Compilers.jar;bin/lib/AssemblerGUI.jar;bin/lib/TranslatorsGUI.jar" ^ + HackAssemblerMain "%_arg1%" +) +popd diff --git a/nand2tetris-suite/tools/Assembler.sh b/nand2tetris-suite/tools/Assembler.sh new file mode 100644 index 0000000..70db569 --- /dev/null +++ b/nand2tetris-suite/tools/Assembler.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env sh + +# $Id: Assembler.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the assembler in interactive mode." + echo " `basename "$0"` FILE[.asm] Assembles FILE.asm to FILE.hack." +elif [ $# -eq 0 ] +then + # Run assembler in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Compilers.jar:bin/lib/AssemblerGUI.jar:bin/lib/TranslatorsGUI.jar" HackAssemblerMain & +else + # Convert arg1 to an absolute path and run assembler with arg1. + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi + echo Assembling "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Compilers.jar:bin/lib/AssemblerGUI.jar:bin/lib/TranslatorsGUI.jar" HackAssemblerMain "$arg1" +fi + diff --git a/nand2tetris-suite/tools/CPUEmulator.bat b/nand2tetris-suite/tools/CPUEmulator.bat new file mode 100644 index 0000000..f92cf40 --- /dev/null +++ b/nand2tetris-suite/tools/CPUEmulator.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: CPUEmulator.bat,v 1.3 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo CPUEmulator Starts the CPU Emulator in interactive mode. + echo CPUEmulator FILE.tst Starts the CPU Emulator and runs the FILE.tst + echo test script. The success/failure message + echo is printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + CPUEmulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + CPUEmulatorMain "%_arg1%" +) +popd diff --git a/nand2tetris-suite/tools/CPUEmulator.sh b/nand2tetris-suite/tools/CPUEmulator.sh new file mode 100644 index 0000000..033d9d7 --- /dev/null +++ b/nand2tetris-suite/tools/CPUEmulator.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env sh + +# $Id: CPUEmulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the CPU Emulator in interactive mode." + echo " `basename "$0"` FILE.tst Starts the CPU Emulator and runs the File.tst" + echo " test script. The success/failure message" + echo " is printed to the command console." +elif [ $# -eq 0 ] +then + # Run CPU emulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" CPUEmulatorMain & +else + # Convert arg1 to an absolute path and run CPU emulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" CPUEmulatorMain "$arg1" +fi diff --git a/nand2tetris-suite/tools/HardwareSimulator.bat b/nand2tetris-suite/tools/HardwareSimulator.bat new file mode 100644 index 0000000..76baa31 --- /dev/null +++ b/nand2tetris-suite/tools/HardwareSimulator.bat @@ -0,0 +1,30 @@ +@echo off + +rem $Id: HardwareSimulator.bat,v 1.3 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo HardwareSimulator Starts the Hardware Simulator in + echo interactive mode. + echo HardwareSimulator FILE.tst Starts the Hardware Simulator and runs the + echo FILE.tst test script. The success/failure + echo message is printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + HardwareSimulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + HardwareSimulatorMain "%_arg1%" +) +popd diff --git a/nand2tetris-suite/tools/HardwareSimulator.sh b/nand2tetris-suite/tools/HardwareSimulator.sh new file mode 100755 index 0000000..47e7482 --- /dev/null +++ b/nand2tetris-suite/tools/HardwareSimulator.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env sh + +# $Id: HardwareSimulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the Hardware Simulator in" + echo " interactive mode." + echo " `basename "$0"` FILE.tst Starts the Hardware Simulator and runs the" + echo " FILE.tst test script. The success/failure" + echo " message is printed to the command console." +elif [ $# -eq 0 ] +then + # Run hardware simulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:BuiltIn:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" HardwareSimulatorMain & +else + # Convert arg1 to an absolute path and run hardware simulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:BuiltIn:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" HardwareSimulatorMain "$arg1" +fi diff --git a/nand2tetris-suite/tools/JackCompiler.bat b/nand2tetris-suite/tools/JackCompiler.bat new file mode 100644 index 0000000..9399b94 --- /dev/null +++ b/nand2tetris-suite/tools/JackCompiler.bat @@ -0,0 +1,26 @@ +@echo off + +rem $Id: JackCompiler.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo JackCompiler Compiles all .jack files in the current + echo working directory. + echo JackCompiler DIRECTORY Compiles all .jack files in DIRECTORY. + echo JackCompiler FILE.jack Compiles FILE.jack to FILE.vm. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) else ( + set "_arg1=%CD%" +) +pushd "%~dp0" +echo Compiling "%_arg1%" +java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/Compilers.jar" ^ + Hack.Compiler.JackCompiler "%_arg1%" +popd diff --git a/nand2tetris-suite/tools/JackCompiler.sh b/nand2tetris-suite/tools/JackCompiler.sh new file mode 100644 index 0000000..699dfb8 --- /dev/null +++ b/nand2tetris-suite/tools/JackCompiler.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env sh + +# $Id: JackCompiler.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Compiles all .jack files in the current" + echo " working directory." + echo " `basename "$0"` DIRECTORY Compiles all .jack files in DIRECTORY." + echo " `basename "$0"` FILE.jack Compiles FILE.jack to FILE.vm." +else + if [ $# -eq 0 ] + then + # Use current directory as arg1 + arg1="$dir" + else + # Convert arg1 to an absolute path + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="$dir/$1" + fi + fi + echo Compiling "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/Compilers.jar" Hack.Compiler.JackCompiler "$arg1" +fi diff --git a/nand2tetris-suite/tools/OS/Array.vm b/nand2tetris-suite/tools/OS/Array.vm new file mode 100644 index 0000000..aa4c9e8 --- /dev/null +++ b/nand2tetris-suite/tools/OS/Array.vm @@ -0,0 +1,23 @@ +function Array.new 0 +push argument 0 +push constant 0 +gt +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 2 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +call Memory.alloc 1 +return +function Array.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return diff --git a/nand2tetris-suite/tools/OS/Keyboard.vm b/nand2tetris-suite/tools/OS/Keyboard.vm new file mode 100644 index 0000000..a806c4e --- /dev/null +++ b/nand2tetris-suite/tools/OS/Keyboard.vm @@ -0,0 +1,102 @@ +function Keyboard.init 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 24576 +call Memory.peek 1 +return +function Keyboard.readChar 2 +push constant 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +push local 0 +push constant 0 +gt +or +not +if-goto WHILE_END0 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +pop local 1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +call String.backSpace 0 +call Output.printChar 1 +pop temp 0 +push local 1 +call Output.printChar 1 +pop temp 0 +push local 1 +return +function Keyboard.readLine 5 +push constant 80 +call String.new 1 +pop local 3 +push argument 0 +call Output.printString 1 +pop temp 0 +call String.newLine 0 +pop local 1 +call String.backSpace 0 +pop local 2 +label WHILE_EXP0 +push local 4 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 0 +push local 0 +push local 1 +eq +pop local 4 +push local 4 +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 3 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 3 +push local 0 +call String.appendChar 2 +pop local 3 +label IF_END1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Keyboard.readInt 2 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +pop local 1 +push local 0 +call String.dispose 1 +pop temp 0 +push local 1 +return diff --git a/nand2tetris-suite/tools/OS/Math.vm b/nand2tetris-suite/tools/OS/Math.vm new file mode 100644 index 0000000..b660688 --- /dev/null +++ b/nand2tetris-suite/tools/OS/Math.vm @@ -0,0 +1,408 @@ +function Math.init 1 +push constant 16 +call Array.new 1 +pop static 1 +push constant 16 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Math.abs 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +neg +pop argument 0 +label IF_FALSE0 +push argument 0 +return +function Math.multiply 5 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 4 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop local 1 +push argument 1 +pop argument 0 +push local 1 +pop argument 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 2 +push constant 1 +sub +push argument 1 +push constant 1 +sub +lt +not +if-goto WHILE_END0 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +push argument 1 +and +push constant 0 +eq +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push argument 0 +add +pop local 0 +push local 2 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 2 +label IF_FALSE1 +push argument 0 +push argument 0 +add +pop argument 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +neg +pop local 0 +label IF_FALSE2 +push local 0 +return +function Math.divide 4 +push argument 1 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 3 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 2 +push constant 0 +push static 1 +add +push argument 1 +call Math.abs 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push argument 0 +call Math.abs 1 +pop argument 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +push local 3 +not +and +not +if-goto WHILE_END0 +push constant 32767 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +sub +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +lt +pop local 3 +push local 3 +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push constant 1 +add +push static 1 +add +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +pop local 3 +push local 3 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +label IF_FALSE1 +goto WHILE_EXP0 +label WHILE_END0 +label WHILE_EXP1 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END1 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +not +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push argument 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +sub +pop argument 0 +label IF_FALSE3 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 1 +neg +pop local 1 +label IF_FALSE4 +push local 1 +return +function Math.sqrt 4 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 4 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 7 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 3 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push local 1 +push local 1 +call Math.multiply 2 +pop local 2 +push local 2 +push argument 0 +gt +not +push local 2 +push constant 0 +lt +not +and +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +pop local 3 +label IF_FALSE1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Math.max 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return +function Math.min 0 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return diff --git a/nand2tetris-suite/tools/OS/Memory.vm b/nand2tetris-suite/tools/OS/Memory.vm new file mode 100644 index 0000000..8c74b87 --- /dev/null +++ b/nand2tetris-suite/tools/OS/Memory.vm @@ -0,0 +1,376 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +push static 0 +add +push constant 14334 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2049 +push static 0 +add +push constant 2050 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.peek 0 +push argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Memory.poke 0 +push argument 0 +push static 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.alloc 2 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 5 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +pop argument 0 +label IF_FALSE1 +push constant 2048 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 16383 +lt +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +lt +and +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +push local 1 +push constant 16382 +gt +or +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +or +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +pop local 0 +goto IF_END2 +label IF_FALSE2 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END3 +label IF_FALSE3 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END3 +label IF_END2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +push argument 0 +add +push constant 16379 +gt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 6 +call Sys.error 1 +pop temp 0 +label IF_FALSE4 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 2 +add +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push argument 0 +push constant 2 +add +push local 0 +add +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 2 +add +eq +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push argument 0 +push constant 3 +add +push local 0 +add +push local 0 +push argument 0 +add +push constant 4 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END6 +label IF_FALSE6 +push argument 0 +push constant 3 +add +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END6 +push constant 1 +push local 0 +add +push local 0 +push argument 0 +add +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_FALSE5 +push constant 0 +push local 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 2 +add +return +function Memory.deAlloc 2 +push argument 0 +push constant 2 +sub +pop local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END1 +label IF_FALSE1 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END1 +label IF_END0 +push constant 0 +return diff --git a/nand2tetris-suite/tools/OS/Output.vm b/nand2tetris-suite/tools/OS/Output.vm new file mode 100644 index 0000000..b8addd7 --- /dev/null +++ b/nand2tetris-suite/tools/OS/Output.vm @@ -0,0 +1,1852 @@ +function Output.init 0 +push constant 16384 +pop static 4 +push constant 0 +not +pop static 2 +push constant 32 +pop static 1 +push constant 0 +pop static 0 +push constant 6 +call String.new 1 +pop static 3 +call Output.initMap 0 +pop temp 0 +call Output.createShiftedMap 0 +pop temp 0 +push constant 0 +return +function Output.initMap 0 +push constant 127 +call Array.new 1 +pop static 5 +push constant 0 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 32 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 33 +push constant 12 +push constant 30 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 34 +push constant 54 +push constant 54 +push constant 20 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 35 +push constant 0 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 36 +push constant 12 +push constant 30 +push constant 51 +push constant 3 +push constant 30 +push constant 48 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 37 +push constant 0 +push constant 0 +push constant 35 +push constant 51 +push constant 24 +push constant 12 +push constant 6 +push constant 51 +push constant 49 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 38 +push constant 12 +push constant 30 +push constant 30 +push constant 12 +push constant 54 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 39 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 40 +push constant 24 +push constant 12 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 41 +push constant 6 +push constant 12 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 42 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 63 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 43 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 63 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 44 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 45 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 46 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 47 +push constant 0 +push constant 0 +push constant 32 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 1 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 48 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 49 +push constant 12 +push constant 14 +push constant 15 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 50 +push constant 30 +push constant 51 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 51 +push constant 30 +push constant 51 +push constant 48 +push constant 48 +push constant 28 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 52 +push constant 16 +push constant 24 +push constant 28 +push constant 26 +push constant 25 +push constant 63 +push constant 24 +push constant 24 +push constant 60 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 53 +push constant 63 +push constant 3 +push constant 3 +push constant 31 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 54 +push constant 28 +push constant 6 +push constant 3 +push constant 3 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 55 +push constant 63 +push constant 49 +push constant 48 +push constant 48 +push constant 24 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 56 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 57 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 24 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 58 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 59 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 60 +push constant 0 +push constant 0 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 61 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 62 +push constant 0 +push constant 0 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 64 +push constant 30 +push constant 51 +push constant 51 +push constant 59 +push constant 59 +push constant 59 +push constant 27 +push constant 3 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 63 +push constant 30 +push constant 51 +push constant 51 +push constant 24 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 65 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 66 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 67 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 68 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 69 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 70 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 71 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 59 +push constant 51 +push constant 51 +push constant 54 +push constant 44 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 72 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 73 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 74 +push constant 60 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 27 +push constant 27 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 75 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 76 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 77 +push constant 33 +push constant 51 +push constant 63 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 78 +push constant 51 +push constant 51 +push constant 55 +push constant 55 +push constant 63 +push constant 59 +push constant 59 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 79 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 80 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 81 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 59 +push constant 30 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 82 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 83 +push constant 30 +push constant 51 +push constant 51 +push constant 6 +push constant 28 +push constant 48 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 84 +push constant 63 +push constant 63 +push constant 45 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 85 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 86 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 87 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 88 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 30 +push constant 30 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 89 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 90 +push constant 63 +push constant 51 +push constant 49 +push constant 24 +push constant 12 +push constant 6 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 91 +push constant 30 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 92 +push constant 0 +push constant 0 +push constant 1 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 48 +push constant 32 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 93 +push constant 30 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 94 +push constant 8 +push constant 28 +push constant 54 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 95 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 96 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 97 +push constant 0 +push constant 0 +push constant 0 +push constant 14 +push constant 24 +push constant 30 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 98 +push constant 3 +push constant 3 +push constant 3 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 99 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 3 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 100 +push constant 48 +push constant 48 +push constant 48 +push constant 60 +push constant 54 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 101 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 63 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 102 +push constant 28 +push constant 54 +push constant 38 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 103 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 104 +push constant 3 +push constant 3 +push constant 3 +push constant 27 +push constant 55 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 105 +push constant 12 +push constant 12 +push constant 0 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 106 +push constant 48 +push constant 48 +push constant 0 +push constant 56 +push constant 48 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 107 +push constant 3 +push constant 3 +push constant 3 +push constant 51 +push constant 27 +push constant 15 +push constant 15 +push constant 27 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 108 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 109 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 63 +push constant 43 +push constant 43 +push constant 43 +push constant 43 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 110 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 111 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 112 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 113 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 114 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 55 +push constant 51 +push constant 3 +push constant 3 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 115 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 6 +push constant 24 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 116 +push constant 4 +push constant 6 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 117 +push constant 0 +push constant 0 +push constant 0 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 118 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 119 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 120 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 121 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 24 +push constant 15 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 122 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 27 +push constant 12 +push constant 6 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 123 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 124 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 125 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 126 +push constant 38 +push constant 45 +push constant 25 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 0 +return +function Output.create 1 +push constant 11 +call Array.new 1 +pop local 0 +push argument 0 +push static 5 +add +push local 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +push local 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push argument 3 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push argument 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push argument 5 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push argument 6 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push argument 7 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push argument 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push argument 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push local 0 +add +push argument 10 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push local 0 +add +push argument 11 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Output.createShiftedMap 4 +push constant 127 +call Array.new 1 +pop static 6 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 127 +lt +not +if-goto WHILE_END0 +push local 2 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +push constant 11 +call Array.new 1 +pop local 1 +push local 2 +push static 6 +add +push local 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +pop local 3 +label WHILE_EXP1 +push local 3 +push constant 11 +lt +not +if-goto WHILE_END1 +push local 3 +push local 1 +add +push local 3 +push local 0 +add +pop pointer 1 +push that 0 +push constant 256 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop local 2 +goto IF_END0 +label IF_FALSE0 +push local 2 +push constant 1 +add +pop local 2 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.getMap 1 +push argument 0 +push constant 32 +lt +push argument 0 +push constant 126 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop argument 0 +label IF_FALSE0 +push static 2 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +push static 6 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END1 +push local 0 +return +function Output.drawChar 4 +push argument 0 +call Output.getMap 1 +pop local 2 +push static 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 256 +neg +and +pop local 3 +goto IF_END0 +label IF_FALSE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 255 +and +pop local 3 +label IF_END0 +push local 0 +push static 4 +add +push local 1 +push local 2 +add +pop pointer 1 +push that 0 +push local 3 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 32 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.moveCursor 0 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 22 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 63 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 20 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push constant 2 +call Math.divide 2 +pop static 0 +push constant 32 +push argument 0 +push constant 352 +call Math.multiply 2 +add +push static 0 +add +pop static 1 +push argument 1 +push static 0 +push constant 2 +call Math.multiply 2 +eq +pop static 2 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return +function Output.printChar 0 +push argument 0 +call String.newLine 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Output.println 0 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +call String.backSpace 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +call Output.backSpace 0 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +call Output.drawChar 1 +pop temp 0 +push static 2 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push static 0 +push constant 1 +add +pop static 0 +push static 1 +push constant 1 +add +pop static 1 +label IF_FALSE2 +push static 0 +push constant 32 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +call Output.println 0 +pop temp 0 +goto IF_END3 +label IF_FALSE3 +push static 2 +not +pop static 2 +label IF_END3 +label IF_END1 +label IF_END0 +push constant 0 +return +function Output.printString 2 +push argument 0 +call String.length 1 +pop local 1 +label WHILE_EXP0 +push local 0 +push local 1 +lt +not +if-goto WHILE_END0 +push argument 0 +push local 0 +call String.charAt 2 +call Output.printChar 1 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.printInt 0 +push static 3 +push argument 0 +call String.setInt 2 +pop temp 0 +push static 3 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 1 +push constant 352 +add +push static 0 +sub +pop static 1 +push constant 0 +pop static 0 +push constant 0 +not +pop static 2 +push static 1 +push constant 8128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop static 1 +label IF_FALSE0 +push constant 0 +return +function Output.backSpace 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push static 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push static 0 +push constant 1 +sub +pop static 0 +push static 1 +push constant 1 +sub +pop static 1 +goto IF_END1 +label IF_FALSE1 +push constant 31 +pop static 0 +push static 1 +push constant 32 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 8128 +pop static 1 +label IF_FALSE2 +push static 1 +push constant 321 +sub +pop static 1 +label IF_END1 +push constant 0 +pop static 2 +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +pop static 2 +label IF_END0 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return diff --git a/nand2tetris-suite/tools/OS/Screen.vm b/nand2tetris-suite/tools/OS/Screen.vm new file mode 100644 index 0000000..fccafb5 --- /dev/null +++ b/nand2tetris-suite/tools/OS/Screen.vm @@ -0,0 +1,806 @@ +function Screen.init 1 +push constant 16384 +pop static 1 +push constant 0 +not +pop static 2 +push constant 17 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.clearScreen 1 +label WHILE_EXP0 +push local 0 +push constant 8192 +lt +not +if-goto WHILE_END0 +push local 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.updateLocation 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +not +and +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END0 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 2 +push constant 0 +return +function Screen.drawPixel 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 7 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 0 +push argument 0 +push local 0 +push constant 16 +call Math.multiply 2 +sub +pop local 1 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 0 +add +pop local 2 +push local 2 +push local 1 +push static 0 +add +pop pointer 1 +push that 0 +call Screen.updateLocation 2 +pop temp 0 +push constant 0 +return +function Screen.drawConditional 0 +push argument 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +push argument 0 +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push constant 0 +return +function Screen.drawLine 11 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 2 +push argument 0 +sub +call Math.abs 1 +pop local 3 +push argument 3 +push argument 1 +sub +call Math.abs 1 +pop local 2 +push local 3 +push local 2 +lt +pop local 6 +push local 6 +push argument 3 +push argument 1 +lt +and +push local 6 +not +push argument 2 +push argument 0 +lt +and +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +pop local 4 +push argument 2 +pop argument 0 +push local 4 +pop argument 2 +push argument 1 +pop local 4 +push argument 3 +pop argument 1 +push local 4 +pop argument 3 +label IF_FALSE1 +push local 6 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 3 +pop local 4 +push local 2 +pop local 3 +push local 4 +pop local 2 +push argument 1 +pop local 1 +push argument 0 +pop local 0 +push argument 3 +pop local 8 +push argument 0 +push argument 2 +gt +pop local 7 +goto IF_END2 +label IF_FALSE2 +push argument 0 +pop local 1 +push argument 1 +pop local 0 +push argument 2 +pop local 8 +push argument 1 +push argument 3 +gt +pop local 7 +label IF_END2 +push constant 2 +push local 2 +call Math.multiply 2 +push local 3 +sub +pop local 5 +push constant 2 +push local 2 +call Math.multiply 2 +pop local 9 +push constant 2 +push local 2 +push local 3 +sub +call Math.multiply 2 +pop local 10 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 8 +lt +not +if-goto WHILE_END0 +push local 5 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 5 +push local 9 +add +pop local 5 +goto IF_END3 +label IF_FALSE3 +push local 5 +push local 10 +add +pop local 5 +push local 7 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END4 +label IF_FALSE4 +push local 0 +push constant 1 +add +pop local 0 +label IF_END4 +label IF_END3 +push local 1 +push constant 1 +add +pop local 1 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawRectangle 9 +push argument 0 +push argument 2 +gt +push argument 1 +push argument 3 +gt +or +push argument 0 +push constant 0 +lt +or +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 9 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push argument 0 +push local 3 +push constant 16 +call Math.multiply 2 +sub +pop local 7 +push argument 2 +push constant 16 +call Math.divide 2 +pop local 4 +push argument 2 +push local 4 +push constant 16 +call Math.multiply 2 +sub +pop local 8 +push local 7 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 6 +push local 8 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 5 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 3 +add +pop local 0 +push local 4 +push local 3 +sub +pop local 2 +label WHILE_EXP0 +push argument 1 +push argument 3 +gt +not +not +if-goto WHILE_END0 +push local 0 +push local 2 +add +pop local 1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 5 +push local 6 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 6 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP1 +push local 0 +push local 1 +lt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +push argument 1 +push constant 1 +add +pop argument 1 +push local 1 +push constant 32 +add +push local 2 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawHorizontal 11 +push argument 1 +push argument 2 +call Math.min 2 +pop local 7 +push argument 1 +push argument 2 +call Math.max 2 +pop local 8 +push argument 0 +push constant 1 +neg +gt +push argument 0 +push constant 256 +lt +and +push local 7 +push constant 512 +lt +and +push local 8 +push constant 1 +neg +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 7 +push constant 0 +call Math.max 2 +pop local 7 +push local 8 +push constant 511 +call Math.min 2 +pop local 8 +push local 7 +push constant 16 +call Math.divide 2 +pop local 1 +push local 7 +push local 1 +push constant 16 +call Math.multiply 2 +sub +pop local 9 +push local 8 +push constant 16 +call Math.divide 2 +pop local 2 +push local 8 +push local 2 +push constant 16 +call Math.multiply 2 +sub +pop local 10 +push local 9 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 5 +push local 10 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 4 +push argument 0 +push constant 32 +call Math.multiply 2 +push local 1 +add +pop local 0 +push local 2 +push local 1 +sub +pop local 6 +push local 0 +push local 6 +add +pop local 3 +push local 6 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 4 +push local 5 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP0 +push local 0 +push local 3 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +push local 4 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +label IF_FALSE0 +push constant 0 +return +function Screen.drawSymetric 0 +push argument 1 +push argument 3 +sub +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 3 +add +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +sub +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +add +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push constant 0 +return +function Screen.drawCircle 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 12 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push argument 2 +sub +push constant 0 +lt +push argument 0 +push argument 2 +add +push constant 511 +gt +or +push argument 1 +push argument 2 +sub +push constant 0 +lt +or +push argument 1 +push argument 2 +add +push constant 255 +gt +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 13 +call Sys.error 1 +pop temp 0 +label IF_FALSE1 +push argument 2 +pop local 1 +push constant 1 +push argument 2 +sub +pop local 2 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 0 +gt +not +if-goto WHILE_END0 +push local 2 +push constant 0 +lt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 2 +push constant 2 +push local 0 +call Math.multiply 2 +add +push constant 3 +add +pop local 2 +goto IF_END2 +label IF_FALSE2 +push local 2 +push constant 2 +push local 0 +push local 1 +sub +call Math.multiply 2 +add +push constant 5 +add +pop local 2 +push local 1 +push constant 1 +sub +pop local 1 +label IF_END2 +push local 0 +push constant 1 +add +pop local 0 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/nand2tetris-suite/tools/OS/String.vm b/nand2tetris-suite/tools/OS/String.vm new file mode 100644 index 0000000..9b7577e --- /dev/null +++ b/nand2tetris-suite/tools/OS/String.vm @@ -0,0 +1,393 @@ +function String.new 0 +push constant 3 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 14 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Array.new 1 +pop this 1 +label IF_FALSE1 +push argument 0 +pop this 0 +push constant 0 +pop this 2 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 1 +call Array.dispose 1 +pop temp 0 +label IF_FALSE0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function String.length 0 +push argument 0 +pop pointer 0 +push this 2 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 15 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 16 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function String.appendChar 0 +push argument 0 +pop pointer 0 +push this 2 +push this 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 17 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push this 1 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 18 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push constant 1 +sub +pop this 2 +push constant 0 +return +function String.intValue 5 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push constant 0 +not +pop local 3 +push constant 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 4 +push constant 1 +pop local 0 +label IF_FALSE1 +label WHILE_EXP0 +push local 0 +push this 2 +lt +push local 3 +and +not +if-goto WHILE_END0 +push local 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 2 +push constant 0 +lt +push local 2 +push constant 9 +gt +or +not +pop local 3 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 1 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +neg +pop local 1 +label IF_FALSE3 +push local 1 +return +function String.setInt 4 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 6 +call Array.new 1 +pop local 2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 3 +push argument 1 +neg +pop argument 1 +label IF_FALSE1 +push argument 1 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 0 +gt +not +if-goto WHILE_END0 +push argument 1 +push constant 10 +call Math.divide 2 +pop local 1 +push local 0 +push local 2 +add +push constant 48 +push argument 1 +push local 1 +push constant 10 +call Math.multiply 2 +sub +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +push local 1 +pop argument 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push local 2 +add +push constant 45 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +push this 0 +push local 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE3 +push local 0 +push constant 0 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 0 +push this 1 +add +push constant 48 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +pop this 2 +goto IF_END4 +label IF_FALSE4 +push constant 0 +pop this 2 +label WHILE_EXP1 +push this 2 +push local 0 +lt +not +if-goto WHILE_END1 +push this 2 +push this 1 +add +push local 0 +push this 2 +push constant 1 +add +sub +push local 2 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +goto WHILE_EXP1 +label WHILE_END1 +label IF_END4 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 0 +return +function String.newLine 0 +push constant 128 +return +function String.backSpace 0 +push constant 129 +return +function String.doubleQuote 0 +push constant 34 +return diff --git a/nand2tetris-suite/tools/OS/Sys.vm b/nand2tetris-suite/tools/OS/Sys.vm new file mode 100644 index 0000000..c186dad --- /dev/null +++ b/nand2tetris-suite/tools/OS/Sys.vm @@ -0,0 +1,83 @@ +function Sys.init 0 +call Memory.init 0 +pop temp 0 +call Math.init 0 +pop temp 0 +call Screen.init 0 +pop temp 0 +call Output.init 0 +pop temp 0 +call Keyboard.init 0 +pop temp 0 +call Main.main 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return +function Sys.halt 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.wait 1 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 1 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +label WHILE_EXP0 +push argument 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 50 +pop local 0 +label WHILE_EXP1 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push argument 0 +push constant 1 +sub +pop argument 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 69 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push argument 0 +call Output.printInt 1 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return diff --git a/nand2tetris-suite/tools/TextComparer.bat b/nand2tetris-suite/tools/TextComparer.bat new file mode 100644 index 0000000..a036d00 --- /dev/null +++ b/nand2tetris-suite/tools/TextComparer.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: TextComparer.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%3"=="" goto :USAGE +if "%1"=="/?" goto :USAGE +if not "%~1"=="" ( + set "_arg1=%~f1" +) +if not "%~2"=="" ( + set "_arg2=%~f2" +) +pushd "%~dp0" +if NOT "%~1"=="" ( + if NOT "%~2"=="" ( + java -classpath "%CLASSPATH%;bin/classes" TextComparer ^ + "%_arg1%" "%_arg2%" + popd + exit /B + ) +) +:USAGE +echo Usage: +echo TextComparer FILE1 FILE2 Compares FILE1 and FILE2. The success +echo message or the first miscompared line +echo is printed to the command console. +popd diff --git a/nand2tetris-suite/tools/TextComparer.sh b/nand2tetris-suite/tools/TextComparer.sh new file mode 100644 index 0000000..c8b08af --- /dev/null +++ b/nand2tetris-suite/tools/TextComparer.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh + +# $Id: TextComparer.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -ne 2 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + # print usage + echo "Usage:" + echo " `basename "$0"` FILE1 FILE2 Compares FILE1 and FILE2. The success" + echo " message or the first miscompared line" + echo " is printed to the command console." +else + # Convert arg1 to an absolute path + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="$dir/$1" + fi + # Convert arg2 to an absolute path + if [ `echo "$2" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg2="$2" + else + arg2="$dir/$2" + fi +# echo Comparing "$arg1" "$arg2" + java -classpath "${CLASSPATH}:bin/classes" TextComparer "$arg1" "$arg2" +fi diff --git a/nand2tetris-suite/tools/VMEmulator.bat b/nand2tetris-suite/tools/VMEmulator.bat new file mode 100644 index 0000000..1b15b72 --- /dev/null +++ b/nand2tetris-suite/tools/VMEmulator.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: VMEmulator.bat,v 1.3 2014/05/10 00:51:55 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo VMEmulator Starts the VM Emulator in interactive mode. + echo VMEmulator FILE.tst Starts the VM Emulator and runs the FILE.tst test + echo script. The success/failure message is + echo printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + VMEmulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + VMEmulatorMain "%_arg1%" +) +popd diff --git a/nand2tetris-suite/tools/VMEmulator.sh b/nand2tetris-suite/tools/VMEmulator.sh new file mode 100644 index 0000000..48f4f0f --- /dev/null +++ b/nand2tetris-suite/tools/VMEmulator.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env sh + +# $Id: VMEmulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the VM Emulator in interactive mode." + echo " `basename "$0"` FILE.tst Starts the VM Emulator and runs the FILE.tst test" + echo " script. The success/failure message is" + echo " printed to the command console." +elif [ $# -eq 0 ] +then + # Run VM emulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" VMEmulatorMain & +else + # Convert arg1 to an absolute path and run VM emulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" VMEmulatorMain "$arg1" +fi diff --git a/nand2tetris-suite/tools/bin/classes/CPUEmulatorMain.class b/nand2tetris-suite/tools/bin/classes/CPUEmulatorMain.class new file mode 100644 index 0000000000000000000000000000000000000000..2c5b68f26f7b9d44b6989affae2ac01270fbae8e GIT binary patch literal 1084 zcmaJ=TTc@~6#hmETh_{Du~ngB!3%A{T}8Z6VnP~FlA(#}*HS?NhOn>vo4YdS6{JVuh4_H}E~~35Kx`rghkY zeNTkGu`FR*Jq}y`azOhDH3sRh$E@f@s_`hxjC6I?4;z;MOn-lU&?qj2+uTfoDH9eXX z;u(mzh)K(ElCNCuzS}wJRqDXq>55C!I?!#iGpJWfy6TZLKX;W|)^agUrR%~lfiyix z`P~4M4}$*pXg5rjk?k!uz|JI&evD$Q1KUuLAYZk3p7@4=@3^7${6OLq%f<7rFtpyE z=sQKC(nNBrfqt?o*_*3Pq_$?JwOiVNHrT+>$5W)67~X0^BY33PGuy!J%`+m&5Y;%5 G(DxT!i!EgU literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/classes/HackAssemblerMain.class b/nand2tetris-suite/tools/bin/classes/HackAssemblerMain.class new file mode 100644 index 0000000000000000000000000000000000000000..b9123917e497a7915222bd03a2ac91be5fdda503 GIT binary patch literal 1098 zcmah|TTc@~7(LTgwk#`1xvD5dM7FK&D&DxM)C$_9^^yt(i4WT{l!d)C-9_NdKVss8 zNuTk7f+YL^f0Xf?t)Vm!ornE)X3lpzXTD#*e;xzSF)yPZL+!YR>ro8Lh+{;i%?$~o zVc-j7wBe?NF&XW+6~(v=6$uGR2`L$!7>eR{2ktlql+pOuB{!@mq znpk3pWZYFw#x_icpo-7=iAUhu1?Q=UmIDHy<@ga-;9;t|8xqGy!(bX*|g zuZ+@W+Vi+ww0JeXq8XkYcMO|q7u#9rfRi{WvprRx9VUr{#{Cvlxd=WJ(-o)TJsBGb*xRT4<&vQ@c&(NzT&W58T zqLCdvkV9Y0<_(9?RCK4u{ZmR1*Z+DFL_ZNgE&;_0ro~^=t7;qtq&ANx)!cs~&14H_ zD@`n61bsAWVuirOBd70W+I5ptq;Yc0PTn+DX1WN5gCRh!bSjPdB8X~zPbS~G?l}p7g9ilsg sR4jIgo)AQU6uGlHdh<2JPPvOLdz5|<<496jlQau+xQH~?VA7t}A4Y!~qW}N^ literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/classes/HardwareSimulatorMain.class b/nand2tetris-suite/tools/bin/classes/HardwareSimulatorMain.class new file mode 100644 index 0000000000000000000000000000000000000000..5786077f36cc03c74fdac38e8e31074e7b9ac3c2 GIT binary patch literal 1182 zcma)5+fEZv6kP`jGmI5suqcXHyq1D93V5T$gb)ytq9&veLVP$(4=^yd%$!>M6%*e~ zc*X~7Y{CclQO12*q>z%xJj|Z6Z)?pyYybZ9>llEISp$O@?!g_5=(uYji%}i-4BW>9 z4G%RuGN5Bv!(#)6vN;`NI`TTk4Wu!l;fV&zfQexP{jfDW)$oj=d)5tH`G%o0H@3!* znh(o@jL+SGVKBE@+~c3P?eSp8UX`&M>=ee<(zt<}8Ya`2!Zd?jO8AbL$*Rok5|7JO z9*b4iuXtRB@d|ayZYECbMlu_4UwqW?JdGE4$uQ}JzLiu0OO;wlmD*d8$G0u|Du>m? zT5sB781Byn=M*>7*#?wN}s&vkf{)zFq3*v%Ovc3EumiYJ%WEqOpRGAgz!yvW|IHYRE9 zO5Z#0pW6y6vf)>=pJ5nj(3lVZF(iCvzjdTJT$ZP5SRk~vNvVrt=xa^+{nnmvi0~QL z>gPlXpTr~Ln0hqD;)eDIQi>$K2<}tw=1rYZWLJ-CJ2Ct(*FQsgV;k5k{!`yCx-=MSU~v6w&p0^98R ziS9$BigoB4HS~}*$X;2gBfT*(ZeBHe&1*IEy*osvj{c20ObQR=J11+nzJ5d?g9J4~ HAoTnNgNs@cU24{qaY{t1+gp&<$EgL#FFswzJd>g z_?m+2D)RVH!LouC1s^H+SeOh%K77=`S%v zlBqikQr@X?+FFKbGmIxUikrqmBWoFUBU|=e({3yXGtK2K=OHh*jVkvTrjy5*9TjPq z#*B=zhFiGJaPhWhG`QYTRXrA1GGHO(+zh2{(-mhOq;6p|reJ9{@>lXPrrI{-dlkaf$n zxtEer)ldVqdNQoq^c-8S8>ZE9xo+Blna;p+3};qM*Yp3!FR2S9ox85%>fbg++g$1b z@f6s58tRx~NaUT4RntWoRm<^ssHB_+f^)mZYr5B|5~W_fV_Dl88fa=Tv8mx}SQ=Wm ztHH*7YRVvA3?u(Guk>J(SN%hx^0w#m7L6FCNx6iBLAbF61Y?nCB-d5sxuVz0(9cbtjDUTzDeTM^$I&d80-*gO%ZqcCv!!|CYXwIVnWpq_7Za4g9a8(O* ztTqkzTCegv!;r`Qd`}cj7V@GSLRRddB)YyWoTX>vJiSUl1axsRLu-;wqqH;HqqBQp zPlO&rNMSZqvmfbQkpb42eI9*`Q%`Xs9_d0l@eEN`WUKp#RrVoQW+RvOpzL9&xQlaZ zWVMgs${w`%OI@5KC9PeY>H+&8sRvp;4kR50MdqXFE=DSAFYtZl8AjLU=#-Ntq~DNw ziuggiF^ZIkc5ynMI23ai%M%j8a#ChO>SFv6t_+}F?xSAmqez{hglQ9ipyHh<+x`1H z5%>kB2jCNZ_$h;)lKt#S)Oh^>#^`CJeouKUX5&b6&?MRgV ipHm6xF;1qZLPZy6cOop%{E?;%-XIw9bnX{12*5w$grw>K literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/classes/VMEmulatorMain.class b/nand2tetris-suite/tools/bin/classes/VMEmulatorMain.class new file mode 100644 index 0000000000000000000000000000000000000000..aa6b7ff524757fcdab43088e9e2a8d7d48d801c9 GIT binary patch literal 1073 zcmZ`&TTc@~6#fPZyR5asVo@$)QPH;Gt|HzjF(C~oNvkBJC4~5}v;!>cExS{|zv8nA z&-h@CP51%+DC3zH-6A*-duGlzXTI-T_UEr3X8=qrY8b)90PbK?#a#^w@=S7k^P z{W>S(TDHe9lHDrpTZfkESl+I=E<)SeE##_6+`?@Ib4fhIJVUM$S-X58BX4GkYn5fU z;aI{C%k)NOE2@QdATpli@{bChC-DL=8RlxfYeWstkU>UtL=PK*W9=BUtNTZhvC*+5 z-#=LL>MNW(3SK4gS_TitnwF1iJP@`|VyD*abK>Z2W!0>f|L7?CZs2>|6Aa_;tlEJ@ zi@qm9-*I@@g-%PfE3j+36a?QthC58ZZM zj6LBx7yV1yenYhVvXTo7lWpQylPS;fkzwrr%H$IThE$xdtUJSCT%-@%`@BZlx?Jm@ zBEeniIuAn<*XgqDn`_i!L5=2?OOJL6ebLRJ1oDzY9O>*;<3WDOeQdVdYF1XumPZ3Z zJgJC_u8uMsWlR629;Z!xDsAWoHvPTa3{AFgTt_s5x()1U~ z)dME~0{V{9X^1Q%+m~;Gok|=77{mBEY(qhUe3krJ;tNt=(WCc%L*fK0`LoY3^}g@u zKS83@g1Xtn09lRfwQ>u|&Dk0Kx}MT+G%@)81nCxrHe1jM9?tj9HF0y}lt@O1YLZB3 F{RSOjDkA^@ literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/help/asmAbout.html b/nand2tetris-suite/tools/bin/help/asmAbout.html new file mode 100644 index 0000000..919e539 --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/asmAbout.html @@ -0,0 +1,96 @@ + + + + + + + + +About Assembler + + + + + + + +

+ +

Assembler, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/help/asmUsage.html b/nand2tetris-suite/tools/bin/help/asmUsage.html new file mode 100644 index 0000000..1e18db2 --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/asmUsage.html @@ -0,0 +1,115 @@ + + + + + + + + +Usage instruction and tips can be found in: + + + + + + + +
+ +

Usage instruction and tips can be found in:

+ +

 

+ +

The Assembler Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/help/compiler.txt b/nand2tetris-suite/tools/bin/help/compiler.txt new file mode 100644 index 0000000..07bbba9 --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/compiler.txt @@ -0,0 +1,9 @@ +Jack Compiler, Version 2.5 + +This program is part of www.nand2tetris.org +and the book "The Elements of Computing Systems" +by Nisan and Schocken, MIT Press. + +Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski + +Usage instruction and tips can be found in the relevant book chapters. diff --git a/nand2tetris-suite/tools/bin/help/cpuAbout.html b/nand2tetris-suite/tools/bin/help/cpuAbout.html new file mode 100644 index 0000000..f806d5e --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/cpuAbout.html @@ -0,0 +1,96 @@ + + + + + + + + +About CPU Emulator + + + + + + + +
+ +

CPU Emulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/help/cpuUsage.html b/nand2tetris-suite/tools/bin/help/cpuUsage.html new file mode 100644 index 0000000..7e69482 --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/cpuUsage.html @@ -0,0 +1,115 @@ + + + + + + + + +Usage instruction and tips can be found in: + + + + + + + +
+ +

Usage instruction and tips can be found in:

+ +

 

+ +

The CPU Emulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/help/hwAbout.html b/nand2tetris-suite/tools/bin/help/hwAbout.html new file mode 100644 index 0000000..67ad89b --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/hwAbout.html @@ -0,0 +1,96 @@ + + + + + + + + +About Hardware Simulator + + + + + + + +
+ +

Hardware Simulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/help/hwUsage.html b/nand2tetris-suite/tools/bin/help/hwUsage.html new file mode 100644 index 0000000..4663f53 --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/hwUsage.html @@ -0,0 +1,115 @@ + + + + + + + + +Usage instruction and tips can be found in: + + + + + + + +
+ +

Usage instruction and tips can be found in:

+ +

 

+ +

The Hardware Simulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/help/vmAbout.html b/nand2tetris-suite/tools/bin/help/vmAbout.html new file mode 100644 index 0000000..c5b296a --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/vmAbout.html @@ -0,0 +1,110 @@ + + + + + + + + +About Virtual Machine Emulator + + + + + + + +
+ +

Virtual Machine Emulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. +Gonczarowski

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/help/vmUsage.html b/nand2tetris-suite/tools/bin/help/vmUsage.html new file mode 100644 index 0000000..611662b --- /dev/null +++ b/nand2tetris-suite/tools/bin/help/vmUsage.html @@ -0,0 +1,115 @@ + + + + + + + + +Usage instruction and tips can be found in: + + + + + + + +
+ +

Usage instruction and tips can be found in:

+ +

 

+ +

The VM Emulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/nand2tetris-suite/tools/bin/images/arrow2.gif b/nand2tetris-suite/tools/bin/images/arrow2.gif new file mode 100644 index 0000000000000000000000000000000000000000..c744eabbbb92a178b85e66ff3666976727741cfb GIT binary patch literal 1073 zcma)5dn}b<7=K)Lz7wmpuwqf1)8@!+xpb0T!a45DNvv?Rsn%`9@KQ@H6{+-(6>>|X zhKX#^NXMVq^1F=N~p*eLf1Ilq83>2)9_<|e6fDeR02!!J}gAq9b zWFUn|^kPs$z#Bb3jK$z70)Jr;1@;&V0EwoH5;@Wt<{?M_n}4oKWn+HubH?lEvNqp;ID%Yf2V(4 zSz9LG$R?({?ny`1RzYBqe|>q^-5pM6hq~*ZzJIXW=d!WzrSPz~Fr>;jJ83*HPZXPT z(^NJgEp)k%)L9@qEh#y4^_ad*vY@ZbZ;ypv;o@jSWr(TAEi;$VBUO=`)C-b<6{$3 zspQ*8YjZ~J-l2UnV+D5vjc!-c=UaM82XlLh_NPp}ei7AMyC&@U`K2vr%XZI_mgNQ2 N$7*?RT!I%I`~#3cMa2LB literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/calculator2.gif b/nand2tetris-suite/tools/bin/images/calculator2.gif new file mode 100644 index 0000000000000000000000000000000000000000..834cb05e10bbfe36cff407fda164f2a0ceafb6b9 GIT binary patch literal 302 zcmZ?wbhEHbRA5kG*vtR|4Pe{=rW$~}1`s%K;J|;N_+{(pa>>4D^V8MBy@JNFdm9FG32;J)ttpXl^;%?}?a zNOgN0e%sC|HR1RQq2o;V1Xiu-%$i-9dZzpJM#br75nC*C3LC9BD%xWur@wC~sf*3M zcTc9UvA8xVJU+fe#L=d=w>7uD!?;VhEPY0reod?;!@LC<7SdCN@)`=7=1(X!Pg`Fx zd&!z^?)`>mKww>8ww^>PP o;;I$;EmF_d_Pw&6|3XyyV#9-X;-9}g|NdF|x6n^vK?VkE0M?p{i2wiq literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/cancel.gif b/nand2tetris-suite/tools/bin/images/cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8509fac8f841102ed55b4b43d0d5f43a1dae656 GIT binary patch literal 1133 zcmZ?wbhEHbRA5kG_|5G|I?<^Pm9|K}|IzjW>YwQK)x-THs; z-v7sr{Xci^|FvuXuig7U3PwYK&LQyo!-54%8X6k@1Jn6`hW}s+NCR0wp!k!8k%8eC zgAPyaMTGv^7%K~)bvxuRDkngRz}xw%Ago@8upZs+%yTvxD@;jsS# zkBY!Gzr;Bfr@hMix*e9hZm zqIu4O$}SxYfm@x~`KoR*ef>S@NX%||r>q;drhYswSTa%SnZeApPn#Lo#HacEEIzq< zw)Jeb-d_gKF9|HqD%)H7_WV`bVyUHfXTHy3Xm9rRoAYpa>pscIt~*=}t1r(`zaO+^ zN8+cHy_rAjraEj%d3$b^viG*Ro|DxXc(N}q-@emUwS}EOC+>j5{<^jeYCGK8R8No8CazvE`^KEU~6dX@f4YDClRJkd-ehCkAx%Wvtqa4>-L@bH6*7=3 zLi;edk+@w3N~}(%-Z0lAv*xZ_X*-*2mUZHe59_WEwzR_yY7857O!Il$H8aN-bA7;9lM2EP?v1dayL1fvFvz`bN^VG%JOtsWu{G=U~# zEi5AIBkdvOATAI!YOsiE6}}J8gX2I57{N?ga?YkQS=3oru~j2XabB`yGjB4ZQ)o=0 zMwp_Kls0XXrcPa>R)d9ksuE?Mc7~>)o}|`sFBZyFbCim9k!FFqyDIGeSYVB?8Z1;Q zmBq!y+1c5dnVHGS$&rx}*L8EbTsE5>7#K*W)BXMZsZ=VFNW|muwzjrtG#U( z8X9=FJT&yBWm$n6FnDgIf)2JIPuy8|AMg*J32uWQ5d!L}xKqDTA0C?cuLSLNDEDj#Z9c{P4FPW6tB z*5wzb6ED2AeyZj4SJNM$I(4LU>x*CB+quxvHM^m`@caPZc`t1@}2}(fvaBUU%R>v$))Mx?ko4dxx?ApIX3wFjqhLI_V%w+hyUHw zH?_O5l-zi2S3`Yvf9yy&`Q2&rnCQ8DrhV{{lU{HBHF;qoy!n%Nd#}o#%g%3qzq530 zypP4c(FjiPqs{zbySM%N&+K}t@7VF%H`N2*zHwcgSzdZ}bVK9wPv;Iz|1ofW@bSI! N+}-7JmRQ*ef(~%&rPETQ%tyB%+5?N z4m#hv^^h&^c)+MVlL@9f;x zy7=u|>uou0v!wr*&6O&?^l(poz+%34A;sCRb{JllS!-MN_xpgVWw7~bEVf7`FU z^2eTp?HsnHVo`4;O=dVV&ovc|u)W!m;F05~`Y?o7DdIr5V`FHre}(1~g(ePNlK=+> G25SIPD1)2; literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/equal.gif b/nand2tetris-suite/tools/bin/images/equal.gif new file mode 100644 index 0000000000000000000000000000000000000000..340255668f139b7614061fe5781fcdfdaca87857 GIT binary patch literal 1042 zcma)5YeU8F1C|W<3TJ|TA%0l1SkCH5ulJ#RF zM_At4G8LT8)&g^@73svw4>Kw;L&B+vnSnEvI`6)3RR22TaNcuy&-1+Jd`p!|#79nN zffQB&exU#-5;y*EObD=}KpCFPTg$A#nTZK^5C8^DL5$OHz<8~I0hwI@kM6G%8Rluf zBJ`(>8^pey0SjNtwRQtpe+alIK$SZNqUpUd9npUmfH+V~XwIQzVET&yG#Lg`v?2g? z*;`^y9e4IUi}kkaT4GmdNo=K-(EAiC1$$X|ZVF$<>5m07AjTXZ(2qHe9~;5(^PCqz zfAcsR?z!Wl_2#DW}>AR974hU3gY z_Wy1*&VN41VXP0T@NN1=fo`-{~uv{O%S3TOH`siX? zgVYdey(hjrKN)Th9c@e~|G6c-w{56dqH<4Z?>(2L%WAdVhoXu{*C%t8hcGb1r2lNK_1!zs;U}8W zD1*#(QEMerw$lB@S34>V@|zE0s(pql56z8wWeXQO{SPios0yvd(ksS=560q|k<7Tm e7c}YvOjoDLv^+DQiYy%Id$uw=*1F4wg}C3-12(4s literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/find.gif b/nand2tetris-suite/tools/bin/images/find.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3f4c9d8ebefe041d8c3cfd9ca05aa096e551f24 GIT binary patch literal 1014 zcmZwGO=uKJ7zW_iAKZvADhY%HJ!q(?s~|HT6!W8z-L+>FY}8~BMRWuY+eK~QiuAR@xN+moA_e23yID5!dP zzuFo9Wy|KHRj9%jl!_$MNTfGt>mVVOm)l z8ETRuNwfxt`)G0yl@K~=s0#GPX(<{*)N&Lq;RdjMm=01B2^}#i(jzU>AT?63h+=@i zhws3VkUI3aShNwC@KbOSkTK|Uu^30t1V0K#K-NGnV-c7wn~O!n12p-FIuH^y`dlo+ z4q*C7IY>yv^fDGvEFuWt`*0jc2|YYh@HlQ!8647>E2UKynBs)TVT)OV8I4jfiL$^H zl}FE_Wzf*535qfnCa8w#Wocz-NNP!n*4Zo+sK)6jT0=B))ZCfCzGsEwH(OT5!u0g? z)YR1I=x9El9~>O)>+5q}x4XOBw(ZW&PSZ5o+uKvAR9jnHB9UlrZjQxb_4W0&wY8B* zgx?B1JvY+nbeIhoUNS6t~>PbuT?lX zZ&|-_D?j$&;(XC|=7*)n(1Cw?jW5r-;;7r`R#w~}>p$^v>$S$O_SjZ?{k9hi1}e8V zp8e09-*a_SUHbRxcP*FKe!BkTY{knfyIx1JC%d;d_0uWY_2Aa>jM?FLOzl2*d?a#b z%ceC4|Ni;Fi({K3lOt&P&|jBWHra3kZx=g@_lW(c)0L~wyivW4w~_yIee(0KlaG!x w+-<1dw|3-d*S{B59$3C%$EC`a?yBFOpLqK!R{h7}9}m9Ydp@^h(Lyx*53-x}9RL6T literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/hex.gif b/nand2tetris-suite/tools/bin/images/hex.gif new file mode 100644 index 0000000000000000000000000000000000000000..68a851b2d7aacbf14a139744febfa79a70a4b2b0 GIT binary patch literal 1422 zcmeHG>rY#C0R7#yaCwYT-mfbu1QjxvT?`vArY#gGf=MxK!GX%=W|)qoRb*YF$z?EL zk!j~6L*N54MMofZflwZn-M)ZA8LyT{DT7-|ftEtcqb-F}%YWeq&$n}Oa&mH#la-yB zbn!YFkb%_+TsS^Hb~>F7hXX~?!^6X)qay%NyWM_paA339tXAvZ-roNH{`R)XVA!pW?c4-M$t6v$7 zTY9}-r(0WET2`wU=jTGPJn(YI1T~CL5JXhlE1O z=B81vHz<`eLZNtI09#vI9~&E&N{0mktglb7vZ5Uskq-_I4-5$T{Jy!l`Tl-ER~KKQ zP>zkg6p19AoqQgzYhq$jCL8JM>gMq}J34qO)k0fa2ac}{4ap>uK@1ajclUO7cDJ|l zo;~YmZEaJj)KgQ_VzCs%L;}H!-rj$nKK=7#=>PHGTOjIy2m!zW@h8CDza~D^rSiUlPPxBZ8BL|+>+*hjyJqVSC5Wb|^=yrdEe3Hj z(6#;)s%iNw4UnQqm&w1y%X&S&Ny%T|F%msIqnYHw3T+0#FSwvU&Us$Q4LOdaQfZ>x zc6a~cBrZ){O+ZpOoH`h*@rKE{=Nk4}^@KB2l26nP;%(q_;cUT27qE&(uTX@XCz4bI z#D1W@YR0iD!j}nu+rBM^z9aZv>q(+$-0BwM>n}Nd3(K(gz5aR_{$_Z(J4g3e{A1!< z0ICj)Dd{nxE!B@A_+zN}YoDfa^prM{TX_cFtPw#@BdgFo8NtNRWrSQrpyP1(UHXBE zK;kDaV-Ss1PJNJERKEnJAtn(Cu470_W4ILc_bECK@Ier!1fqnpF+WBOyV3u>RCLil z=ZGOLN;@s9dQ4BmC8fU9>~!yh)a&;>k)J=j<&}}frUzy-&bvLy$&LGrn_ouy)UPBG zWCUGBSkk}(wdM7^b7d?PPV@i8?NOHH9vWP5hh6A>Q&hWN8F!NnLf$E3Qv*LPVuRpM zQ1(Iq!epztaR^2XfvdhSSBAnIyeb&3qh*Hi|44Zf)}TUHA*wu4T6C+4-RND?M7bZ9 zNQp`hWp47)!#{7w--syX;)4+^b>;&&L*mzgTs&gY!*9!JS+A9|3<*7V)!nlKo8<~K U>&Rl*esLU0G+{(S5D8rR7Y(KzssI20 literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/keyboard.gif b/nand2tetris-suite/tools/bin/images/keyboard.gif new file mode 100644 index 0000000000000000000000000000000000000000..823aaf868cd4e59fc747f96434c944f081d9f601 GIT binary patch literal 1017 zcmZ?wbhEHbRA5kG_|Cxa9|##3_V3?cUtj59+S0VPidjGnwVX&dk(%e5^{{KkU?WqsRlT gbCb+!c5Tk?30QqfP3!a5*YkE1zrJ_YT7khD0F&VAO8@`> literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/ok.gif b/nand2tetris-suite/tools/bin/images/ok.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe6ed8d753d58607bb0041ddeded23df4013d6b3 GIT binary patch literal 988 zcmZ?wbhEHbRA5kG_|52S|Ig6Fz%Ye@VGaYsQU-># z49AWgWBAVi6dwhnAuu#T;P;0G3zjrAH2epqb5PO+Q9v4!h!uabFfuR*GUxzBfjL5f zfq`QugEEJV$A$$5n>mEFVon4oHn($&ndJP~@Q8^)ST-zWLj&Wn9(MDvKOCDDoM>0^ z=CgSjxYUzfDR@^3L-AstsV4H*_CyM$`A*@sG@~jy1_JSN!RipyWD{-@c7! zLeS$=)5PK@P084#e0rvl=d+MV;iqm42AQ+IR9;9qJ(n%p&Sh4JW^l7i_AQ=Wfv--^ Zwy93KYFVOvZl$p!6R-ESHOCqltO2v`IX3_R literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/open.gif b/nand2tetris-suite/tools/bin/images/open.gif new file mode 100644 index 0000000000000000000000000000000000000000..f69a024197318aa70fff927d760c14627d438536 GIT binary patch literal 930 zcmZvbPe>GD7{(t>!a6J(cv$IB!Y2tGbnsw=(#d8AiV0ioP*6kEVM>CJ2=>y7;&B#6 zn2JJ#{=sad)4_HQ!Mc@89u}C`5{R*QsR;II^p@)b-}~^ryzuhl;XR)k9yoKO z4Q=>^U1j%PcF(f$FPkmKii)pRYOJZ>)!@5wR=?OE3;G9NeD*Q#VkQI2f?+_@zzxN6 zz`VnpO{sHCFpVgMa1dS}q=1nGFVII(gbT>XKrN zNJmJ881&F5AxtExY7DA$6zyf|1qz?=Be)?l9xMsNghoXMq(j=IP72mhj}V0jJ$Mq* zgjrLp22>80Z5DL;fEVdo`6ikY``M0pX?wkA{AjUM4tyC zku(p&BHRd>5S9l+LNgn%h(6MRj)CENY7B;BL4Dxhxv?cX1iu8Ug)TpWq6rE+-1?v7@ zVEVi)=Or3q-l>9`wTL>tih5Qkci>kD&5 zxwY1F=Y3^;X$oD<_a6Lwwj{UFZx-8&rQCLJv$;Mukve>8WEdyho2i-J3vVw!T75b7 zbU+MTdD4!H&bf{sSC6buOg`6Vh6~9{x4*tlJigU`w4-O_{!qT_+RCx~r}^tmEydP% SZ%UIL-~9B}!rk37Jo^vWfy|Ep literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/open2.gif b/nand2tetris-suite/tools/bin/images/open2.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b94682b19d1cb5cf5c6aad7c7ed1af371fabe39 GIT binary patch literal 969 zcmZwGO-K}B7zgmbWFi$CMTd4vsKaPU7bhzFP%O%3C!#4(yF@wAp@u|y>#}s%KClik z)=JaG#Gnjjp`1Q!hX_PTvkyynyU0YjhIJ_xJ5&VwZ}gVyb9i_jc;S72JkPr~USGYX zc?DMB7iNMal1L`QGE6g7e;7f3&#N4B@^{wzB<-;gYcQidca;||9;DEbfN4V4p{n4d zb7k|fhU zVW^Um9*1qFEw*bE3Y$Cc;rpCv|M@L5o1_t{2`druT>gr0RQf+N*iA18MrNuPO z#>Pfn*K2EQRaGr7FOS7ykw}DpbKTu{lF4K^8!)_XcI9WQaP!yxDGqyJ!%Uj_6LqCM zSWvoJ>piyf?02kd?KdtAUS3+Z8}EN~Zo|rrCxa`VIZ(1_S0z5*zctcP@vi7vfA8Jb zHzVsys-H%VKRf$%$?_dHTW?=1sf(7DRh}^qT(3R4`RbbU**%VaL%p%}XXl6X;YU+) zh($ literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/opendoc.gif b/nand2tetris-suite/tools/bin/images/opendoc.gif new file mode 100644 index 0000000000000000000000000000000000000000..e84f0d69d646eab20c3c8d0d0dc0588207790a37 GIT binary patch literal 1094 zcmZvbZ)h8J9LAs4>N;`7R$tgyYjnG)RMehMC)ywmy2}m6ZP;ewoHSr%JzM|W7&R|6 zbgsC87s=$Lbd>QBx%7cA&+p6c zdGY)3@Y@z@-tu&tAAbCU{}fxD*s8_6Ef&joaxo086$!q+Cg zOyFn~kqBfNq6p?4PFhUrjH}cnh6T334Z&`L(Fjd|QVTi`EsMHNRiz|R5Q=~c*nk0O zfC4X*r!`4ENi|MMqYx%qT!d^i8EDiXD5#}Vpp~QUP@SNZqF@rHi-e7+frtiKfk=n6 zNS#zki4<5w(S>WnHehJb6etCUIg5_Y36&{{ra%)+z>UI=z>uMdP}ag?2yPSXMi>IL zS|}x01a2f-3yTQ3XtL30K+sUDtc67+Ttsa|49FTpr38y87U8MB)`T4oIxv{aa;o)J^GzSI- z5{X1_Z*Mdj?ds}^L?W%Nt+Ff!gF#Ug1A&0g=c}r!;`PGu_F@8s#e zYZYa{I3D&cy&vHRDvLP0zHZCyvC)H-)iryjPWm@V8|y>I?uzd@ec(@D$DNf6ZR3Y) z8jfUBJ2%F(rRGl>p4xG2rkhhQRVazJZ6Er#7B7bM_Sp~WwP4S=3ro$|;CoPcOZ;ux zc;r!ebBB1M=av^*hW0W6Eh>s1Uf(dadFq#n#Tuke)rRpzhv8I`;I+9<}M>by`t9yBC@AlJAc1~B{FFkha!styGGY7M?uk@XI^Vg|;cYOX$|2xY| zRY#J4Y`DkX|3f;tF1=Uj`FmkJyQ#cT{P{q4zkMP3>iOVG#Thj}6W;yR*_G>8|N8yX N`E>gIm9jEC^Dl{qCS3pk literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/redflag.gif b/nand2tetris-suite/tools/bin/images/redflag.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b1a6b1881b227026310fe680ea692d0e7c0e004 GIT binary patch literal 1100 zcmZwGe`p(J7zgmL(6Oz$2$gkBrr64^V^a!=Iy*{Z>yP%5Ik-vFDps8LhvH7^@B~LF zcteRlSTB;1lXVd4EVEohcZ`Lcwb)jhY#ml7HyPd0x)cgyFhbdwPRZ9>|8waB@B8q+ zJn-`2%iA64YTf;MBN}lFcS>7b+G^9hlcr62GpSG&*(WdtHv+pIMi8n1$qzaXEsMHNMWHBC5GsHR*nk13 zfCO)5iB^$%mP(SMN}-R4xro?kHxN`INbu7s(<)JSs1zvXDVT)mB4s0PKvofz5TZj` zq)sZNND8c=;=;9I8!%L;5~Q-jl0`>nL1A8`DbNH{aO1FL7*VJpNNceef!hu{2t$DC zhg8KPaJOtN77=mLZX;+wP~n%>Vi749aT~IMsEUwO#Ud&dxGroPh5=QD6B&*$Sm<&lw5P1C$=K<~Lb&FkLgRny-! z_W-x?n0M>_h(=&T1vfW7D4rUb`f$So^)-{Hz6`(b+r0DbOTRtzT;lq+x}M^N($Ll? zo>|zR-``o2sB7ERZ#~j=B>8Zp<#VmBsXKk&%in*ryRIWL44*lEwwyTM(0XvNXUh5d z+|l}b7q-<-j-4OfbKE$B^vF!2_tnJc;hw9THU~fWz2~X&iO;@jQqE2c$JRx@ZI}oR zK58V~zp2ji*oV zosD(MU2QAdpUu@iovr_6eus3a_T$-;V#9$qhi)GX|Ipw^_n(=4FSh7g?apJ{H??(( zgUi>huFozOS}yKb7<1R}eD}t}lY_5(a$xBAma*#tHx{p4zBM-F@eqNmXygK_m5VZhN@%NtM|D#|u1ZWfjzdtNku%w}(;Xg2)|7Z9Qrhqh%1q6ye zSr{1@elh3(C4o6Yfq{YJAH!Eh36Bj64mNXq)nxhb(3zb+`Y-pNyRO0N>dK2e5|bXaaBN+DeZ2-lg2d|5%*(&YuG zJ9k%nezli7e4THbeB72%6#3o`uoRZ;d!17 z|8gWh$4`i{beH=$!<6&-I!2!vb0eSLJh$Hc#l5rDEjb)QV)@5zSG8~m9_v@O=VNI4 zd~0Rrem6NMmyTE0*P7SY&C)yco?Y>{MMFR}a~MydzV?g_FgE}D|MPl$rR0t2_fp?j9=~7DW9AXxDBi$+kBNDnSVV2)%_ofPGG!|cwll~m zC^3i_eNd>161<|wuFzG%&?%}_n%F3L&ty@%ZePTsPQibr%6*EjB$N}R6INX9*V!cT zq}#e|x=@(ytshE#QaYTEYsADnle?JL&QPBGUsYAW>)FB;54&Wt7A)yz_|dNF&E%=E d+)+wv$-}u7&sM6><9fOI`TT}WA_5Ey)&Tg%d;I_a literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/scroll.gif b/nand2tetris-suite/tools/bin/images/scroll.gif new file mode 100644 index 0000000000000000000000000000000000000000..e00a9a1bd4c3fe363b7f3cbcfdc2e4c38c98ae77 GIT binary patch literal 949 zcmdUt-Aj{U7{-6^yP3|Mxy|ael(Za-O39BvvtpFg6stiA8jDs3%g7F@!CFMCBpcL$ zNe5adeF%{eSV#p6StO;fBD7*eLiDu>B?ZO1LV9{$`YXB*pO5SM-Pe6@ZrW5=zei&c z`dnny)YLRKHnz651_FUlC=`uG`}_L`2M1%ZSfW3WNF=7FreGs@a_l87sA8M4%1qFux+ZhYZwOl*qwlZAtdQek*~b*YG@n?T_O5V@e7*zm>yT|Q}Lb%?ROp9sdSsO3!2;zc(h+K$e1W|Q>9|ghnx)%$so!sqN-@Z++zqROjl8|1Hyth z6+VQ6bhDxemZ$J14WTp)mul%!9#Sl@rzso;g{8(_fm6}ZLU4e}S>qI=X9tY1#E+6z zydC8{r?l9DRinI!hdl zG6>|tERqY+%fcM9d+5ret~pux!T8YC$7l0#dGVKxp38G?9eBXir(KKdm%r5R4va^0 z8!q{Z?4La6SM93&q1oI|PFFWP8EyOSd~|uv;`d+nA4+Y!wx;X#tfltGmg}3hzZn>> zbxqvxo@u^qDcm=CtG(oO>tOKaGD7{;H_LL($JjI|Dhjg*Mw&|hj7A;{UKU#$Lp63yBi z=1^clkuhEz2yu)+_pnC9g76(gCa7K7Q-{S%MX^t_-g5UnygV;_@V-Bu=j)4}KXr0& z5BA_EDn$}0q*8$lT171d6H)7lz#fp+FCTQqpy4nlub*8Wp7s_<#r4fB^L13|XMNLUWcznwp?8K*W7S zJ%nxa2q-#2lqI@(nvzDA+5#1aaC}%Ek~R_oF&!!;>5?XCkQ%A5jIs~kgJ;7Q5IXc) zShV0L;U!?lAXMnJuo#6OhSvjIfe1mb!XmJhtQHm#^%3^aV?z-L>9w#3%SX~f!bVI$ z)vK_Gav8o4&x37428^vOAeSJNb z%Vjc|`T2Rrai*rGEXx`j8%rjWLqkJ}M54dHKNgEcA`w+pJ32br+S;0$n)s(QJ^ebB zN(J74!Me@JZ>k{q2Y=TGGtgCOl|RwjkVaj@er;}g`9YA;x65%(tW=nb>Qsi z@xwdocfT6kHNLI;&W&G_*D}vSd)2>JRuA<}wqBk0$A`a1A0KU8EUe9C`|j?zZPkAr znu)zU-ID7X89s7xrtZb!kB@3ce6l&*{AJ>Dd**rMeNi@^XkUGJ?9$EAPT95Q?7Nrz UF!C;YVdDC^&d*O;Z}sBLKay(KfdBvi literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/smallequal.gif b/nand2tetris-suite/tools/bin/images/smallequal.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1db606b601fe57d8fa08e1d272b5706496f90f2 GIT binary patch literal 898 zcma)5Ur1A76#s4B?!9TfWc3iu()G~9M&QdbD`j(YF>y@F9!4$*g6Kgb_~w&gg+BQZ z!v_7qm0J#axVi`*%9bFMBt+O-#2$)nQBWFq!$qBQ?;Y7&XB^IV{(R^6`_8!wg@e9B zXZFH{HQ+Z1ED1X7!?7A*$LTRok8O(|Wi!+4F$ADsc8_BEwa9)nx_ej4=hJ4>Hn`f=H~&NDaIZ zdT80~dzR`KhqFRYW<|?jR`7ks>Y!dln_IG0G5uHd3Vf6U0sZ)7@lzWue$rYPl{27<=L3;?${i9S{k-sP4>4Yv&`ZdIwCVc*GlEjg}nswSD{sU%-=OO?A literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/smallminus.gif b/nand2tetris-suite/tools/bin/images/smallminus.gif new file mode 100644 index 0000000000000000000000000000000000000000..06492f570f9595a21b693ed5ffa2581f742854d8 GIT binary patch literal 863 zcmZ?wbhEHb3KSM#o1R!-H;LVMe z8*c(`+_2bjLnQ{RW0V*TfngE?ia%Kx85kHDbU^+AZ&W%e?Pd7+DB_kogU=093 C7BtrY literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/smallnew.gif b/nand2tetris-suite/tools/bin/images/smallnew.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3137e5ed50c4eb006a246d389f319cc067c5841 GIT binary patch literal 1000 zcmZwGUr19?90%}kB>nM0iZa-qD!VHpO7~DwIeJ)mw_a|PTJ(=rL3T;1(?15%5H*On zi-9)?6QhW_gW^J|x4>+X3n>XXPjbQ9$X+6r1QEf$-T9XD_i*?fIB?E~@9#85_SA1X zu@Wos8>J$N1QH3a^_EgM;*~q{Xsp13WX`5EII43as>ihv6^fC&gd^PVB|w6iqQ)RR;Nl@_AO zMZ`gai8=vAgO9R6J4ZuOAEi1(#Ud;hDF<;AF@dOtASG#&2C0)Osj!Hm3)g{T!W0l1 zwE0*}!HvU-!Hhx#q0Pr)1a1SII+zNC4_X7@6 z)K#hql`udgqaN_BU4$K&y~wzgO-*4*42jYdPEP%sz_1Ok4)zpAQ=e+&Kn z4-<)mmksD$H#_pPoj3Vw{#1B-U{h%+{fS*m-eF-y{kQR>ogGV-_pNxZ^}kv4*B`zX zw%6{)k5$_%3THasC6l#hZ{hyo!RvuF;SGyFPrbhQJsiBWcy&kkcJ=A)&wUqiHD>MQ z%5|+5kB{{rwee&93UszFJAdrdOZ$O*;$Qgbz}Snlc6V#dwd%3kkN5TD4-VgoROg1< zH%|?p`!u2KwHAE1vcGk(ck0!l)=*b%TkqaGUD@`_l|8**-m-E_XmH|Z{_V}56FawM co_)>SSbueMJy>9Lk<@C=q(t zXv7sggj&Ux4gM_Jl068qhXg$IG^er`6DfF+P!JIzubbX%@*Re6U|{Cq{pNyx{`j$5 zLm0wubc-bN$mhd0T)JH?tf2PhYnyG!rblVBZnCP;Rp=rp!MEUKA(AjuuqD~>Sg~0& zDKusjrV!}x6L8`X3XB*iB|VR}P1B^NQBgWT0Qi6d2*3!RAzSnsv@0}=)C83bkqV&u zNH~ZKClOj3IEY}zJGjhaHG zhlLhpgI+9=lYip~k zt1BxjuIrY|oGBOg4M)|irKmR(P&xhH7 z;dNUhztx44fAG(aa1V@km+qgKj93_mjA|clo}EGN$K64cCuiU0K3jv8mtP)Y{CY66 zZ{gisbl|}3k*ROz9*thzm0OJ0PR{<^ZJpj(+kdh2emGqjetcVdj{6JO^iNAuPa`*$ sFP(UDDE|!U!}sRYJ9?qLbb0y3$JCX@GkYKW(sSR9S4WHPo(N9;1Fp2ohX4Qo literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/smallplus.gif b/nand2tetris-suite/tools/bin/images/smallplus.gif new file mode 100644 index 0000000000000000000000000000000000000000..9030b0b323d21671c1dcca90bf03a818ffbbbfdb GIT binary patch literal 873 zcmZ?wbhEHb#=yuSEs?|&!BLoee71t(K9{a5EBspo6fHU!Otl&ohZ;u2S_wCtnk^LNv}V>p zjq|J7H<$5p2Cj+N;3Xc#U~oM(c9py5q`#aF8K>upUu$~$a;j#-H08=;F&j2-x^*x@ zT&9gPfiZQ)^wZ0DErT4>FDXeU>)J>ed7oG)`0nj%(Xux?(k^OwSeG#6-&vL`y_~fx#L8 D>|#zc literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/vcrforward.gif b/nand2tetris-suite/tools/bin/images/vcrforward.gif new file mode 100644 index 0000000000000000000000000000000000000000..b58d649fdf4ceb25b1558a9ada96747266845a22 GIT binary patch literal 1021 zcmZ?wbhEHbRA5kG_|5sNxf_fPvv?7rVaO428yI)_w)vxE6!N#Z6r5_RB;#CZ?R6ZV-5G31`C+&lzGR z?^-H^(^$D3Q_r>h`23=k+i5z}ftO!0uS^l>joPun^rhcChlyQ#xr7$AF3u>{I(q8B zirX`s8TXiaZBq>HtFXLQYhkK?Z!dTDwksY*ObM-~sv2=R4-1?+1P$C~*xWQc#LBIZ zac|AdPmUdPEUWomF4*$&(qhl~ZhOsC8`w4^FW;wA_~?4mkD}N6&hFlxf1i<&!5RQ5 C{4RO` literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/images/vcrrewind.gif b/nand2tetris-suite/tools/bin/images/vcrrewind.gif new file mode 100644 index 0000000000000000000000000000000000000000..e55b4d67df125da7a480a9cea0de193024c97c23 GIT binary patch literal 1122 zcmZ?wbhEHbRA5kG_|5;j~Wdn^S3^)W$6_Ppo%^gVUu6d^4ohNN!#2yDC(D56{Z231=5d70tVbfj@ z4#B&}bu?{P{FxYebNBzwiMF1TejNQSU;j5UWkDlf2S|IZNA!jL?Lp?WXFlzSXo z{~tSc3@A7XMnho8guw3)3l=PCXlVEkOy~a@fGHYC0cjus1d2ad7#SFTG3WqAfjL5f zfq`Qs!&gojj|~eBHggDT#hlo%@Nm0;vKfoR#zjZFCB&I34s2X}ykAzF;lhstjVC8- z1Y0F2Oj^>+W{`Yp&dH)BhkEtXU-d*@etK@cZT_@BJB>4(=D3tfxptVWJhPO2wpAF$5+t=UQ h9VpHr=d;5gakjgmR+!GljgOB{Q1+f@W2wMk4FH+FE0F*I literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/lib/AssemblerGUI.jar b/nand2tetris-suite/tools/bin/lib/AssemblerGUI.jar new file mode 100644 index 0000000000000000000000000000000000000000..c40d4552654ad467da6fa5619f893f87d3c847aa GIT binary patch literal 4470 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 bze)b5wS;LAll=IE`1{HJ?pPPqkGFpSBfhgP literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/lib/Compilers.jar b/nand2tetris-suite/tools/bin/lib/Compilers.jar new file mode 100644 index 0000000000000000000000000000000000000000..9a78b05898628a46573810974ba601a1aae83238 GIT binary patch literal 27094 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 W5|GdPOb`&H=Rf9`$Q}KcZ~q6LDgY4x literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/lib/Hack.jar b/nand2tetris-suite/tools/bin/lib/Hack.jar new file mode 100644 index 0000000000000000000000000000000000000000..9d57398b780de383bc6574669371a8adf818feca GIT binary patch literal 59364 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 Bdffm3 literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/lib/HackGUI.jar b/nand2tetris-suite/tools/bin/lib/HackGUI.jar new file mode 100644 index 0000000000000000000000000000000000000000..22d4ff389c3b46addfa05ff1c2fbc6048901a6af GIT binary patch literal 96666 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 literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/lib/Simulators.jar b/nand2tetris-suite/tools/bin/lib/Simulators.jar new file mode 100644 index 0000000000000000000000000000000000000000..72b5db7376b380f7f79b27851b996e7ec97b12a1 GIT binary patch literal 81810 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 Hc_ID>Mkn7* literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/bin/lib/SimulatorsGUI.jar b/nand2tetris-suite/tools/bin/lib/SimulatorsGUI.jar new file mode 100644 index 0000000000000000000000000000000000000000..4d36e646cec99860b95b683cf28f1d5cba97cc48 GIT binary patch literal 68492 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 CxIR4q literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/And.hdl b/nand2tetris-suite/tools/builtInChips/And.hdl new file mode 100644 index 0000000..d2c48b5 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/And.hdl @@ -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: tools/builtIn/And.hdl + +/** + * And gate: out = 1 if {a == 1 and b == 1}, 0 otherwise + */ + +CHIP And { + + IN a, b; + OUT out; + + BUILTIN And; +} diff --git a/nand2tetris-suite/tools/builtInChips/And16.hdl b/nand2tetris-suite/tools/builtInChips/And16.hdl new file mode 100644 index 0000000..4c71874 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/And16.hdl @@ -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: tools/builtIn/And16.hdl + +/** + * 16-bit-wise And gate: for i = 0..15: out[i] = a[i] and b[i] + */ + +CHIP And16 { + + IN a[16], b[16]; + OUT out[16]; + + BUILTIN And; +} + diff --git a/nand2tetris-suite/tools/builtInChips/Bit.class b/nand2tetris-suite/tools/builtInChips/Bit.class new file mode 100644 index 0000000000000000000000000000000000000000..1e5a3c457c0abbb4801757bbcfb53e08bad62590 GIT binary patch literal 416 zcmZ8d!A`bz;GjHC!o!!r`_YVLO+8#>qT{x(EsA0pPO;ffEtvlFuutTsjJ=PNf4GG1* zN|Zh#Sed<@>m?QVrq7Dw!|zl}a)~?dIao*d<3eBvk&jIO6?;H*!$U z?WGHy`>o6fqB9IfX!CPR{2PRViO0xd%+a~7Gpq7ReA?YN&@%%-pq$Ggj~BSt?7pBN ldP`XShIoSCHQX}%72?-c$!!6f%+@lG*;bFMSfaR^!#7^oMs5HA literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Bit.hdl b/nand2tetris-suite/tools/builtInChips/Bit.hdl new file mode 100644 index 0000000..a0a76bb --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Bit.hdl @@ -0,0 +1,19 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/Bit.hdl + +/** + * 1-bit register. + * If load[t] == 1 then out[t+1] = in[t] + * else out[t+1] = out[t] (no change) + */ + +CHIP Bit { + + IN in, load; + OUT out; + + BUILTIN Bit; + CLOCKED in, load; +} diff --git a/nand2tetris-suite/tools/builtInChips/DFF.class b/nand2tetris-suite/tools/builtInChips/DFF.class new file mode 100644 index 0000000000000000000000000000000000000000..49efcf1ae7958520030cafe649d65bfb433bf2e7 GIT binary patch literal 401 zcmZ8d%SyvQ6g@YOrio+vP^-pgcWpL-ZWR}{R0R>C*o~_iiw-SGArt&AK`XfM1Nozpyr{D4UIN++0wM(VB5hC!Oql3jR`a$lul(L z)fvHTwTA?&n?ADQ#M3mM+|3AXfqLmnBCrM_u#3RKp1?j11YCFmhX@3Ya7?H^Bl{qy++AVR~3g7#3xvX2#199nfKP^c=b5z0N28oN&r&DMY* z%u(R(=@&}qdYo1FJ1`sli|%n zbUd_49v#eN*RZKc+40h(IiY%W_Gj#ZKiwr%{!tw2F0s>SeS)7AcD^riC&*^MHNXxZ zrTAQ+1afit^|=eU64!$cxf5}gS|&mrm19wR9_jaR5}%xJhL(FhXqr literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/DMux.hdl b/nand2tetris-suite/tools/builtInChips/DMux.hdl new file mode 100644 index 0000000..80153d7 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/DMux.hdl @@ -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: tools/builtIn/DMux.hdl + +/** + * Dmultiplexor. + * {a,b} = {in,0} if sel == 0 + * {0,in} if sel == 1 + */ + + +CHIP DMux { + + IN in, sel; + OUT a, b; + + BUILTIN DMux; +} + diff --git a/nand2tetris-suite/tools/builtInChips/DMux4Way.class b/nand2tetris-suite/tools/builtInChips/DMux4Way.class new file mode 100644 index 0000000000000000000000000000000000000000..ab72a174054b6a3d615a62427e3bb128d111e293 GIT binary patch literal 408 zcmZ8cO-sW-5PjR-BqpxbR#QKki?_CyK=5YuU<4IZghD-dv1-tzH7RBT`d2)8^DIaO z5B>mulsIdl)UvSi=FQBTH{U;>UjRY`9vny)HWoZAqHNHTK@|s82g?k0Tct|xGVn&T z%OK+HCShAdf@Fg}-XYj8IHPAwb99(@7rgjay7Y!YU=zGnM8H)r;e)wo_WX%}}19$k=V7|Lk=bysXfZd7hhs zXmpxgY|>#4oeY$~jAi;g$|@8YMXU7z_Gao3n4gpf;PimY);mf(8iBVB5(e!M50Z3Gy#)3oSUp%l1r?!C51yh14c4@n1oTxrdGo3u z6-0ahA4;6HP-3Kvs>C9L-HGBT-Dcp; zR-Zw1hnFEk=`QRJZ%0`gx+tRLVhJ^gx{GD3xL8Ha#Tpt6weu_*qz7^LIvOSZ?ooEX zaT+`@)c1pn8-FiI!^Gd2l$d}TM=^ChiQUuQzL+Y=U2`y;*|* literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/DMux8Way.hdl b/nand2tetris-suite/tools/builtInChips/DMux8Way.hdl new file mode 100644 index 0000000..c5536b8 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/DMux8Way.hdl @@ -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: tools/builtIn/DMux8Way.hdl + +/** + * 8-way demultiplexor. + * {a,b,c,d,e,f,g,h} = {in,0,0,0,0,0,0,0} if sel == 000 + * {0,in,0,0,0,0,0,0} if sel == 001 + * etc. + * {0,0,0,0,0,0,0,in} if sel == 111 + */ + + +CHIP DMux8Way { + + IN in, sel[3]; + OUT a, b, c, d, e, f, g, h; + + BUILTIN DMux8Way; +} + diff --git a/nand2tetris-suite/tools/builtInChips/DRegister.class b/nand2tetris-suite/tools/builtInChips/DRegister.class new file mode 100644 index 0000000000000000000000000000000000000000..74a713d010fd8f6e39ea4d2b8bfcbc497026feef GIT binary patch literal 339 zcmZ{gJ5K^p5QV?twLI3xqM)daRzTtQVr(GMO^Ag?tXJGDSK%&!i~q}nU_xPO;g2%j zEhsF^Bxh#MoXI@Cf7YLX&runNN{Iq)k*zY@?4+>k;5k%xaM&h!;vY z?%#yNS4;RCK{uI96CG*O5gPv%1!o?a+i(&IwPyb%d<*??sAK=$%#@Bh>GBn;=qJO_ zs6-3-W)QRnoZ8bJ`w9?i_ArZOo1K%j5uCL@koJW_26Idmk3h9 zgFnC@B~C09kwE6XyqPyM`TG9&1Q4PXz=QHp#(IDaR2{%M!n`s^n1w zGsXdL=JC!z3FKzxJ78AjNE}zX@1R$wLtoLCQptmjPL_Cn?u9^ literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/HalfAdder.hdl b/nand2tetris-suite/tools/builtInChips/HalfAdder.hdl new file mode 100644 index 0000000..1591b96 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/HalfAdder.hdl @@ -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: tools/builtIn/HalfAdder.hdl + +/** + * Half adder. Computes sum, the least significnat bit of a + b, + * and carry, the most significnat bit of a + b. + */ + +CHIP HalfAdder { + + IN a, b; + OUT sum, // LSB of a + b + carry; // MSB of a + b + + BUILTIN HalfAdder; +} diff --git a/nand2tetris-suite/tools/builtInChips/Inc16.class b/nand2tetris-suite/tools/builtInChips/Inc16.class new file mode 100644 index 0000000000000000000000000000000000000000..b5b2aebe7bb4d4e7e8ec8d59b79b8302b123e9c7 GIT binary patch literal 333 zcmZ9H!A`95K1O-vtn79BojV#f$<3_|r8>J=o^-KH`6N8Bh zKfsSNP9-76&CH#-b7$^+eSdrc0ee0!#-qfV&pPECZRDupQgzu>lzLGd*%O6swMPo4 zpWKBC?>X!z(^+Oi!wQ~Zi<(Q_uua3TL(Q;DQ&GLmq9;3u`w!794F>V#@JLZVA5R{G zv#|}+;B>*~g=~#tS$P%3sVJ{6{)}D9)ni5ZUrSuwhxXUoP~j(;UFvn36HaT`9aWJapPaPPVIJm)$0ylwva`?uc#RPank9#?f-!*yOh z)bNpxG_Ib&yZD%;8@zm?<5S#Z=`$U3xW&uo47ttA7dpPgyiU>rD;61dhnFhfeWhV3 zgJm5#)H1lM;hu)NhWi4k9d#fe8YH#4mcUHCVeNKp8MvOmv|g*+QwQ6w^vp$fx8pj> z3FZVwZdr~M+$NJ^X+t2r=$cAkyrlxNNPq&9#Zvv5+>;ggJg6l1M4*$?RZsc8G6l{Q zk3edVJh0Cy3vS9F#SJCFmMjj1{!#1U>zG89vS!s zn+6^;)fQ8IYv2jKGjIlH4SbIuG)M#6Xc{mvV?g1lffm{ZEIxjK%L1pDWpk&pBm?D# zYZ8pWMaoH7heBKW1;;H|9M+Y>x~~fJYpP}Wf%3MVa4ccwRI?hl#RPFvlwqGNOUJa? zVLooS{fhtGa$1$UgH1QdLHt`Ia8jBkQ5{7zeOyQO)nQW(Q}ZfnyL=eXdSKaBU{TfX zsHZ#{QU9Im2Yjra#~_L!8lV3f1MY0M8+5wCs>Pi>u{D^<6&gQc8y`q6Us3+TH>Qi! zSJQ2QV5Sso{B>opL&6@*T`*7OdjIY c9}(@5iNF>5>FGO2krAMW@Y4)u{s9O02gQw$Gynhq literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Keyboard.hdl b/nand2tetris-suite/tools/builtInChips/Keyboard.hdl new file mode 100644 index 0000000..26ca5ed --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Keyboard.hdl @@ -0,0 +1,23 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/Keyboard.hdl + +/** + * The keyboard (memory map). + * Outputs the code of the currently pressed key. + * + * The built-in chip implementation has two side effects supplied + * by the simulator. First, the keyboard memory map is continuously + * being refreshed from the physical keyboard unit. Second, it + * displays a keyboard icon and data entry GUI. + */ + +CHIP Keyboard { + + OUT out[16]; // The ASCII code of the pressed key, + // or 0 if no key is currently pressed, + // or one the special codes listed in Figure 5.5. + + BUILTIN Keyboard; +} diff --git a/nand2tetris-suite/tools/builtInChips/Mux.class b/nand2tetris-suite/tools/builtInChips/Mux.class new file mode 100644 index 0000000000000000000000000000000000000000..75c66452bb093e5fcab3b770331d2b3cc81b6af4 GIT binary patch literal 356 zcmZ9HzfJ-{5XQgZ_E_#*<&T1Yz`_n_F477VUZEyxOh{;~P&c|!?})dT@GQQ7wTZ#R z!Uyo7jI)vuW3%&{`DVVI`TG9&1Q4MWLP7;7Vl~7X%8n|IsuDGcbwaUk5@Ux1uiY6F zM4aAeLhz*H^l_S7tx!Usuz|WnLtztJ3frhF?4U`gT;=A$o+R;|nP$;hJ|i@aC)fAU z(ZuR3I$WqOVNa8=;e|;uLhbVOPun^Fc|a)tEAdXZ+Wu}fB7|vfm-Alc1koOK#@OSV zBwq^@KyF)pL(ZxkiKE|r2faES0xL^-!0m!-``tGbyxtsM-;r=MaO680G6}D@`wZE9 LfoRR)FRbtbHwHlH literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Mux.hdl b/nand2tetris-suite/tools/builtInChips/Mux.hdl new file mode 100644 index 0000000..a0eefbc --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Mux.hdl @@ -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: tools/builtIn/Mux.hdl + +/** + * Multiplexor. If sel == 1 then out = b else out = a. + */ + +CHIP Mux { + + IN a, b, sel; + OUT out; + + BUILTIN Mux; +} diff --git a/nand2tetris-suite/tools/builtInChips/Mux16.hdl b/nand2tetris-suite/tools/builtInChips/Mux16.hdl new file mode 100644 index 0000000..676d1f4 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Mux16.hdl @@ -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: tools/builtIn/Mux16.hdl + +/** + * 16 bit multiplexor. If sel == 1 then out = b else out = a. + */ + +CHIP Mux16 { + + IN a[16], b[16], sel; + OUT out[16]; + + BUILTIN Mux; +} diff --git a/nand2tetris-suite/tools/builtInChips/Mux4Way16.class b/nand2tetris-suite/tools/builtInChips/Mux4Way16.class new file mode 100644 index 0000000000000000000000000000000000000000..b2e2ed773d8437a2fd7f69d81ca6300eac2b0702 GIT binary patch literal 435 zcmZ9H%}T>S5Xb-9O?GWet!+*HXhl2-Z9Rk*&BfY-J*c1}6zaiK)u2I5i%CFz0AEG$ zCP)PjK7bD;&O|8UVP<}_^RfT=`u_L?;G$|l!_Gn>XJH0;rdg(fMp2_ApxQwg#2o=y ztM>(r?(o7F$lm$g;q54ieH&BA+L(i*QMNIU1sjWSY%HN7P(Dk7n|MF$UInAbJxuO5 zP6iK6j|zK(^J{l^5c`q4^V`D-Z4N?OdmMz3K=Jh8Pumgwyd{wT_e9Dr{W#Uv6R?I! zJeijf7mQl3-p49krs-xN1HqcfTa* zW-^&NOp3`f78i@&n>gpj^Qa*9DGUX)l63YT+Js1UH zLqIE6dIEZDeCZ2V_kL@9H<^XLgCr~mD^L;z2dh|funy&514V(ta2DK#?NRGGm`vT1 z*~4Cc@VM(y<7jYk;~ow|f9f{l3@_;BU_{q;g3(kUe|G#Qc1kbr3uOLn(PUSC7|que zu*b7-abBBpLoatLJ#5j>B>fpkK=8~|ZCd5X1-VgugLvUSbfgyTZ;GdA@2mQXgjSnF zt260L2TTT2gUMv_bVeDW!I+HDWX#418F3s*MjU4>&9jyD9F2fsY|+R%?mYLeQd t4yjK%FM9S9+!EKyCf9AHvz3&=rj*H+R+3Gsq-WEUx>i&697gYwnJ2vWg= zKfoU)&RQtqW#+wk^YP~E`{NTpgiZht%0~@r0oGA>Xv3kA{r%GN@$%Yw-3=- zVs#OnE@Ve|smXZbmB|W1K0oF0 zyFdlx>~aj4g`A0Vwf_!!bvh(gm+~Pq!L@__8!BQjhZs5}9Xe(t#Xz<@&*{q?)x|V^ E070NX82|tP literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Nand.hdl b/nand2tetris-suite/tools/builtInChips/Nand.hdl new file mode 100644 index 0000000..ae0204e --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Nand.hdl @@ -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: tools/builtIn/Nand.hdl + +/** + * Nand gate: out = a Nand b. + */ + +CHIP Nand { + + IN a, b; + OUT out; + + BUILTIN Nand; +} diff --git a/nand2tetris-suite/tools/builtInChips/Not.class b/nand2tetris-suite/tools/builtInChips/Not.class new file mode 100644 index 0000000000000000000000000000000000000000..4726b678408f6fb87b2a44060bdcb07ce67d8fa0 GIT binary patch literal 331 zcmZ9H%}N775QM+UZnEw=njcM!#*5$~$z>r|g9md^L4pv-#Zxqk4(e`jXP?9;5hQ{K zAHatadk6&a(p^2(Ra5=_^Z5nD97Y7_kP2H7+f*H@IaCj51nej(Lz5bNs_?qKslp#+ z^F$H8B%|zkQP@PYL8#fK8PL+~(bnwK)Ev-J)NTv&WG~avgIVP9IJ1h@#q91eKA+hn zkIz=D8^qJ3Vt8%RT+z6>`m;8cKTj0Ze@~L>J`qPrHc>=bVb^*ucZA=a^rjriO@Uks wC6r4mHIk_=T}dzZKTvOu$7gd*ALEGt+WmJ*-e8G06y$pYzcYVbQeG+e1^K-^2mk;8 literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Not.hdl b/nand2tetris-suite/tools/builtInChips/Not.hdl new file mode 100644 index 0000000..5b9d897 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Not.hdl @@ -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: tools/builtIn/Not.hdl + +/** + * Not gate: out = not in + */ + +CHIP Not { + + IN in; + OUT out; + + BUILTIN Not; +} \ No newline at end of file diff --git a/nand2tetris-suite/tools/builtInChips/Not16.class b/nand2tetris-suite/tools/builtInChips/Not16.class new file mode 100644 index 0000000000000000000000000000000000000000..ff3e68f6b9766669c35db54e79cc853dc9a3628c GIT binary patch literal 327 zcmZ9H%}T>S6otRZq>YKu{%EyYH-d|{n_w4iEN-$;K}0BY@rp<{!c6(!i zpXO5~2%lA&Kg~*`Vpa%aHfaTH#cb1#*`XD)OGnVWDfOc{&(eE6E0W9H93Bbk%S(Gt zXZF~Y&I-$1Uz|;DACl9FQI46aV?k|cW%JxA^OtHQi1N}bcv(2Z?~Zz7_U%7`{S-We uOKNLmr-tpq_DcT)@#cJdRu}dG(gM)#zvIcl967YgmxGS?@;ayTPw)$doI11s literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Not16.hdl b/nand2tetris-suite/tools/builtInChips/Not16.hdl new file mode 100644 index 0000000..c50dab9 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Not16.hdl @@ -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: tools/builtIn/Not16.hdl + +/** + * 16-bit Not gate: for i = 0..15: out[i] = not in[i] + */ + +CHIP Not16 { + + IN in[16]; + OUT out[16]; + + BUILTIN Not16; +} \ No newline at end of file diff --git a/nand2tetris-suite/tools/builtInChips/Or.class b/nand2tetris-suite/tools/builtInChips/Or.class new file mode 100644 index 0000000000000000000000000000000000000000..a5b64f9419c5dcbf1a9b30e44d7d32cfd0cda243 GIT binary patch literal 340 zcmZ9H%}&Bl5QV=>3$^tsf`UJ=(G{?;30u*HU8sps6B0JAP#e8b3Zd=ZckoF}3??po z03XUYR}x~(O=iyAGjrz5*Z0RK5Yi0r&^{$r0#+$ov}RGoqw2A)DD_NYvLl7lY7Z1{ zG`@=!{xpupqe-5{nk9VA1~remW|J+=HZ{!-4Mq7TH&5AF5Y5Pg%~WW94WCNc3NBG@I@9HbHq7G9x(s1S&S)v1Rrn!AwOEBqaH{sC)2 zB3SqX{88epfgmni`vE6B<{Ad9cT6bZ5qScsAL+h#v{9 zqxkwhJdACUhX*r(D|oF*dFQ!Fb3*;{&+ZYb|5|M8HnG3v1_VDV?0jD2j*y)} zcZeN+OYy@%3FHiO^tq~WCeG#H9rWsWNG#6jfaN9bZ3k~CiQW{V&q#`1`x#2SK+2~n I%CkBA0C(m+`Tzg` literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Or8Way.hdl b/nand2tetris-suite/tools/builtInChips/Or8Way.hdl new file mode 100644 index 0000000..dccd61d --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Or8Way.hdl @@ -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: tools/builtIn/Or8Way.hdl + +/** + * 8-way Or gate: out = in[0] or in[1] or ... or in[7]. + */ + +CHIP Or8Way { + + IN in[8]; + OUT out; + + BUILTIN Or8Way; +} diff --git a/nand2tetris-suite/tools/builtInChips/PC.class b/nand2tetris-suite/tools/builtInChips/PC.class new file mode 100644 index 0000000000000000000000000000000000000000..1e6ada1389a15401a6a660b935e8cc6a7f5d8f92 GIT binary patch literal 1899 zcma)7-%}e^6#gzr2rLU}LV=b*n_AG2R??zUEkCrRK%*2R2$f=Mm(4cW5_U1Wq4mi> z!l#ZeJ~-1CA9SV-PCKJ-eejP`zq9!Pb*4^-;oNi1J?Go+oO|xgUw=RU13(s44QFsg z!-x1t#MLNfG=y=b8>5)*!kifMB0d)JiHK_=79=32;W`#YTN2;0Xg9={*YGJm(`c@A z;ijysB0d*U5b;G6Yh75^FpMvw*oa~?idzbi1EW&26x6yxs8q8Rk}Ee1b9Z?opIx&` zw&z>boV&O0I+o+lD0I%+j_uDgI6bkc5YD+pW=GA6Ywm9BD|83ib@!p85Gz?eaoXt$ zgXxKt2gZSsH6Hrewx6(iKqFT+oRU>km`DdCf{+>+6pX6xy<#mM2p^%)Q`;{ZzO~t? zBb;6rXCF&hHf+Z#F1cpSQ_#pI2)X8ybvi%6dbPzzrnT?et|I|v*)n(YPSJYQ2q22) z9ZQO&^MuwhhVdxA(y@ixI=1n(!s*vGOvhU|&t4UBS9RRMT^-+GT*o~aI(A^{D8kZl zAEhYDI&3`9k-|A0A7EO?E=oEon2cgiha-C~#uWzgm5Nm|Dk-B_tXiIz3RgXp8}H$Lg;T;TyUg}@fovB{(uG{AY*c9knwqNEkD_jirF<@ry}FS*}To6R$_@yf3IRof{AqZ48O zEY3p@<%(+>G77vB>3lvIEH?Ov?d3Nc$yP#ue}V{$)v8-}xW0Y=yZ^d1i&My3%1eoJd~MD^;Ve4%$9d+n*C7{yt42RB5arvn))1lwEM*R% zen&?gp~slXyg+#C5Rqr-%sfSBB3eh6D0Otp5?5wiJ+DI(BU49DbJc$%68I>-)5iCS zAEB?zklxT#9euN+g+-eaEh5^yXq}=>hX=yppNJTGhS(FNMgk)l82zI(`Z8Nj5ewh@ zfi7lszHBTZ>ajXbv>2q@42D^`RM^Lecxb8-muSTCnM0=8i8xn@iwNqkR6z3rE;hFp zSV)Mz=?iuA&#~x}BR@hLiGTmk&p4Y&4Ae0wi7zoEON-7E_HE=4LygaM$m7t&yF|1O z;*DjbIOdRBvW^6iPc?w_0EoV3QHsA@tz+vA*pXqYj!U>qI62Wlt^%xOl7~1=jMy)< zfGPfm`Elt7U#4bsvPmPBe2m@~7~V=SYvj)c>`{u6_pq5V#8o=c)A+zqc}L;+7lp^H AdjJ3c literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/PC.hdl b/nand2tetris-suite/tools/builtInChips/PC.hdl new file mode 100644 index 0000000..f102d99 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/PC.hdl @@ -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: tools/builtIn/PC.hdl + +/** + * 16-bit counter with load and reset controls. + * + * If reset(t-1) then out(t) = 0 + * else if load(t-1) then out(t) = in(t-1) + * else if inc(t-1) then out(t) = out(t-1) + 1 (integer addition) + * else out(t) = out(t-1) + */ + +CHIP PC { + + IN in[16], load, inc, reset; + OUT out[16]; + + BUILTIN PC; + CLOCKED in, load, inc, reset; +} diff --git a/nand2tetris-suite/tools/builtInChips/RAM.class b/nand2tetris-suite/tools/builtInChips/RAM.class new file mode 100644 index 0000000000000000000000000000000000000000..e17050f0cbbb0bd207174db146fedf32ee3c7ce2 GIT binary patch literal 1928 zcma)6-B%k`5dYnLbjfllfl7;nP_UpOMPpI?0-`jfG#Y9oLZ#G?WwVAYVK?q>p#CWy zU-ZQ%AM_j>daS3u^}#>N0FFE@C3ic~2Bz3(@+%L3DtTZVZ^YN6`d zPGHqHm969+wOq$?f@M0qVmo$F6iDRC^E>n_xphlGGn=k?xZM(n=Xg8iS$wJ;kS(Qb zH{26PV7Orggx^CHxR{%-+&7Mmf^iZQdixYfsx(UnhSRX>0`obQoN^&puWERK|IBLr zm{a8FgY8z`2&^6EDUi&SYrK2D(Y7}X+p+35U9(O6bxKD0tOX$-x(3{kGi<%1-IPZuy0+wM~KS8HnqlmGSP_!GY?O1!a#) z{JdIJY(KCZ%M-YC22SO*X*foMErV2pvf~GaV^XOy)C|vYrH&Y}eU&0*uPTn zx4VQwwJEvOu}(l`OXl{%f^)@e-zLv3_k;}WR&h;(%d7fAweX-(ulG~E_F{e3J)rt6 zO$h6r=X%{;fh!S=YD&MLtV-{?sDmlnp&6;#+-#$JXQ|(&u_DUDXKsVHh%jB4qFtkw zblXAie4NN}8!PJEtl=OX;}EJ*+tUTp%W%PLT88%wM@m_@Xhvxe>DmRx za^V~|XK@|c161>;5c$ks zsfUO?LcD{-4=CmzBe{Eua}S~A|4?77g8^3410AGT8Nn}Uy#rm@I~a`q@^`}In6Duh zMcSZ93EEpGm!bG#2j^EHOj-t@4{Z%P=!Z3^@n-#=Ci3>!mrQ z0#op=X%TNx<+z69^yeDNeC8A{hs=MaHSjil2?{+yc6y~E|Jmr$#xp-cX4wD9&lq}) eiQQ2GnEX48&_65qS&Yt(M+Bl+nLf?FKmG$iD6ZiE literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/RAM16K.class b/nand2tetris-suite/tools/builtInChips/RAM16K.class new file mode 100644 index 0000000000000000000000000000000000000000..2f1e3feaaf03e35f6ada3dbd8d47cccfc5272dbd GIT binary patch literal 390 zcmaJ-%Sr=55Ue(j*-h4%hw*KQC)Xe>UPO$Dl7lWLA`x@nBtsm{&V=l!_*sHP@Ziyd zA0^Is^dJq@)!jvP(_i239{>W>a&X|eV3>DM$YB9R3ndF>h6=+XA$ugG(8q+7ztbb6 zTWZKXxTtzq!ZN|>o_6Yc`xl1{D;`#{=3(6qH?T>l^dH1nhq84mCP`qFMo1|B?HXG@ zwC--qV>Nv~y9o*P_IWh8H#E3XLTWzj{LWe`o+!zsZW3z$D+ny%`Z9_+q3XBqqQ@v0 zM{*Qg>#2~VrrlUDik?VBf6Tk;DIw%dqpb#!7D^H_erOKEmidumeg=>U7deA@Qym~> l7_i$Yo!|}Bc*Wc&>Nb^AGo&pkvKca#uo7+0kbSW>zz>IXREPio literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/RAM16K.hdl b/nand2tetris-suite/tools/builtInChips/RAM16K.hdl new file mode 100644 index 0000000..7031bf9 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/RAM16K.hdl @@ -0,0 +1,24 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/RAM16K.hdl + +/** + * Memory of 16K registers, each 16-bit wide. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = RAM16K[address(t)](t) + * Write: If load(t-1) then RAM16K[address(t-1)](t) = in(t-1) + * In words: the chip always outputs the value stored at the memory + * location specified by address. If load=1, the in value is loaded + * into the memory location specified by address. This value becomes + * available through the out output starting from the next time step. + */ + +CHIP RAM16K { + + IN in[16], load, address[14]; + OUT out[16]; + + BUILTIN RAM16K; + CLOCKED in, load; +} diff --git a/nand2tetris-suite/tools/builtInChips/RAM4K.class b/nand2tetris-suite/tools/builtInChips/RAM4K.class new file mode 100644 index 0000000000000000000000000000000000000000..164ebf8cf730b99edbb8eb31c57b188e120d958c GIT binary patch literal 309 zcmaJ+u}T9$5Pg%x+uXUD%W2d~B3N9~Y?I1}AXn&-L_{(DYL>W~+YQMo_*sG|SXf&4 zQR1GZg$&HRnK$#8_x1h$0YG3oLVzg53Rdgj5!SHI&|ruO!J#(V9TBQ&XH2MNcA_{K znj8r>2<+l`)b0%q7&bXt*dip?4|?Wulilk1Qh2&IAjE%%UMkH?#jsF?T|Av!<%IU| zRNmZsD9)`mPEAI?TxN^8HOja?VfX(H|IkvoGg&A?D;?g+M=55~OvR;JXfy41#@O>V n18*B39}IP$L*MPA;t{aZZN_*5bze~V1TRZceMRlLJOO?HRV71e literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/RAM4K.hdl b/nand2tetris-suite/tools/builtInChips/RAM4K.hdl new file mode 100644 index 0000000..8f1b211 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/RAM4K.hdl @@ -0,0 +1,24 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/RAM4K.hdl + +/** + * Memory of 4K registers, each 16-bit wide. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = RAM4K[address(t)](t) + * Write: If load(t-1) then RAM4K[address(t-1)](t) = in(t-1) + * In words: the chip always outputs the value stored at the memory + * location specified by address. If load == 1, the in value is loaded + * into the memory location specified by address. This value becomes + * available through the out output starting from the next time step. + */ + +CHIP RAM4K { + + IN in[16], load, address[12]; + OUT out[16]; + + BUILTIN RAM4K; + CLOCKED in, load; +} diff --git a/nand2tetris-suite/tools/builtInChips/RAM512.class b/nand2tetris-suite/tools/builtInChips/RAM512.class new file mode 100644 index 0000000000000000000000000000000000000000..69bff7ae05671ed0795b54349ef09eeab52db15b GIT binary patch literal 311 zcmaJ+Jxc>Y5Pfrrw|D1izKmK)1dB_WMZw01AXn%?BBGdnHA`I0?S^C({8@r1SXf&4 zqr^Q+3mKSsGw;oV_x1h$0YG3QL5L*A5|$(I1S?o&s4>(D;h{F#9T6&NcSNXWcC0uU z8XQfu2+_syu(Q9rcfhd5(Z)KVb^V~HE;re&o-KsuJx!?py?V1WFFoTz6?Xn~a+MQ0 zgHw5P@1Z!i+Bh{H{&JZuX4WX<`h>0j6$G|W?o1Yn&`t+;@==PZG!t>@=Gsj9-4V8Z n(9j15$QMK8d+fIz1RepKy+(jHQ11o7CwMuUl~+`s%NO7WoCHIV literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/RAM512.hdl b/nand2tetris-suite/tools/builtInChips/RAM512.hdl new file mode 100644 index 0000000..2a2f433 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/RAM512.hdl @@ -0,0 +1,24 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/RAM512.hdl + +/** + * Memory of 512 registers, each 16-bit wide. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = RAM512[address(t)](t) + * Write: If load(t-1) then RAM512[address(t-1)](t) = in(t-1) + * In words: the chip always outputs the value stored at the memory + * location specified by address. If load == 1, the in value is loaded + * into the memory location specified by address. This value becomes + * available through the out output starting from the next time step. + */ + +CHIP RAM512 { + + IN in[16], load, address[9]; + OUT out[16]; + + BUILTIN RAM512; + CLOCKED in, load; +} diff --git a/nand2tetris-suite/tools/builtInChips/RAM64.class b/nand2tetris-suite/tools/builtInChips/RAM64.class new file mode 100644 index 0000000000000000000000000000000000000000..a1fe78ab90af4332d0a4dae904dd6f871d6cad28 GIT binary patch literal 308 zcmaJ+u}T9$5Pg%x+uXUD^E9TDh|MLW~+YQMo_*sG|SXf&4 zQR1GZg$&HRnK$#8_x1h$0YIP?AwU#j1*>)N2y0kpXfVWt;6NMg4hhw?GbYqBJ5d}A z8ypEX3GCu{)b9888MZi@*d`>`4|?Wulilk1Qh2)GBgB7)UMkH?#jsF?T|Av!<%IU| zRNmZsD9)`mPEAI?TxN^8HOjaFVdwu1|IkvoGg&A?GacT^M=55~OvR;JXfqvj#@O{X m18*B39}IP$L*MP8;t|m5#z$|U?h7iP;AKgwuc$qj7r+nqJVR{& literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/RAM64.hdl b/nand2tetris-suite/tools/builtInChips/RAM64.hdl new file mode 100644 index 0000000..6f32f47 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/RAM64.hdl @@ -0,0 +1,24 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/RAM64.hdl + +/** + * Memory of 64 registers, each 16-bit wide. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = RAM64[address(t)](t) + * Write: If load(t-1) then RAM64[address(t-1)](t) = in(t-1) + * In words: the chip always outputs the value stored at the memory + * location specified by address. If load == 1, the in value is loaded + * into the memory location specified by address. This value becomes + * available through the out output starting from the next time step. + */ + +CHIP RAM64 { + + IN in[16], load, address[6]; + OUT out[16]; + + BUILTIN RAM64; + CLOCKED in, load; +} diff --git a/nand2tetris-suite/tools/builtInChips/RAM8.class b/nand2tetris-suite/tools/builtInChips/RAM8.class new file mode 100644 index 0000000000000000000000000000000000000000..88f106e2b625bb9699c2850f6b131f6542b2a24a GIT binary patch literal 306 zcmaJ+u}T9$5Pg%x+q-i$muO5U5t~bzZG(}3T%iYvh+_KHEO9lr8-+r!fIvG&fH=YiHbd|jTi9l(GbDuISR3tzglgKI5Nes7Dh`GQ zM-w}qzdRXt`bP}A94+h-8aI!6?sAje>BUNTwogd@-n>zomwr*93cGwhz0L`p(V4t` z@K9V>ZJe5pf4R&S3u}~d1H%6Q3IbaxcPXr-fj`6R_$nwhwAOKoO@?gR%uWZ**s iiG?0u#Q_`}PQuclOU-&q8W+W@v{@@4Qx6FBWIrrZ8^yA>y4P-W9{UW&1sGycZA3&ikTxe;haC z1G4y_e0wO4hw&j19~PY-5%E#^`bZ3q3g9tWd@PEO$MA_bgZ!kJ{8S8|mhm$&JRZdp zaomnG66j}T_PH1?%J_K^PsZ?tD83lQm!fzoil-Gsid92F*XV>%u9h^{vYnArx$Mak zV}n+?Vwt+>4k%c+pp~k+qo8SKf~$juX}E`YHr;btLGz$h&=s`Wx*VyxoNp}ZF4fdk zDA=0r89l2lXj$#No2~Ct_4<;f6~=9=XlrE!Thallq?yI+glijSaX@Uuhc4vxifdRV zo!C$b;Dhr-=>-Md>CwBj{JHGV0^N18p*DZzpH_YM>+qfs9=dCfYc@|cu9lCkuT~10 ztDlzm6||&t6XMPWk~X3lrd}Af@>RMNXTUz@uuDSHxgOFK&(G`mb2+o1UkLUj4yOUv zTCixeteFg9YkFq2$W;tuM8#1IMe&S^FXJmJzKX9Y*uHkYR2;#eimzi)#Wygm;+yyu z9bifisQ5Ozk~0p_#U29aS7j7@dI3r;))6nODeA7vWg$#c@@_%9mNYOM)4zt z-#<^9qqwf(MZBcq$D;iwqA@2Le=6c<7-5*BOe%BN-`}s|=NOCPWfi}`E23vi!A?J0 zhaE>R&z5vMTc6dltm2n~epPh;3L{bcTE%a~v)|%(Lc{M>`~iPdF@Z@1n{uU+Uern{ z!*pD`nwK(BaW5uSyam$=I(>5^Orw((S+}B~ZTTqEBy7{*pYRI#8a;9NsER-1B?ZYE z%B+@WbvtFvr8K)(ElagAb$(qpRP2%J+?;N!_zV83;&1r70wpVxf2jDUsNOv}Z#b#^ zyirLNEZs5pxGASvsaUp~a{Vv0qS!QBHA-&I93<3{p1f_}F;;s+I7b42L^Wl&^XxeV zeg5~xa$cplM-9i-P2EZ z#}9-~4w)Jg&$8zYaxb;8D+Vo-4hf$v>6xI(q*n~bAo8Sjo*x7@YUMS_uiuL~>BT5_ zk85S=PFv@kIIU1vcK+7?uiI+}{0k#N4dE?P+gEVQ+P6#%tKG1JK8ao(_GaAO0xvL&~-1WXnu*mPFat)GwhOf;u`Cgs){ zw+s@@lu>5L`y-MklKN1sWaM&p6 zL4jG7X;sW{X{#sr5>o z`?WG59_E?tNo!KSKxVcusVm=EMY4Kt9x7z5#lx3ge z#eCFYCA8P*Fs!VQL__N|YLNG+uQB;2X3y$*cVMN};HKlb8{oBfdxevAc+9l|5O(tK z%w1^0n{b%2NuDnLd25mvkE04j9ze>wxmrMkGvI7y2}&l>^g`Wv*e} z^b(?15X)Tle-RI@GHs7~h|8oy8SYT_cvvrsgzBM9CLT7(knylF9NWXO;}Wd_&GNj3 zKJ2FtP2B4tBoW!?Vbej*Hb?eRMw0tIY>~4s2PTppwgxH`ycx$r6&)NUj21yYCkAMN z?;`a|l=smB|FmMFH_^oCwv7b}cl0JYJ-p^(;B1SB?TdjC2Dd%aM}IU_A8d7|n~>I|#ffP^HR{*x@0Sp~9UWUb_f&EYs&bof--6VCdsNYam-z4vTsJ<_xD<#-u*Xh75-}NL7?4_-S*cF_rr?Sm=l+M;t zbQ)7(4mvqXmeovh3H`q2{m*g@)X2;7JO5mS_+4~D@SVvgp$hYn>(8L=8nV-g*Dc}J z7jGm!OV|1DBs|+01`ygx3LPu)Gk9x=f13Da+IqBC%5PudHV?1Ah=tzkEl-6e_lwB} z9{dzu!|m*jJN$NegNHXJ4tN;oZKjF=4+s6MGQBq)56;!nDk1D;zLzy_695yw7#h1X Qh)-eto+P=F{bi2uAI7bI+W-In literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/ROM32K.hdl b/nand2tetris-suite/tools/builtInChips/ROM32K.hdl new file mode 100644 index 0000000..929f824 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/ROM32K.hdl @@ -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: tools/builtIn/ROM32K.hdl + +/** + * Read-Only memory (ROM) of 16K registers, each 16-bit wide. + * The chip is designed to facilitate data read, as follows: + * out(t) = ROM32K[address(t)](t) + * In words: the chip always outputs the value stored at the + * memory location specified by address. + * + * The built-in chip implementation has a GUI side-effect, + * showing an array-like component that displays the ROM's + * contents. The ROM32K chip is supposed to be pre-loaded with + * a machine language program. To that end, the built-in chip + * implementation also knows how to handle the "ROM32K load Xxx" + * script command, where Xxx is the name of a text file containing + * a program written in the Hack machine language. When the + * simulator encounters such a command in a test script, the code + * found in the file is loaded into the simulated ROM32K unit. + */ + +CHIP ROM32K { + + IN address[15]; + OUT out[16]; + + BUILTIN ROM32K; +} diff --git a/nand2tetris-suite/tools/builtInChips/Register.class b/nand2tetris-suite/tools/builtInChips/Register.class new file mode 100644 index 0000000000000000000000000000000000000000..3958fcd4ecd31f6dc560c2c6bbc0a9594988cc26 GIT binary patch literal 423 zcmZ8d!A`EpaP2A01r*LiXOy7O^h)Txp+csU_;Y3cB{YRFPJDM9{d15 z$~X(LF*fq7|(7(LT-Uhf+t^K1wvpORSPwNI(7tdumyHe6=-0OP`-<$ zr_TNURECjr?M`H*+y_GCY&4!Zrz7P?&hb*B32&Ev7^^GkM}*St#UI%v=Qtn~{ylNd ziK`ZAIlLXjD)AeU9+<5`dx$3AoaHZJt}`++7;}EEtIUeriF>;94tik#7Uq-jK2mG| s8l6|9jP4vpPa{*K!@Bv5Y^U}H^Ve8Nj8!)3y?K_WjV@Pnj?7YrAGG*L>;M1& literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Register.hdl b/nand2tetris-suite/tools/builtInChips/Register.hdl new file mode 100644 index 0000000..3b81e46 --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Register.hdl @@ -0,0 +1,19 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/Register.hdl + +/** + * 16-Bit register. + * If load[t-1]=1 then out[t] = in[t-1] + * else out does not change (out[t] = out[t-1]) + */ + +CHIP Register { + + IN in[16], load; + OUT out[16]; + + BUILTIN Register; + CLOCKED in, load; +} diff --git a/nand2tetris-suite/tools/builtInChips/RegisterWithGUI.class b/nand2tetris-suite/tools/builtInChips/RegisterWithGUI.class new file mode 100644 index 0000000000000000000000000000000000000000..c80208ce3124d2af6d0181ede434262dfba8d24a GIT binary patch literal 1769 zcma)7U3U{z6x}x;opw5H+9LfRRf8>>1SC+!k5Z}-LWzc2s0B+!oleGNXgZUXnH2sC zZ~g!ubS+3+vX;E@z>jjd&m@_K2V6Yl-ZSU!yU#xNo^$i+-@pF>P{5&%MO@PH89tZc z3k_fDNZ`^K(pVkEW%*c>;ff6FGJGY&*8;ez;~I)$T^CKP_ZH45K*=XAeigvu#b`;W;o2GTJu~RPGv1^VW*sY>>*z{c6 z4K6E;tU0a|tP`Bg-Bm~wy()KWR>QLncA5%fp>^GRB4bH9{H1y6M*JszNRsiU=WXD%dhxf&bc9=}7d5gzY6kY*ULJ|;wm2u5%7*E< zcJ+p5wS5JhT0+RxfU2|Q9P`ynk1e|yIG!s2t8QBdWw&ZS?g7Z6`$L1SLo<4Ahv zGdsSW87%ERkd*E#Ebh0RMo@N(b*Je^cYn_b>bygRcZb4U>mem(w0;tnyifTrpm4#n6AajO0#0#0A<-sJANpa3QMlJ-;mm2VKN(ySGQ>% zlHp{wS8@&3R$)76Ic}|2H$+rC%ar?PA7smADV$`>rk^UzYV}y{#kZ@+!G@53iVUSz z%WDn13QK*Ouz3AKxEk66NVsv#ae0PYj#TB$-f;GtY&K?{8afbhN#}}YW-e9jwS#DX zJWS?<)v(RhYhuW~{5ChHFgoZQQrm1(_99ykr}?HVf^~ryA0QSjAGL&(J7=AKwh6~& ze%(f#7EsD}q5eXwgZLAy=AR?6+ePvjM)FTFGNW}cD#kRPPU#(tiQR!NQ@(@o{%rh7 zA_;URqF*O{oW2!8CgLj{Os1Rj@!OPwhr=99xYQXhj#C3|vh}20U zrsKj$+)NLr@DZ~8l%_cgE-9>k&;UPk$oH2QNE4%Pg33?i&vx)m7bklxF=^jE>;iQQ zY`5{681`ubWGK900bgh3g2An!c?RAS+Y&-UZ%`E(a^lEv=?0~h#9 yF!(&z`F8Zt>As9q`UxhUV}5sLp^H;5dbGz|lsroPEpwdZ%*T5H7Nhiz;rI_~p literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Screen.class b/nand2tetris-suite/tools/builtInChips/Screen.class new file mode 100644 index 0000000000000000000000000000000000000000..100ed03dc68a20edc3acb9b47e7f9458a680de3e GIT binary patch literal 1322 zcmaJ=U31e`5Ixr)2#Xt12S^NZAf+kThGGbxZ9-@WA&3S@>mdx~NhlgeL`WW62L4K? zFZ8_+?M$&dr2}s~^hb4iR#J?oGwpc1cX#jZIeT|kfBpT(I{;0zOibfU2}f|}Xx zqG{l~iDK%$AliZiTr_bBm&Lpy=2bDTnbf`%@s)^0155jH-9#D7V&5?EwSg6de7o-} zoY-jj&-;NBN8R4~L%Z2>yPg-WM$bD@=!Nm3!oC+y(D!-@xhE}JOMd9b%S^A;w-gGi z(YB{xxIyIZKI|xzx}GHWV|q)8_g3^WRG4ggG4V&h3e&av#xv)I({x_O&5@sk2l}0D zC-%04R-st4Tf$@#AaSk4q^;R?7Gtixa=lLMM~ky-|{eg{sC; z95ZlJV->eF)^J;4_J13oF@uW6I__xLxNG1WjSbw>XkcFBKJIEfz^29t0smG+4RwXe z9mm~muJakaM2-qon6QJuYdgW5FQrOZ-)Ve?d4)qy`+gAH;p&dx>1C5(ePd8J(*VJJ z$#$bbji|IPiUL1OX?Qd<7s{?IsQ1FMB`w2mcWOiN;ymGD)Q8TGmRls zqdbQ{OK*_-9r*zYKVYWu7RARy?0W;F@f!@IIKcj284eV1d<3#ikOF;+j49<81~8XI zD~NVow4!Ls)xv8WqnVqvws;sHpyimg1~{+>$|cDvJ4MhOK_w#v5Kx_8pv+m92bkE) znH%MlnJcd;HU>DDUMsfZWCr>1nzX+#PWr>W%C66nF;CxI!cZNr(Wn`K>RZAx%OH7eD=1A^&_+;@$Y`Z#9NdfPfZPR=zYrY WF;~gAl;u{kDl;ytI>h0B$KxM|eg%&J literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInChips/Screen.hdl b/nand2tetris-suite/tools/builtInChips/Screen.hdl new file mode 100644 index 0000000..5e7837b --- /dev/null +++ b/nand2tetris-suite/tools/builtInChips/Screen.hdl @@ -0,0 +1,35 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: tools/builtIn/Screen.hdl + +/** + * The Screen (memory map). + * Functions exactly like a 16-bit 8K RAM: + * 1. out(t)=Screen[address(t)](t) + * 2. If load(t-1) then Screen[address(t-1)](t)=in(t-1) + * + * The built-in chip implementation has the side effect of continuously + * refreshing a visual 256 by 512 black-and-white screen, simulated + * by the simulator. Each row in the visual screen is represented + * by 32 consecutive 16-bit words, starting at the top left corner + * of the visual screen. Thus the pixel at row r from the top and + * column c from the left (0<=r<=255, 0<=c<=511) reflects the c%16 + * bit (counting from LSB to MSB) of the word found in + * Screen[r*32+c/16]. + */ + +CHIP Screen { + + IN in[16], // what to write + load, // write-enable bit + address[13]; // where to read/write + OUT out[16]; // Screen value at the given address + + BUILTIN Screen; + CLOCKED in, load; +} + + + + \ No newline at end of file diff --git a/nand2tetris-suite/tools/builtInChips/Xor.class b/nand2tetris-suite/tools/builtInChips/Xor.class new file mode 100644 index 0000000000000000000000000000000000000000..d99ad18728a943b0ae43ad1eb503cac8c766638e GIT binary patch literal 341 zcmZ9HOG*Pl5Qe`_Pcmj~%|jC($wpU677k=xi9913FeCj@Hg3>@I+8hdGr#ljO zQFok0tiVZduTQn5gv;@`bTtAxAB)Zp=EWAvog67Hi<{>;D zn>Y)P=Bi8VOr6+)7dpuV^{cZ#W#{(KeL>~lll62Ln_p)`L6GKV(JwP6c%5N)#E#v` zx7$Ji;oRCguvyJUVPmoPj(BxC9?J`P4`~nV_TDJS{tP*A zz>hL+fyDT-li8U$yJx?DKED8%*w>(-s>0AvLQO?o#g2l8f?bBvsUP{t8AHC^aTp4H zG4+UC55`2=cE@JW2G6cHPka%@3icS3sUOcpOt#G6=ulB+DBEe=^`sP1M-wdu-SR>q z(=HDJ;WAX#bn5k1joM`42gxvUtZb&)lai+l&Hvp??mpbu{eZ_Y!|??%)3FBOBH)RT z=E#$wAMwOn@kKV!FGM%Ii=*TVQ1Hw!;S})LyT=4_>u~BFdye_?)R14&& WP-+X?>r{Q6QjKC}9k1T~^Wqnv;8#ol literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInVMCode/JackOSClass.class b/nand2tetris-suite/tools/builtInVMCode/JackOSClass.class new file mode 100644 index 0000000000000000000000000000000000000000..25df72a4693f8cfdac9990c7b9c0483bac190cd7 GIT binary patch literal 1782 zcmaKsTXWk)6vxlTcI+4@aoi>)P2Hv~mt5L9+zO>>K$X|_7Tqeza@`l9I3h7Paz>G9 zzek_o1(;!`FL~jm?Z6BlfCs(?--2+Cou*62@F3~@cK`c7yJwI6$KSvH4geKsQfymk-6N7H=OH0`QGvMhs(l1vi@AEU}KxGJe^uDXg**TzYw7%WRt zRoJSmnQmb-XpTX*;HUy6;gJnFg7jWiYwfjk?JegVf5Z z#~`itcS3BEuY+#`CyBe!uG_yCbiNtI%|jgUbO!S)8YwEhAlj{r=5DWI7w7roPI!=X zv6r*(1%p}HM?^^hK7yNB&fD4#&?!+WGI0&O1(vw%S03OXQZV$S>L`0rWC#%p|Oh@enhlhA=4Wx>v z^Zh}OtSfgjF27_q$P$gr082{oOd&clYA{qhPy-MJv8u60B}7jCPZ~VRZ$A zLMQ0;YJ;dl6~cxXQ$;~#99v$zoy=F=_%Io|sSL86K^%t>^0{$FL#K3vrG#btKboN? zf<>5xB4E*wCWd@Q;syUX=Je(vrj%kjoNZM7|{PGV*1KuOMHQ_$}nO zC4L9_U5QtaS0!FUUYGb9@^y)CAXg;bKz>i+_mMx4_(Pyy1-2+w=wpoL@XPR_6#PzhkPlOegWyDQi>R(&EFu?#-)?`wP%oR;VV~~`T-V7 z`6Y^9z#BAHXgxjtYw3v0;ZuClnDRE}*~C1fZA6$QgEQMN{j_!ROWnawu6X@N$fqeR zv{G9%LOCiF+)NJz8$ZGFe7bn+XPA5n3*};d4{2lPOA=G^KQDX-*>dvasQhHK3-||c CBy+j| literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInVMCode/Keyboard.class b/nand2tetris-suite/tools/builtInVMCode/Keyboard.class new file mode 100644 index 0000000000000000000000000000000000000000..7366f75b8cacf7fd20daf679e331af171e618a94 GIT binary patch literal 1362 zcmaJ=OH&g;5dMY)HpJzT7*O)SCmKMBZ^Zxt5hOr_Dj*a$mt=s*vYXm$RBn3nY6{TzIGHqvsc|3n*c{2Mm;wO~FnHD+*PdxJwv{uM1zMX~PE-gvgbOfU+9$`#H65}c+Fe%WwSj_2m(nzOR#@K{hUot)?ia?P~XS>`0mtY$P_A1xXgJ{IaCTCJdii|{PvDOmN)YWaJvK+>mEEPiz%^EVx? zbB?pQq6+m!9SPJHbSd-P(>PzGI$ave_KI_DlGI{W>e7~cUPE*pLezNGUS(zDRIBCl z(jd-IH1Qvp$2Rv*DG;s3#c___L96pLJP>?^$hOhiM_!Px?b?C(>;UQ!JV-Y<5mZui zJ5b|P2An#;<9mV+i zE==QpKu`BJeD3T(1eN4DXg-`xFvTt2*wla&8>G*8rlPt?odUhx;H C%px`b literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInVMCode/Math.class b/nand2tetris-suite/tools/builtInVMCode/Math.class new file mode 100644 index 0000000000000000000000000000000000000000..71aef914e8bb27f1170510b1a57819bea5c904e3 GIT binary patch literal 650 zcmZ`#%TC)s6g`tTc4EvUf%33vDLV%w`~j`H0jg3p0?8;{PlA<9nb~x&YjJLS&neXU2YN;A);6W$I#bbpqR5o%q}|$6Sx@o7eqUuLydx=}*X2^aAEsRs zkzqdk^o5UjBzfA4Vy#5ld$VJ9oO*=sB3R*8a|^5VZ8rTRPz5ua&|RZfohqYRS^EX{ z)9?hl5A@_1!6P*RuTU-)O3(j}ny)XeVEI3a0h5?2y6Py=q4|E$zqqHTi7t)pmkW9( z_y)I8vaeD8><6;woFSn_gX+}Vco?}*XeRvN5>D{1@9ck?d}<2r-REe9JNFf;X8BoK Qf!v+3`}sAjug?PDFF62g&;S4c literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInVMCode/Memory.class b/nand2tetris-suite/tools/builtInVMCode/Memory.class new file mode 100644 index 0000000000000000000000000000000000000000..e9bb7ad3ff815685aab0771a85044a2f062fc3e5 GIT binary patch literal 788 zcmZut$!^n76g{sVk~$8p(}~y#W!N|%ksT~Z3#bYrhzO9YRP5}=Rxokw%5f-N@e$pz zES0)p!-|LnAHbLJ6)pG1ZN>B~zjMcP&wW2mzkLVL#4Qa4tY}cN%GX*ER~f4Xm<3n@ zYAcMxY*Rq88$AJeEAayY4hm@P_x)fm3zK+UK#jtCK`D^-aD@udGVm>WN8==9#9?0R_Rsw zs1Up#-5PlYp&(Rle}(wMc}kV&pPQxE3HdA;MHu%_r874A>;|FY5kY7a!L6C5`Dnfl#ifQ{4ykHM8=V|A zL3+Jm9-(Z>F4?Vi`UN>Ofi^da63#hVYTZ@H6YR=lSg3KsEtD#r zo+L#jDN_Ms6?P?-F2Q?9Zi^*oEj!uAnGGkKx2cc%Z8}dEZ0ey-o6a%lrIbw{(Z@C| zkz>;`WucRKw%MC^-Lh*_j-WV5muwni?Q!bo5=xJ~#e8YCvbKk3k<)mEbyjQ|rmF!u z^~ibRq$>HRm6X!q@SSWW@22tRR5-t*Ql{vXR<+Ev>dHzU46vFYFM33gDx&En{YGtE}3Y^$azJ)5xWG0FZx3%Xcu+;qYlBMO zs--M<5{Y$9y_?!lx*OWZ-p7y}%h}k-moRJR-y_m}z?`boP=FGcqd(?`D`js+TDuO) zK|l6BcgQFxKL9!56PT)O)phecUuFp{#c7blA5nAv!@h4vK}fU&)`9@+>we67n5Xj1O5;SoJ=;w6X;Q z{MzEUlI>Oq*y@#f?DQPeWfY@`WB>>gdzi?^M;U73d93_Mh9%`LD8i^*Sg}{`l#DW! z0+K|cGAYYc#6H-7H~&R)iqQ|oVbLUAuzy6L7#F3yX9kLz&h;CB`99GmA#kPekr43N zCgS1*vf!kL72{(uYFVN~O3V5y@*rd_$xvZwGnb&;FJ(Ca`6~I#ega-1TH_O+F{1Sj zD~&5&S=bEf#Pu4gr*SKph(L9@>N|K9Dx5X{DY+5D&^?AlODm6Q_d|l;1g1<0%l4vF zGL5>y9fz*UVAN}eQn-d1sZ#i>Voab?gQAm*)rn1;qFzVW5}pOD3DKk&lc?YTB%=_B z%K6r7wW2^EAhFM^1`Xpn6G2-sU`=Lvsoawk+wV_>_w8g^7P*4w7dxj9kYS9d zs;rJDuZ3~U>`AZ4sXmJ^nsmsVEmr3pSS*gglc#(^X-UAk*3yn^fy!uAGU`+UT~ z7~-;yY0u1KHX}bqm6bA6th1mjX*=s2dpjD|qh2LmQdAv@*YL8J=f3PW>Zu)=a!%&! zdZIiPCD~PWkt2c(DPNnOsD;+}#jb>8)x6sIhfbBH)o)^56Q3~Ei`M^X+1jJ>MC*Be zs;Fva(P9>Mj%E`?tR8xMaxN%*r-d@ry=cMy_U?T7&IswPL2)gknLp3CAq8 z5mqduccEBV@4~T0y=#m`^ez&M&UpTDzsI$WuUa`WDTwu6TqIvoV_baql7hz2HZ}Z} zqAlTJ<7$l}&9pl#!dH!vZ88SUb`gC==bFbTW-ckXLyd{&GVu1^wx{3kP~?RXcwr`M zyZ==lFT;b0j6cCW?g|ZQ-*=IF12~iMpXf+j9D7BF5HD9lafc4qXaUF% z5^1W@tvE~|=^yDLT(A!lxk_KaMbc9`EoFSqHEP~ZI2grwgrIpmXm*{BfR+wY-8B}|Ww3*uRub(L_ zuiOU>;a^2|9ci zUp&2`KwV9um^L;lugY$+)mFH@ ztzhX2X_bxj%Ue6Gu#=>f8*#eTY*Vu~)~~0@tu)-a(MXfsaFf~DyJ@o%ug6)6 z)l6%dv@-1q?b?~2p!`4rU}EY8H`_GzF>+(~G`Vww?0MQbd#3z8mfiAa{YRK^^M}ZH zp=ABPhY80hK&3E26sV7*)bq&G4_I(1x3=saLS6Y0xdT|f_w`B!)Aw@U?60^!p&i9B zaRRf1Sf+g5nL^P$fUagx^Z#M$!W$j8LKJcocEP<5;g)mgVZyr)%PT8*2zyE^>4zwM z;*qD}*7UooTbkV8JA{7pY>ThK2=qMycV2ROl?4Ubd3QECS9ay%0!@yZZSnI|+F zkupOhmxd%4h~ylT>|xd?>i&>=K-7b0)D5QYyOC6d`T&MdJ5mk2NNPf3RqK$X3avM4 zkSvJ80gS+Vh@vRm!wKK*VcM0tzby0>PwK%%pHf6gG|GSJ!`plV0!$vpnfhyLi&i+huaQT>Y+8 zeOk0Bb1-XJm@-R~KFu!rifSp%5$&3!?lF5)nD?+CbWzxs7NdVEjDbcs#8YeEUhEok zS^rP=d_W$P$kRsk>s>=3$?Bmbj43*q4O#y$P9NtAqckVXhz`s8zZ@;n;(wgcefyq@ z=yYoHNXl@P%+zz6Hl{tCo=y|! zT08{1$BBaigf*;V;L7@cFy07^wxj$_%wu81|0y&S21EM4N9YVj<45=5xqfYM*QY#I z9go!UQ!R2-{*o_M)u&tT(S+!$xk2OxwL^N;LF5HBm(29BL8x>!*ZDP+gr)_JLaipX Z4AZPoRKsAstMg>m|MAfx@h^){Ow#}W literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInVMCode/String.class b/nand2tetris-suite/tools/builtInVMCode/String.class new file mode 100644 index 0000000000000000000000000000000000000000..98c7f58149fb27f35a7a0503ff584ecd25d717fc GIT binary patch literal 1630 zcmZ`&U31$+6g{dWOL3IMapHbhQGt{Xxp8ACG*FVbq$Z^?z!jgKKtkKQvem*$zl#= z9T&35V_8QYbbKlfp9yn0i_ftt%$kOE4OI!5HOF%z z+Q@dPEkUXIJx+(4o7;4-TcwtS?B@4f-j5vL3pHGkp!J-v?}wBo66jLK<=$?zN1N^* z3pOGNs@-apY7!j{6FNkyi3z(U?&VVo~Pcf6?0+yPa|5J=rS zLZy0|#}68gCwSU%l^xdouGME<@=W&p!H&!C4E%^2m`8y~wC;z?JP7>2z!%t%U^Mx@ zAKYJNuIqOVTm>IQD$ zYY7mZhA>SHHw{?0W#BAsOPJpoI4;p|H-)k(ii9)&ci*4}ZnbJI3quJ@*XdMgH#heO zE{pu2vc-da$72z1H*W|2Zou}p_5%NaQJ>UIm)f{C@Va6^#Mo}U&Uv*irZ{;JI1x{} z6tdUrVszPnv)++YvE$54G9L-1T`P^DB?_$4gd#uDgqpO+^C)9RFiCQ@{CI+eW7r9D z<>UNsE^QLgH%D`?3lP7Px_GYjQVs9Wub89%1WbXbqd@i~on~pJNkTpU2-4pojtQK? zX`G0|709#$&J};dWd1~M`VjJVUMZ>_+N_zyL#U?Gk;U>?eEAGng%FDbV`3qNnWt4$ z(eoL)B5x;!{+nx!O3tOZT2Y}Q+Boc4yp_T((<&3}Vv@RU{tDe(_#hPgC)N+9?;*AxIqcflB3{kLzorL=Q(i)Li_4=yA>BhlJk* V&L0>3@hG}9iq52W<=kQt#4D3PGtK}2 literal 0 HcmV?d00001 diff --git a/nand2tetris-suite/tools/builtInVMCode/Sys.class b/nand2tetris-suite/tools/builtInVMCode/Sys.class new file mode 100644 index 0000000000000000000000000000000000000000..0c15f1b9fb855912121996b6ab5892b4b3bb8bea GIT binary patch literal 1885 zcmZ`(%X1V(82?S!WIJIKk~TnCAU5(a??pvaf+%@l0=t0OkO)4YceXbfn3-OBX7ZrQ zljXsaCr^6ulq#z{P*y?IDm__c`S*CX{CYN<5D16gucyEF_jULD^WSfO04P9rU>N5a z-s!*)-eq`?;R3@r!$pSo87^7z2MizD^>PO$Fqy>^!!*McEBeUN48ttLRfcN}MTQc? zb%q-ZHyJ)=m}4k2%ro3#SYTLW_=Mp$!<{TX?Z9c9{4=|LZt06G?q+e%LEA+y^x{hn z_6-a!ILJ)us-ndT9dt~uxvCy}I*hWABwm(2i8HIxYBK|6>(Z)>(I$rxj5^p~Qh_$> zW7a>13S0;6B^fWL0#cVoF`IVN7BAx+QC<>0}!z1??k;8`PzhyvTZ1*2N=bw1dK=3_~3YR|hmFC8CFkG)fpvGF=l=gldVB zttb&DK}8t{XD<7`b|tkUg7hR_maTI}$-2-h%G7+lN_EfrJ_Ykd-CI*WWz?qXg*K3b zzNXIiLiLO)a&WwI_KIXr-$LjdyXsU)5s&xQ*n z`?d<@b*l2nZrN4oKDbey^kqc4;ThT$7E04W;>%c@!n`s;dK3$#tvvI~Mz6|>Pj@Qk zO5eYdgs#1F4h{|!pD%KJuuNuNXdg7)--_scER<+QdlWEhD`=DTx(X@a$Q~AhFI3$a?YILL>qZI(y#p`WjpGFU z8Hec~3$%iwW0ZJ|c0IH@Ryy<)&SR@bJN<}9(UPjqr%GUmw`^kHBG07UnsQsp*_2tz z?VIRm#5hZFGUWRPMSF8Q8sCc6#`o`O`4-M?^Rc z622mQL->|p?Jd3|d{6k1utE5l@C)Hr!k>h{cyDn7HGYuz9zR5UhaV=M=Y7Q2`4Qq7 zo+qB*M~N@;W5nnAapJSQpLmGBN_>h7;{KHT_zC*v{59enKS|uiPZfX1>Dy0nhQIy< N1H*(T7~Es3_#fsb;cfr` literal 0 HcmV?d00001