From 281a96945a54888afc0678825aaa1aaaf29b1e3a Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Wed, 21 Apr 2021 17:01:42 +0300 Subject: [PATCH] init --- .gitignore | 602 + projects/00/file.txt | 6 + projects/00/project0.zip | Bin 0 -> 321 bytes projects/01/And.cmp | 5 + projects/01/And.hdl | 19 + projects/01/And.tst | 29 + projects/01/And16.cmp | 7 + projects/01/And16.hdl | 32 + projects/01/And16.tst | 39 + projects/01/DMux.cmp | 5 + projects/01/DMux.hdl | 20 + projects/01/DMux.tst | 27 + projects/01/DMux4Way.cmp | 9 + projects/01/DMux4Way.hdl | 31 + projects/01/DMux4Way.tst | 43 + projects/01/DMux8Way.cmp | 17 + projects/01/DMux8Way.hdl | 32 + projects/01/DMux8Way.tst | 75 + projects/01/Mux.cmp | 9 + projects/01/Mux.hdl | 21 + projects/01/Mux.tst | 49 + projects/01/Mux16.cmp | 9 + projects/01/Mux16.hdl | 33 + projects/01/Mux16.tst | 49 + projects/01/Mux4Way16.cmp | 9 + projects/01/Mux4Way16.hdl | 32 + projects/01/Mux4Way16.tst | 49 + projects/01/Mux8Way16.cmp | 17 + projects/01/Mux8Way16.hdl | 30 + projects/01/Mux8Way16.tst | 89 + projects/01/Not.cmp | 3 + projects/01/Not.hdl | 17 + projects/01/Not.tst | 17 + projects/01/Not16.cmp | 6 + projects/01/Not16.hdl | 32 + projects/01/Not16.tst | 29 + projects/01/Or.cmp | 5 + projects/01/Or.hdl | 20 + projects/01/Or.tst | 29 + projects/01/Or16.cmp | 7 + projects/01/Or16.hdl | 32 + projects/01/Or16.tst | 39 + projects/01/Or8Way.cmp | 6 + projects/01/Or8Way.hdl | 23 + projects/01/Or8Way.tst | 29 + projects/01/Xor.cmp | 5 + projects/01/Xor.hdl | 19 + projects/01/Xor.tst | 29 + projects/01/project1.zip | Bin 0 -> 21524 bytes projects/02/02.zip | Bin 0 -> 8944 bytes projects/02/ALU-nostat.cmp | 37 + projects/02/ALU-nostat.tst | 353 + projects/02/ALU.cmp | 37 + projects/02/ALU.hdl | 66 + projects/02/ALU.tst | 377 + projects/02/Add16.cmp | 7 + projects/02/Add16.hdl | 32 + projects/02/Add16.tst | 39 + projects/02/FullAdder.cmp | 9 + projects/02/FullAdder.hdl | 27 + projects/02/FullAdder.tst | 47 + projects/02/HalfAdder.cmp | 5 + projects/02/HalfAdder.hdl | 18 + projects/02/HalfAdder.tst | 29 + projects/02/Inc16.cmp | 5 + projects/02/Inc16.hdl | 17 + projects/02/Inc16.tst | 25 + projects/03/03.zip | Bin 0 -> 207548 bytes projects/03/a/Bit.cmp | 215 + projects/03/a/Bit.hdl | 19 + projects/03/a/Bit.tst | 865 + projects/03/a/PC.cmp | 31 + projects/03/a/PC.hdl | 29 + projects/03/a/PC.tst | 125 + projects/03/a/RAM64.cmp | 320 + projects/03/a/RAM64.hdl | 29 + projects/03/a/RAM64.tst | 1026 + projects/03/a/RAM8.cmp | 173 + projects/03/a/RAM8.hdl | 29 + projects/03/a/RAM8.tst | 560 + projects/03/a/Register.cmp | 149 + projects/03/a/Register.hdl | 33 + projects/03/a/Register.tst | 569 + projects/03/b/RAM16K.cmp | 320 + projects/03/b/RAM16K.hdl | 29 + projects/03/b/RAM16K.tst | 1026 + projects/03/b/RAM4K.cmp | 320 + projects/03/b/RAM4K.hdl | 29 + projects/03/b/RAM4K.tst | 1026 + projects/03/b/RAM512.cmp | 320 + projects/03/b/RAM512.hdl | 29 + projects/03/b/RAM512.tst | 1027 + projects/04/Fill.asm | 85 + projects/04/Mult.asm | 35 + projects/04/fill/Fill.asm | 85 + projects/04/fill/Fill.tst | 11 + projects/04/fill/FillAutomatic.cmp | 4 + projects/04/fill/FillAutomatic.tst | 37 + projects/04/mult/Mult.asm | 35 + projects/04/mult/Mult.cmp | 7 + projects/04/mult/Mult.tst | 74 + projects/04/project4.zip | Bin 0 -> 1014 bytes projects/05/05.zip | Bin 0 -> 14656 bytes projects/05/Add.hack | 6 + projects/05/CPU-external.cmp | 93 + projects/05/CPU-external.tst | 150 + projects/05/CPU.cmp | 93 + projects/05/CPU.hdl | 72 + projects/05/CPU.tst | 150 + projects/05/Computer.hdl | 25 + projects/05/ComputerAdd-external.cmp | 15 + projects/05/ComputerAdd-external.tst | 32 + projects/05/ComputerAdd.cmp | 15 + projects/05/ComputerAdd.tst | 32 + projects/05/ComputerMax-external.cmp | 28 + projects/05/ComputerMax-external.tst | 38 + projects/05/ComputerMax.cmp | 28 + 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 + projects/05/Max.hack | 16 + projects/05/Memory.cmp | 54 + projects/05/Memory.hdl | 46 + projects/05/Memory.tst | 163 + projects/05/Rect.hack | 25 + projects/06/06.zip | Bin 0 -> 12539 bytes projects/06/Add.hack | 6 + projects/06/Max.hack | 16 + projects/06/Pong.hack | 27483 +++++++++++++++ projects/06/Rect.hack | 25 + projects/06/add/Add.asm | 13 + projects/06/add/Add.hack | 6 + projects/06/asm.py | 202 + projects/06/asm.py.v1 | 202 + projects/06/max/Max.asm | 26 + projects/06/max/Max.hack | 16 + projects/06/max/MaxL.asm | 16 + projects/06/max/MaxL.hack | 16 + projects/06/max/asdf.asm | 26 + projects/06/max/asdf.hack | 16 + projects/06/pong/Pong.asm | 28375 ++++++++++++++++ projects/06/pong/Pong.hack | 27483 +++++++++++++++ projects/06/pong/PongL.asm | 27490 +++++++++++++++ projects/06/prog.txt | 1 + projects/06/rect/Rect.asm | 35 + projects/06/rect/Rect.hack | 25 + projects/06/rect/RectL.asm | 32 + .../07/MemoryAccess/BasicTest/BasicTest.asm | 0 .../07/MemoryAccess/BasicTest/BasicTest.cmp | 0 .../07/MemoryAccess/BasicTest/BasicTest.tst | 0 .../07/MemoryAccess/BasicTest/BasicTest.vm | 0 .../MemoryAccess/BasicTest/BasicTestVME.tst | 0 .../MemoryAccess/PointerTest/PointerTest.asm | 194 + .../MemoryAccess/PointerTest/PointerTest.cmp | 2 + .../MemoryAccess/PointerTest/PointerTest.tst | 20 + .../MemoryAccess/PointerTest/PointerTest.vm | 22 + .../PointerTest/PointerTestVME.tst | 20 + .../07/MemoryAccess/StaticTest/StaticTest.asm | 122 + .../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.asm | 40 + .../StackArithmetic/SimpleAdd/SimpleAdd.cmp | 2 + .../StackArithmetic/SimpleAdd/SimpleAdd.tst | 17 + .../07/StackArithmetic/SimpleAdd/SimpleAdd.vm | 9 + .../SimpleAdd/SimpleAddVME.tst | 17 + .../StackArithmetic/StackTest/StackTest.asm | 560 + .../StackArithmetic/StackTest/StackTest.cmp | 4 + .../StackArithmetic/StackTest/StackTest.tst | 22 + .../07/StackArithmetic/StackTest/StackTest.vm | 45 + .../StackTest/StackTestVME.tst | 22 + .../FibonacciElement/FibonacciElement.asm | 507 + .../FibonacciElement/FibonacciElement.cmp | 2 + .../FibonacciElement/FibonacciElement.tst | 18 + .../FibonacciElement/FibonacciElementVME.tst | 17 + .../08/FunctionCalls/FibonacciElement/Main.vm | 30 + .../08/FunctionCalls/FibonacciElement/Sys.vm | 15 + projects/08/FunctionCalls/NestedCall/.asm | 651 + .../FunctionCalls/NestedCall/NestedCall.asm | 707 + .../FunctionCalls/NestedCall/NestedCall.cmp | 2 + .../FunctionCalls/NestedCall/NestedCall.html | 196 + .../FunctionCalls/NestedCall/NestedCall.tst | 65 + .../NestedCall/NestedCallStack.html | 306 + .../NestedCall/NestedCallVME.tst | 70 + projects/08/FunctionCalls/NestedCall/Sys.asm | 649 + projects/08/FunctionCalls/NestedCall/Sys.vm | 63 + projects/08/FunctionCalls/SimpleFunction.asm | 1 + .../SimpleFunction/SimpleFunction.asm | 195 + .../SimpleFunction/SimpleFunction.cmp | 2 + .../SimpleFunction/SimpleFunction.tst | 29 + .../SimpleFunction/SimpleFunction.vm | 16 + .../SimpleFunction/SimpleFunctionVME.tst | 29 + projects/08/FunctionCalls/StaticsTest/.asm | 531 + .../08/FunctionCalls/StaticsTest/Class1.vm | 20 + .../08/FunctionCalls/StaticsTest/Class2.vm | 20 + .../FunctionCalls/StaticsTest/StaticsTest.asm | 701 + .../FunctionCalls/StaticsTest/StaticsTest.cmp | 2 + .../FunctionCalls/StaticsTest/StaticsTest.tst | 17 + .../StaticsTest/StaticsTestVME.tst | 17 + projects/08/FunctionCalls/StaticsTest/Sys.asm | 1 + projects/08/FunctionCalls/StaticsTest/Sys.vm | 20 + projects/08/ProgramFlow/BasicLoop/.asm | 185 + .../08/ProgramFlow/BasicLoop/BasicLoop.asm | 181 + .../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.asm | 338 + .../FibonacciSeries/FibonacciSeries.cmp | 2 + .../FibonacciSeries/FibonacciSeries.tst | 22 + .../FibonacciSeries/FibonacciSeries.vm | 49 + .../FibonacciSeries/FibonacciSeriesVME.tst | 22 + projects/09/Average/Main.jack | 27 + projects/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 + projects/09/Jack OS API.pdf | Bin 0 -> 108857 bytes projects/09/List/List.jack | 46 + 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 + projects/10/ExpressionLessSquare/Main.jack | 36 + projects/10/ExpressionLessSquare/Main.xml | 205 + projects/10/ExpressionLessSquare/MainT.xml | 109 + projects/10/ExpressionLessSquare/Square.jack | 99 + projects/10/ExpressionLessSquare/Square.xml | 967 + .../10/ExpressionLessSquare/SquareGame.jack | 60 + .../10/ExpressionLessSquare/SquareGame.xml | 544 + .../10/ExpressionLessSquare/SquareGameT.xml | 268 + projects/10/ExpressionLessSquare/SquareT.xml | 449 + projects/10/Square/Main.jack | 36 + 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/Arkanoid/Ball.jack | 104 + projects/11/Arkanoid/Ball.vm | 204 + projects/11/Arkanoid/Ball.xml | 736 + projects/11/Arkanoid/BallT.xml | 407 + projects/11/Arkanoid/Game.jack | 224 + projects/11/Arkanoid/Game.vm | 585 + projects/11/Arkanoid/Game.xml | 1899 ++ projects/11/Arkanoid/GameT.xml | 1145 + projects/11/Arkanoid/Main.jack | 8 + projects/11/Arkanoid/Main.vm | 8 + projects/11/Arkanoid/Main.xml | 54 + projects/11/Arkanoid/MainT.xml | 35 + projects/11/Arkanoid/Rect.jack | 90 + projects/11/Arkanoid/Rect.vm | 174 + projects/11/Arkanoid/Rect.xml | 612 + projects/11/Arkanoid/RectT.xml | 360 + projects/11/Arkanoid/Util.jack | 9 + projects/11/Arkanoid/Util.vm | 14 + projects/11/Arkanoid/Util.xml | 66 + projects/11/Arkanoid/UtilT.xml | 33 + projects/11/Arkanoid/source/Ball.jack | 104 + projects/11/Arkanoid/source/Game.jack | 224 + projects/11/Arkanoid/source/Main.jack | 8 + projects/11/Arkanoid/source/Rect.jack | 90 + projects/11/Arkanoid/source/Util.jack | 9 + projects/11/Average/Main.jack | 29 + projects/11/Average/Main.vm | 149 + projects/11/Average/Main.xml | 179 + projects/11/Average/MainT.xml | 110 + projects/11/ComplexArrays/Main.jack | 70 + projects/11/ComplexArrays/Main.vm | 703 + projects/11/ComplexArrays/Main.xml | 689 + projects/11/ComplexArrays/MainT.xml | 414 + projects/11/ConvertToBin/Main.jack | 82 + projects/11/ConvertToBin/Main.vm | 106 + projects/11/ConvertToBin/Main.xml | 399 + projects/11/ConvertToBin/MainT.xml | 237 + projects/11/Pong/Array.jack | 26 + projects/11/Pong/Array.vm | 12 + projects/11/Pong/Ball.jack | 203 + projects/11/Pong/Ball.vm | 444 + projects/11/Pong/Ball.xml | 1758 + projects/11/Pong/BallT.xml | 881 + projects/11/Pong/Bat.jack | 103 + projects/11/Pong/Bat.vm | 207 + projects/11/Pong/Bat.xml | 587 + projects/11/Pong/BatT.xml | 413 + projects/11/Pong/Keyboard.jack | 92 + projects/11/Pong/Keyboard.vm | 98 + projects/11/Pong/Main.jack | 20 + projects/11/Pong/Main.vm | 13 + projects/11/Pong/Main.xml | 72 + projects/11/Pong/MainT.xml | 49 + projects/11/Pong/Math.jack | 142 + projects/11/Pong/Math.vm | 394 + projects/11/Pong/Memory.jack | 73 + projects/11/Pong/Memory.vm | 161 + projects/11/Pong/Output.jack | 288 + projects/11/Pong/Output.vm | 1818 + projects/11/Pong/PongGame.jack | 137 + projects/11/Pong/PongGame.vm | 318 + projects/11/Pong/PongGame.xml | 1035 + projects/11/Pong/PongGameT.xml | 614 + projects/11/Pong/Screen.jack | 162 + projects/11/Pong/Screen.vm | 534 + projects/11/Pong/String.jack | 136 + projects/11/Pong/String.vm | 250 + projects/11/Pong/Sys.jack | 47 + projects/11/Pong/Sys.vm | 62 + projects/11/Seven/Main.jack | 17 + projects/11/Seven/Main.vm | 8 + projects/11/Seven/Main.xml | 34 + projects/11/Seven/MainT.xml | 29 + projects/11/Square/Main.jack | 17 + projects/11/Square/Main.vm | 11 + projects/11/Square/Main.xml | 63 + projects/11/Square/MainT.xml | 42 + projects/11/Square/Square.jack | 110 + projects/11/Square/Square.vm | 310 + projects/11/Square/Square.xml | 728 + projects/11/Square/SquareGame.jack | 81 + projects/11/Square/SquareGame.vm | 190 + projects/11/Square/SquareGame.xml | 584 + projects/11/Square/SquareGameT.xml | 315 + projects/11/Square/SquareT.xml | 561 + projects/12/Array.jack | 26 + projects/12/ArrayTest/Array.jack | 26 + projects/12/ArrayTest/Array.vm | 12 + projects/12/ArrayTest/ArrayTest.cmp | 2 + projects/12/ArrayTest/ArrayTest.tst | 15 + projects/12/ArrayTest/Keyboard.jack | 92 + projects/12/ArrayTest/Keyboard.vm | 98 + projects/12/ArrayTest/Main.jack | 40 + projects/12/ArrayTest/Main.vm | 131 + projects/12/ArrayTest/Math.jack | 142 + projects/12/ArrayTest/Math.vm | 394 + projects/12/ArrayTest/Memory.jack | 73 + projects/12/ArrayTest/Memory.vm | 161 + projects/12/ArrayTest/Output.jack | 288 + projects/12/ArrayTest/Output.vm | 1818 + projects/12/ArrayTest/Screen.jack | 162 + projects/12/ArrayTest/Screen.vm | 534 + projects/12/ArrayTest/String.jack | 136 + projects/12/ArrayTest/String.vm | 250 + projects/12/ArrayTest/Sys.jack | 47 + projects/12/ArrayTest/Sys.vm | 62 + projects/12/Keyboard.jack | 92 + projects/12/KeyboardTest/Keyboard.jack | 92 + projects/12/KeyboardTest/Keyboard.vm | 98 + .../12/KeyboardTest/KeyboardTestOutput.gif | Bin 0 -> 12048 bytes projects/12/KeyboardTest/Main.jack | 93 + projects/12/KeyboardTest/Main.vm | 949 + projects/12/Math.jack | 142 + projects/12/MathTest/Main.jack | 35 + projects/12/MathTest/Main.vm | 162 + projects/12/MathTest/Math.jack | 142 + projects/12/MathTest/Math.vm | 394 + projects/12/MathTest/MathTest.cmp | 2 + projects/12/MathTest/MathTest.tst | 15 + projects/12/Memory.jack | 73 + projects/12/MemoryTest/Main.jack | 42 + projects/12/MemoryTest/Main.vm | 126 + projects/12/MemoryTest/Memory.jack | 73 + projects/12/MemoryTest/Memory.vm | 161 + projects/12/MemoryTest/MemoryTest.cmp | 2 + projects/12/MemoryTest/MemoryTest.tst | 15 + projects/12/Output.jack | 288 + projects/12/OutputTest/Array.jack | 26 + projects/12/OutputTest/Array.vm | 12 + projects/12/OutputTest/Keyboard.jack | 92 + projects/12/OutputTest/Keyboard.vm | 98 + projects/12/OutputTest/Main.jack | 42 + projects/12/OutputTest/Main.vm | 254 + projects/12/OutputTest/Math.jack | 142 + projects/12/OutputTest/Math.vm | 394 + projects/12/OutputTest/Memory.jack | 73 + projects/12/OutputTest/Memory.vm | 161 + projects/12/OutputTest/Output.jack | 288 + projects/12/OutputTest/Output.vm | 1818 + projects/12/OutputTest/OutputTestOutput.gif | Bin 0 -> 6184 bytes projects/12/OutputTest/Screen.jack | 162 + projects/12/OutputTest/Screen.vm | 534 + projects/12/OutputTest/String.jack | 136 + projects/12/OutputTest/String.vm | 250 + projects/12/OutputTest/Sys.jack | 47 + projects/12/OutputTest/Sys.vm | 62 + projects/12/Pong/Array.jack | 26 + projects/12/Pong/Array.vm | 12 + projects/12/Pong/Ball.jack | 203 + projects/12/Pong/Ball.vm | 444 + projects/12/Pong/Ball.xml | 1758 + projects/12/Pong/BallT.xml | 881 + projects/12/Pong/Bat.jack | 103 + projects/12/Pong/Bat.vm | 207 + projects/12/Pong/Bat.xml | 587 + projects/12/Pong/BatT.xml | 413 + projects/12/Pong/Keyboard.jack | 92 + projects/12/Pong/Keyboard.vm | 98 + projects/12/Pong/Main.jack | 20 + projects/12/Pong/Main.vm | 13 + projects/12/Pong/Main.xml | 72 + projects/12/Pong/MainT.xml | 49 + projects/12/Pong/Math.jack | 142 + projects/12/Pong/Math.vm | 394 + projects/12/Pong/Memory.jack | 73 + projects/12/Pong/Memory.vm | 161 + projects/12/Pong/Output.jack | 288 + projects/12/Pong/Output.vm | 1818 + projects/12/Pong/PongGame.jack | 137 + projects/12/Pong/PongGame.vm | 318 + projects/12/Pong/PongGame.xml | 1035 + projects/12/Pong/PongGameT.xml | 614 + projects/12/Pong/Screen.jack | 162 + projects/12/Pong/Screen.vm | 534 + projects/12/Pong/String.jack | 136 + projects/12/Pong/String.vm | 250 + projects/12/Pong/Sys.jack | 47 + projects/12/Pong/Sys.vm | 62 + projects/12/Screen.jack | 162 + projects/12/ScreenTest/Array.jack | 26 + projects/12/ScreenTest/Array.vm | 12 + projects/12/ScreenTest/Keyboard.jack | 92 + projects/12/ScreenTest/Keyboard.vm | 98 + projects/12/ScreenTest/Main.jack | 36 + projects/12/ScreenTest/Main.vm | 104 + projects/12/ScreenTest/Math.jack | 142 + projects/12/ScreenTest/Math.vm | 394 + projects/12/ScreenTest/Memory.jack | 73 + projects/12/ScreenTest/Memory.vm | 161 + projects/12/ScreenTest/Output.jack | 288 + projects/12/ScreenTest/Output.vm | 1818 + projects/12/ScreenTest/Screen.jack | 162 + projects/12/ScreenTest/Screen.vm | 534 + projects/12/ScreenTest/ScreenTestOutput.gif | Bin 0 -> 4563 bytes projects/12/ScreenTest/String.jack | 136 + projects/12/ScreenTest/String.vm | 250 + projects/12/ScreenTest/Sys.jack | 47 + projects/12/ScreenTest/Sys.vm | 62 + projects/12/String.jack | 136 + projects/12/StringTest/Main.jack | 83 + projects/12/StringTest/Main.vm | 469 + projects/12/StringTest/String.jack | 136 + projects/12/StringTest/String.vm | 250 + projects/12/StringTest/StringTestOutput.gif | Bin 0 -> 8126 bytes projects/12/Sys.jack | 47 + projects/12/SysTest/Main.jack | 31 + projects/12/SysTest/Main.vm | 281 + projects/12/SysTest/Sys.jack | 47 + projects/12/SysTest/Sys.vm | 62 + projects/12/project12.zip | Bin 0 -> 10292 bytes projects/13/more fun to go.txt | 9 + projects/Arkanoid.zip | Bin 0 -> 6223 bytes projects/Arkanoid/Ball.vm | 200 + projects/Arkanoid/Game.vm | 581 + projects/Arkanoid/Main.vm | 8 + projects/Arkanoid/Rect.vm | 173 + projects/Arkanoid/Util.vm | 15 + projects/Arkanoid/source/Ball.jack | 104 + projects/Arkanoid/source/Game.jack | 224 + projects/Arkanoid/source/Main.jack | 8 + projects/Arkanoid/source/Rect.jack | 90 + projects/Arkanoid/source/Util.jack | 9 + projects/JackAnalyzer/.gitattributes | 63 + projects/JackAnalyzer/.gitignore | 341 + projects/JackAnalyzer/JackAnalyzer.sln | 31 + .../JackAnalyzer/JackAnalyzer/Constants.cs | 18 + .../JackAnalyzer/JackAnalyzer.csproj | 8 + .../JackAnalyzer/MetaSymbolTable.cs | 87 + projects/JackAnalyzer/JackAnalyzer/Program.cs | 57 + .../JackAnalyzer/JackAnalyzer/SymbolTable.cs | 71 + projects/JackAnalyzer/JackAnalyzer/Token.cs | 15 + .../JackAnalyzer/JackAnalyzer/Tokenizer.cs | 179 + .../JackAnalyzer/JackAnalyzer/VMWriter.cs | 92 + projects/JackAnalyzer/JackAnalyzer/Writer.cs | 914 + .../JackAnalyzer/JackAnalyzer/project10.zip | Bin 0 -> 4935 bytes .../JackAnalyzer/JackAnalyzer/project11.zip | Bin 0 -> 8625 bytes .../SymbolTableTest/JackAnalyzerTest.csproj | 20 + .../SymbolTableTest/MetaSymbolTableTest.cs | 43 + .../SymbolTableTest/SymbolTableTest.cs | 29 + projects/Tables/Cell.jack | 23 + projects/Tables/Cell.vm | 52 + projects/Tables/Main.jack | 8 + projects/Tables/Main.vm | 5 + projects/Tables/Table.jack | 96 + projects/Tables/Table.vm | 293 + projects/Tables/Utils.jack | 7 + projects/Tables/Utils.vm | 11 + projects/VMTranslator/.asm | 0 projects/VMTranslator/.clang-format | 6 + projects/VMTranslator/.gitignore | 4 + .../.vscode/c_cpp_properties.json | 18 + projects/VMTranslator/.vscode/settings.json | 45 + projects/VMTranslator/CMakeLists.txt | 8 + projects/VMTranslator/Commands.cpp | 35 + projects/VMTranslator/Commands.h | 49 + projects/VMTranslator/Parser.cpp | 54 + projects/VMTranslator/Parser.h | 23 + projects/VMTranslator/VMTranslator | Bin 0 -> 369568 bytes projects/VMTranslator/Writer.cpp | 469 + projects/VMTranslator/Writer.h | 37 + projects/VMTranslator/lang.txt | 1 + projects/VMTranslator/main.cpp | 79 + projects/VMTranslator/project7.zip | Bin 0 -> 4299 bytes projects/VMTranslator/project8.zip | Bin 0 -> 5674 bytes projects/demo/Xor.cmp | 5 + projects/demo/Xor.hdl | 25 + projects/demo/Xor.tst | 29 + tools/Assembler.bat | 27 + tools/Assembler.sh | 32 + tools/CPUEmulator.bat | 29 + tools/CPUEmulator.sh | 33 + tools/HardwareSimulator.bat | 30 + tools/HardwareSimulator.sh | 34 + tools/JackCompiler.bat | 26 + tools/JackCompiler.sh | 35 + tools/OS/Array.vm | 23 + tools/OS/Keyboard.vm | 102 + tools/OS/Math.vm | 408 + tools/OS/Memory.vm | 279 + tools/OS/Output.vm | 1852 + tools/OS/Screen.vm | 806 + tools/OS/String.vm | 393 + tools/OS/Sys.vm | 84 + tools/TextComparer.bat | 29 + tools/TextComparer.sh | 36 + tools/VMEmulator.bat | 29 + tools/VMEmulator.sh | 33 + tools/builtInChips/ALU.class | Bin 0 -> 1754 bytes 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 tools/builtInChips/And.hdl | 16 + tools/builtInChips/And16.hdl | 17 + tools/builtInChips/Bit.class | Bin 0 -> 416 bytes tools/builtInChips/Bit.hdl | 19 + tools/builtInChips/DFF.class | Bin 0 -> 401 bytes tools/builtInChips/DFF.hdl | 18 + tools/builtInChips/DMux.class | Bin 0 -> 365 bytes 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 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 tools/builtInChips/Nand.hdl | 16 + tools/builtInChips/Not.class | Bin 0 -> 331 bytes tools/builtInChips/Not.hdl | 16 + tools/builtInChips/Not16.class | Bin 0 -> 327 bytes tools/builtInChips/Not16.hdl | 16 + tools/builtInChips/Or.class | Bin 0 -> 340 bytes tools/builtInChips/Or.hdl | 16 + tools/builtInChips/Or16.hdl | 16 + tools/builtInChips/Or8Way.class | Bin 0 -> 340 bytes tools/builtInChips/Or8Way.hdl | 16 + tools/builtInChips/PC.class | Bin 0 -> 1899 bytes 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 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 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 613 files changed, 202255 insertions(+) create mode 100644 .gitignore create mode 100644 projects/00/file.txt create mode 100644 projects/00/project0.zip create mode 100644 projects/01/And.cmp create mode 100644 projects/01/And.hdl create mode 100644 projects/01/And.tst create mode 100644 projects/01/And16.cmp create mode 100644 projects/01/And16.hdl create mode 100644 projects/01/And16.tst create mode 100644 projects/01/DMux.cmp create mode 100644 projects/01/DMux.hdl create mode 100644 projects/01/DMux.tst create mode 100644 projects/01/DMux4Way.cmp create mode 100644 projects/01/DMux4Way.hdl create mode 100644 projects/01/DMux4Way.tst create mode 100644 projects/01/DMux8Way.cmp create mode 100644 projects/01/DMux8Way.hdl create mode 100644 projects/01/DMux8Way.tst create mode 100644 projects/01/Mux.cmp create mode 100644 projects/01/Mux.hdl create mode 100644 projects/01/Mux.tst create mode 100644 projects/01/Mux16.cmp create mode 100644 projects/01/Mux16.hdl create mode 100644 projects/01/Mux16.tst create mode 100644 projects/01/Mux4Way16.cmp create mode 100644 projects/01/Mux4Way16.hdl create mode 100644 projects/01/Mux4Way16.tst create mode 100644 projects/01/Mux8Way16.cmp create mode 100644 projects/01/Mux8Way16.hdl create mode 100644 projects/01/Mux8Way16.tst create mode 100644 projects/01/Not.cmp create mode 100644 projects/01/Not.hdl create mode 100644 projects/01/Not.tst create mode 100644 projects/01/Not16.cmp create mode 100644 projects/01/Not16.hdl create mode 100644 projects/01/Not16.tst create mode 100644 projects/01/Or.cmp create mode 100644 projects/01/Or.hdl create mode 100644 projects/01/Or.tst create mode 100644 projects/01/Or16.cmp create mode 100644 projects/01/Or16.hdl create mode 100644 projects/01/Or16.tst create mode 100644 projects/01/Or8Way.cmp create mode 100644 projects/01/Or8Way.hdl create mode 100644 projects/01/Or8Way.tst create mode 100644 projects/01/Xor.cmp create mode 100644 projects/01/Xor.hdl create mode 100644 projects/01/Xor.tst create mode 100644 projects/01/project1.zip create mode 100644 projects/02/02.zip create mode 100644 projects/02/ALU-nostat.cmp create mode 100644 projects/02/ALU-nostat.tst create mode 100644 projects/02/ALU.cmp create mode 100644 projects/02/ALU.hdl create mode 100644 projects/02/ALU.tst create mode 100644 projects/02/Add16.cmp create mode 100644 projects/02/Add16.hdl create mode 100644 projects/02/Add16.tst create mode 100644 projects/02/FullAdder.cmp create mode 100644 projects/02/FullAdder.hdl create mode 100644 projects/02/FullAdder.tst create mode 100644 projects/02/HalfAdder.cmp create mode 100644 projects/02/HalfAdder.hdl create mode 100644 projects/02/HalfAdder.tst create mode 100644 projects/02/Inc16.cmp create mode 100644 projects/02/Inc16.hdl create mode 100644 projects/02/Inc16.tst create mode 100644 projects/03/03.zip create mode 100644 projects/03/a/Bit.cmp create mode 100644 projects/03/a/Bit.hdl create mode 100644 projects/03/a/Bit.tst create mode 100644 projects/03/a/PC.cmp create mode 100644 projects/03/a/PC.hdl create mode 100644 projects/03/a/PC.tst create mode 100644 projects/03/a/RAM64.cmp create mode 100644 projects/03/a/RAM64.hdl create mode 100644 projects/03/a/RAM64.tst create mode 100644 projects/03/a/RAM8.cmp create mode 100644 projects/03/a/RAM8.hdl create mode 100644 projects/03/a/RAM8.tst create mode 100644 projects/03/a/Register.cmp create mode 100644 projects/03/a/Register.hdl create mode 100644 projects/03/a/Register.tst create mode 100644 projects/03/b/RAM16K.cmp create mode 100644 projects/03/b/RAM16K.hdl create mode 100644 projects/03/b/RAM16K.tst create mode 100644 projects/03/b/RAM4K.cmp create mode 100644 projects/03/b/RAM4K.hdl create mode 100644 projects/03/b/RAM4K.tst create mode 100644 projects/03/b/RAM512.cmp create mode 100644 projects/03/b/RAM512.hdl create mode 100644 projects/03/b/RAM512.tst create mode 100644 projects/04/Fill.asm create mode 100644 projects/04/Mult.asm create mode 100644 projects/04/fill/Fill.asm create mode 100644 projects/04/fill/Fill.tst create mode 100644 projects/04/fill/FillAutomatic.cmp create mode 100644 projects/04/fill/FillAutomatic.tst create mode 100644 projects/04/mult/Mult.asm create mode 100644 projects/04/mult/Mult.cmp create mode 100644 projects/04/mult/Mult.tst create mode 100644 projects/04/project4.zip create mode 100644 projects/05/05.zip create mode 100644 projects/05/Add.hack create mode 100644 projects/05/CPU-external.cmp create mode 100644 projects/05/CPU-external.tst create mode 100644 projects/05/CPU.cmp create mode 100644 projects/05/CPU.hdl create mode 100644 projects/05/CPU.tst create mode 100644 projects/05/Computer.hdl create mode 100644 projects/05/ComputerAdd-external.cmp create mode 100644 projects/05/ComputerAdd-external.tst create mode 100644 projects/05/ComputerAdd.cmp create mode 100644 projects/05/ComputerAdd.tst create mode 100644 projects/05/ComputerMax-external.cmp create mode 100644 projects/05/ComputerMax-external.tst create mode 100644 projects/05/ComputerMax.cmp create mode 100644 projects/05/ComputerMax.tst create mode 100644 projects/05/ComputerRect-external.cmp create mode 100644 projects/05/ComputerRect-external.tst create mode 100644 projects/05/ComputerRect.cmp create mode 100644 projects/05/ComputerRect.tst create mode 100644 projects/05/Max.hack create mode 100644 projects/05/Memory.cmp create mode 100644 projects/05/Memory.hdl create mode 100644 projects/05/Memory.tst create mode 100644 projects/05/Rect.hack create mode 100644 projects/06/06.zip create mode 100644 projects/06/Add.hack create mode 100644 projects/06/Max.hack create mode 100644 projects/06/Pong.hack create mode 100644 projects/06/Rect.hack create mode 100644 projects/06/add/Add.asm create mode 100644 projects/06/add/Add.hack create mode 100644 projects/06/asm.py create mode 100644 projects/06/asm.py.v1 create mode 100644 projects/06/max/Max.asm create mode 100644 projects/06/max/Max.hack create mode 100644 projects/06/max/MaxL.asm create mode 100644 projects/06/max/MaxL.hack create mode 100644 projects/06/max/asdf.asm create mode 100644 projects/06/max/asdf.hack create mode 100644 projects/06/pong/Pong.asm create mode 100644 projects/06/pong/Pong.hack create mode 100644 projects/06/pong/PongL.asm create mode 100644 projects/06/prog.txt create mode 100644 projects/06/rect/Rect.asm create mode 100644 projects/06/rect/Rect.hack create mode 100644 projects/06/rect/RectL.asm create mode 100644 projects/07/MemoryAccess/BasicTest/BasicTest.asm create mode 100644 projects/07/MemoryAccess/BasicTest/BasicTest.cmp create mode 100644 projects/07/MemoryAccess/BasicTest/BasicTest.tst create mode 100644 projects/07/MemoryAccess/BasicTest/BasicTest.vm create mode 100644 projects/07/MemoryAccess/BasicTest/BasicTestVME.tst create mode 100644 projects/07/MemoryAccess/PointerTest/PointerTest.asm create mode 100644 projects/07/MemoryAccess/PointerTest/PointerTest.cmp create mode 100644 projects/07/MemoryAccess/PointerTest/PointerTest.tst create mode 100644 projects/07/MemoryAccess/PointerTest/PointerTest.vm create mode 100644 projects/07/MemoryAccess/PointerTest/PointerTestVME.tst create mode 100644 projects/07/MemoryAccess/StaticTest/StaticTest.asm create mode 100644 projects/07/MemoryAccess/StaticTest/StaticTest.cmp create mode 100644 projects/07/MemoryAccess/StaticTest/StaticTest.tst create mode 100644 projects/07/MemoryAccess/StaticTest/StaticTest.vm create mode 100644 projects/07/MemoryAccess/StaticTest/StaticTestVME.tst create mode 100644 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.asm create mode 100644 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp create mode 100644 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.tst create mode 100644 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm create mode 100644 projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst create mode 100644 projects/07/StackArithmetic/StackTest/StackTest.asm create mode 100644 projects/07/StackArithmetic/StackTest/StackTest.cmp create mode 100644 projects/07/StackArithmetic/StackTest/StackTest.tst create mode 100644 projects/07/StackArithmetic/StackTest/StackTest.vm create mode 100644 projects/07/StackArithmetic/StackTest/StackTestVME.tst create mode 100644 projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm create mode 100644 projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp create mode 100644 projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst create mode 100644 projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst create mode 100644 projects/08/FunctionCalls/FibonacciElement/Main.vm create mode 100644 projects/08/FunctionCalls/FibonacciElement/Sys.vm create mode 100644 projects/08/FunctionCalls/NestedCall/.asm create mode 100644 projects/08/FunctionCalls/NestedCall/NestedCall.asm create mode 100644 projects/08/FunctionCalls/NestedCall/NestedCall.cmp create mode 100644 projects/08/FunctionCalls/NestedCall/NestedCall.html create mode 100644 projects/08/FunctionCalls/NestedCall/NestedCall.tst create mode 100644 projects/08/FunctionCalls/NestedCall/NestedCallStack.html create mode 100644 projects/08/FunctionCalls/NestedCall/NestedCallVME.tst create mode 100644 projects/08/FunctionCalls/NestedCall/Sys.asm create mode 100644 projects/08/FunctionCalls/NestedCall/Sys.vm create mode 100644 projects/08/FunctionCalls/SimpleFunction.asm create mode 100644 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.asm create mode 100644 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp create mode 100644 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst create mode 100644 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm create mode 100644 projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst create mode 100644 projects/08/FunctionCalls/StaticsTest/.asm create mode 100644 projects/08/FunctionCalls/StaticsTest/Class1.vm create mode 100644 projects/08/FunctionCalls/StaticsTest/Class2.vm create mode 100644 projects/08/FunctionCalls/StaticsTest/StaticsTest.asm create mode 100644 projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp create mode 100644 projects/08/FunctionCalls/StaticsTest/StaticsTest.tst create mode 100644 projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst create mode 100644 projects/08/FunctionCalls/StaticsTest/Sys.asm create mode 100644 projects/08/FunctionCalls/StaticsTest/Sys.vm create mode 100644 projects/08/ProgramFlow/BasicLoop/.asm create mode 100644 projects/08/ProgramFlow/BasicLoop/BasicLoop.asm create mode 100644 projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp create mode 100644 projects/08/ProgramFlow/BasicLoop/BasicLoop.tst create mode 100644 projects/08/ProgramFlow/BasicLoop/BasicLoop.vm create mode 100644 projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst create mode 100644 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm create mode 100644 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp create mode 100644 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst create mode 100644 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm create mode 100644 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst create mode 100644 projects/09/Average/Main.jack create mode 100644 projects/09/BitmapEditor/BitmapEditor.html create mode 100644 projects/09/BitmapEditor/BitmapEditor.iml create mode 100644 projects/09/Fraction/Fraction.jack create mode 100644 projects/09/Fraction/Main.jack create mode 100644 projects/09/HelloWorld/Main.jack create mode 100644 projects/09/Jack OS API.pdf create mode 100644 projects/09/List/List.jack create mode 100644 projects/09/List/Main.jack create mode 100644 projects/09/Square/Main.jack create mode 100644 projects/09/Square/Square.jack create mode 100644 projects/09/Square/SquareGame.jack create mode 100644 projects/10/ArrayTest/Main.jack create mode 100644 projects/10/ArrayTest/Main.xml create mode 100644 projects/10/ArrayTest/MainT.xml create mode 100644 projects/10/ExpressionLessSquare/Main.jack create mode 100644 projects/10/ExpressionLessSquare/Main.xml create mode 100644 projects/10/ExpressionLessSquare/MainT.xml create mode 100644 projects/10/ExpressionLessSquare/Square.jack create mode 100644 projects/10/ExpressionLessSquare/Square.xml create mode 100644 projects/10/ExpressionLessSquare/SquareGame.jack create mode 100644 projects/10/ExpressionLessSquare/SquareGame.xml create mode 100644 projects/10/ExpressionLessSquare/SquareGameT.xml create mode 100644 projects/10/ExpressionLessSquare/SquareT.xml create mode 100644 projects/10/Square/Main.jack create mode 100644 projects/10/Square/Main.xml create mode 100644 projects/10/Square/MainT.xml create mode 100644 projects/10/Square/Square.jack create mode 100644 projects/10/Square/Square.xml create mode 100644 projects/10/Square/SquareGame.jack create mode 100644 projects/10/Square/SquareGame.xml create mode 100644 projects/10/Square/SquareGameT.xml create mode 100644 projects/10/Square/SquareT.xml create mode 100644 projects/11/Arkanoid/Ball.jack create mode 100644 projects/11/Arkanoid/Ball.vm create mode 100644 projects/11/Arkanoid/Ball.xml create mode 100644 projects/11/Arkanoid/BallT.xml create mode 100644 projects/11/Arkanoid/Game.jack create mode 100644 projects/11/Arkanoid/Game.vm create mode 100644 projects/11/Arkanoid/Game.xml create mode 100644 projects/11/Arkanoid/GameT.xml create mode 100644 projects/11/Arkanoid/Main.jack create mode 100644 projects/11/Arkanoid/Main.vm create mode 100644 projects/11/Arkanoid/Main.xml create mode 100644 projects/11/Arkanoid/MainT.xml create mode 100644 projects/11/Arkanoid/Rect.jack create mode 100644 projects/11/Arkanoid/Rect.vm create mode 100644 projects/11/Arkanoid/Rect.xml create mode 100644 projects/11/Arkanoid/RectT.xml create mode 100644 projects/11/Arkanoid/Util.jack create mode 100644 projects/11/Arkanoid/Util.vm create mode 100644 projects/11/Arkanoid/Util.xml create mode 100644 projects/11/Arkanoid/UtilT.xml create mode 100644 projects/11/Arkanoid/source/Ball.jack create mode 100644 projects/11/Arkanoid/source/Game.jack create mode 100644 projects/11/Arkanoid/source/Main.jack create mode 100644 projects/11/Arkanoid/source/Rect.jack create mode 100644 projects/11/Arkanoid/source/Util.jack create mode 100644 projects/11/Average/Main.jack create mode 100644 projects/11/Average/Main.vm create mode 100644 projects/11/Average/Main.xml create mode 100644 projects/11/Average/MainT.xml create mode 100644 projects/11/ComplexArrays/Main.jack create mode 100644 projects/11/ComplexArrays/Main.vm create mode 100644 projects/11/ComplexArrays/Main.xml create mode 100644 projects/11/ComplexArrays/MainT.xml create mode 100644 projects/11/ConvertToBin/Main.jack create mode 100644 projects/11/ConvertToBin/Main.vm create mode 100644 projects/11/ConvertToBin/Main.xml create mode 100644 projects/11/ConvertToBin/MainT.xml create mode 100644 projects/11/Pong/Array.jack create mode 100644 projects/11/Pong/Array.vm create mode 100644 projects/11/Pong/Ball.jack create mode 100644 projects/11/Pong/Ball.vm create mode 100644 projects/11/Pong/Ball.xml create mode 100644 projects/11/Pong/BallT.xml create mode 100644 projects/11/Pong/Bat.jack create mode 100644 projects/11/Pong/Bat.vm create mode 100644 projects/11/Pong/Bat.xml create mode 100644 projects/11/Pong/BatT.xml create mode 100644 projects/11/Pong/Keyboard.jack create mode 100644 projects/11/Pong/Keyboard.vm create mode 100644 projects/11/Pong/Main.jack create mode 100644 projects/11/Pong/Main.vm create mode 100644 projects/11/Pong/Main.xml create mode 100644 projects/11/Pong/MainT.xml create mode 100644 projects/11/Pong/Math.jack create mode 100644 projects/11/Pong/Math.vm create mode 100644 projects/11/Pong/Memory.jack create mode 100644 projects/11/Pong/Memory.vm create mode 100644 projects/11/Pong/Output.jack create mode 100644 projects/11/Pong/Output.vm create mode 100644 projects/11/Pong/PongGame.jack create mode 100644 projects/11/Pong/PongGame.vm create mode 100644 projects/11/Pong/PongGame.xml create mode 100644 projects/11/Pong/PongGameT.xml create mode 100644 projects/11/Pong/Screen.jack create mode 100644 projects/11/Pong/Screen.vm create mode 100644 projects/11/Pong/String.jack create mode 100644 projects/11/Pong/String.vm create mode 100644 projects/11/Pong/Sys.jack create mode 100644 projects/11/Pong/Sys.vm create mode 100644 projects/11/Seven/Main.jack create mode 100644 projects/11/Seven/Main.vm create mode 100644 projects/11/Seven/Main.xml create mode 100644 projects/11/Seven/MainT.xml create mode 100644 projects/11/Square/Main.jack create mode 100644 projects/11/Square/Main.vm create mode 100644 projects/11/Square/Main.xml create mode 100644 projects/11/Square/MainT.xml create mode 100644 projects/11/Square/Square.jack create mode 100644 projects/11/Square/Square.vm create mode 100644 projects/11/Square/Square.xml create mode 100644 projects/11/Square/SquareGame.jack create mode 100644 projects/11/Square/SquareGame.vm create mode 100644 projects/11/Square/SquareGame.xml create mode 100644 projects/11/Square/SquareGameT.xml create mode 100644 projects/11/Square/SquareT.xml create mode 100644 projects/12/Array.jack create mode 100644 projects/12/ArrayTest/Array.jack create mode 100644 projects/12/ArrayTest/Array.vm create mode 100644 projects/12/ArrayTest/ArrayTest.cmp create mode 100644 projects/12/ArrayTest/ArrayTest.tst create mode 100644 projects/12/ArrayTest/Keyboard.jack create mode 100644 projects/12/ArrayTest/Keyboard.vm create mode 100644 projects/12/ArrayTest/Main.jack create mode 100644 projects/12/ArrayTest/Main.vm create mode 100644 projects/12/ArrayTest/Math.jack create mode 100644 projects/12/ArrayTest/Math.vm create mode 100644 projects/12/ArrayTest/Memory.jack create mode 100644 projects/12/ArrayTest/Memory.vm create mode 100644 projects/12/ArrayTest/Output.jack create mode 100644 projects/12/ArrayTest/Output.vm create mode 100644 projects/12/ArrayTest/Screen.jack create mode 100644 projects/12/ArrayTest/Screen.vm create mode 100644 projects/12/ArrayTest/String.jack create mode 100644 projects/12/ArrayTest/String.vm create mode 100644 projects/12/ArrayTest/Sys.jack create mode 100644 projects/12/ArrayTest/Sys.vm create mode 100644 projects/12/Keyboard.jack create mode 100644 projects/12/KeyboardTest/Keyboard.jack create mode 100644 projects/12/KeyboardTest/Keyboard.vm create mode 100644 projects/12/KeyboardTest/KeyboardTestOutput.gif create mode 100644 projects/12/KeyboardTest/Main.jack create mode 100644 projects/12/KeyboardTest/Main.vm create mode 100644 projects/12/Math.jack create mode 100644 projects/12/MathTest/Main.jack create mode 100644 projects/12/MathTest/Main.vm create mode 100644 projects/12/MathTest/Math.jack create mode 100644 projects/12/MathTest/Math.vm create mode 100644 projects/12/MathTest/MathTest.cmp create mode 100644 projects/12/MathTest/MathTest.tst create mode 100644 projects/12/Memory.jack create mode 100644 projects/12/MemoryTest/Main.jack create mode 100644 projects/12/MemoryTest/Main.vm create mode 100644 projects/12/MemoryTest/Memory.jack create mode 100644 projects/12/MemoryTest/Memory.vm create mode 100644 projects/12/MemoryTest/MemoryTest.cmp create mode 100644 projects/12/MemoryTest/MemoryTest.tst create mode 100644 projects/12/Output.jack create mode 100644 projects/12/OutputTest/Array.jack create mode 100644 projects/12/OutputTest/Array.vm create mode 100644 projects/12/OutputTest/Keyboard.jack create mode 100644 projects/12/OutputTest/Keyboard.vm create mode 100644 projects/12/OutputTest/Main.jack create mode 100644 projects/12/OutputTest/Main.vm create mode 100644 projects/12/OutputTest/Math.jack create mode 100644 projects/12/OutputTest/Math.vm create mode 100644 projects/12/OutputTest/Memory.jack create mode 100644 projects/12/OutputTest/Memory.vm create mode 100644 projects/12/OutputTest/Output.jack create mode 100644 projects/12/OutputTest/Output.vm create mode 100644 projects/12/OutputTest/OutputTestOutput.gif create mode 100644 projects/12/OutputTest/Screen.jack create mode 100644 projects/12/OutputTest/Screen.vm create mode 100644 projects/12/OutputTest/String.jack create mode 100644 projects/12/OutputTest/String.vm create mode 100644 projects/12/OutputTest/Sys.jack create mode 100644 projects/12/OutputTest/Sys.vm create mode 100644 projects/12/Pong/Array.jack create mode 100644 projects/12/Pong/Array.vm create mode 100644 projects/12/Pong/Ball.jack create mode 100644 projects/12/Pong/Ball.vm create mode 100644 projects/12/Pong/Ball.xml create mode 100644 projects/12/Pong/BallT.xml create mode 100644 projects/12/Pong/Bat.jack create mode 100644 projects/12/Pong/Bat.vm create mode 100644 projects/12/Pong/Bat.xml create mode 100644 projects/12/Pong/BatT.xml create mode 100644 projects/12/Pong/Keyboard.jack create mode 100644 projects/12/Pong/Keyboard.vm create mode 100644 projects/12/Pong/Main.jack create mode 100644 projects/12/Pong/Main.vm create mode 100644 projects/12/Pong/Main.xml create mode 100644 projects/12/Pong/MainT.xml create mode 100644 projects/12/Pong/Math.jack create mode 100644 projects/12/Pong/Math.vm create mode 100644 projects/12/Pong/Memory.jack create mode 100644 projects/12/Pong/Memory.vm create mode 100644 projects/12/Pong/Output.jack create mode 100644 projects/12/Pong/Output.vm create mode 100644 projects/12/Pong/PongGame.jack create mode 100644 projects/12/Pong/PongGame.vm create mode 100644 projects/12/Pong/PongGame.xml create mode 100644 projects/12/Pong/PongGameT.xml create mode 100644 projects/12/Pong/Screen.jack create mode 100644 projects/12/Pong/Screen.vm create mode 100644 projects/12/Pong/String.jack create mode 100644 projects/12/Pong/String.vm create mode 100644 projects/12/Pong/Sys.jack create mode 100644 projects/12/Pong/Sys.vm create mode 100644 projects/12/Screen.jack create mode 100644 projects/12/ScreenTest/Array.jack create mode 100644 projects/12/ScreenTest/Array.vm create mode 100644 projects/12/ScreenTest/Keyboard.jack create mode 100644 projects/12/ScreenTest/Keyboard.vm create mode 100644 projects/12/ScreenTest/Main.jack create mode 100644 projects/12/ScreenTest/Main.vm create mode 100644 projects/12/ScreenTest/Math.jack create mode 100644 projects/12/ScreenTest/Math.vm create mode 100644 projects/12/ScreenTest/Memory.jack create mode 100644 projects/12/ScreenTest/Memory.vm create mode 100644 projects/12/ScreenTest/Output.jack create mode 100644 projects/12/ScreenTest/Output.vm create mode 100644 projects/12/ScreenTest/Screen.jack create mode 100644 projects/12/ScreenTest/Screen.vm create mode 100644 projects/12/ScreenTest/ScreenTestOutput.gif create mode 100644 projects/12/ScreenTest/String.jack create mode 100644 projects/12/ScreenTest/String.vm create mode 100644 projects/12/ScreenTest/Sys.jack create mode 100644 projects/12/ScreenTest/Sys.vm create mode 100644 projects/12/String.jack create mode 100644 projects/12/StringTest/Main.jack create mode 100644 projects/12/StringTest/Main.vm create mode 100644 projects/12/StringTest/String.jack create mode 100644 projects/12/StringTest/String.vm create mode 100644 projects/12/StringTest/StringTestOutput.gif create mode 100644 projects/12/Sys.jack create mode 100644 projects/12/SysTest/Main.jack create mode 100644 projects/12/SysTest/Main.vm create mode 100644 projects/12/SysTest/Sys.jack create mode 100644 projects/12/SysTest/Sys.vm create mode 100644 projects/12/project12.zip create mode 100644 projects/13/more fun to go.txt create mode 100644 projects/Arkanoid.zip create mode 100644 projects/Arkanoid/Ball.vm create mode 100644 projects/Arkanoid/Game.vm create mode 100644 projects/Arkanoid/Main.vm create mode 100644 projects/Arkanoid/Rect.vm create mode 100644 projects/Arkanoid/Util.vm create mode 100644 projects/Arkanoid/source/Ball.jack create mode 100644 projects/Arkanoid/source/Game.jack create mode 100644 projects/Arkanoid/source/Main.jack create mode 100644 projects/Arkanoid/source/Rect.jack create mode 100644 projects/Arkanoid/source/Util.jack create mode 100644 projects/JackAnalyzer/.gitattributes create mode 100644 projects/JackAnalyzer/.gitignore create mode 100644 projects/JackAnalyzer/JackAnalyzer.sln create mode 100644 projects/JackAnalyzer/JackAnalyzer/Constants.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/JackAnalyzer.csproj create mode 100644 projects/JackAnalyzer/JackAnalyzer/MetaSymbolTable.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/Program.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/SymbolTable.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/Token.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/Tokenizer.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/VMWriter.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/Writer.cs create mode 100644 projects/JackAnalyzer/JackAnalyzer/project10.zip create mode 100644 projects/JackAnalyzer/JackAnalyzer/project11.zip create mode 100644 projects/JackAnalyzer/SymbolTableTest/JackAnalyzerTest.csproj create mode 100644 projects/JackAnalyzer/SymbolTableTest/MetaSymbolTableTest.cs create mode 100644 projects/JackAnalyzer/SymbolTableTest/SymbolTableTest.cs create mode 100644 projects/Tables/Cell.jack create mode 100644 projects/Tables/Cell.vm create mode 100644 projects/Tables/Main.jack create mode 100644 projects/Tables/Main.vm create mode 100644 projects/Tables/Table.jack create mode 100644 projects/Tables/Table.vm create mode 100644 projects/Tables/Utils.jack create mode 100644 projects/Tables/Utils.vm create mode 100644 projects/VMTranslator/.asm create mode 100644 projects/VMTranslator/.clang-format create mode 100644 projects/VMTranslator/.gitignore create mode 100644 projects/VMTranslator/.vscode/c_cpp_properties.json create mode 100644 projects/VMTranslator/.vscode/settings.json create mode 100644 projects/VMTranslator/CMakeLists.txt create mode 100644 projects/VMTranslator/Commands.cpp create mode 100644 projects/VMTranslator/Commands.h create mode 100644 projects/VMTranslator/Parser.cpp create mode 100644 projects/VMTranslator/Parser.h create mode 100644 projects/VMTranslator/VMTranslator create mode 100644 projects/VMTranslator/Writer.cpp create mode 100644 projects/VMTranslator/Writer.h create mode 100644 projects/VMTranslator/lang.txt create mode 100644 projects/VMTranslator/main.cpp create mode 100644 projects/VMTranslator/project7.zip create mode 100644 projects/VMTranslator/project8.zip create mode 100644 projects/demo/Xor.cmp create mode 100644 projects/demo/Xor.hdl create mode 100644 projects/demo/Xor.tst create mode 100644 tools/Assembler.bat create mode 100644 tools/Assembler.sh create mode 100644 tools/CPUEmulator.bat create mode 100644 tools/CPUEmulator.sh create mode 100644 tools/HardwareSimulator.bat create mode 100644 tools/HardwareSimulator.sh create mode 100644 tools/JackCompiler.bat create mode 100644 tools/JackCompiler.sh create mode 100644 tools/OS/Array.vm create mode 100644 tools/OS/Keyboard.vm create mode 100644 tools/OS/Math.vm create mode 100644 tools/OS/Memory.vm create mode 100644 tools/OS/Output.vm create mode 100644 tools/OS/Screen.vm create mode 100644 tools/OS/String.vm create mode 100644 tools/OS/Sys.vm create mode 100644 tools/TextComparer.bat create mode 100644 tools/TextComparer.sh create mode 100644 tools/VMEmulator.bat create mode 100644 tools/VMEmulator.sh create mode 100644 tools/builtInChips/ALU.class create mode 100644 tools/builtInChips/ALU.hdl create mode 100644 tools/builtInChips/ARegister.class create mode 100644 tools/builtInChips/ARegister.hdl create mode 100644 tools/builtInChips/Add16.class create mode 100644 tools/builtInChips/Add16.hdl create mode 100644 tools/builtInChips/And.class create mode 100644 tools/builtInChips/And.hdl create mode 100644 tools/builtInChips/And16.hdl create mode 100644 tools/builtInChips/Bit.class create mode 100644 tools/builtInChips/Bit.hdl create mode 100644 tools/builtInChips/DFF.class create mode 100644 tools/builtInChips/DFF.hdl create mode 100644 tools/builtInChips/DMux.class create mode 100644 tools/builtInChips/DMux.hdl create mode 100644 tools/builtInChips/DMux4Way.class create mode 100644 tools/builtInChips/DMux4Way.hdl create mode 100644 tools/builtInChips/DMux8Way.class create mode 100644 tools/builtInChips/DMux8Way.hdl create mode 100644 tools/builtInChips/DRegister.class create mode 100644 tools/builtInChips/DRegister.hdl create mode 100644 tools/builtInChips/FullAdder.class create mode 100644 tools/builtInChips/FullAdder.hdl create mode 100644 tools/builtInChips/HalfAdder.class create mode 100644 tools/builtInChips/HalfAdder.hdl create mode 100644 tools/builtInChips/Inc16.class create mode 100644 tools/builtInChips/Inc16.hdl create mode 100644 tools/builtInChips/Keyboard.class create mode 100644 tools/builtInChips/Keyboard.hdl create mode 100644 tools/builtInChips/Mux.class create mode 100644 tools/builtInChips/Mux.hdl create mode 100644 tools/builtInChips/Mux16.hdl create mode 100644 tools/builtInChips/Mux4Way16.class create mode 100644 tools/builtInChips/Mux4Way16.hdl create mode 100644 tools/builtInChips/Mux8Way16.class create mode 100644 tools/builtInChips/Mux8Way16.hdl create mode 100644 tools/builtInChips/Nand.class create mode 100644 tools/builtInChips/Nand.hdl create mode 100644 tools/builtInChips/Not.class create mode 100644 tools/builtInChips/Not.hdl create mode 100644 tools/builtInChips/Not16.class create mode 100644 tools/builtInChips/Not16.hdl create mode 100644 tools/builtInChips/Or.class create mode 100644 tools/builtInChips/Or.hdl create mode 100644 tools/builtInChips/Or16.hdl create mode 100644 tools/builtInChips/Or8Way.class create mode 100644 tools/builtInChips/Or8Way.hdl create mode 100644 tools/builtInChips/PC.class create mode 100644 tools/builtInChips/PC.hdl create mode 100644 tools/builtInChips/RAM.class create mode 100644 tools/builtInChips/RAM16K.class create mode 100644 tools/builtInChips/RAM16K.hdl create mode 100644 tools/builtInChips/RAM4K.class create mode 100644 tools/builtInChips/RAM4K.hdl create mode 100644 tools/builtInChips/RAM512.class create mode 100644 tools/builtInChips/RAM512.hdl create mode 100644 tools/builtInChips/RAM64.class create mode 100644 tools/builtInChips/RAM64.hdl create mode 100644 tools/builtInChips/RAM8.class create mode 100644 tools/builtInChips/RAM8.hdl create mode 100644 tools/builtInChips/ROM32K.class create mode 100644 tools/builtInChips/ROM32K.hdl create mode 100644 tools/builtInChips/Register.class create mode 100644 tools/builtInChips/Register.hdl create mode 100644 tools/builtInChips/RegisterWithGUI.class create mode 100644 tools/builtInChips/Screen.class create mode 100644 tools/builtInChips/Screen.hdl create mode 100644 tools/builtInChips/Xor.class create mode 100644 tools/builtInChips/Xor.hdl create mode 100644 tools/builtInVMCode/Array.class create mode 100644 tools/builtInVMCode/JackOSClass.class create mode 100644 tools/builtInVMCode/Keyboard.class create mode 100644 tools/builtInVMCode/Math.class create mode 100644 tools/builtInVMCode/Memory.class create mode 100644 tools/builtInVMCode/Output.class create mode 100644 tools/builtInVMCode/Screen.class create mode 100644 tools/builtInVMCode/String.class create mode 100644 tools/builtInVMCode/Sys.class diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a82e0aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,602 @@ +.history +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + + +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps + diff --git a/projects/00/file.txt b/projects/00/file.txt new file mode 100644 index 0000000..b7eeed1 --- /dev/null +++ b/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/projects/00/project0.zip b/projects/00/project0.zip new file mode 100644 index 0000000000000000000000000000000000000000..e59caeddfb5626acaf3216b7bfa670bf806ff934 GIT binary patch literal 321 zcmWIWW@Zs#W?pF=^79XEzdRzn}T!w7#Hq zXV3wcJ5zFg2g}$6cr!BDGvo4-3eZy^pwRHP5k$j0$i<)l;xaHYNH8$8Ju>wFbCHo@ g_5Yx5!>f!8b>{*>bbvQ28$=BwLlls45yW8t0O+H382|tP literal 0 HcmV?d00001 diff --git a/projects/01/And.cmp b/projects/01/And.cmp new file mode 100644 index 0000000..8199ca5 --- /dev/null +++ b/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/projects/01/And.hdl b/projects/01/And.hdl new file mode 100644 index 0000000..ba0fda3 --- /dev/null +++ b/projects/01/And.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/01/And.hdl + +/** + * And gate: + * out = 1 if (a == 1 and b == 1) + * 0 otherwise + */ + +CHIP And { + IN a, b; + OUT out; + + PARTS: + Nand(a=a, b=b, out=nand); + Not(in=nand, out=out); +} diff --git a/projects/01/And.tst b/projects/01/And.tst new file mode 100644 index 0000000..8c94f98 --- /dev/null +++ b/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/projects/01/And16.cmp b/projects/01/And16.cmp new file mode 100644 index 0000000..fb8dbfc --- /dev/null +++ b/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/projects/01/And16.hdl b/projects/01/And16.hdl new file mode 100644 index 0000000..9d0ca6a --- /dev/null +++ b/projects/01/And16.hdl @@ -0,0 +1,32 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computag 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: + And(a=a[0], b=b[0], out=out[0]); + And(a=a[1], b=b[1], out=out[1]); + And(a=a[2], b=b[2], out=out[2]); + And(a=a[3], b=b[3], out=out[3]); + And(a=a[4], b=b[4], out=out[4]); + And(a=a[5], b=b[5], out=out[5]); + And(a=a[6], b=b[6], out=out[6]); + And(a=a[7], b=b[7], out=out[7]); + And(a=a[8], b=b[8], out=out[8]); + And(a=a[9], b=b[9], out=out[9]); + And(a=a[10], b=b[10], out=out[10]); + And(a=a[11], b=b[11], out=out[11]); + And(a=a[12], b=b[12], out=out[12]); + And(a=a[13], b=b[13], out=out[13]); + And(a=a[14], b=b[14], out=out[14]); + And(a=a[15], b=b[15], out=out[15]); +} \ No newline at end of file diff --git a/projects/01/And16.tst b/projects/01/And16.tst new file mode 100644 index 0000000..c9a776f --- /dev/null +++ b/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/projects/01/DMux.cmp b/projects/01/DMux.cmp new file mode 100644 index 0000000..9a92ec0 --- /dev/null +++ b/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/projects/01/DMux.hdl b/projects/01/DMux.hdl new file mode 100644 index 0000000..90025a4 --- /dev/null +++ b/projects/01/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: 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: + Not(in=sel, out=notsel); + And(a=notsel, b=in, out=a); + And(a=sel, b=in, out=b); +} diff --git a/projects/01/DMux.tst b/projects/01/DMux.tst new file mode 100644 index 0000000..87c580f --- /dev/null +++ b/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/projects/01/DMux4Way.cmp b/projects/01/DMux4Way.cmp new file mode 100644 index 0000000..9dd708f --- /dev/null +++ b/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/projects/01/DMux4Way.hdl b/projects/01/DMux4Way.hdl new file mode 100644 index 0000000..2247245 --- /dev/null +++ b/projects/01/DMux4Way.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/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: + Not(in=sel[0], out=notsel0); + Not(in=sel[1], out=notsel1); + + And(a=notsel0, b=notsel1, out=shouldA); + And(a=sel[0], b=notsel1, out=shouldB); + And(a=notsel0, b=sel[1], out=shouldC); + And(a=sel[0], b=sel[1], out=shouldD); + + And(a=shouldA, b=in, out=a); + And(a=shouldB, b=in, out=b); + And(a=shouldC, b=in, out=c); + And(a=shouldD, b=in, out=d); +} \ No newline at end of file diff --git a/projects/01/DMux4Way.tst b/projects/01/DMux4Way.tst new file mode 100644 index 0000000..41ca702 --- /dev/null +++ b/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/projects/01/DMux8Way.cmp b/projects/01/DMux8Way.cmp new file mode 100644 index 0000000..ebf9304 --- /dev/null +++ b/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/projects/01/DMux8Way.hdl b/projects/01/DMux8Way.hdl new file mode 100644 index 0000000..fd95c83 --- /dev/null +++ b/projects/01/DMux8Way.hdl @@ -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/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: + DMux4Way(in=in, sel=sel[0..1], a=pa, b=pb, c=pc, d=pd); + DMux4Way(in=in, sel=sel[0..1], a=pe, b=pf, c=pg, d=ph); + + Not(in=sel[2], out=notsel2); + + And(a=pa, b=notsel2, out=a); + And(a=pb, b=notsel2, out=b); + And(a=pc, b=notsel2, out=c); + And(a=pd, b=notsel2, out=d); + And(a=pe, b=sel[2], out=e); + And(a=pf, b=sel[2], out=f); + And(a=pg, b=sel[2], out=g); + And(a=ph, b=sel[2], out=h); +} \ No newline at end of file diff --git a/projects/01/DMux8Way.tst b/projects/01/DMux8Way.tst new file mode 100644 index 0000000..91469bf --- /dev/null +++ b/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/projects/01/Mux.cmp b/projects/01/Mux.cmp new file mode 100644 index 0000000..e4b51c6 --- /dev/null +++ b/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/projects/01/Mux.hdl b/projects/01/Mux.hdl new file mode 100644 index 0000000..f65f07c --- /dev/null +++ b/projects/01/Mux.hdl @@ -0,0 +1,21 @@ +// 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: + Not(in=sel, out=notsel); + And(a=b, b=sel, out=selb); + And(a=a, b=notsel, out=sela); + Or(a=selb, b=sela, out=out); +} \ No newline at end of file diff --git a/projects/01/Mux.tst b/projects/01/Mux.tst new file mode 100644 index 0000000..5bbd8f3 --- /dev/null +++ b/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/projects/01/Mux16.cmp b/projects/01/Mux16.cmp new file mode 100644 index 0000000..d2e472e --- /dev/null +++ b/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/projects/01/Mux16.hdl b/projects/01/Mux16.hdl new file mode 100644 index 0000000..6c93894 --- /dev/null +++ b/projects/01/Mux16.hdl @@ -0,0 +1,33 @@ +// 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: + Mux(sel=sel, a=a[0], b=b[0], out=out[0]); + Mux(sel=sel, a=a[1], b=b[1], out=out[1]); + Mux(sel=sel, a=a[2], b=b[2], out=out[2]); + Mux(sel=sel, a=a[3], b=b[3], out=out[3]); + Mux(sel=sel, a=a[4], b=b[4], out=out[4]); + Mux(sel=sel, a=a[5], b=b[5], out=out[5]); + Mux(sel=sel, a=a[6], b=b[6], out=out[6]); + Mux(sel=sel, a=a[7], b=b[7], out=out[7]); + Mux(sel=sel, a=a[8], b=b[8], out=out[8]); + Mux(sel=sel, a=a[9], b=b[9], out=out[9]); + Mux(sel=sel, a=a[10], b=b[10], out=out[10]); + Mux(sel=sel, a=a[11], b=b[11], out=out[11]); + Mux(sel=sel, a=a[12], b=b[12], out=out[12]); + Mux(sel=sel, a=a[13], b=b[13], out=out[13]); + Mux(sel=sel, a=a[14], b=b[14], out=out[14]); + Mux(sel=sel, a=a[15], b=b[15], out=out[15]); +} diff --git a/projects/01/Mux16.tst b/projects/01/Mux16.tst new file mode 100644 index 0000000..3465ed7 --- /dev/null +++ b/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/projects/01/Mux4Way16.cmp b/projects/01/Mux4Way16.cmp new file mode 100644 index 0000000..659176d --- /dev/null +++ b/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/projects/01/Mux4Way16.hdl b/projects/01/Mux4Way16.hdl new file mode 100644 index 0000000..ea85f0d --- /dev/null +++ b/projects/01/Mux4Way16.hdl @@ -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/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: + Nand(a=sel[0], b=sel[1], out=shouldAorBorC); + And(a=sel[0], b=sel[1], out=shouldD); + + Xor(a=sel[0], b=sel[1], out=shouldBorC); + And(a=shouldBorC, b=sel[0], out=shouldB); + And(a=shouldBorC, b=sel[1], out=shouldC); + + Nand(a=shouldAorBorC, b=shouldBorC, out=shouldA); + + Mux16(a=c, b=b, sel=shouldB, out=BorC); + Mux16(a=a, b=d, sel=shouldD, out=DorA); + + Mux16(a=DorA, b=BorC, sel=shouldBorC, out=out); +} \ No newline at end of file diff --git a/projects/01/Mux4Way16.tst b/projects/01/Mux4Way16.tst new file mode 100644 index 0000000..025924b --- /dev/null +++ b/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/projects/01/Mux8Way16.cmp b/projects/01/Mux8Way16.cmp new file mode 100644 index 0000000..11ff518 --- /dev/null +++ b/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/projects/01/Mux8Way16.hdl b/projects/01/Mux8Way16.hdl new file mode 100644 index 0000000..b6aed19 --- /dev/null +++ b/projects/01/Mux8Way16.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: projects/01/Mux8Way16.hdl + +/** + * 8-way 16-bit multiplexor: + * out = a == 000 + * b == 001 + * c == 010 + d == 011 + + e == 100 + f == 101 + g == 110 + * h == 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: + Mux4Way16(a=a, b=b, c=c, d=d, sel=sel[0..1], out=ABCD); + Mux4Way16(a=e, b=f, c=g, d=h, sel=sel[0..1], out=EFGH); + + Mux16(a=ABCD, b=EFGH, sel=sel[2], out=out); +} \ No newline at end of file diff --git a/projects/01/Mux8Way16.tst b/projects/01/Mux8Way16.tst new file mode 100644 index 0000000..1273849 --- /dev/null +++ b/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/projects/01/Not.cmp b/projects/01/Not.cmp new file mode 100644 index 0000000..7b64092 --- /dev/null +++ b/projects/01/Not.cmp @@ -0,0 +1,3 @@ +| in | out | +| 0 | 1 | +| 1 | 0 | diff --git a/projects/01/Not.hdl b/projects/01/Not.hdl new file mode 100644 index 0000000..fc02c1c --- /dev/null +++ b/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: + Nand(a=in, b=in, out=out); +} \ No newline at end of file diff --git a/projects/01/Not.tst b/projects/01/Not.tst new file mode 100644 index 0000000..e68a4a3 --- /dev/null +++ b/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/projects/01/Not16.cmp b/projects/01/Not16.cmp new file mode 100644 index 0000000..ae2ad1d --- /dev/null +++ b/projects/01/Not16.cmp @@ -0,0 +1,6 @@ +| in | out | +| 0000000000000000 | 1111111111111111 | +| 1111111111111111 | 0000000000000000 | +| 1010101010101010 | 0101010101010101 | +| 0011110011000011 | 1100001100111100 | +| 0001001000110100 | 1110110111001011 | diff --git a/projects/01/Not16.hdl b/projects/01/Not16.hdl new file mode 100644 index 0000000..9e4e0be --- /dev/null +++ b/projects/01/Not16.hdl @@ -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/01/Not16.hdl + +/** + * 16-bit Not: + * for i=0..15: out[i] = not in[i] + */ + +CHIP Not16 { + IN in[16]; + OUT out[16]; + + PARTS: + Not(in=in[0], out=out[0]); + Not(in=in[1], out=out[1]); + Not(in=in[2], out=out[2]); + Not(in=in[3], out=out[3]); + Not(in=in[4], out=out[4]); + Not(in=in[5], out=out[5]); + Not(in=in[6], out=out[6]); + Not(in=in[7], out=out[7]); + Not(in=in[8], out=out[8]); + Not(in=in[9], out=out[9]); + Not(in=in[10], out=out[10]); + Not(in=in[11], out=out[11]); + Not(in=in[12], out=out[12]); + Not(in=in[13], out=out[13]); + Not(in=in[14], out=out[14]); + Not(in=in[15], out=out[15]); +} \ No newline at end of file diff --git a/projects/01/Not16.tst b/projects/01/Not16.tst new file mode 100644 index 0000000..b3266db --- /dev/null +++ b/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/projects/01/Or.cmp b/projects/01/Or.cmp new file mode 100644 index 0000000..8010688 --- /dev/null +++ b/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/projects/01/Or.hdl b/projects/01/Or.hdl new file mode 100644 index 0000000..6d8673a --- /dev/null +++ b/projects/01/Or.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/Or.hdl + + /** + * Or gate: + * out = 1 if (a == 1 or b == 1) + * 0 otherwise + */ + +CHIP Or { + IN a, b; + OUT out; + + PARTS: + Not(in=a, out=nota); + Not(in=b, out=notb); + Nand(a=nota, b=notb, out=out); +} diff --git a/projects/01/Or.tst b/projects/01/Or.tst new file mode 100644 index 0000000..9787bbb --- /dev/null +++ b/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/projects/01/Or16.cmp b/projects/01/Or16.cmp new file mode 100644 index 0000000..8664afe --- /dev/null +++ b/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/projects/01/Or16.hdl b/projects/01/Or16.hdl new file mode 100644 index 0000000..f28b6bc --- /dev/null +++ b/projects/01/Or16.hdl @@ -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/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: + Or(a=a[0], b=b[0], out=out[0]); + Or(a=a[1], b=b[1], out=out[1]); + Or(a=a[2], b=b[2], out=out[2]); + Or(a=a[3], b=b[3], out=out[3]); + Or(a=a[4], b=b[4], out=out[4]); + Or(a=a[5], b=b[5], out=out[5]); + Or(a=a[6], b=b[6], out=out[6]); + Or(a=a[7], b=b[7], out=out[7]); + Or(a=a[8], b=b[8], out=out[8]); + Or(a=a[9], b=b[9], out=out[9]); + Or(a=a[10], b=b[10], out=out[10]); + Or(a=a[11], b=b[11], out=out[11]); + Or(a=a[12], b=b[12], out=out[12]); + Or(a=a[13], b=b[13], out=out[13]); + Or(a=a[14], b=b[14], out=out[14]); + Or(a=a[15], b=b[15], out=out[15]); +} \ No newline at end of file diff --git a/projects/01/Or16.tst b/projects/01/Or16.tst new file mode 100644 index 0000000..9ba9820 --- /dev/null +++ b/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/projects/01/Or8Way.cmp b/projects/01/Or8Way.cmp new file mode 100644 index 0000000..b9f8d99 --- /dev/null +++ b/projects/01/Or8Way.cmp @@ -0,0 +1,6 @@ +| in | out | +| 00000000 | 0 | +| 11111111 | 1 | +| 00010000 | 1 | +| 00000001 | 1 | +| 00100110 | 1 | diff --git a/projects/01/Or8Way.hdl b/projects/01/Or8Way.hdl new file mode 100644 index 0000000..e7816b3 --- /dev/null +++ b/projects/01/Or8Way.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/01/Or8Way.hdl + +/** + * 8-way Or: + * out = (in[0] or in[1] or ... or in[7]) + */ + +CHIP Or8Way { + IN in[8]; + OUT out; + + PARTS: + Or(a=in[0], b=in[1], out=or1); + Or(a=or1, b=in[2], out=or2); + Or(a=or2, b=in[3], out=or3); + Or(a=or3, b=in[4], out=or4); + Or(a=or4, b=in[5], out=or5); + Or(a=or5, b=in[6], out=or6); + Or(a=or6, b=in[7], out=out); +} \ No newline at end of file diff --git a/projects/01/Or8Way.tst b/projects/01/Or8Way.tst new file mode 100644 index 0000000..203a0ff --- /dev/null +++ b/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/projects/01/Xor.cmp b/projects/01/Xor.cmp new file mode 100644 index 0000000..73a8d0c --- /dev/null +++ b/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/projects/01/Xor.hdl b/projects/01/Xor.hdl new file mode 100644 index 0000000..59369ae --- /dev/null +++ b/projects/01/Xor.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/01/Xor.hdl + +/** + * Exclusive-or gate: + * out = not (a == b) + */ + +CHIP Xor { + IN a, b; + OUT out; + + PARTS: + Nand(a=a, b=b, out=aisb); + Or(a=a, b=b, out=aorb); + And(a=aisb, b=aorb, out=out); +} \ No newline at end of file diff --git a/projects/01/Xor.tst b/projects/01/Xor.tst new file mode 100644 index 0000000..e379bb2 --- /dev/null +++ b/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/projects/01/project1.zip b/projects/01/project1.zip new file mode 100644 index 0000000000000000000000000000000000000000..3aa11c4fcc2764f359301599a213900ad09486a4 GIT binary patch literal 21524 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 Jk_`B-{{i|-U7r8| literal 0 HcmV?d00001 diff --git a/projects/02/02.zip b/projects/02/02.zip new file mode 100644 index 0000000000000000000000000000000000000000..37df56346e3ba916885c9c42ac379ab346cbab29 GIT binary patch literal 8944 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 z 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 Pq<{^{zU%~DO5XngRln?V literal 0 HcmV?d00001 diff --git a/projects/03/a/Bit.cmp b/projects/03/a/Bit.cmp new file mode 100644 index 0000000..165c66d --- /dev/null +++ b/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/projects/03/a/Bit.hdl b/projects/03/a/Bit.hdl new file mode 100644 index 0000000..e67aa8b --- /dev/null +++ b/projects/03/a/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: 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: + Mux(a=mux, b=in, sel=load, out=dff); + DFF(in=dff, out=mux, out=out); +} diff --git a/projects/03/a/Bit.tst b/projects/03/a/Bit.tst new file mode 100644 index 0000000..402c7be --- /dev/null +++ b/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/projects/03/a/PC.cmp b/projects/03/a/PC.cmp new file mode 100644 index 0000000..5eca76b --- /dev/null +++ b/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/projects/03/a/PC.hdl b/projects/03/a/PC.hdl new file mode 100644 index 0000000..8a81e59 --- /dev/null +++ b/projects/03/a/PC.hdl @@ -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/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: + Inc16(in=regout, out=reginc); + Mux16(a=regout, b=reginc, sel=inc, out=incmux); + + Mux16(a=incmux, b=in, sel=load, out=loadmux); + + Mux16(a=loadmux, b=false, sel=reset, out=resmux); + + Or8Way(in[0]=reset, in[1]=load, in[2]=inc, out=regload); + + Register(in=resmux, load=regload, out=regout, out=out); +} diff --git a/projects/03/a/PC.tst b/projects/03/a/PC.tst new file mode 100644 index 0000000..5cecfcf --- /dev/null +++ b/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/projects/03/a/RAM64.cmp b/projects/03/a/RAM64.cmp new file mode 100644 index 0000000..554ce39 --- /dev/null +++ b/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/projects/03/a/RAM64.hdl b/projects/03/a/RAM64.hdl new file mode 100644 index 0000000..c117bc8 --- /dev/null +++ b/projects/03/a/RAM64.hdl @@ -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/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: + RAM8(in=in, load=load1, address=address[0..2], out=out1); + RAM8(in=in, load=load2, address=address[0..2], out=out2); + RAM8(in=in, load=load3, address=address[0..2], out=out3); + RAM8(in=in, load=load4, address=address[0..2], out=out4); + RAM8(in=in, load=load5, address=address[0..2], out=out5); + RAM8(in=in, load=load6, address=address[0..2], out=out6); + RAM8(in=in, load=load7, address=address[0..2], out=out7); + RAM8(in=in, load=load8, address=address[0..2], out=out8); + + DMux8Way(in=load, sel=address[3..5], a=load1, b=load2, c=load3, d=load4, e=load5, f=load6, g=load7, h=load8); + Mux8Way16(a=out1, b=out2, c=out3, d=out4, e=out5, f=out6, g=out7, h=out8, sel=address[3..5], out=out); +} \ No newline at end of file diff --git a/projects/03/a/RAM64.tst b/projects/03/a/RAM64.tst new file mode 100644 index 0000000..cf10a90 --- /dev/null +++ b/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/projects/03/a/RAM8.cmp b/projects/03/a/RAM8.cmp new file mode 100644 index 0000000..68df551 --- /dev/null +++ b/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/projects/03/a/RAM8.hdl b/projects/03/a/RAM8.hdl new file mode 100644 index 0000000..e17aece --- /dev/null +++ b/projects/03/a/RAM8.hdl @@ -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/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: + Register(in=in, load=reg0l, out=reg0); + Register(in=in, load=reg1l, out=reg1); + Register(in=in, load=reg2l, out=reg2); + Register(in=in, load=reg3l, out=reg3); + Register(in=in, load=reg4l, out=reg4); + Register(in=in, load=reg5l, out=reg5); + Register(in=in, load=reg6l, out=reg6); + Register(in=in, load=reg7l, out=reg7); + + DMux8Way(in=load, sel=address, a=reg0l, b=reg1l, c=reg2l, d=reg3l, e=reg4l, f=reg5l, g=reg6l, h=reg7l); + Mux8Way16(a=reg0, b=reg1, c=reg2, d=reg3, e=reg4, f=reg5, g=reg6, h=reg7, sel=address, out=out); +} \ No newline at end of file diff --git a/projects/03/a/RAM8.tst b/projects/03/a/RAM8.tst new file mode 100644 index 0000000..38d6ae8 --- /dev/null +++ b/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/projects/03/a/Register.cmp b/projects/03/a/Register.cmp new file mode 100644 index 0000000..2719604 --- /dev/null +++ b/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/projects/03/a/Register.hdl b/projects/03/a/Register.hdl new file mode 100644 index 0000000..09a5417 --- /dev/null +++ b/projects/03/a/Register.hdl @@ -0,0 +1,33 @@ +// 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: + Bit(in=in[0], load=load, out=out[0]); + Bit(in=in[1], load=load, out=out[1]); + Bit(in=in[2], load=load, out=out[2]); + Bit(in=in[3], load=load, out=out[3]); + Bit(in=in[4], load=load, out=out[4]); + Bit(in=in[5], load=load, out=out[5]); + Bit(in=in[6], load=load, out=out[6]); + Bit(in=in[7], load=load, out=out[7]); + Bit(in=in[8], load=load, out=out[8]); + Bit(in=in[9], load=load, out=out[9]); + Bit(in=in[10], load=load, out=out[10]); + Bit(in=in[11], load=load, out=out[11]); + Bit(in=in[12], load=load, out=out[12]); + Bit(in=in[13], load=load, out=out[13]); + Bit(in=in[14], load=load, out=out[14]); + Bit(in=in[15], load=load, out=out[15]); +} diff --git a/projects/03/a/Register.tst b/projects/03/a/Register.tst new file mode 100644 index 0000000..1d7b714 --- /dev/null +++ b/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/projects/03/b/RAM16K.cmp b/projects/03/b/RAM16K.cmp new file mode 100644 index 0000000..2caabe9 --- /dev/null +++ b/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/projects/03/b/RAM16K.hdl b/projects/03/b/RAM16K.hdl new file mode 100644 index 0000000..cffcabb --- /dev/null +++ b/projects/03/b/RAM16K.hdl @@ -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/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: + RAM4K(in=in, load=load1, address=address[0..11], out=out1); + RAM4K(in=in, load=load2, address=address[0..11], out=out2); + RAM4K(in=in, load=load3, address=address[0..11], out=out3); + RAM4K(in=in, load=load4, address=address[0..11], out=out4); + RAM4K(in=in, load=load5, address=address[0..11], out=out5); + RAM4K(in=in, load=load6, address=address[0..11], out=out6); + RAM4K(in=in, load=load7, address=address[0..11], out=out7); + RAM4K(in=in, load=load8, address=address[0..11], out=out8); + + DMux8Way(in=load, sel=address[11..13], a=load1, b=load2, c=load3, d=load4, e=load5, f=load6, g=load7, h=load8); + Mux8Way16(a=out1, b=out2, c=out3, d=out4, e=out5, f=out6, g=out7, h=out8, sel=address[11..13], out=out); +} \ No newline at end of file diff --git a/projects/03/b/RAM16K.tst b/projects/03/b/RAM16K.tst new file mode 100644 index 0000000..26e9690 --- /dev/null +++ b/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/projects/03/b/RAM4K.cmp b/projects/03/b/RAM4K.cmp new file mode 100644 index 0000000..c53d23a --- /dev/null +++ b/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/projects/03/b/RAM4K.hdl b/projects/03/b/RAM4K.hdl new file mode 100644 index 0000000..3d03872 --- /dev/null +++ b/projects/03/b/RAM4K.hdl @@ -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/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: + RAM512(in=in, load=load1, address=address[0..8], out=out1); + RAM512(in=in, load=load2, address=address[0..8], out=out2); + RAM512(in=in, load=load3, address=address[0..8], out=out3); + RAM512(in=in, load=load4, address=address[0..8], out=out4); + RAM512(in=in, load=load5, address=address[0..8], out=out5); + RAM512(in=in, load=load6, address=address[0..8], out=out6); + RAM512(in=in, load=load7, address=address[0..8], out=out7); + RAM512(in=in, load=load8, address=address[0..8], out=out8); + + DMux8Way(in=load, sel=address[9..11], a=load1, b=load2, c=load3, d=load4, e=load5, f=load6, g=load7, h=load8); + Mux8Way16(a=out1, b=out2, c=out3, d=out4, e=out5, f=out6, g=out7, h=out8, sel=address[9..11], out=out); +} \ No newline at end of file diff --git a/projects/03/b/RAM4K.tst b/projects/03/b/RAM4K.tst new file mode 100644 index 0000000..3732dc3 --- /dev/null +++ b/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/projects/03/b/RAM512.cmp b/projects/03/b/RAM512.cmp new file mode 100644 index 0000000..b947117 --- /dev/null +++ b/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/projects/03/b/RAM512.hdl b/projects/03/b/RAM512.hdl new file mode 100644 index 0000000..392e915 --- /dev/null +++ b/projects/03/b/RAM512.hdl @@ -0,0 +1,29 @@ +// 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: + RAM64(in=in, load=load1, address=address[0..5], out=out1); + RAM64(in=in, load=load2, address=address[0..5], out=out2); + RAM64(in=in, load=load3, address=address[0..5], out=out3); + RAM64(in=in, load=load4, address=address[0..5], out=out4); + RAM64(in=in, load=load5, address=address[0..5], out=out5); + RAM64(in=in, load=load6, address=address[0..5], out=out6); + RAM64(in=in, load=load7, address=address[0..5], out=out7); + RAM64(in=in, load=load8, address=address[0..5], out=out8); + + DMux8Way(in=load, sel=address[6..8], a=load1, b=load2, c=load3, d=load4, e=load5, f=load6, g=load7, h=load8); + Mux8Way16(a=out1, b=out2, c=out3, d=out4, e=out5, f=out6, g=out7, h=out8, sel=address[6..8], out=out); +} \ No newline at end of file diff --git a/projects/03/b/RAM512.tst b/projects/03/b/RAM512.tst new file mode 100644 index 0000000..dd83c04 --- /dev/null +++ b/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/projects/04/Fill.asm b/projects/04/Fill.asm new file mode 100644 index 0000000..546a682 --- /dev/null +++ b/projects/04/Fill.asm @@ -0,0 +1,85 @@ +// 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. + +@SCREEN +D=A +@PTR +M=D + +(WHITE) +@KBD +D=M +@BLACK +D;JNE + +@SCREEN +D=A +@PTR +M=D + +(WLOOP) +@PTR +D=M +@R0 +M=D +@KBD +D=A +@R0 +D=D-M +@WHITE +D;JEQ + +@PTR +A=M +M=0 + +@PTR +M=M+1 + +@WLOOP +0;JMP + +(BLACK) +@KBD +D=M +@WHITE +D;JEQ + +@SCREEN +D=A +@PTR +M=D + +(BLOOP) +@PTR +D=M +@R0 +M=D +@KBD +D=A +@R0 +D=D-M +@BLACK +D;JEQ + +@PTR +A=M +M=-1 + +@PTR +M=M+1 + +@BLOOP +0;JMP diff --git a/projects/04/Mult.asm b/projects/04/Mult.asm new file mode 100644 index 0000000..6624e7b --- /dev/null +++ b/projects/04/Mult.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/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.) + +// Put your code here. + +@R2 +M=0 + +(LOOP) +@R1 +D=M + +@END +D;JEQ + +@R0 +D=M + +@R2 +M=M+D + +@R1 +M=M-1 + +@LOOP +0;JEQ + +(END) +@END +0;JMP \ No newline at end of file diff --git a/projects/04/fill/Fill.asm b/projects/04/fill/Fill.asm new file mode 100644 index 0000000..546a682 --- /dev/null +++ b/projects/04/fill/Fill.asm @@ -0,0 +1,85 @@ +// 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. + +@SCREEN +D=A +@PTR +M=D + +(WHITE) +@KBD +D=M +@BLACK +D;JNE + +@SCREEN +D=A +@PTR +M=D + +(WLOOP) +@PTR +D=M +@R0 +M=D +@KBD +D=A +@R0 +D=D-M +@WHITE +D;JEQ + +@PTR +A=M +M=0 + +@PTR +M=M+1 + +@WLOOP +0;JMP + +(BLACK) +@KBD +D=M +@WHITE +D;JEQ + +@SCREEN +D=A +@PTR +M=D + +(BLOOP) +@PTR +D=M +@R0 +M=D +@KBD +D=A +@R0 +D=D-M +@BLACK +D;JEQ + +@PTR +A=M +M=-1 + +@PTR +M=M+1 + +@BLOOP +0;JMP diff --git a/projects/04/fill/Fill.tst b/projects/04/fill/Fill.tst new file mode 100644 index 0000000..8023469 --- /dev/null +++ b/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/projects/04/fill/FillAutomatic.cmp b/projects/04/fill/FillAutomatic.cmp new file mode 100644 index 0000000..a71db27 --- /dev/null +++ b/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/projects/04/fill/FillAutomatic.tst b/projects/04/fill/FillAutomatic.tst new file mode 100644 index 0000000..fbc29a0 --- /dev/null +++ b/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/projects/04/mult/Mult.asm b/projects/04/mult/Mult.asm new file mode 100644 index 0000000..6624e7b --- /dev/null +++ b/projects/04/mult/Mult.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/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.) + +// Put your code here. + +@R2 +M=0 + +(LOOP) +@R1 +D=M + +@END +D;JEQ + +@R0 +D=M + +@R2 +M=M+D + +@R1 +M=M-1 + +@LOOP +0;JEQ + +(END) +@END +0;JMP \ No newline at end of file diff --git a/projects/04/mult/Mult.cmp b/projects/04/mult/Mult.cmp new file mode 100644 index 0000000..33a6352 --- /dev/null +++ b/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/projects/04/mult/Mult.tst b/projects/04/mult/Mult.tst new file mode 100644 index 0000000..f9fe465 --- /dev/null +++ b/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/projects/04/project4.zip b/projects/04/project4.zip new file mode 100644 index 0000000000000000000000000000000000000000..4893dda0fda33aefa344a58d329571d19f1c433e GIT binary patch literal 1014 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 WWuQPZ5dgpky$nFDVbD$h;Qs(H!~B2% literal 0 HcmV?d00001 diff --git a/projects/05/Add.hack b/projects/05/Add.hack new file mode 100644 index 0000000..8297cbb --- /dev/null +++ b/projects/05/Add.hack @@ -0,0 +1,6 @@ +0000000000000010 +1110110000010000 +0000000000000011 +1110000010010000 +0000000000000000 +1110001100001000 diff --git a/projects/05/CPU-external.cmp b/projects/05/CPU-external.cmp new file mode 100644 index 0000000..728a800 --- /dev/null +++ b/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/projects/05/CPU-external.tst b/projects/05/CPU-external.tst new file mode 100644 index 0000000..b90cbd1 --- /dev/null +++ b/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/projects/05/CPU.cmp b/projects/05/CPU.cmp new file mode 100644 index 0000000..108fc46 --- /dev/null +++ b/projects/05/CPU.cmp @@ -0,0 +1,93 @@ +|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|1110000111010000| 0 |*******| 0 |23456| 3| 11111 | +|4 | 0|1110000111010000| 0 |*******| 0 |23456| 4| 11111 | +|4+ | 0|0000001111101000| 0 |*******| 0 |23456| 4| 11111 | +|5 | 0|0000001111101000| 0 |*******| 0 | 1000| 5| 11111 | +|5+ | 0|1110001100001000| 0 | 11111| 1 | 1000| 5| 11111 | +|6 | 0|1110001100001000| 0 | 11111| 1 | 1000| 6| 11111 | +|6+ | 0|0000001111101001| 0 |*******| 0 | 1000| 6| 11111 | +|7 | 0|0000001111101001| 0 |*******| 0 | 1001| 7| 11111 | +|7+ | 0|1110001110011000| 0 | 11110| 1 | 1001| 7| 11110 | +|8 | 0|1110001110011000| 0 | 11109| 1 | 1001| 8| 11110 | +|8+ | 0|0000001111101000| 0 |*******| 0 | 1001| 8| 11110 | +|9 | 0|0000001111101000| 0 |*******| 0 | 1000| 9| 11110 | +|9+ | 11111|1111010011010000| 0 |*******| 0 | 1000| 9| -1 | +|10 | 11111|1111010011010000| 0 |*******| 0 | 1000| 10| -1 | +|10+ | 11111|0000000000001110| 0 |*******| 0 | 1000| 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|1110110111100000| 0 |*******| 0 | 999| 15| -1 | +|14 | 11111|1110110111100000| 0 |*******| 0 | 1000| 16| -1 | +|14+ | 11111|1110001100001000| 0 | -1| 1 | 1000| 16| -1 | +|15 | 11111|1110001100001000| 0 | -1| 1 | 1000| 17| -1 | +|15+ | 11111|0000000000010101| 0 |*******| 0 | 1000| 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|1110000010010000| 0 |*******| 0 | 2| 22| 1 | +|19 | 11111|1110000010010000| 0 |*******| 0 | 2| 23| 1 | +|19+ | 11111|0000001111101000| 0 |*******| 0 | 2| 23| 1 | +|20 | 11111|0000001111101000| 0 |*******| 0 | 1000| 24| 1 | +|20+ | 11111|1110111010010000| 0 |*******| 0 | 1000| 24| -1 | +|21 | 11111|1110111010010000| 0 |*******| 0 | 1000| 25| -1 | +|21+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 25| -1 | +|22 | 11111|1110001100000001| 0 |*******| 0 | 1000| 26| -1 | +|22+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 26| -1 | +|23 | 11111|1110001100000010| 0 |*******| 0 | 1000| 27| -1 | +|23+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 27| -1 | +|24 | 11111|1110001100000011| 0 |*******| 0 | 1000| 28| -1 | +|24+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 28| -1 | +|25 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| -1 | +|25+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 | +|26 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| -1 | +|26+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 | +|27 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| -1 | +|27+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 | +|28 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| -1 | +|28+ | 11111|1110101010010000| 0 |*******| 0 | 1000| 1000| 0 | +|29 | 11111|1110101010010000| 0 |*******| 0 | 1000| 1001| 0 | +|29+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 0 | +|30 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1002| 0 | +|30+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1002| 0 | +|31 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 0 | +|31+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 | +|32 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 0 | +|32+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 0 | +|33 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 0 | +|33+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 0 | +|34 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1002| 0 | +|34+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1002| 0 | +|35 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 0 | +|35+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 | +|36 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 0 | +|36+ | 11111|1110111111010000| 0 |*******| 0 | 1000| 1000| 1 | +|37 | 11111|1110111111010000| 0 |*******| 0 | 1000| 1001| 1 | +|37+ | 11111|1110001100000001| 0 |*******| 0 | 1000| 1001| 1 | +|38 | 11111|1110001100000001| 0 |*******| 0 | 1000| 1000| 1 | +|38+ | 11111|1110001100000010| 0 |*******| 0 | 1000| 1000| 1 | +|39 | 11111|1110001100000010| 0 |*******| 0 | 1000| 1001| 1 | +|39+ | 11111|1110001100000011| 0 |*******| 0 | 1000| 1001| 1 | +|40 | 11111|1110001100000011| 0 |*******| 0 | 1000| 1000| 1 | +|40+ | 11111|1110001100000100| 0 |*******| 0 | 1000| 1000| 1 | +|41 | 11111|1110001100000100| 0 |*******| 0 | 1000| 1001| 1 | +|41+ | 11111|1110001100000101| 0 |*******| 0 | 1000| 1001| 1 | +|42 | 11111|1110001100000101| 0 |*******| 0 | 1000| 1000| 1 | +|42+ | 11111|1110001100000110| 0 |*******| 0 | 1000| 1000| 1 | +|43 | 11111|1110001100000110| 0 |*******| 0 | 1000| 1001| 1 | +|43+ | 11111|1110001100000111| 0 |*******| 0 | 1000| 1001| 1 | +|44 | 11111|1110001100000111| 0 |*******| 0 | 1000| 1000| 1 | +|44+ | 11111|1110001100000111| 1 |*******| 0 | 1000| 1000| 1 | +|45 | 11111|1110001100000111| 1 |*******| 0 | 1000| 0| 1 | +|45+ | 11111|0111111111111111| 0 |*******| 0 | 1000| 0| 1 | +|46 | 11111|0111111111111111| 0 |*******| 0 |32767| 1| 1 | diff --git a/projects/05/CPU.hdl b/projects/05/CPU.hdl new file mode 100644 index 0000000..55d4e45 --- /dev/null +++ b/projects/05/CPU.hdl @@ -0,0 +1,72 @@ +// 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: + ALU(x=dreg, y=aluy, zx=instruction[11], nx=instruction[10], zy=instruction[9], ny=instruction[8], f=instruction[7], no=instruction[6], out=aluout, out=outM, zr=aluzr, ng=alung); + + And(a=instruction[15], b=instruction[4], out=dload); + DRegister(in=aluout, load=dload, out=dreg); + + Not(in=instruction[15], out=ainst); + Or(a=instruction[5], b=ainst, out=aload); + + ARegister(in=aregin, load=aload, out=areg, out[0..14]=addressM); + Mux16(a=instruction, b=aluout, sel=instruction[15], out=aregin); + + And(a=instruction[15], b=instruction[3], out=writeM); + + Mux16(a=areg, b=inM, sel=instruction[12], out=aluy); + + + + And(a=instruction[1], b=aluzr, out=jmpzr); + And(a=instruction[2], b=alung, out=jmpng); + + Not(in=alung, out=alunng); + Not(in=aluzr, out=alunzr); + And(a=alunng, b=alunzr, out=alupz); + And(a=instruction[0], b=alupz, out=jmppz); + + Or8Way(in[0]=jmpzr, in[1]=jmpng, in[2]=jmppz, out=jump); + + And(a=jump, b=instruction[15], out=sjump); + + PC(in=areg, load=sjump, inc=true, reset=reset, out[0..14]=pc); +} \ No newline at end of file diff --git a/projects/05/CPU.tst b/projects/05/CPU.tst new file mode 100644 index 0000000..c01d2f5 --- /dev/null +++ b/projects/05/CPU.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.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 %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/projects/05/Computer.hdl b/projects/05/Computer.hdl new file mode 100644 index 0000000..d78cfcf --- /dev/null +++ b/projects/05/Computer.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/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: + Memory(in=memin, load=memload, address=memaddr, out=memout); + CPU(inM=memout, instruction=instr, reset=reset, outM=memin, writeM=memload, addressM=memaddr, pc=pct); + ROM32K(address=pct, out=instr); +} diff --git a/projects/05/ComputerAdd-external.cmp b/projects/05/ComputerAdd-external.cmp new file mode 100644 index 0000000..2407eca --- /dev/null +++ b/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/projects/05/ComputerAdd-external.tst b/projects/05/ComputerAdd-external.tst new file mode 100644 index 0000000..24dec83 --- /dev/null +++ b/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/projects/05/ComputerAdd.cmp b/projects/05/ComputerAdd.cmp new file mode 100644 index 0000000..5748770 --- /dev/null +++ b/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/projects/05/ComputerAdd.tst b/projects/05/ComputerAdd.tst new file mode 100644 index 0000000..f9aa64b --- /dev/null +++ b/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/projects/05/ComputerMax-external.cmp b/projects/05/ComputerMax-external.cmp new file mode 100644 index 0000000..4a6dff5 --- /dev/null +++ b/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/projects/05/ComputerMax-external.tst b/projects/05/ComputerMax-external.tst new file mode 100644 index 0000000..b427c6e --- /dev/null +++ b/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/projects/05/ComputerMax.cmp b/projects/05/ComputerMax.cmp new file mode 100644 index 0000000..698d5a1 --- /dev/null +++ b/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/projects/05/ComputerMax.tst b/projects/05/ComputerMax.tst new file mode 100644 index 0000000..ea638f4 --- /dev/null +++ b/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/projects/05/ComputerRect-external.cmp b/projects/05/ComputerRect-external.cmp new file mode 100644 index 0000000..afbddfe --- /dev/null +++ b/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/projects/05/ComputerRect-external.tst b/projects/05/ComputerRect-external.tst new file mode 100644 index 0000000..0446b14 --- /dev/null +++ b/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/projects/05/ComputerRect.cmp b/projects/05/ComputerRect.cmp new file mode 100644 index 0000000..a6b3965 --- /dev/null +++ b/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/projects/05/ComputerRect.tst b/projects/05/ComputerRect.tst new file mode 100644 index 0000000..a405b73 --- /dev/null +++ b/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/projects/05/Max.hack b/projects/05/Max.hack new file mode 100644 index 0000000..ab8a440 --- /dev/null +++ b/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/projects/05/Memory.cmp b/projects/05/Memory.cmp new file mode 100644 index 0000000..1dbf7ed --- /dev/null +++ b/projects/05/Memory.cmp @@ -0,0 +1,54 @@ +| in |load | address | out | +| -1 | 1 | 000000000000000 | 0 | +| -1 | 1 | 000000000000000 | -1 | +| 9999 | 0 | 000000000000000 | -1 | +| 9999 | 0 | 000000000000000 | -1 | +| 9999 | 0 | 010000000000000 | 0 | +| 9999 | 0 | 100000000000000 | 0 | +| 2222 | 1 | 010000000000000 | 0 | +| 2222 | 1 | 010000000000000 | 2222 | +| 9999 | 0 | 010000000000000 | 2222 | +| 9999 | 0 | 010000000000000 | 2222 | +| 9999 | 0 | 000000000000000 | -1 | +| 9999 | 0 | 100000000000000 | 0 | +| 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 | +| 2345 | 0 | 110000000000000 | 75 | +| -1 | 1 | 100111111001111 | -1 | +| -1 | 1 | 101000001001111 | -1 | +| -1 | 1 | 000111111001111 | 0 | +| -1 | 1 | 010111111001111 | 0 | +| -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/projects/05/Memory.hdl b/projects/05/Memory.hdl new file mode 100644 index 0000000..e33371c --- /dev/null +++ b/projects/05/Memory.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/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: + + Not(in=address[14], out=stdmem); + + And(a=stdmem, b=load, out=stdload); + RAM16K(in=in, load=stdload, address=address[0..13], out=stdout); + + Mux16(a=ioout, b=stdout, sel=stdmem, out=out); + + Keyboard(out=kbdout); + + And(a=address[14], b=address[13], out=kbdmem); + + And(a=address[14], b=load, out=scrload); + Screen(in=in, load=scrload, address=address[0..12], out=scrout); + + Mux16(b[0..15]=kbdout, a=scrout, sel=kbdmem, out=ioout); +} \ No newline at end of file diff --git a/projects/05/Memory.tst b/projects/05/Memory.tst new file mode 100644 index 0000000..5a01e0f --- /dev/null +++ b/projects/05/Memory.tst @@ -0,0 +1,163 @@ +// 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"; + +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 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; + +// 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 { + eval, +} + +clear-echo, +output; + +// Screen test + +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 { + eval, +} + +clear-echo, +output; diff --git a/projects/05/Rect.hack b/projects/05/Rect.hack new file mode 100644 index 0000000..f33a9d1 --- /dev/null +++ b/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/projects/06/06.zip b/projects/06/06.zip new file mode 100644 index 0000000000000000000000000000000000000000..b0049b90ac1137c10964acdccc9569f7d85c562d GIT binary patch literal 12539 zcmZ`=b95%(mW^$j9oy)1Y}@wNamTi8C*84a+qToOtuLPZ-mIDT{+Ov+_tdR*YM)(o zZmm<=r6>aqfdK*r0s}(YWhNgFQI<>r0s>bVux~?HG%+-4_Ehm7}sgBM1mQDKrS|7n7o$t;N46F7!?kE~%^D1QhbUK2zHrUeg8*R-y3Y zAWRh|L}i_mYqiiAN|Q!>KLulaKcEHu?)yJSrv*OWLkPM9-?(CO|8BE=yiWUeht0EH ze+smCi}R29c4OqA`=S`ocbu?Hb#DW?1V8YHyFUpJK0mMDh(0@C_B>7d^##~{2XMIFAsyS4{`g<)5#O%k9@lMiK3bTgE%x(^0OHC%A5$Q78hJFSws6^-E4KH3A`I#VGIg!D~3hpO@?MXSWYJ`a;Z8cD#eb*<1Jh!{Lw1DYnSp z_&R&{NhvqpIkufThtMBPqGPj71yyJ27IB|j1ZpNeB!`+$Kd2RMp9jrzO^N!pLa+IX ztDc5ef&8%nbTTjVUb0RAp}~@8ODPE;ps^qy-NZ;rgZ>d{27D?njLn?P%XPIPf9{VP zs(imP;MrWO3~S#Wx^R%#d>du?HJwdhj4|x1IA=wLiU|UcB0gxeB6Q(XE>~y+ae5mf04Qfs=DuC4R(B zclxL0VW0Ee1+(o#KT~N%*Q?GCd2)U4i@8^Dk5?06r{--A2%JKBR>gIsi1uF54NVRKcnjHd4$mq4M|$V=pG# zbp!9ce{nvD5J-}31IF}Padi#hTdo%+gn7IP$15#r2*K*FKpEpU9hnC8VX)b3bn8Lt zxmsqL82fUcn;98jD-Z1b(Mk79^T{hCKkWS({`RpTwwzLW<$;Fg8ZX&m*8JU9i{E9U zLmnEP9dw$gc4%xN$c6{NS-MwmNB$)1tU_f}+^;^fVtp8NMlW_RCcL+!^}hOz)EAKh zuY{6+A1t@rj6zXoKt%syQlV_3@33%CwM;~3$J=2)^;f>}WSw7Zl%MdZqD^4c_tv-v zx!)Q%+C|aa(zKG%OcC*(@3C~Fr|@gx%D`}MiD-Tzwr%T8aB$PG@wvPj{jKXHw;e6L z@*c=wKPckhuHi8^xSUCHq?E!bD1;@V-rx|w+4pqRByLHKf z`-+fVEzT^{6V4vjm7EzdjN}ibc|1>OBX>eJWg=Z8m?LwEoA`8exuTeoH=c59Tf>=- zHm(LaQx}lDU$@fIn$Br zw}gqdOEbcNU2h9flC0PoE~J%iD-M@wbh(`Ev;$><6`IBkiJ(cD;=RsUyIRdO*jbTV zm2&W&waqYi!pAOr2?0!2_W|5Ye9|Sj+{8S82p%7HUwd>46d4zFPn{(%TlEhGQyqt zc>o&@sgM~6vFs3@J_w0^a#c}f8Z_<&dn31Ny?U-}F(rup#lOPFdCWbVHIz{u+h6@I zKkp=5AlYbbBia2n-r#bpjPEK)59DfGaiAhUdTzWl4NK1PhmW)ErV}}A0pKcnA%l&% z_!-9{bvsIbRXFJ1D*O@0f2ZV|W{evW{n$UXbB#)xwTOy;=5(3pFj2LVrT_8-g=V%A z{kZNE{ZNbZed+PtHl%i)foKA!N~e@rw;5Ax8K+0aqahDRIN%(w-|}wv{D~?>7-fFL zXbITP+-n3`o`wKm@{%=zchfjc^d+3*k9Nh=X8b8t%g8Xdwa-Xgka4z2r;Ae1gl2FsTxis(8D=dC=63NmLPZ+y(lLDoDKKnf2Il)QUDLlba(}?S+OG#Rv>S|0R@X {{!lkh{d9RB)Q&-VS)cndz~_w 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 literal 0 HcmV?d00001 diff --git a/projects/06/Add.hack b/projects/06/Add.hack new file mode 100644 index 0000000..8297cbb --- /dev/null +++ b/projects/06/Add.hack @@ -0,0 +1,6 @@ +0000000000000010 +1110110000010000 +0000000000000011 +1110000010010000 +0000000000000000 +1110001100001000 diff --git a/projects/06/Max.hack b/projects/06/Max.hack new file mode 100644 index 0000000..ab8a440 --- /dev/null +++ b/projects/06/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/projects/06/Pong.hack b/projects/06/Pong.hack new file mode 100644 index 0000000..9eb4a3d --- /dev/null +++ b/projects/06/Pong.hack @@ -0,0 +1,27483 @@ +0000000100000000 +1110110000010000 +0000000000000000 +1110001100001000 +0000000010000101 +1110101010000111 +0000000000001111 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111010000 +1110101010001000 +0000000000010011 +1110001100000101 +0000000000000000 +1111110010100000 +1110111010001000 +0000000000001111 +1111110000100000 +1110101010000111 +0000000000001111 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111010000 +1110101010001000 +0000000000100011 +1110001100000110 +0000000000000000 +1111110010100000 +1110111010001000 +0000000000001111 +1111110000100000 +1110101010000111 +0000000000001111 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111010000 +1110101010001000 +0000000000110011 +1110001100000011 +0000000000000000 +1111110010100000 +1110111010001000 +0000000000001111 +1111110000100000 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000001 +1111000111100000 +1111110000010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +1110110000010000 +0000000000000000 +1110011111001000 +0000000000000001 +1111110000010000 +0000000000001110 +1110001110101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000001110 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000001110 +1111110010101000 +1111110000010000 +0000000000000010 +1110001100001000 +0000000000001110 +1111110010101000 +1111110000010000 +0000000000000001 +1110001100001000 +0000000000001101 +1111110000100000 +1110101010000111 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000100 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1111000010010000 +0000000000000000 +1111000111010000 +0000000000000010 +1110001100001000 +0000000000000000 +1111110111011000 +0000000000000001 +1110001100001000 +0000000000001110 +1111110000100000 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110110010 +1110110000010000 +0000000000001110 +1110001100001000 +0000000010010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000000010100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001010 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110000010000 +0000000000001011 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001100 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110000010000 +0000000000001101 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000110000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000000101001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0000000101111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000000110100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001000000010 +1110110000010000 +0000000000001110 +1110001100001000 +0000000110111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000000111100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001000000010 +1110110000010000 +0000000000001110 +1110001100001000 +0000000111110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000001001001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000001010001110 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0000001011101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0000001100000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001100011110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000001100111010 +1110001100000101 +0000001110100010 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001101110110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001110010100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000001111011111 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001110110100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001111010011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000001111111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000010000100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000010001010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000111000100 +1110110000010000 +0000000000001110 +1110001100001000 +0000010010000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000010010011010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000010010100001 +1110001100000101 +0000010011000011 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000010101111001 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010011110011 +1110001100000101 +0000010100110111 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010100000011 +1110001100000101 +0000010100011101 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000010100110101 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000010101111001 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010101000111 +1110001100000101 +0000010101100001 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000010101111001 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010110001001 +1110001100000101 +0000010111001101 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010110011001 +1110001100000101 +0000010110110011 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000010111001011 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000011000001111 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010111011101 +1110001100000101 +0000010111110111 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000011000001111 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011000100011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011000101101 +1110001100000101 +0000011001001100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011001100000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011001101010 +1110001100000101 +0000011010001011 +1110101010000111 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011010011111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011010101001 +1110001100000101 +0000011011001010 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011011011110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011011101000 +1110001100000101 +0000011100001001 +1110101010000111 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000110000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000011100011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000011100101101 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000011101011010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000011101111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000011110010011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000011110011010 +1110001100000101 +0000011110101011 +1110101010000111 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000100000100110 +1110101010000111 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000011110111011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000011111001101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000011111100010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000011111111010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000100000000110 +1110001100000101 +0000100000010111 +1110101010000111 +0000000000010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000100000100110 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000100000110111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000100000111110 +1110001100000101 +0000100010110011 +1110101010000111 +0000000111111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100001101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000100001111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100010100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000101000111000 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000100011000110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000100011001101 +1110001100000101 +0000100100111100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100011110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000100100000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100100101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000101000111000 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000100101001111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000100101010110 +1110001100000101 +0000100111001011 +1110101010000111 +0000000011111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100110000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000100110010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100110111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000101000111000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100111101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000101000000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000101000101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0000001010001100 +1110110000010000 +0000000000001110 +1110001100001000 +0000101001011000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000101001110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101100001011 +1110110000010000 +0000000000001110 +1110001100001000 +0000101011010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0000101100000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000101100101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0000101101000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000101101101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0000101101111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000101111011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101101001100 +1110110000010000 +0000000000001110 +1110001100001000 +0000110001011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101100001011 +1110110000010000 +0000000000001110 +1110001100001000 +0000110010000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000110010101000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000110010101111 +1110001100000101 +0000110111000101 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000110011010110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000110011011101 +1110001100000101 +0000110011100111 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000110011110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000110101100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000110101111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000110110111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000111011110111 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000110111111011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000111000000010 +1110001100000101 +0000111000011011 +1110101010000111 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000111000101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000111001111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000111010010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000111011110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001000110011100 +1110110000010000 +0000000000001110 +1110001100001000 +0000111100001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001000110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111100011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001000110111011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111100110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001000101000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111101101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0101000001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0000111101111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000011100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0000101001100011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111110111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000011111101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000011100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000001101 +1110001100001000 +0000000010010001 +1110110000010000 +0000000000001110 +1110001100001000 +0000111111101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000110010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0000001010001100 +1110110000010000 +0000000000001110 +1110001100001000 +0001000000001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000011101110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000000110110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0100101110010110 +1110110000010000 +0000000000001110 +1110001100001000 +0001000001010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0001000001101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000001111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000010001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001101111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000010011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000010110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011010100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000100000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101011100010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000101100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000101011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000101111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0001000110010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0000111101011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000110101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000010000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001101001111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001000111101110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001001001010 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001000010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110010001011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001000101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001010001000111 +1110110000010000 +0000000000001110 +1110001100001000 +0001001001000011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001000111011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000010000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001001001011011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001001001100010 +1110001100000101 +0001001010000000 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000101111100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001001111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001001011011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000010000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001001010010001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001001010011000 +1110001100000101 +0001001010111000 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000101111100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001010110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001001011011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000010001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001001011001001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001001011010000 +1110001100000101 +0001001011011111 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001001011101110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001101001101 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001100010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110010001011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001100101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001010001000111 +1110110000010000 +0000000000001110 +1110001100001000 +0001001101000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001001011011111 +1110101010000111 +0001000111001011 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001101011111 +1110001100000101 +0001010001000001 +1110101010000111 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0100101110010110 +1110110000010000 +0000000000001110 +1110001100001000 +0001001101110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0001001110001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001110100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001110110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001010001001001 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000010001100110 +1110110000010000 +0000000000001110 +1110001100001000 +0001010001101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001010010000110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010010011011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001010010101010 +1110001100000101 +0001011010101010 +1110101010000111 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110000000110 +1110110000010000 +0000000000001110 +1110001100001000 +0001010011011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110000011011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010011110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001001010111 +1110110000010000 +0000000000001110 +1110001100001000 +0001010100001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001001101100 +1110110000010000 +0000000000001110 +1110001100001000 +0001010100100111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010101000010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001010101001001 +1110001100000101 +0001011010001011 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010101011101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010101110010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001010110010010 +1110001100000101 +0001011010001011 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0001010110110001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001010110111000 +1110001100000101 +0001010111001000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001010111111001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0001010111101000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001010111101111 +1110001100000101 +0001010111111001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000110000111101 +1110110000010000 +0000000000001110 +1110001100001000 +0001011000110100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0100101110010110 +1110110000010000 +0000000000001110 +1110001100001000 +0001011001101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100111000001101 +1110110000010000 +0000000000001110 +1110001100001000 +0001011010000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000011100101011 +1110110000010000 +0000000000001110 +1110001100001000 +0001011010100101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011010111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001011011001001 +1110001100000101 +0001011011100000 +1110101010000111 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0001011011011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0001011011110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0001011100010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0110000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000101101110 +1110110000010000 +0000000000001110 +1110001100001000 +0001011100110110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011101100011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011101110010 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001011110110110 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001011110001011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011110100000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001011110100111 +1110001100000101 +0001011110110100 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0001011101010100 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110100010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011111000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011111001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011111100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001011111110110 +1110001100000001 +0000000001010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0001100000001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0001100000101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001100000111011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110100010 +1110110000010000 +0000000000001110 +1110001100001000 +0001100001001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001100100000100 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100111000 +1110110000010000 +0000000000001110 +1110001100001000 +0001100001110100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001100010001100 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001100010101000 +1110001100000101 +0001100100000010 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001100010111011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001100011000010 +1110001100000101 +0001100011011110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110010011001001 +1110110000010000 +0000000000001110 +1110001100001000 +0001100011010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001100100000010 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001100011111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0001100001010100 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011111110100 +1110110000010000 +0000000000001110 +1110001100001000 +0001100100101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110010100100001 +1110110000010000 +0000000000001110 +1110001100001000 +0001100101000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001010100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001100101011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0001100101111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010001 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0001100110010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010010 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001100111010101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001101001110000 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0001100111000100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101010000101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001101010001100 +1110001100000101 +0001101010011101 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001101010101000 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101010111110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101011001101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101011100001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101011110000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001101100010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001101100101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001101101000111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001101101001110 +1110001100000101 +0001101101110101 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001101110001000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001110001001101 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101111000100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001101111001011 +1110001100000101 +0001110000011000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0001101101110101 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001110001011101 +1110001100000101 +0001110001101110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001110001111001 +1110001100000001 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110010001111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001110010010110 +1110001100000101 +0001110010101101 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0001110010101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110010111100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110011001011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110011011111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110011101110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001110100100001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001110101001010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111010100001 +1110001100000101 +0111111111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001110110101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001110111001010 +1110001100000101 +0001111010011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001111001101110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111010001001 +1110001100000101 +0001111010011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001110101010000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0001111010110100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111101100111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001111011100101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111011101111 +1110001100000101 +0001111101001111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001111010100001 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111101110110 +1110001100000101 +0001111110000111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001111110010010 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001111110101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001111110101111 +1110001100000101 +0001111111000110 +1110101010000111 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0001111111000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0001111111100101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0010000010011100 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0010000000111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000001010011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0010000001100110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0010000001110101 +1110001100000101 +0010000010000100 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001111111010010 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000010111001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010000011000000 +1110001100000101 +0010000011001101 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000011101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010000011101111 +1110001100000101 +0010000011111100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010011 +1110001100001000 +0000100000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0011011111111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000100000000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000100000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0010000111010110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010000111011101 +1110001100000101 +0010000111110100 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0010000111101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000100000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010001000100111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0010001001010011 +1110001100000101 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0010001000000000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0011111111111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010001001110000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010001001110111 +1110001100000101 +0010001010001110 +1110101010000111 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0010001010001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0010001011000000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010001011000111 +1110001100000101 +0010010001001111 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0010001101100000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010001101100111 +1110001100000101 +0010001110111011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0010010000001011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0010010011110010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010010011111001 +1110001100000101 +0010010101010100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0010011001111000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0010010111110101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010010111111100 +1110001100000101 +0010011000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0010011001111000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0100000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010100 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0010011010111011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0010011011101000 +1110110000010000 +0000000000001110 +1110001100001000 +0010011011001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100100000011000 +1110110000010000 +0000000000001110 +1110001100001000 +0010011011011101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000001111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0010011011111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011001 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010011101001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010011110010000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010011111100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100000101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100001111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100011010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100100100111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100101111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100111000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101000011010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101001101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101010111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101100001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101101010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101110010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101111011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110000101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110010000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110011010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110100101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110110000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110111010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111000101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111010000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111011010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111100101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111101111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111111001010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000000010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000001101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000010101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000100000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000101010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000110101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000111111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001001010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001010100111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001011111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001101010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001110100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001111111011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010001010000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010010100101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010011111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010110100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010111111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011001001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011010100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011011111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011110100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011111111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100001001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100010100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100011111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100101001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100110100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100111110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101001001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101010100001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101011110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101101000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101110001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101111010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110000011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110001101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110011000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110100001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110101100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110110110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111000001000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111001011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111010110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111100000011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111101011000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111110101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000000000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000001010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000010100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000011101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000101000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000110010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000111100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001000101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001010000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001011010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001100100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001101110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001111000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010000010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010001100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010010110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010100001010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010101011111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010110101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100010111001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0100100000011010 +1110001100000001 +0000000001111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100100000110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011010 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000001111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100001010101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100110101011 +1110001100000101 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100100010010100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100011101001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100101101011 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000100000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100100100111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0100100011010110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100100101111011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100100110000010 +1110001100000101 +0100100110010001 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0100100110101001 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0100100001000011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100111000110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000001111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100111010111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100111100011 +1110001100000101 +0100100111101101 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100111111010 +1110001100000101 +0100101000100000 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0100101001000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0100101001001111 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100100110110001 +1110110000010000 +0000000000001110 +1110001100001000 +0100101001101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100101010001101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100101110010000 +1110001100000101 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100101010100010 +1110001100000101 +0100101011011001 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000100000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0100101100001010 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0100101001111100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100101110100101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100101110110110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100101111001010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100101111100000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100101111101100 +1110001100000101 +0100110000000011 +1110101010000111 +0000000000010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0100101111111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0100110000011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000101100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100110001000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100110001110100 +1110110000010000 +0000000001011111 +1110101010000111 +0100110001111000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100101001001101 +1110110000010000 +0000000000001110 +1110001100001000 +0100110010001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110011010 +1110110000010000 +0000000000001110 +1110001100001000 +0100110010101101 +1110110000010000 +0000000001011111 +1110101010000111 +0100110010110001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100110010111000 +1110001100000101 +0100110011001011 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111001001000 +1110110000010000 +0000000000001110 +1110001100001000 +0100110011000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0100110110000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110100010 +1110110000010000 +0000000000001110 +1110001100001000 +0100110011011110 +1110110000010000 +0000000001011111 +1110101010000111 +0100110011100010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100110011101001 +1110001100000101 +0100110011111100 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100110011110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0100110110000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100101001001101 +1110110000010000 +0000000000001110 +1110001100001000 +0100110100001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100110100100100 +1110001100000101 +0100110101001100 +1110101010000111 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100110101011100 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100110101100011 +1110001100000101 +0100110101110110 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111001001000 +1110110000010000 +0000000000001110 +1110001100001000 +0100110101101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0100110110000100 +1110101010000111 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001011111011 +1110110000010000 +0000000000001110 +1110001100001000 +0100110110100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100110110111100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100111000000111 +1110001100000101 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110001100010001 +1110110000010000 +0000000000001110 +1110001100001000 +0100110111011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0100110111101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0100110110101010 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000011000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110011010110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100111000100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000011000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0100111000111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000101100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001111111000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100111010001110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100111010010101 +1110001100000101 +0100111010100000 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100111010110011 +1110001100000101 +0100111101000000 +1110101010000111 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100111011000001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100111011001000 +1110001100000101 +0100111011110010 +1110101010000111 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0100111100110101 +1110101010000111 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100111100001101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100111100010100 +1110001100000101 +0100111100011111 +1110101010000111 +0001111111000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000101000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0100111101001100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100101001001101 +1110110000010000 +0000000000001110 +1110001100001000 +0100111101011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0100000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011100 +1110001100001000 +0000000000010001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100111110010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100111111010101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101000001110000 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0100111111000100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101000010001011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101000011010111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101000001111010 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000011100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101000011101010 +1110001100000101 +0101000100111110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0101000110010011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011100 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101000110101101 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101000111000011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101000111010100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101000111101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101000111111110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101001000001010 +1110001100000101 +0101001000100001 +1110101010000111 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0101001000011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101001000111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001001100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001010000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101001011001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101001011100011 +1110001100000101 +0101001100000100 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110101011 +1110110000010000 +0000000000001110 +1110001100001000 +0101001011111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101001100100011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110101011 +1110110000010000 +0000000000001110 +1110001100001000 +0101001100011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000001011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101001100101011 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101001101000001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101001101010011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101001101100111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101001101111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101001110001011 +1110001100000101 +0101001110100010 +1110101010000111 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0101001110011101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001111000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001111101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010000000111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010000101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010001010011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101010001100100 +1110001100000101 +0101010011000010 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101010011010010 +1110001100000101 +0101010101010100 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010101000110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0101010110100010 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010110010110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101010110111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101010111101110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101011000100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101001011010100 +1110110000010000 +0000000000001110 +1110001100001000 +0101011001010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011001101010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101011101001100 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101011010000011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0101011010001010 +1110001100000101 +0101011010101101 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0101011100001100 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101011011011110 +1110001100000101 +0101011011110110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101011100001100 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101001011010100 +1110110000010000 +0000000000001110 +1110001100001000 +0101011101000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101011001010110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000001001 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101011101010100 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011101101110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011110000010 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101011110010110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011110101101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101011111000001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011111011001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101011111100101 +1110001100000101 +0101011111111100 +1110101010000111 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0101011111110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101100000010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101100000111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101100001101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101100010010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101100100110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101100101111001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101101011001101 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101100110101110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0101100110110101 +1110001100000101 +0101100111100110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101100111011111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101101010010000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101101000000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101101000101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101101001101111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101101001010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101101000011101 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101101010001011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101100101100101 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000001011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101101011010101 +1110001100000001 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000011010110 +1110110000010000 +0000000000001110 +1110001100001000 +0101101011110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000010100111 +1110110000010000 +0000000000001110 +1110001100001000 +0101101100011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0101101100111101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000100000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101101101001110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101101101100110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0101101110000000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101101110001100 +1110001100000101 +0101111001010001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000010100111 +1110110000010000 +0000000000001110 +1110001100001000 +0101101110100101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000011010110 +1110110000010000 +0000000000001110 +1110001100001000 +0101101111001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101101111110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101110000011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101110001000111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101110001110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101110100001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101110101101011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0101110101110010 +1110001100000101 +0101110110100011 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101110110011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101111001010001 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101110110111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101110111101110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101111000101110 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101111000010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101110111011010 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101111001001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111010100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111011101110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111100111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111110001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101111110011001 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101111110101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101111111000000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101111111010100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101111111101010 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101111111110110 +1110001100000101 +0110000000001101 +1110101010000111 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110000000001000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110000000101001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110000001000111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110000001101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110000010001011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110000010010111 +1110001100000101 +0110000010101110 +1110101010000111 +0000000000001101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110000010101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101111001010111 +1110110000010000 +0000000000001110 +1110001100001000 +0110000011111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110000100010011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110001000001011 +1110001100000101 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110000100101011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110000100110010 +1110001100000101 +0110000101101100 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110000101010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0110000111000110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110000110011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101111001010111 +1110110000010000 +0000000000001110 +1110001100001000 +0110001000000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0110000100000001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0110001000100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001000110111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110001000111110 +1110001100000101 +0110001001010101 +1110101010000111 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110001001010000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001001100100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110001001101011 +1110001100000101 +0110001010000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0110001001111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001010111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110001011000110 +1110001100000101 +0110001011011110 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011011110101 +1110110000010000 +0000000000001110 +1110001100001000 +0110001011011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0110001011110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001100101100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001100111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001101010111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110001101100011 +1110001100000101 +0110001101111010 +1110101010000111 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110001101110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001110110110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001111001001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001111100001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110001111101101 +1110001100000101 +0110010000000100 +1110101010000111 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110001111111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110010001011010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010001100001 +1110001100000101 +0110010001111000 +1110101010000111 +0000000000010001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110010001110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110010011100101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010011101100 +1110001100000101 +0110010100000011 +1110101010000111 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110010011111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0110010100100011 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110010101000110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010101001101 +1110001100000101 +0110010101010011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110010110001000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010110001111 +1110001100000101 +0110010110101001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110010110111100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110011010001001 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011000010011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110011000100101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110011001000101 +1110001100000101 +0110011010000111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110011001011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0110010110101001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110011010011001 +1110001100000101 +0110011010101010 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0110011010110101 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011011010111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110011011011110 +1110001100000101 +0110011011110101 +1110101010000111 +0000000000010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110011011110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0110011100000111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011100011101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110011100100100 +1110001100000101 +0110011101000100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011101100000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110100000000110 +1110001100000101 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0110011110000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110011111000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0110011101010001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110100000010110 +1110001100000101 +0110100001011100 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110100001101110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110100001110101 +1110001100000101 +0110100010001100 +1110101010000111 +0000000000010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110100010000111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110100010011011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110100010100010 +1110001100000101 +0110100011011011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0110100101111011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110100011111001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110100101111011 +1110001100000101 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0110100011100110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011011110101 +1110110000010000 +0000000000001110 +1110001100001000 +0110100110001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000010000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000010000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000100010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0010000100000101 +1110110000010000 +0000000000001110 +1110001100001000 +0110100110111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001100101101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110100111001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111101101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110100111100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0010011001111110 +1110110000010000 +0000000000001110 +1110001100001000 +0110100111110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100011110 +1110110000010000 +0000000000001110 +1110001100001000 +0110101000000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0000111011111101 +1110110000010000 +0000000000001110 +1110001100001000 +0110101000010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110101000101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101000100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110101000111010 +1110001100000101 +0110101000101001 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110101001001101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110101001010100 +1110001100000101 +0110101001101001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101001100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110101001111000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110101011010011 +1110001100000101 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110101010011011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110101010111011 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0110101010001100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0110101001101001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101011101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0110101011111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0110101100001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0110101100100001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0110101100101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100111000001101 +1110110000010000 +0000000000001110 +1110001100001000 +0110101101000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110101000101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101101010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 diff --git a/projects/06/Rect.hack b/projects/06/Rect.hack new file mode 100644 index 0000000..f33a9d1 --- /dev/null +++ b/projects/06/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/projects/06/add/Add.asm b/projects/06/add/Add.asm new file mode 100644 index 0000000..ff6a209 --- /dev/null +++ b/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/projects/06/add/Add.hack b/projects/06/add/Add.hack new file mode 100644 index 0000000..8297cbb --- /dev/null +++ b/projects/06/add/Add.hack @@ -0,0 +1,6 @@ +0000000000000010 +1110110000010000 +0000000000000011 +1110000010010000 +0000000000000000 +1110001100001000 diff --git a/projects/06/asm.py b/projects/06/asm.py new file mode 100644 index 0000000..e3118e7 --- /dev/null +++ b/projects/06/asm.py @@ -0,0 +1,202 @@ +import sys +import os +import re + +lut = { + "R0": 0, + "R1": 1, + "R2": 2, + "R3": 3, + "R4": 4, + "R5": 5, + "R6": 6, + "R7": 7, + "R8": 8, + "R9": 9, + "R10": 10, + "R11": 11, + "R12": 12, + "R13": 13, + "R14": 14, + "R15": 15, + "SCREEN": 16384, + "KBD": 24576, + "SP": 0, + "LCL": 1, + "ARG": 2, + "THIS": 3, + "THAT": 4, +} + +currentAddr = 16 +currentCmd = 0 + +def main(): + global lut + global currentAddr + global currentCmd + global outfile + global infile + + if len(sys.argv) < 2: + print("No file specified") + exit(-1) + elif not sys.argv[1].endswith(".asm"): + print("File is not assembly") + exit(-1) + + infile = open(sys.argv[1], "r") + + if os.path.isfile(sys.argv[1].replace(".asm", ".hack")): + outfile = open(sys.argv[1].replace(".asm", ".hack"), "w") + else: + outfile = open(sys.argv[1].replace(".asm", ".hack"), "x") + + outfile.truncate(0) + + labelre = re.compile("^\((.*?)\)") + # Parse all labels + for line in infile: + nocomment = line.split("//", 1)[0] + stripped = nocomment.strip() + if len(stripped) > 0: + match = labelre.match(stripped); + if match: + label = match.group(1) + lut[label] = currentCmd + else: + currentCmd += 1 + + infile.seek(0) + # Translate everything else + for line in infile: + nocomment = line.split("//", 1)[0] + stripped = nocomment.strip() + if len(stripped) > 0: + match = labelre.match(stripped) + if not match: + process_line(stripped) + + infile.close() + outfile.close() + +def getbin(num, n=0): + return format(num, 'b').zfill(n) + +def getcomp(comp): + cmdluta = { + "0": "101010", + "1": "111111", + "-1": "111010", + "D": "001100", + "A": "110000", + "!D": "001101", + "!A": "110001", + "-D": "001111", + "-A": "110011", + "D+1": "011111", + "A+1": "110111", + "D-1": "001110", + "A-1": "110010", + "D+A": "000010", + "D-A": "010011", + "A-D": "000111", + "D&A": "000000", + "D|A": "010101", + } + + cmd = "" + if comp.find("M") != -1: + cmd += "1" + else: + cmd += "0" + + compa = comp.replace("M", "A") + + cmd += cmdluta[compa] + + return cmd + +def getdest(dest): + cmd = "" + + if dest.find("A") != -1: + cmd += "1" + else: + cmd += "0" + + if dest.find("D") != -1: + cmd += "1" + else: + cmd += "0" + + if dest.find("M") != -1: + cmd += "1" + else: + cmd += "0" + return cmd + +def getjmp(jmp): + return { + "JGT": "001", + "JEQ": "010", + "JGE": "011", + "JLT": "100", + "JNE": "101", + "JLE": "110", + "JMP": "111", + }[jmp] + + +def process_line(line): + global lut + global currentAddr + global currentCmd + global outfile + global infile + + if line[0] == "@": + addr = line[1:] + if not addr.isdigit(): + if not addr in lut: + lut[addr] = currentAddr + currentAddr += 1 + outfile.write("0" + getbin(lut[addr], 15) +"\n") + else: + outfile.write("0" + getbin(int(addr), 15) + "\n") + else: + if "=" in line: + dest=line.split("=",1)[0] + comp = line.split("=", 1)[1] + else: + dest = False + + if ";" in line: + split = line.split(";") + jmp = split[len(split) - 1] + comp = line.split(";", 1)[0] + else: + jmp = False + + if not comp: + comp = line + + cmd = "111" + + cmd += getcomp(comp) + + if dest: + cmd += getdest(dest) + else: + cmd += "000" + + if jmp: + cmd += getjmp(jmp) + else: + cmd += "000" + + + outfile.write(cmd + "\n") + +if __name__ == '__main__': + main() diff --git a/projects/06/asm.py.v1 b/projects/06/asm.py.v1 new file mode 100644 index 0000000..18eb071 --- /dev/null +++ b/projects/06/asm.py.v1 @@ -0,0 +1,202 @@ +import sys +import os +import re + +lut = { + "R0": 0, + "R1": 1, + "R2": 2, + "R3": 3, + "R4": 4, + "R5": 5, + "R6": 6, + "R7": 7, + "R8": 8, + "R9": 9, + "R10": 10, + "R11": 11, + "R12": 12, + "R13": 13, + "R14": 14, + "R15": 15, + "SCREEN": 16384, + "KBD": 24576, + "SP": 0, + "LCL": 1, + "ARG": 2, + "THIS": 3, + "THAT": 4, +} + +currentAddr = 16 +currentCmd = 0 + +def main(): + global lut + global currentAddr + global currentCmd + global outfile + global infile + + if len(sys.argv) < 2: + print("No file specified") + exit(-1) + elif not sys.argv[1].endswith(".asm"): + print("File is not assembly") + exit(-1) + + infile = open(sys.argv[1], "r") + + if os.path.isfile(sys.argv[1].replace(".asm", ".hack")): + outfile = open(sys.argv[1].replace(".asm", ".hack"), "w") + else: + outfile = open(sys.argv[1].replace(".asm", ".hack"), "x") + + outfile.truncate(0) + + labelre = re.compile("^\((.*?)\)") + # Parse all labels + for line in infile: + nocomment = line.split("//", 1)[0] + stripped = nocomment.strip() + if len(stripped) > 0: + match = labelre.match(stripped); + if match: + label = match.group(1) + lut[label] = currentCmd + else: + currentCmd += 1 + + infile.seek(0) + # Translate everything else + for line in infile: + nocomment = line.split("//", 1)[0] + stripped = nocomment.strip() + if len(stripped) > 0: + match = labelre.match(stripped) + if not match: + process_line(stripped) + + infile.close() + outfile.close() + +def getbin(num, n=0): + return format(num, 'b').zfill(n) + +def getcomp(comp): + cmdluta = { + "0": "101010", + "1": "111111", + "-1": "111010", + "D": "001100", + "A": "110000", + "!D": "001101", + "!A": "110001", + "-D": "001111", + "-A": "110011", + "D+1": "011111", + "A+1": "110111", + "D-1": "001110", + "A-1": "110010", + "D+A": "000010", + "D-A": "010011", + "A-D": "000111", + "D&A": "000000", + "D|A": "010101", + } + + cmd = "" + if comp.find("M") != -1: + cmd += "1" + else: + cmd += "0" + + compa = comp.replace("M", "A") + + cmd += cmdluta[compa] + + return cmd + +def getdest(dest): + cmd = "" + + if dest.find("A") != -1: + cmd += "1" + else: + cmd += "0" + + if dest.find("D") != -1: + cmd += "1" + else: + cmd += "0" + + if dest.find("M") != -1: + cmd += "1" + else: + cmd += "0" + return cmd + +def getjmp(jmp): + return { + "JGT": "001", + "JEQ": "010", + "JGE": "011", + "JLT": "100", + "JNE": "101", + "JLE": "110", + "JMP": "111", + }[jmp] + + +def process_line(line): + global lut + global currentAddr + global currentCmd + global outfile + global infile + + if line[0] == "@": + addr = line[1:] + if not addr.isdigit(): + if not addr in lut: + lut[addr] = currentAddr + currentAddr += 1 + outfile.write("0" + getbin(lut[addr], 15) +"\n") + else: + outfile.write("0" + getbin(int(addr), 15) + "\n") + else: + if "=" in line: + dest=line.split("=",1)[0] + comp = line.split("=", 1)[1] + else: + dest = False + + if ";" in line: + split = line.split(";") + jmp = split[len(split) - 1] + comp = line.split(";", 1)[0] + else: + jmp = False + + if not comp: + comp = line + + cmd = "111" + + cmd += getcomp(comp) + + if dest: + cmd += getdest(dest) + else: + cmd += "000" + + if jmp: + cmd += getjmp(jmp) + else: + cmd += "000" + + + outfile.write(cmd + "\n") + +if __name__ == '__main__': + main() diff --git a/projects/06/max/Max.asm b/projects/06/max/Max.asm new file mode 100644 index 0000000..e9d6c7e --- /dev/null +++ b/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/projects/06/max/Max.hack b/projects/06/max/Max.hack new file mode 100644 index 0000000..ab8a440 --- /dev/null +++ b/projects/06/max/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/projects/06/max/MaxL.asm b/projects/06/max/MaxL.asm new file mode 100644 index 0000000..3370c87 --- /dev/null +++ b/projects/06/max/MaxL.asm @@ -0,0 +1,16 @@ +@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 \ No newline at end of file diff --git a/projects/06/max/MaxL.hack b/projects/06/max/MaxL.hack new file mode 100644 index 0000000..e207691 --- /dev/null +++ b/projects/06/max/MaxL.hack @@ -0,0 +1,16 @@ +0000000000000000 +1110000000010000 +0000000000000001 +1110000000010000 +0000000000001010 +1110000000000001 +0000000000000001 +1110000000010000 +0000000000001100 +1110000000000111 +0000000000000000 +1110000000010000 +0000000000000010 +1110000000001000 +0000000000001110 +1110000000000111 diff --git a/projects/06/max/asdf.asm b/projects/06/max/asdf.asm new file mode 100644 index 0000000..1da3254 --- /dev/null +++ b/projects/06/max/asdf.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 \ No newline at end of file diff --git a/projects/06/max/asdf.hack b/projects/06/max/asdf.hack new file mode 100644 index 0000000..ab8a440 --- /dev/null +++ b/projects/06/max/asdf.hack @@ -0,0 +1,16 @@ +0000000000000000 +1111110000010000 +0000000000000001 +1111010011010000 +0000000000001010 +1110001100000001 +0000000000000001 +1111110000010000 +0000000000001100 +1110101010000111 +0000000000000000 +1111110000010000 +0000000000000010 +1110001100001000 +0000000000001110 +1110101010000111 diff --git a/projects/06/pong/Pong.asm b/projects/06/pong/Pong.asm new file mode 100644 index 0000000..1bc9d23 --- /dev/null +++ b/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/projects/06/pong/Pong.hack b/projects/06/pong/Pong.hack new file mode 100644 index 0000000..9eb4a3d --- /dev/null +++ b/projects/06/pong/Pong.hack @@ -0,0 +1,27483 @@ +0000000100000000 +1110110000010000 +0000000000000000 +1110001100001000 +0000000010000101 +1110101010000111 +0000000000001111 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111010000 +1110101010001000 +0000000000010011 +1110001100000101 +0000000000000000 +1111110010100000 +1110111010001000 +0000000000001111 +1111110000100000 +1110101010000111 +0000000000001111 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111010000 +1110101010001000 +0000000000100011 +1110001100000110 +0000000000000000 +1111110010100000 +1110111010001000 +0000000000001111 +1111110000100000 +1110101010000111 +0000000000001111 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111010000 +1110101010001000 +0000000000110011 +1110001100000011 +0000000000000000 +1111110010100000 +1110111010001000 +0000000000001111 +1111110000100000 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000001 +1111000111100000 +1111110000010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +1110110000010000 +0000000000000000 +1110011111001000 +0000000000000001 +1111110000010000 +0000000000001110 +1110001110101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000001110 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000001110 +1111110010101000 +1111110000010000 +0000000000000010 +1110001100001000 +0000000000001110 +1111110010101000 +1111110000010000 +0000000000000001 +1110001100001000 +0000000000001101 +1111110000100000 +1110101010000111 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000100 +1111110000010000 +0000000000000000 +1111110111101000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1111000010010000 +0000000000000000 +1111000111010000 +0000000000000010 +1110001100001000 +0000000000000000 +1111110111011000 +0000000000000001 +1110001100001000 +0000000000001110 +1111110000100000 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110110010 +1110110000010000 +0000000000001110 +1110001100001000 +0000000010010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000000010100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001010 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110000010000 +0000000000001011 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001100 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110000010000 +0000000000001101 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000110000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000000101001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0000000101111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000000110100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001000000010 +1110110000010000 +0000000000001110 +1110001100001000 +0000000110111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000000111100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001000000010 +1110110000010000 +0000000000001110 +1110001100001000 +0000000111110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000001001001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000001010001110 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0000001011101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0000001100000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001100011110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000001100111010 +1110001100000101 +0000001110100010 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001101110110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001110010100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000001111011111 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001110110100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001111010011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000001111111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000010000100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000010001010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000111000100 +1110110000010000 +0000000000001110 +1110001100001000 +0000010010000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000010010011010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000010010100001 +1110001100000101 +0000010011000011 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000010101111001 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010011110011 +1110001100000101 +0000010100110111 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010100000011 +1110001100000101 +0000010100011101 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000010100110101 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000010101111001 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010101000111 +1110001100000101 +0000010101100001 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000010101111001 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010110001001 +1110001100000101 +0000010111001101 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010110011001 +1110001100000101 +0000010110110011 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000010111001011 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000011000001111 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000010111011101 +1110001100000101 +0000010111110111 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000011000001111 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011000100011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011000101101 +1110001100000101 +0000011001001100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011001100000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011001101010 +1110001100000101 +0000011010001011 +1110101010000111 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011010011111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011010101001 +1110001100000101 +0000011011001010 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000011011011110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000011011101000 +1110001100000101 +0000011100001001 +1110101010000111 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000110000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000011100011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000011100101101 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000011101011010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000011101111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000011110010011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000011110011010 +1110001100000101 +0000011110101011 +1110101010000111 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000100000100110 +1110101010000111 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000011110111011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000011111001101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000011111100010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000011111111010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000100000000110 +1110001100000101 +0000100000010111 +1110101010000111 +0000000000010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000100000100110 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000100000110111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000100000111110 +1110001100000101 +0000100010110011 +1110101010000111 +0000000111111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100001101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000100001111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100010100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000101000111000 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000100011000110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000100011001101 +1110001100000101 +0000100100111100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100011110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000100100000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100100101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000101000111000 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000001110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000100101001111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000100101010110 +1110001100000101 +0000100111001011 +1110101010000111 +0000000011111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100110000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000100110010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100110111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000101000111000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000100111101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0000101000000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0000101000101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0000001010001100 +1110110000010000 +0000000000001110 +1110001100001000 +0000101001011000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000101001110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101100001011 +1110110000010000 +0000000000001110 +1110001100001000 +0000101011010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0000101100000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000101100101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0000101101000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000101101101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0000101101111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000101111011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101101001100 +1110110000010000 +0000000000001110 +1110001100001000 +0000110001011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101100001011 +1110110000010000 +0000000000001110 +1110001100001000 +0000110010000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000110010101000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000110010101111 +1110001100000101 +0000110111000101 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000110011010110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000110011011101 +1110001100000101 +0000110011100111 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000110011110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000110101100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000110101111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000110110111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000111011110111 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000110111111011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000111000000010 +1110001100000101 +0000111000011011 +1110101010000111 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000111000101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000111001111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110011001 +1110110000010000 +0000000000001110 +1110001100001000 +0000111010010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0000111011110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001000110011100 +1110110000010000 +0000000000001110 +1110001100001000 +0000111100001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001000110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111100011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001000110111011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111100110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001000101000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111101101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0101000001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0000111101111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000011100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0000101001100011 +1110110000010000 +0000000000001110 +1110001100001000 +0000111110111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000011111101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000011100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000001101 +1110001100001000 +0000000010010001 +1110110000010000 +0000000000001110 +1110001100001000 +0000111111101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000110010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0000001010001100 +1110110000010000 +0000000000001110 +1110001100001000 +0001000000001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000011101110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101011101010010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000000110110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0100101110010110 +1110110000010000 +0000000000001110 +1110001100001000 +0001000001010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0001000001101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000001111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000010001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001101111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000010011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000010110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011010100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001000011111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000100000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000101011100010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000101100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000000101011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000101111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0001000110010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0000111101011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001000110101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000010000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001101001111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001000111101110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001001001010 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001000010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110010001011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001000101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001010001000111 +1110110000010000 +0000000000001110 +1110001100001000 +0001001001000011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001000111011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000010000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001001001011011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001001001100010 +1110001100000101 +0001001010000000 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000101111100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001001111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001001011011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000010000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001001010010001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001001010011000 +1110001100000101 +0001001010111000 +1110101010000111 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000101111100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001010110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001001011011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000010001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001001011001001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001001011010000 +1110001100000101 +0001001011011111 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001001011101110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001101001101 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001001100010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110010001011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001100101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001010001000111 +1110110000010000 +0000000000001110 +1110001100001000 +0001001101000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001001011011111 +1110101010000111 +0001000111001011 +1110101010000111 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001001101011111 +1110001100000101 +0001010001000001 +1110101010000111 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0100101110010110 +1110110000010000 +0000000000001110 +1110001100001000 +0001001101110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0001001110001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001110100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001110110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001001111111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0001010000111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001010001001001 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000010001100110 +1110110000010000 +0000000000001110 +1110001100001000 +0001010001101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001010010000110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010010011011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001010010101010 +1110001100000101 +0001011010101010 +1110101010000111 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110000000110 +1110110000010000 +0000000000001110 +1110001100001000 +0001010011011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000110000011011 +1110110000010000 +0000000000001110 +1110001100001000 +0001010011110010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001001010111 +1110110000010000 +0000000000001110 +1110001100001000 +0001010100001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0000001001101100 +1110110000010000 +0000000000001110 +1110001100001000 +0001010100100111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010101000010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001010101001001 +1110001100000101 +0001011010001011 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010101011101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001010101110010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001010110010010 +1110001100000101 +0001011010001011 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0001010110110001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001010110111000 +1110001100000101 +0001010111001000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001010111111001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0001010111101000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001010111101111 +1110001100000101 +0001010111111001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000110000111101 +1110110000010000 +0000000000001110 +1110001100001000 +0001011000110100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0100101110010110 +1110110000010000 +0000000000001110 +1110001100001000 +0001011001101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100111000001101 +1110110000010000 +0000000000001110 +1110001100001000 +0001011010000110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0000011100101011 +1110110000010000 +0000000000001110 +1110001100001000 +0001011010100101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011010111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001011011001001 +1110001100000101 +0001011011100000 +1110101010000111 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0001011011011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0001011011110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0001011100010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0110000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000101101110 +1110110000010000 +0000000000001110 +1110001100001000 +0001011100110110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011101100011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011101110010 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001011110110110 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001011110001011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001011110100000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001011110100111 +1110001100000101 +0001011110110100 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0001011101010100 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110100010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011111000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011111001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001011111100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001011111110110 +1110001100000001 +0000000001010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0001100000001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0001100000101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110011010 +1110110000010000 +0000000000001110 +1110001100001000 +0001100000111011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110100010 +1110110000010000 +0000000000001110 +1110001100001000 +0001100001001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001100100000100 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100111000 +1110110000010000 +0000000000001110 +1110001100001000 +0001100001110100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001100010001100 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001100010101000 +1110001100000101 +0001100100000010 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001100010111011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001100011000010 +1110001100000101 +0001100011011110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110010011001001 +1110110000010000 +0000000000001110 +1110001100001000 +0001100011010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0001100100000010 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0001100011111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0001100001010100 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011111110100 +1110110000010000 +0000000000001110 +1110001100001000 +0001100100101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110010100100001 +1110110000010000 +0000000000001110 +1110001100001000 +0001100101000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001010100100 +1110110000010000 +0000000000001110 +1110001100001000 +0001100101011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0001100101111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010001 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0001100110010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010010 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001100111010101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001101001110000 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0001100111000100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101010000101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001101010001100 +1110001100000101 +0001101010011101 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001101010101000 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101010111110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101011001101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101011100001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101011110000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001101100010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001101100101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001101101000111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001101101001110 +1110001100000101 +0001101101110101 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001101110001000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001110001001101 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001101111000100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001101111001011 +1110001100000101 +0001110000011000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0001101101110101 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001110001011101 +1110001100000101 +0001110001101110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001110001111001 +1110001100000001 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110010001111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001110010010110 +1110001100000101 +0001110010101101 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0001110010101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110010111100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110011001011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110011011111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001110011101110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001110100100001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0001110101001010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111010100001 +1110001100000101 +0111111111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001110110101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001110111001010 +1110001100000101 +0001111010011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001111001101110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111010001001 +1110001100000101 +0001111010011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001110101010000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0001111010110100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111101100111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001111011100101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111011101111 +1110001100000101 +0001111101001111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001111010100001 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0001111101110110 +1110001100000101 +0001111110000111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0001111110010010 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0001111110101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0001111110101111 +1110001100000101 +0001111111000110 +1110101010000111 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0001111111000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0001111111100101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0010000010011100 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0010000000111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000001010011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0010000001100110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0010000001110101 +1110001100000101 +0010000010000100 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0001111111010010 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000010111001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010000011000000 +1110001100000101 +0010000011001101 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000011101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010000011101111 +1110001100000101 +0010000011111100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010011 +1110001100001000 +0000100000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0011011111111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000100000000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000100000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0010000111010110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010000111011101 +1110001100000101 +0010000111110100 +1110101010000111 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0010000111101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000100000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010001000100111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0010001001010011 +1110001100000101 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0010001000000000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0011111111111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010001001110000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010001001110111 +1110001100000101 +0010001010001110 +1110101010000111 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0010001010001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0010001011000000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010001011000111 +1110001100000101 +0010010001001111 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0010001101100000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010001101100111 +1110001100000101 +0010001110111011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0010010000001011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0010010011110010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010010011111001 +1110001100000101 +0010010101010100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0010011001111000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0010010111110101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0010010111111100 +1110001100000101 +0010011000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0010011001111000 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0100000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010100 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0010011010111011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0010011011101000 +1110110000010000 +0000000000001110 +1110001100001000 +0010011011001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100100000011000 +1110110000010000 +0000000000001110 +1110001100001000 +0010011011011101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000001111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0010011011111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011001 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010011101001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010011110010000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010011111100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100000101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100001111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100011010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100100100111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100101111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000100111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010100111000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101000011010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101001101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101010111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101100001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101101010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101110010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010101111011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000101111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110000101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110010000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110011010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110100101100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110110000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010110111010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111000101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111010000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111011010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111100101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111101111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0010111111001010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000000010111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000001101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000010101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000100000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000101010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000110101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011000111111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001001010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001010100111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001011111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001101010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001110100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011001111111011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010001010000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010010100101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010011111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010110100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011010111111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011001001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011010100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011011111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011101001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011110100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011011111111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100001001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100010100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100011111000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001010111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100101001101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100110100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011100111110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101001001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101010100001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101011110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101101000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101110001110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011101111010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110000011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110001101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110011000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110100001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110101100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011110110110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111000001000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001100111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111001011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111010110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111100000011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111101011000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0011111110101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000000000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000001010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000010100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001101111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000011101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000101000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000110010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100000111100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001000101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001010000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001011010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001100100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001110111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001101110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100001111000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010000010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010001100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010010110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010100001010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010101011111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000001111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000001100 +1110110000010000 +0000000000001101 +1110001100001000 +0100010110110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100010110101000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100010111001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000010000 +0000000000001011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0100100000011010 +1110001100000001 +0000000001111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100100000110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011010 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000001111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100001010101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100110101011 +1110001100000101 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100100010010100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100011101001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100101101011 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000100000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100100100111001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0100100011010110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100100101111011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100100110000010 +1110001100000101 +0100100110010001 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0100100110101001 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0100100001000011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100111000110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000001111110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100100111010111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100111100011 +1110001100000101 +0100100111101101 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100100111111010 +1110001100000101 +0100101000100000 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011001 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0100101001000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011010 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0100101001001111 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100100110110001 +1110110000010000 +0000000000001110 +1110001100001000 +0100101001101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100101010001101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100101110010000 +1110001100000101 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100101010100010 +1110001100000101 +0100101011011001 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000100000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0100101100001010 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0100101001111100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100101110100101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100101110110110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100101111001010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100101111100000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100101111101100 +1110001100000101 +0100110000000011 +1110101010000111 +0000000000010100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0100101111111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0100110000011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000101100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100110001000000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100110001110100 +1110110000010000 +0000000001011111 +1110101010000111 +0100110001111000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100101001001101 +1110110000010000 +0000000000001110 +1110001100001000 +0100110010001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110011010 +1110110000010000 +0000000000001110 +1110001100001000 +0100110010101101 +1110110000010000 +0000000001011111 +1110101010000111 +0100110010110001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100110010111000 +1110001100000101 +0100110011001011 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111001001000 +1110110000010000 +0000000000001110 +1110001100001000 +0100110011000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0100110110000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110100110100010 +1110110000010000 +0000000000001110 +1110001100001000 +0100110011011110 +1110110000010000 +0000000001011111 +1110101010000111 +0100110011100010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100110011101001 +1110001100000101 +0100110011111100 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0100110011110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0100110110000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100101001001101 +1110110000010000 +0000000000001110 +1110001100001000 +0100110100001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100110100100100 +1110001100000101 +0100110101001100 +1110101010000111 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100110101011100 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100110101100011 +1110001100000101 +0100110101110110 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111001001000 +1110110000010000 +0000000000001110 +1110001100001000 +0100110101101111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0100110110000100 +1110101010000111 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110000100000 +1110101010001000 +1110110111110000 +1110101010001000 +0000000000000000 +1110011111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001011111011 +1110110000010000 +0000000000001110 +1110001100001000 +0100110110100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100110110111100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100111000000111 +1110001100000101 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110001100010001 +1110110000010000 +0000000000001110 +1110001100001000 +0100110111011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110010011010 +1110110000010000 +0000000000001110 +1110001100001000 +0100110111101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0100110110101010 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000011000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110011010110011 +1110110000010000 +0000000000001110 +1110001100001000 +0100111000100110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000011000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0100111000111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000101100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0001111111000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100111010001110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100111010010101 +1110001100000101 +0100111010100000 +1110101010000111 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000010101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0100111010110011 +1110001100000101 +0100111101000000 +1110101010000111 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0100111011000001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100111011001000 +1110001100000101 +0100111011110010 +1110101010000111 +0000000000010111 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0100111100110101 +1110101010000111 +0000000000011111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010111 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100111100001101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0100111100010100 +1110001100000101 +0100111100011111 +1110101010000111 +0001111111000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000010110 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000101000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010110 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0100111101001100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000010101 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100101001001101 +1110110000010000 +0000000000001110 +1110001100001000 +0100111101011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0100000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011011 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011100 +1110001100001000 +0000000000010001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0100111110010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0100111111010101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101000001110000 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0100111111000100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0010000000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101000010001011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101000011010111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101000001111010 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000011100 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101000011101010 +1110001100000101 +0101000100111110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0101000110010011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000011100 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101000110101101 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101000111000011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101000111010100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101000111101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101000111111110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101001000001010 +1110001100000101 +0101001000100001 +1110101010000111 +0000000000000111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0101001000011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101001000111010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001001100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001010000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101001011001001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101001011100011 +1110001100000101 +0101001100000100 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110101011 +1110110000010000 +0000000000001110 +1110001100001000 +0101001011111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101001100100011 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000110101011 +1110110000010000 +0000000000001110 +1110001100001000 +0101001100011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000001011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101001100101011 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101001101000001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101001101010011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101001101100111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101001101111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101001110001011 +1110001100000101 +0101001110100010 +1110101010000111 +0000000000001000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0101001110011101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001111000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001101001110110 +1110110000010000 +0000000000001110 +1110001100001000 +0101001111101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010000000111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010000101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010001010011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101010001100100 +1110001100000101 +0101010011000010 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101010011010010 +1110001100000101 +0101010101010100 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010101000110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0101010110100010 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101010110010110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101010110111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101010111101110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101011000100010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101001011010100 +1110110000010000 +0000000000001110 +1110001100001000 +0101011001010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011001101010 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101011101001100 +1110001100000101 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101011010000011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0101011010001010 +1110001100000101 +0101011010101101 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0101011100001100 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101011011011110 +1110001100000101 +0101011011110110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101011100001100 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101001011010100 +1110110000010000 +0000000000001110 +1110001100001000 +0101011101000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101011001010110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000001001 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101011101010100 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011101101110 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011110000010 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101011110010110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011110101101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101011111000001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101011111011001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101011111100101 +1110001100000101 +0101011111111100 +1110101010000111 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0101011111110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101100000010101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101100000111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101100001101010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101100010010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101100100110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101100101111001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101101011001101 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101100110101110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0101100110110101 +1110001100000101 +0101100111100110 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101100111011111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101101010010000 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101101000000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101101000101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101101001101111 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101101001010010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101101000011101 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101101010001011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101100101100101 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000001011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101101011010101 +1110001100000001 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000011010110 +1110110000010000 +0000000000001110 +1110001100001000 +0101101011110111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000010100111 +1110110000010000 +0000000000001110 +1110001100001000 +0101101100011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0101101100111101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000100000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101101101001110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000001000000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101101101100110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0101101110000000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101101110001100 +1110001100000101 +0101111001010001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000010100111 +1110110000010000 +0000000000001110 +1110001100001000 +0101101110100101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0010000011010110 +1110110000010000 +0000000000001110 +1110001100001000 +0101101111001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101101111110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000111 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101110000011011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0101110001000111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001000 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101110001110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010010000 +0000000000001101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000001101 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001001 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000001010 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000011101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000100000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0101110100001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000110 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101110101101011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0101110101110010 +1110001100000101 +0101110110100011 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101110110011100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0101111001010001 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000101 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101110110111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101110111101110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101111000101110 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101111000010001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0101110111011010 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0101000011011101 +1110110000010000 +0000000000001110 +1110001100001000 +0101111001001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111010100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111011101110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111100111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000001101 +1110001100001000 +0101101011010011 +1110110000010000 +0000000000001110 +1110001100001000 +0101111110001100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0101111110011001 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101111110101111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101111111000000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0101111111010100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0101111111101010 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0101111111110110 +1110001100000101 +0110000000001101 +1110101010000111 +0000000000001100 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110000000001000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110000000101001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000111111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110000001000111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110000001101000 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000011111111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110000010001011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110000010010111 +1110001100000101 +0110000010101110 +1110101010000111 +0000000000001101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110000010101001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101111001010111 +1110110000010000 +0000000000001110 +1110001100001000 +0110000011111100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110000100010011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110001000001011 +1110001100000101 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110000100101011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110000100110010 +1110001100000101 +0110000101101100 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110000101010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0110000111000110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110000110011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000100 +1110110000010000 +0000000000001101 +1110001100001000 +0101111001010111 +1110110000010000 +0000000000001110 +1110001100001000 +0110001000000100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0110000100000001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010000111000011 +1110110000010000 +0000000000001110 +1110001100001000 +0110001000100011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001000110111 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110001000111110 +1110001100000101 +0110001001010101 +1110101010000111 +0000000000001110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110001001010000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001001100100 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110001001101011 +1110001100000101 +0110001010000100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0110001001111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001010111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110001011000110 +1110001100000101 +0110001011011110 +1110101010000111 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011011110101 +1110110000010000 +0000000000001110 +1110001100001000 +0110001011011001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0010010010001101 +1110110000010000 +0000000000001110 +1110001100001000 +0110001011110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001100101100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001100111111 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001101010111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110001101100011 +1110001100000101 +0110001101111010 +1110101010000111 +0000000000001111 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110001101110101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110001110110110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001111001001 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110001111100001 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110001111101101 +1110001100000101 +0110010000000100 +1110101010000111 +0000000000010000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110001111111111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110010001011010 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010001100001 +1110001100000101 +0110010001111000 +1110101010000111 +0000000000010001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110010001110011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110010011100101 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010011101100 +1110001100000101 +0110010100000011 +1110101010000111 +0000000000010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110010011111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000101 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0110010100100011 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110010101000110 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010101001101 +1110001100000101 +0110010101010011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110010110001000 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110010110001111 +1110001100000101 +0110010110101001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110010110111100 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000000001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110011010001001 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011000010011 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110011000100101 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111010101001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110011001000101 +1110001100000101 +0110011010000111 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110011001011110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0110010110101001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000100 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110011010011001 +1110001100000101 +0110011010101010 +1110101010000111 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000100 +1110110000010000 +1110001110010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0110011010110101 +1110001100000001 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011011010111 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110011011011110 +1110001100000101 +0110011011110101 +1110101010000111 +0000000000010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110011011110000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000110 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011010110000 +1110110000010000 +0000000000001110 +1110001100001000 +0110011100000111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011100011101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110011100100100 +1110001100000101 +0110011101000100 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110110111100000 +1110110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010100000 +1111110001010000 +1110011111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110011101100000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110100000000110 +1110001100000101 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001110001110111 +1110110000010000 +0000000000001110 +1110001100001000 +0110011110000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110111100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000001010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0001101010100110 +1110110000010000 +0000000000001110 +1110001100001000 +0110011111000001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110111100000 +1110001100001000 +0110011101010001 +1110101010000111 +0000000000000001 +1111110000010000 +0000000000000011 +1110000010100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110100000010110 +1110001100000101 +0110100001011100 +1110101010000111 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000101101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000011 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110100001101110 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110100001110101 +1110001100000101 +0110100010001100 +1110101010000111 +0000000000010011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110100010000111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110100010011011 +1110110000010000 +0000000000000110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110100010100010 +1110001100000101 +0110100011011011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000110000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0110100101111011 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0110100011111001 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110100101111011 +1110001100000101 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000100 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1110001100001000 +0000000000000101 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000100 +1111110000100000 +1110001100001000 +0000000000000011 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000011 +1111110111100000 +1110110111100000 +1110001100001000 +0110100011100110 +1110101010000111 +0000000000000001 +1111110111100000 +1110110111100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0001011011110101 +1110110000010000 +0000000000001110 +1110001100001000 +0110100110001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000010000000 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000010000001 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000100010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000110110 +1110101010000111 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0010000100000101 +1110110000010000 +0000000000001110 +1110001100001000 +0110100110111110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001100101101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110100111001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0100111101101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110100111100000 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0010011001111110 +1110110000010000 +0000000000001110 +1110001100001000 +0110100111110001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0001011100011110 +1110110000010000 +0000000000001110 +1110001100001000 +0110101000000010 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0000111011111101 +1110110000010000 +0000000000001110 +1110001100001000 +0110101000010011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110101000101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101000100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110101000111010 +1110001100000101 +0110101000101001 +1110101010000111 +0000000000000000 +1111110111101000 +1110110010100000 +1110101010001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110101001001101 +1110110000010000 +0000000000100110 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0110101001010100 +1110001100000101 +0110101001101001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110101011011001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101001100100 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110101001111000 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110101011010011 +1110001100000101 +0000000000110010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0110101010011011 +1110110000010000 +0000000000010110 +1110101010000111 +0000000000000000 +1111110010100000 +1111110001001000 +0000000000000000 +1111110010101000 +1111110000010000 +0110101010111011 +1110001100000101 +0000000000000001 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0110101010001100 +1110101010000111 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000000 +1111110111001000 +1111110010100000 +1110111111001000 +0000000000000000 +1111110010101000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0110101001101001 +1110101010000111 +0000000000000000 +1111110111001000 +1111110010100000 +1110101010001000 +0000000000110110 +1110101010000111 +0000000000000011 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0110001000010001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101011101011 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001000101 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0110101011111101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0110101100001111 +1110110000010000 +0000000001011111 +1110101010000111 +0000000001010010 +1110110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000010 +1110110000010000 +0000000000001101 +1110001100001000 +0110010000111011 +1110110000010000 +0000000000001110 +1110001100001000 +0110101100100001 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100110110001010 +1110110000010000 +0000000000001110 +1110001100001000 +0110101100101101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000010 +1111110000100000 +1111110000010000 +0000000000000000 +1111110111101000 +1110110010100000 +1110001100001000 +0000000000000001 +1110110000010000 +0000000000001101 +1110001100001000 +0100111000001101 +1110110000010000 +0000000000001110 +1110001100001000 +0110101101000101 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000001101 +1110001100001000 +0110101000101001 +1110110000010000 +0000000000001110 +1110001100001000 +0110101101010110 +1110110000010000 +0000000001011111 +1110101010000111 +0000000000000000 +1111110010101000 +1111110000010000 +0000000000000101 +1110001100001000 diff --git a/projects/06/pong/PongL.asm b/projects/06/pong/PongL.asm new file mode 100644 index 0000000..f4bd7ee --- /dev/null +++ b/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/projects/06/prog.txt b/projects/06/prog.txt new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/projects/06/prog.txt @@ -0,0 +1 @@ + diff --git a/projects/06/rect/Rect.asm b/projects/06/rect/Rect.asm new file mode 100644 index 0000000..722c172 --- /dev/null +++ b/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/projects/06/rect/Rect.hack b/projects/06/rect/Rect.hack new file mode 100644 index 0000000..f33a9d1 --- /dev/null +++ b/projects/06/rect/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/projects/06/rect/RectL.asm b/projects/06/rect/RectL.asm new file mode 100644 index 0000000..4eb2173 --- /dev/null +++ b/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/projects/07/MemoryAccess/BasicTest/BasicTest.asm b/projects/07/MemoryAccess/BasicTest/BasicTest.asm new file mode 100644 index 0000000..e69de29 diff --git a/projects/07/MemoryAccess/BasicTest/BasicTest.cmp b/projects/07/MemoryAccess/BasicTest/BasicTest.cmp new file mode 100644 index 0000000..e69de29 diff --git a/projects/07/MemoryAccess/BasicTest/BasicTest.tst b/projects/07/MemoryAccess/BasicTest/BasicTest.tst new file mode 100644 index 0000000..e69de29 diff --git a/projects/07/MemoryAccess/BasicTest/BasicTest.vm b/projects/07/MemoryAccess/BasicTest/BasicTest.vm new file mode 100644 index 0000000..e69de29 diff --git a/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst b/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst new file mode 100644 index 0000000..e69de29 diff --git a/projects/07/MemoryAccess/PointerTest/PointerTest.asm b/projects/07/MemoryAccess/PointerTest/PointerTest.asm new file mode 100644 index 0000000..3594b46 --- /dev/null +++ b/projects/07/MemoryAccess/PointerTest/PointerTest.asm @@ -0,0 +1,194 @@ +// push constant 3030 +@3030 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THIS +M=D +// push constant 3040 +@3040 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THAT +M=D +// push constant 32 +@32 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop this 2 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@2 +D=A +@THIS +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push constant 46 +@46 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop that 6 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@6 +D=A +@THAT +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push pointer 0 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push pointer 1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// push this 2 +@2 +D=A +@THIS +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// push that 6 +@6 +D=A +@THAT +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// 0 diff --git a/projects/07/MemoryAccess/PointerTest/PointerTest.cmp b/projects/07/MemoryAccess/PointerTest/PointerTest.cmp new file mode 100644 index 0000000..5d62de8 --- /dev/null +++ b/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/projects/07/MemoryAccess/PointerTest/PointerTest.tst b/projects/07/MemoryAccess/PointerTest/PointerTest.tst new file mode 100644 index 0000000..43cff67 --- /dev/null +++ b/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/projects/07/MemoryAccess/PointerTest/PointerTest.vm b/projects/07/MemoryAccess/PointerTest/PointerTest.vm new file mode 100644 index 0000000..a6086d9 --- /dev/null +++ b/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/projects/07/MemoryAccess/PointerTest/PointerTestVME.tst b/projects/07/MemoryAccess/PointerTest/PointerTestVME.tst new file mode 100644 index 0000000..76967b0 --- /dev/null +++ b/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/projects/07/MemoryAccess/StaticTest/StaticTest.asm b/projects/07/MemoryAccess/StaticTest/StaticTest.asm new file mode 100644 index 0000000..b4ef653 --- /dev/null +++ b/projects/07/MemoryAccess/StaticTest/StaticTest.asm @@ -0,0 +1,122 @@ +// push constant 111 +@111 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 333 +@333 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 888 +@888 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop static 8 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@StaticTest.8 +M=D +// pop static 3 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@StaticTest.3 +M=D +// pop static 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@StaticTest.1 +M=D +// push static 3 +@StaticTest.3 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push static 1 +@StaticTest.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// push static 8 +@StaticTest.8 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// 0 diff --git a/projects/07/MemoryAccess/StaticTest/StaticTest.cmp b/projects/07/MemoryAccess/StaticTest/StaticTest.cmp new file mode 100644 index 0000000..2bc908b --- /dev/null +++ b/projects/07/MemoryAccess/StaticTest/StaticTest.cmp @@ -0,0 +1,2 @@ +|RAM[256]| +| 1110 | diff --git a/projects/07/MemoryAccess/StaticTest/StaticTest.tst b/projects/07/MemoryAccess/StaticTest/StaticTest.tst new file mode 100644 index 0000000..41bb34a --- /dev/null +++ b/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/projects/07/MemoryAccess/StaticTest/StaticTest.vm b/projects/07/MemoryAccess/StaticTest/StaticTest.vm new file mode 100644 index 0000000..e24584b --- /dev/null +++ b/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/projects/07/MemoryAccess/StaticTest/StaticTestVME.tst b/projects/07/MemoryAccess/StaticTest/StaticTestVME.tst new file mode 100644 index 0000000..5e3fe30 --- /dev/null +++ b/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/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.asm b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.asm new file mode 100644 index 0000000..664a84a --- /dev/null +++ b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.asm @@ -0,0 +1,40 @@ +// push constant 7 +@7 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 8 +@8 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// 0 diff --git a/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp new file mode 100644 index 0000000..6b3b20e --- /dev/null +++ b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp @@ -0,0 +1,2 @@ +| RAM[0] | RAM[256] | +| 257 | 15 | diff --git a/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.tst b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.tst new file mode 100644 index 0000000..fff63ff --- /dev/null +++ b/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/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm new file mode 100644 index 0000000..d80d9fa --- /dev/null +++ b/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/projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst b/projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst new file mode 100644 index 0000000..955468f --- /dev/null +++ b/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/projects/07/StackArithmetic/StackTest/StackTest.asm b/projects/07/StackArithmetic/StackTest/StackTest.asm new file mode 100644 index 0000000..93ece30 --- /dev/null +++ b/projects/07/StackArithmetic/StackTest/StackTest.asm @@ -0,0 +1,560 @@ +// push constant 17 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 17 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// eq 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T0 +D;JEQ +@END0 +D=0;JMP +(T0) +D=-1 +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 17 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 16 +@16 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// eq 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T1 +D;JEQ +@END1 +D=0;JMP +(T1) +D=-1 +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 16 +@16 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 17 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// eq 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T2 +D;JEQ +@END2 +D=0;JMP +(T2) +D=-1 +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 892 +@892 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 891 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// lt 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T3 +D;JLT +@END3 +D=0;JMP +(T3) +D=-1 +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 891 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 892 +@892 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// lt 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T4 +D;JLT +@END4 +D=0;JMP +(T4) +D=-1 +(END4) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 891 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 891 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// lt 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T5 +D;JLT +@END5 +D=0;JMP +(T5) +D=-1 +(END5) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 32767 +@32767 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 32766 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// gt 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T6 +D;JGT +@END6 +D=0;JMP +(T6) +D=-1 +(END6) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 32766 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 32767 +@32767 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// gt 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T7 +D;JGT +@END7 +D=0;JMP +(T7) +D=-1 +(END7) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 32766 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 32766 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// gt 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T8 +D;JGT +@END8 +D=0;JMP +(T8) +D=-1 +(END8) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 57 +@57 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 31 +@31 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 53 +@53 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END9) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 112 +@112 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END10) +@SP +A=M +M=D +@SP +M=M+1 +// neg 0 +@SP +M=M-1 +A=M +D=-M +(END11) +@SP +A=M +M=D +@SP +M=M+1 +// and 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M&D +(END12) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 82 +@82 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// or 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M|D +(END13) +@SP +A=M +M=D +@SP +M=M+1 +// not 0 +@SP +M=M-1 +A=M +D=!M +(END14) +@SP +A=M +M=D +@SP +M=M+1 +// 0 diff --git a/projects/07/StackArithmetic/StackTest/StackTest.cmp b/projects/07/StackArithmetic/StackTest/StackTest.cmp new file mode 100644 index 0000000..cb182ec --- /dev/null +++ b/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/projects/07/StackArithmetic/StackTest/StackTest.tst b/projects/07/StackArithmetic/StackTest/StackTest.tst new file mode 100644 index 0000000..3c44cbb --- /dev/null +++ b/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/projects/07/StackArithmetic/StackTest/StackTest.vm b/projects/07/StackArithmetic/StackTest/StackTest.vm new file mode 100644 index 0000000..c418178 --- /dev/null +++ b/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/projects/07/StackArithmetic/StackTest/StackTestVME.tst b/projects/07/StackArithmetic/StackTest/StackTestVME.tst new file mode 100644 index 0000000..190570b --- /dev/null +++ b/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/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm new file mode 100644 index 0000000..2a3997f --- /dev/null +++ b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm @@ -0,0 +1,507 @@ +@256 +D=A +@SP +M=D +// call Sys.init 0 +@$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.init +-1;JMP +($ret.0) +// function Sys.init 0 +(Sys.init) +// push constant 4 +@4 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// call Main.fibonacci 1 +@Sys.init$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@6 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Main.fibonacci +-1;JMP +(Sys.init$ret.0) +// label WHILE 0 +(Sys.init$WHILE) +// goto WHILE 0 +@Sys.init$WHILE +-1;JMP +// 0 +// function Main.fibonacci 0 +(Main.fibonacci) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 2 +@2 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// lt 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +@T0 +D;JLT +@END0 +D=0;JMP +(T0) +D=-1 +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// if-goto IF_TRUE 0 +@SP +M=M-1 +A=M +D=M +@Main.fibonacci$IF_TRUE +D;JNE +// goto IF_FALSE 0 +@Main.fibonacci$IF_FALSE +-1;JMP +// label IF_TRUE 0 +(Main.fibonacci$IF_TRUE) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// label IF_FALSE 0 +(Main.fibonacci$IF_FALSE) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 2 +@2 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// call Main.fibonacci 1 +@Main.fibonacci$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@6 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Main.fibonacci +-1;JMP +(Main.fibonacci$ret.0) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 1 +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// call Main.fibonacci 1 +@Main.fibonacci$ret.1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@6 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Main.fibonacci +-1;JMP +(Main.fibonacci$ret.1) +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// 0 diff --git a/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp new file mode 100644 index 0000000..fdf5e2d --- /dev/null +++ b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp @@ -0,0 +1,2 @@ +| RAM[0] |RAM[261]| +| 262 | 3 | diff --git a/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst new file mode 100644 index 0000000..ed03a4e --- /dev/null +++ b/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 9000 { + ticktock; +} + +output; diff --git a/projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst b/projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst new file mode 100644 index 0000000..082cf4e --- /dev/null +++ b/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/projects/08/FunctionCalls/FibonacciElement/Main.vm b/projects/08/FunctionCalls/FibonacciElement/Main.vm new file mode 100644 index 0000000..c84f599 --- /dev/null +++ b/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/projects/08/FunctionCalls/FibonacciElement/Sys.vm b/projects/08/FunctionCalls/FibonacciElement/Sys.vm new file mode 100644 index 0000000..4cd3dc4 --- /dev/null +++ b/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/projects/08/FunctionCalls/NestedCall/.asm b/projects/08/FunctionCalls/NestedCall/.asm new file mode 100644 index 0000000..7325512 --- /dev/null +++ b/projects/08/FunctionCalls/NestedCall/.asm @@ -0,0 +1,651 @@ +@Sys.init +0;JMP +// function Sys.init 0 +(Sys.init) +// push constant 4000 +@4000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THIS +M=D +// push constant 5000 +@5000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THAT +M=D +// call Sys.main 0 +@Sys.init$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.main +-1;JMP +(Sys.init$ret.0) +// pop temp 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@R6 +M=D +// label LOOP 0 +(Sys.init$LOOP) +// goto LOOP 0 +@Sys.init$LOOP +-1;JMP +// function Sys.main 5 +(Sys.main) +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 4001 +@4001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THIS +M=D +// push constant 5001 +@5001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THAT +M=D +// push constant 200 +@200 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@1 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push constant 40 +@40 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 2 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@2 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push constant 6 +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 3 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@3 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push constant 123 +@123 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// call Sys.add12 1 +@Sys.main$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@6 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.add12 +-1;JMP +(Sys.main$ret.0) +// pop temp 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@R5 +M=D +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 1 +@1 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 2 +@2 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 3 +@3 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 4 +@4 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// function Sys.add12 0 +(Sys.add12) +// push constant 4002 +@4002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THIS +M=D +// push constant 5002 +@5002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THAT +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 12 +@12 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END4) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// 0 diff --git a/projects/08/FunctionCalls/NestedCall/NestedCall.asm b/projects/08/FunctionCalls/NestedCall/NestedCall.asm new file mode 100644 index 0000000..e9fb64d --- /dev/null +++ b/projects/08/FunctionCalls/NestedCall/NestedCall.asm @@ -0,0 +1,707 @@ +@256 +D=A +@SP +M=D +// call Sys.init 0 +@$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.init +-1;JMP +($ret.0) +// function Sys.init 0 +(Sys.init) +// push constant 4000 +@4000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THIS +M=D +// push constant 5000 +@5000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THAT +M=D +// call Sys.main 0 +@Sys.init$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.main +-1;JMP +(Sys.init$ret.0) +// pop temp 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R6 +M=D +// label LOOP 0 +(Sys.init$LOOP) +// goto LOOP 0 +@Sys.init$LOOP +-1;JMP +// function Sys.main 5 +(Sys.main) +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 4001 +@4001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THIS +M=D +// push constant 5001 +@5001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THAT +M=D +// push constant 200 +@200 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@1 +D=A +@LCL +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push constant 40 +@40 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 2 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@2 +D=A +@LCL +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push constant 6 +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 3 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@3 +D=A +@LCL +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push constant 123 +@123 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// call Sys.add12 1 +@Sys.main$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@6 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.add12 +-1;JMP +(Sys.main$ret.0) +// pop temp 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R5 +M=D +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 1 +@1 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 2 +@2 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 3 +@3 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 4 +@4 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// function Sys.add12 0 +(Sys.add12) +// push constant 4002 +@4002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THIS +M=D +// push constant 5002 +@5002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THAT +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 12 +@12 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END4) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// 0 diff --git a/projects/08/FunctionCalls/NestedCall/NestedCall.cmp b/projects/08/FunctionCalls/NestedCall/NestedCall.cmp new file mode 100644 index 0000000..978405d --- /dev/null +++ b/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/projects/08/FunctionCalls/NestedCall/NestedCall.html b/projects/08/FunctionCalls/NestedCall/NestedCall.html new file mode 100644 index 0000000..0821f9c --- /dev/null +++ b/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 Sys.asm, sets up the stack to simulate the bootstrap's call to Sys.init(), then +begins execution at the beginning of Sys.asm. If the bootstrap is not present, the program begins +running with Sys.init() since it is the first function in Sys.vm. +

+If Sys.asm includes the bootstrap, the bootstrap will (re)initialize the stack and call Sys.init(), +so the test should see the same environment either way it gets to Sys.init(). +

+The test setup also initializes the + +

Sys.init()

+ +THIS and THAT are set to known values so that context save and restore can be tested. +

+Sys.init() calls Sys.main() and stores the return value in temp 1. This tests call to and +return from a function with no arguments. + +

Sys.main()

+Sys.init() allocates 5 local variables. It sets local 1, local 2 and +local 3. local 0 and local 4 are intentionally not set. +

+THIS and THAT are changed so that context save and restore can be tested. +

+Sys.main() calls Sys.add12(123) and stores the return value in temp 0. This tests call to and +return from a function with arguments. +

+After Sys.add12() returns, Sys.main() sums local 0 through local 4 and returns the +result. This tests that the local segment was properly allocated on the stack and that the local +variables were not overwritten by the call to Sys.main(). It also tests that local 0 and +local 4 were properly initialized to 0. + +

Sys.add12()

+ +THIS and THAT are set to known values so that context save and restore can be tested. +

+Returns argument 0 plus 12. + + +

Test Coverage

+ +

+Functions with no arguments return to correct RIP (Return Instruction Point) with correct return value on stack.
+This can fail if the RIP is not correctly pushed on the stack by the calling code, or if the returning +code does not store the RIP in a temporary register before overwriting it with the return value. + +

+Functions with arguments return to correct RIP with correct return value on stack.
+This can fail if it is assumed that ARG points to the RIP. + +

+Functions with local variables allocate space on the stack for the local variables.
+This can fail if the function prologue is not written or if the SP is not updated after zeroing +the local variables. + +

+All local variables are initialized to 0.
+Common errors are to forget this completely, or for the zeroing loop to be off by one. + +

+THIS and THAT are correctly retained across function calls. Looking ahead, in Project 9 you will be asked to write a simple computer game in the high-level Jack language. You can run your game (following compilation) on the supplied VM Emulator. But, if you choose to translate the VM code that the compiler generates using your VM Translator, then code like +"push THIS, push THAT ... pop THIS, pop THAT" can cause some interesting failures! + + +

Debugging

+These comments assume that your VM translator has passed the SimpleFunction test. +

+If RAM[0] is incorrect, you have a stack skew. More data was pushed onto the stack by +call than was popped by return, or vice versa. See debugging with +breakpoints later in this section. +

+If one or more of RAM[1] through RAM[4] is incorrect, the LCL, +ARG, THIS and THAT pointers are not being correctly saved or restored. +Most likely problem is when they are being saved; the SimpleFunction test verified that +return restored them correctly. +

+If RAM[5] is incorrect there may be a problem with setting up the ARG pointer. +

+If RAM[4] is incorrect and RAM[5] is correct, there may be a problem with +allocation or initialization of local variables. + +

Debugging with breakpoints

+ +To find tough bugs you can use the "breakpoint" facility in the CPU Emulator (red flag button). +You can use breakpoints to have you program stop when it gets to a particular RAM address. For +example:
+ • load the NestedCall.tst file,
+ • set a PC breakpoint at the ROM address for (Sys.main),
+ • hit the run button.
+When the CPU Emulator stops at the breakpoint you can inspect the RAM to check the stack and pointers values. +(If the breakpoint isn't hit, you will need to to single-step debug through +your calling code to see why it didn't get there.) +

+Other useful places to set breakpoints are the entry points to the other functions and at the +first and final instructions generated for return commands. +

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/projects/08/FunctionCalls/NestedCall/NestedCall.tst b/projects/08/FunctionCalls/NestedCall/NestedCall.tst new file mode 100644 index 0000000..38350bd --- /dev/null +++ b/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/projects/08/FunctionCalls/NestedCall/NestedCallStack.html b/projects/08/FunctionCalls/NestedCall/NestedCallStack.html new file mode 100644 index 0000000..e751054 --- /dev/null +++ b/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/projects/08/FunctionCalls/NestedCall/NestedCallVME.tst b/projects/08/FunctionCalls/NestedCall/NestedCallVME.tst new file mode 100644 index 0000000..4a46ffe --- /dev/null +++ b/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/projects/08/FunctionCalls/NestedCall/Sys.asm b/projects/08/FunctionCalls/NestedCall/Sys.asm new file mode 100644 index 0000000..59112d8 --- /dev/null +++ b/projects/08/FunctionCalls/NestedCall/Sys.asm @@ -0,0 +1,649 @@ +// function Sys.init 0 +(Sys.init) +// push constant 4000 +@4000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THIS +M=D +// push constant 5000 +@5000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THAT +M=D +// call Sys.main 0 +@Sys.init$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.main +-1;JMP +(Sys.init$ret.0) +// pop temp 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@R6 +M=D +// label LOOP 0 +(Sys.init$LOOP) +// goto LOOP 0 +@Sys.init$LOOP +-1;JMP +// function Sys.main 5 +(Sys.main) +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 4001 +@4001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THIS +M=D +// push constant 5001 +@5001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THAT +M=D +// push constant 200 +@200 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@1 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push constant 40 +@40 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 2 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@2 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push constant 6 +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 3 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@3 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push constant 123 +@123 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// call Sys.add12 1 +@Sys.main$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@6 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.add12 +-1;JMP +(Sys.main$ret.0) +// pop temp 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@R5 +M=D +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 1 +@1 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 2 +@2 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 3 +@3 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 4 +@4 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// function Sys.add12 0 +(Sys.add12) +// push constant 4002 +@4002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THIS +M=D +// push constant 5002 +@5002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@THAT +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 12 +@12 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END4) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// 0 diff --git a/projects/08/FunctionCalls/NestedCall/Sys.vm b/projects/08/FunctionCalls/NestedCall/Sys.vm new file mode 100644 index 0000000..646b6d3 --- /dev/null +++ b/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/projects/08/FunctionCalls/SimpleFunction.asm b/projects/08/FunctionCalls/SimpleFunction.asm new file mode 100644 index 0000000..5790785 --- /dev/null +++ b/projects/08/FunctionCalls/SimpleFunction.asm @@ -0,0 +1 @@ +// 0 diff --git a/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.asm b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.asm new file mode 100644 index 0000000..65f259d --- /dev/null +++ b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.asm @@ -0,0 +1,195 @@ +// function SimpleFunction.test 2 +(SimpleFunction.test) +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 1 +@1 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// not 0 +@SP +M=M-1 +A=M +D=!M +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// push argument 1 +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// 0 diff --git a/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp new file mode 100644 index 0000000..ef72b7a --- /dev/null +++ b/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/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst new file mode 100644 index 0000000..a0083bb --- /dev/null +++ b/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/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm new file mode 100644 index 0000000..59a76df --- /dev/null +++ b/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/projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst b/projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst new file mode 100644 index 0000000..57336cb --- /dev/null +++ b/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/projects/08/FunctionCalls/StaticsTest/.asm b/projects/08/FunctionCalls/StaticsTest/.asm new file mode 100644 index 0000000..2939585 --- /dev/null +++ b/projects/08/FunctionCalls/StaticsTest/.asm @@ -0,0 +1,531 @@ +// add Class2.set 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@.0 +M=D +// push argument 1 +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@.1 +M=D +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// add Class2.get 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// push static 0 +@.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push static 1 +@.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END4) +@SP +A=M +M=D +@SP +M=M+1 +// 0 +// add Class1.set 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END5) +@SP +A=M +M=D +@SP +M=M+1 +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@.0 +M=D +// push argument 1 +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 1 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@.1 +M=D +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END6) +@SP +A=M +M=D +@SP +M=M+1 +// add Class1.get 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END7) +@SP +A=M +M=D +@SP +M=M+1 +// push static 0 +@.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push static 1 +@.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END8) +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END9) +@SP +A=M +M=D +@SP +M=M+1 +// 0 +// add Sys.init 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END10) +@SP +A=M +M=D +@SP +M=M+1 +// push constant 6 +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 8 +@8 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add Class1.set 2 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END11) +@SP +A=M +M=D +@SP +M=M+1 +// pop temp 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@R5 +M=D +// push constant 23 +@23 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 15 +@15 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add Class2.set 2 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END12) +@SP +A=M +M=D +@SP +M=M+1 +// pop temp 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@R5 +M=D +// add Class1.get 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END13) +@SP +A=M +M=D +@SP +M=M+1 +// add Class2.get 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END14) +@SP +A=M +M=D +@SP +M=M+1 +// label WHILE 0 +(LWHILE) +// goto WHILE 0 +@LWHILE +-1;JMP +// 0 diff --git a/projects/08/FunctionCalls/StaticsTest/Class1.vm b/projects/08/FunctionCalls/StaticsTest/Class1.vm new file mode 100644 index 0000000..c1e87cf --- /dev/null +++ b/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/projects/08/FunctionCalls/StaticsTest/Class2.vm b/projects/08/FunctionCalls/StaticsTest/Class2.vm new file mode 100644 index 0000000..4eca310 --- /dev/null +++ b/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/projects/08/FunctionCalls/StaticsTest/StaticsTest.asm b/projects/08/FunctionCalls/StaticsTest/StaticsTest.asm new file mode 100644 index 0000000..28ac3ee --- /dev/null +++ b/projects/08/FunctionCalls/StaticsTest/StaticsTest.asm @@ -0,0 +1,701 @@ +@256 +D=A +@SP +M=D +// call Sys.init 0 +@$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.init +-1;JMP +($ret.0) +// function Class2.set 0 +(Class2.set) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@Class2.0 +M=D +// push argument 1 +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@Class2.1 +M=D +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// function Class2.get 0 +(Class2.get) +// push static 0 +@Class2.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push static 1 +@Class2.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// 0 +// function Class1.set 0 +(Class1.set) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@Class1.0 +M=D +// push argument 1 +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop static 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@Class1.1 +M=D +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// function Class1.get 0 +(Class1.get) +// push static 0 +@Class1.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push static 1 +@Class1.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// return 0 +@LCL +D=M +@R13 +M=D +@5 +A=D-A +D=M +@R14 +M=D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +D=M +@1 +A=D-A +D=M +@THAT +M=D +@R13 +D=M +@2 +A=D-A +D=M +@THIS +M=D +@R13 +D=M +@3 +A=D-A +D=M +@ARG +M=D +@R13 +D=M +@4 +A=D-A +D=M +@LCL +M=D +@R14 +A=M +0;JMP +// 0 +// function Sys.init 0 +(Sys.init) +// push constant 6 +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 8 +@8 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// call Class1.set 2 +@Sys.init$ret.0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@7 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class1.set +-1;JMP +(Sys.init$ret.0) +// pop temp 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R5 +M=D +// push constant 23 +@23 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// push constant 15 +@15 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// call Class2.set 2 +@Sys.init$ret.1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@7 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class2.set +-1;JMP +(Sys.init$ret.1) +// pop temp 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R5 +M=D +// call Class1.get 0 +@Sys.init$ret.2 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class1.get +-1;JMP +(Sys.init$ret.2) +// call Class2.get 0 +@Sys.init$ret.3 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@LCL +D=M +@SP +A=M +M=D +@SP +M=M+1 +@ARG +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THIS +D=M +@SP +A=M +M=D +@SP +M=M+1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +D=M +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class2.get +-1;JMP +(Sys.init$ret.3) +// label WHILE 0 +(Sys.init$WHILE) +// goto WHILE 0 +@Sys.init$WHILE +-1;JMP +// 0 diff --git a/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp b/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp new file mode 100644 index 0000000..309f058 --- /dev/null +++ b/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp @@ -0,0 +1,2 @@ +| RAM[0] |RAM[261]|RAM[262]| +| 263 | -2 | 8 | diff --git a/projects/08/FunctionCalls/StaticsTest/StaticsTest.tst b/projects/08/FunctionCalls/StaticsTest/StaticsTest.tst new file mode 100644 index 0000000..00d3839 --- /dev/null +++ b/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/projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst b/projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst new file mode 100644 index 0000000..9e4d5d0 --- /dev/null +++ b/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/projects/08/FunctionCalls/StaticsTest/Sys.asm b/projects/08/FunctionCalls/StaticsTest/Sys.asm new file mode 100644 index 0000000..5790785 --- /dev/null +++ b/projects/08/FunctionCalls/StaticsTest/Sys.asm @@ -0,0 +1 @@ +// 0 diff --git a/projects/08/FunctionCalls/StaticsTest/Sys.vm b/projects/08/FunctionCalls/StaticsTest/Sys.vm new file mode 100644 index 0000000..3614282 --- /dev/null +++ b/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/projects/08/ProgramFlow/BasicLoop/.asm b/projects/08/ProgramFlow/BasicLoop/.asm new file mode 100644 index 0000000..e0a0c9c --- /dev/null +++ b/projects/08/ProgramFlow/BasicLoop/.asm @@ -0,0 +1,185 @@ +@SP +M=256 +@Sys.init +0;JMP +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@0 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// label LOOP_START 0 +(LLOOP_START) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// pop local 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@0 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 1 +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// pop argument 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@0 +D=A +@ARG +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// if-goto LOOP_START 0 +@SP +M=M-1 +A=M +D=M +@LLOOP_START +D;JGT +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// 0 diff --git a/projects/08/ProgramFlow/BasicLoop/BasicLoop.asm b/projects/08/ProgramFlow/BasicLoop/BasicLoop.asm new file mode 100644 index 0000000..81dceb0 --- /dev/null +++ b/projects/08/ProgramFlow/BasicLoop/BasicLoop.asm @@ -0,0 +1,181 @@ +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop local 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@0 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// label LOOP_START 0 +($LOOP_START) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// pop local 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@0 +D=A +@LCL +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 1 +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// pop argument 0 +@SP +M=M-1 +A=M +D=M +@R13 +M=D +@0 +D=A +@ARG +D=M+D +@R14 +M=D +@R13 +D=M +@R14 +A=M +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// if-goto LOOP_START 0 +@SP +M=M-1 +A=M +D=M +@$LOOP_START +D;JGT +// push local 0 +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// 0 diff --git a/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp b/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp new file mode 100644 index 0000000..1786c7c --- /dev/null +++ b/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp @@ -0,0 +1,2 @@ +| RAM[0] |RAM[256]| +| 257 | 6 | diff --git a/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst b/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst new file mode 100644 index 0000000..aa76556 --- /dev/null +++ b/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/projects/08/ProgramFlow/BasicLoop/BasicLoop.vm b/projects/08/ProgramFlow/BasicLoop/BasicLoop.vm new file mode 100644 index 0000000..462432e --- /dev/null +++ b/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/projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst b/projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst new file mode 100644 index 0000000..5eb5216 --- /dev/null +++ b/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/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm new file mode 100644 index 0000000..14c8e4c --- /dev/null +++ b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm @@ -0,0 +1,338 @@ +// push argument 1 +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THAT +M=D +// push constant 0 +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop that 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@0 +D=A +@THAT +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push constant 1 +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// pop that 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@1 +D=A +@THAT +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 2 +@2 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END0) +@SP +A=M +M=D +@SP +M=M+1 +// pop argument 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@0 +D=A +@ARG +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// label MAIN_LOOP_START 0 +($MAIN_LOOP_START) +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// if-goto COMPUTE_ELEMENT 0 +@SP +M=M-1 +A=M +D=M +@$COMPUTE_ELEMENT +D;JNE +// goto END_PROGRAM 0 +@$END_PROGRAM +-1;JMP +// label COMPUTE_ELEMENT 0 +($COMPUTE_ELEMENT) +// push that 0 +@0 +D=A +@THAT +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push that 1 +@1 +D=A +@THAT +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END1) +@SP +A=M +M=D +@SP +M=M+1 +// pop that 2 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@2 +D=A +@THAT +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// push pointer 1 +@THAT +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 1 +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// add 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M+D +(END2) +@SP +A=M +M=D +@SP +M=M+1 +// pop pointer 1 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@THAT +M=D +// push argument 0 +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +// push constant 1 +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +// sub 0 +@SP +M=M-1 +A=M +D=M +M=0 +@R13 +M=D +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@R13 +D=M +@R14 +D=M-D +(END3) +@SP +A=M +M=D +@SP +M=M+1 +// pop argument 0 +@SP +M=M-1 +A=M +D=M +@R14 +M=D +@0 +D=A +@ARG +D=M+D +@R15 +M=D +@R14 +D=M +@R15 +A=M +M=D +// goto MAIN_LOOP_START 0 +@$MAIN_LOOP_START +-1;JMP +// label END_PROGRAM 0 +($END_PROGRAM) +// 0 diff --git a/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp new file mode 100644 index 0000000..304e7c1 --- /dev/null +++ b/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/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst new file mode 100644 index 0000000..e4f1a1e --- /dev/null +++ b/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/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm new file mode 100644 index 0000000..41b5773 --- /dev/null +++ b/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/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst new file mode 100644 index 0000000..72458bc --- /dev/null +++ b/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/projects/09/Average/Main.jack b/projects/09/Average/Main.jack new file mode 100644 index 0000000..a359602 --- /dev/null +++ b/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/projects/09/BitmapEditor/BitmapEditor.html b/projects/09/BitmapEditor/BitmapEditor.html new file mode 100644 index 0000000..fdb9e0b --- /dev/null +++ b/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/projects/09/BitmapEditor/BitmapEditor.iml b/projects/09/BitmapEditor/BitmapEditor.iml new file mode 100644 index 0000000..ef582b1 --- /dev/null +++ b/projects/09/BitmapEditor/BitmapEditor.iml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/projects/09/Fraction/Fraction.jack b/projects/09/Fraction/Fraction.jack new file mode 100644 index 0000000..c86f0a5 --- /dev/null +++ b/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/projects/09/Fraction/Main.jack b/projects/09/Fraction/Main.jack new file mode 100644 index 0000000..43ddece --- /dev/null +++ b/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/projects/09/HelloWorld/Main.jack b/projects/09/HelloWorld/Main.jack new file mode 100644 index 0000000..446b21b --- /dev/null +++ b/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/projects/09/Jack OS API.pdf b/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/projects/09/List/List.jack b/projects/09/List/List.jack new file mode 100644 index 0000000..c62fe28 --- /dev/null +++ b/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/projects/09/List/Main.jack b/projects/09/List/Main.jack new file mode 100644 index 0000000..824eb6f --- /dev/null +++ b/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/projects/09/Square/Main.jack b/projects/09/Square/Main.jack new file mode 100644 index 0000000..4a45833 --- /dev/null +++ b/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/projects/09/Square/Square.jack b/projects/09/Square/Square.jack new file mode 100644 index 0000000..38066e5 --- /dev/null +++ b/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/projects/09/Square/SquareGame.jack b/projects/09/Square/SquareGame.jack new file mode 100644 index 0000000..f192ceb --- /dev/null +++ b/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/projects/10/ArrayTest/Main.jack b/projects/10/ArrayTest/Main.jack new file mode 100644 index 0000000..7c4f13e --- /dev/null +++ b/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/projects/10/ArrayTest/Main.xml b/projects/10/ArrayTest/Main.xml new file mode 100644 index 0000000..75b689a --- /dev/null +++ b/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/projects/10/ArrayTest/MainT.xml b/projects/10/ArrayTest/MainT.xml new file mode 100644 index 0000000..ce3c849 --- /dev/null +++ b/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/projects/10/ExpressionLessSquare/Main.jack b/projects/10/ExpressionLessSquare/Main.jack new file mode 100644 index 0000000..99b202f --- /dev/null +++ b/projects/10/ExpressionLessSquare/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/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 test() { // Added to test Jack syntax that is not use in + var int i, j; // the Square files. + var String s; + var Array a; + if (i) { + let s = i; + let s = j; + let a[i] = j; + } + else { // There is no else keyword in the Square files. + let i = i; + let j = j; + let i = i | j; + } + return; + } +} diff --git a/projects/10/ExpressionLessSquare/Main.xml b/projects/10/ExpressionLessSquare/Main.xml new file mode 100644 index 0000000..f679c3c --- /dev/null +++ b/projects/10/ExpressionLessSquare/Main.xml @@ -0,0 +1,205 @@ + + class + Main + { + + static + boolean + test + ; + + + function + void + main + ( + + + ) + + { + + var + SquareGame + game + ; + + + + let + game + = + + + game + + + ; + + + do + game + . + run + ( + + + ) + ; + + + do + game + . + dispose + ( + + + ) + ; + + + return + ; + + + } + + + + function + void + test + ( + + + ) + + { + + var + int + i + , + j + ; + + + var + String + s + ; + + + var + Array + a + ; + + + + if + ( + + + i + + + ) + { + + + let + s + = + + + i + + + ; + + + let + s + = + + + j + + + ; + + + let + a + [ + + + i + + + ] + = + + + j + + + ; + + + } + else + { + + + let + i + = + + + i + + + ; + + + let + j + = + + + j + + + ; + + + let + i + = + + + i + + | + + j + + + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/10/ExpressionLessSquare/MainT.xml b/projects/10/ExpressionLessSquare/MainT.xml new file mode 100644 index 0000000..0873e18 --- /dev/null +++ b/projects/10/ExpressionLessSquare/MainT.xml @@ -0,0 +1,109 @@ + + class + Main + { + static + boolean + test + ; + function + void + main + ( + ) + { + var + SquareGame + game + ; + let + game + = + game + ; + do + game + . + run + ( + ) + ; + do + game + . + dispose + ( + ) + ; + return + ; + } + function + void + test + ( + ) + { + var + int + i + , + j + ; + var + String + s + ; + var + Array + a + ; + if + ( + i + ) + { + let + s + = + i + ; + let + s + = + j + ; + let + a + [ + i + ] + = + j + ; + } + else + { + let + i + = + i + ; + let + j + = + j + ; + let + i + = + i + | + j + ; + } + return + ; + } + } + diff --git a/projects/10/ExpressionLessSquare/Square.jack b/projects/10/ExpressionLessSquare/Square.jack new file mode 100644 index 0000000..33a54ad --- /dev/null +++ b/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/projects/10/ExpressionLessSquare/Square.xml b/projects/10/ExpressionLessSquare/Square.xml new file mode 100644 index 0000000..d98f181 --- /dev/null +++ b/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/projects/10/ExpressionLessSquare/SquareGame.jack b/projects/10/ExpressionLessSquare/SquareGame.jack new file mode 100644 index 0000000..bbc80d5 --- /dev/null +++ b/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/projects/10/ExpressionLessSquare/SquareGame.xml b/projects/10/ExpressionLessSquare/SquareGame.xml new file mode 100644 index 0000000..11e02c7 --- /dev/null +++ b/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/projects/10/ExpressionLessSquare/SquareGameT.xml b/projects/10/ExpressionLessSquare/SquareGameT.xml new file mode 100644 index 0000000..40e0219 --- /dev/null +++ b/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/projects/10/ExpressionLessSquare/SquareT.xml b/projects/10/ExpressionLessSquare/SquareT.xml new file mode 100644 index 0000000..f6a04dc --- /dev/null +++ b/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/projects/10/Square/Main.jack b/projects/10/Square/Main.jack new file mode 100644 index 0000000..60515ac --- /dev/null +++ b/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 test() { // Added to test Jack syntax that is not use 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/projects/10/Square/Main.xml b/projects/10/Square/Main.xml new file mode 100644 index 0000000..dbfcc5f --- /dev/null +++ b/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 + test + ( + + + ) + + { + + 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/projects/10/Square/MainT.xml b/projects/10/Square/MainT.xml new file mode 100644 index 0000000..a7a0ce3 --- /dev/null +++ b/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 + test + ( + ) + { + 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/projects/10/Square/Square.jack b/projects/10/Square/Square.jack new file mode 100644 index 0000000..3faf24f --- /dev/null +++ b/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/projects/10/Square/Square.xml b/projects/10/Square/Square.xml new file mode 100644 index 0000000..169ebf6 --- /dev/null +++ b/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/projects/10/Square/SquareGame.jack b/projects/10/Square/SquareGame.jack new file mode 100644 index 0000000..b14e33c --- /dev/null +++ b/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/projects/10/Square/SquareGame.xml b/projects/10/Square/SquareGame.xml new file mode 100644 index 0000000..e9e57b5 --- /dev/null +++ b/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/projects/10/Square/SquareGameT.xml b/projects/10/Square/SquareGameT.xml new file mode 100644 index 0000000..1140ee6 --- /dev/null +++ b/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/projects/10/Square/SquareT.xml b/projects/10/Square/SquareT.xml new file mode 100644 index 0000000..5170f6f --- /dev/null +++ b/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/projects/11/Arkanoid/Ball.jack b/projects/11/Arkanoid/Ball.jack new file mode 100644 index 0000000..b16dcf1 --- /dev/null +++ b/projects/11/Arkanoid/Ball.jack @@ -0,0 +1,104 @@ +class Ball { + field int x,y, r, hspeed, vspeed; + + constructor Ball new(int lx, int ly, int lr, int lhspeed, int lvspeed) { + let x = lx; + let y = ly; + let r = lr; + + let hspeed = lhspeed; + let vspeed = lvspeed; + + return this; + } + + method void setPos(int lx, int ly) { + do erase(); + + let x = lx; + let y = ly; + + return; + } + + method void setSpeed(int lhspeed, int lvspeed) { + let hspeed = lhspeed; + let vspeed = lvspeed; + + return; + } + + method void draw() { + do Screen.setColor(true); + do Screen.drawCircle(x,y,r); + return; + } + + method void erase() { + do Screen.setColor(false); + do Screen.drawCircle(x,y,r); + return; + } + + method void update() { + var int keyPressed, bLeft, bRight, bTop, bBottom; + + let bLeft = getLeft(); + let bRight = getRight(); + let bTop = getTop(); + let bBottom = getBottom(); + + do erase(); + + // 2 pixel margin on the sides just in case + if (bLeft < 2 & hspeed < 0) { + do invertHspeed(); + } + if (bRight > 508 & hspeed > 0) { + do invertHspeed(); + } + if (bTop < 2 & vspeed < 0) { + do invertVspeed(); + } + if (bBottom > 250 & vspeed > 0) { + do invertVspeed(); + } + + let x = x + hspeed; + let y = y + vspeed; + + do draw(); + + return; + } + + method void invertVspeed() { + let vspeed = -vspeed; + return; + } + + method void invertHspeed() { + let hspeed = -hspeed; + return; + } + + method int getLeft() { + return x - r; + } + + method int getRight() { + return x + r; + } + + method int getTop() { + return y - r; + } + + method int getBottom() { + return y + r; + } + + method int getVspeed() { + return vspeed; + } +} \ No newline at end of file diff --git a/projects/11/Arkanoid/Ball.vm b/projects/11/Arkanoid/Ball.vm new file mode 100644 index 0000000..eca414c --- /dev/null +++ b/projects/11/Arkanoid/Ball.vm @@ -0,0 +1,204 @@ +function Ball.new 0 +push constant 5 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 2 +push argument 3 +pop this 3 +push argument 4 +pop this 4 +push pointer 0 +return +function Ball.setPos 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Ball.erase 1 +pop temp 0 +push argument 1 +pop this 0 +push argument 2 +pop this 1 +push constant 0 +return +function Ball.setSpeed 0 +push argument 0 +pop pointer 0 +push argument 1 +pop this 3 +push argument 2 +pop this 4 +push constant 0 +return +function Ball.draw 0 +push argument 0 +pop pointer 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +call Screen.drawCircle 3 +pop temp 0 +push constant 0 +return +function Ball.erase 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +call Screen.drawCircle 3 +pop temp 0 +push constant 0 +return +function Ball.update 5 +push argument 0 +pop pointer 0 +push pointer 0 +call Ball.getLeft 1 +pop local 1 +push pointer 0 +call Ball.getRight 1 +pop local 2 +push pointer 0 +call Ball.getTop 1 +pop local 3 +push pointer 0 +call Ball.getBottom 1 +pop local 4 +push pointer 0 +call Ball.erase 1 +pop temp 0 +push local 1 +push constant 2 +lt +push this 3 +and +push constant 0 +lt +not +if-goto IF10 +push pointer 0 +call Ball.invertHspeed 1 +pop temp 0 +goto IF11 +label IF10 +label IF11 +push local 2 +push constant 508 +gt +push this 3 +and +push constant 0 +gt +not +if-goto IF20 +push pointer 0 +call Ball.invertHspeed 1 +pop temp 0 +goto IF21 +label IF20 +label IF21 +push local 3 +push constant 2 +lt +push this 4 +and +push constant 0 +lt +not +if-goto IF30 +push pointer 0 +call Ball.invertVspeed 1 +pop temp 0 +goto IF31 +label IF30 +label IF31 +push local 4 +push constant 250 +gt +push this 4 +and +push constant 0 +gt +not +if-goto IF40 +push pointer 0 +call Ball.invertVspeed 1 +pop temp 0 +goto IF41 +label IF40 +label IF41 +push this 0 +push this 3 +add +pop this 0 +push this 1 +push this 4 +add +pop this 1 +push pointer 0 +call Ball.draw 1 +pop temp 0 +push constant 0 +return +function Ball.invertVspeed 0 +push argument 0 +pop pointer 0 +push this 4 +neg +pop this 4 +push constant 0 +return +function Ball.invertHspeed 0 +push argument 0 +pop pointer 0 +push this 3 +neg +pop this 3 +push constant 0 +return +function Ball.getLeft 0 +push argument 0 +pop pointer 0 +push this 0 +push this 2 +sub +return +function Ball.getRight 0 +push argument 0 +pop pointer 0 +push this 0 +push this 2 +add +return +function Ball.getTop 0 +push argument 0 +pop pointer 0 +push this 1 +push this 2 +sub +return +function Ball.getBottom 0 +push argument 0 +pop pointer 0 +push this 1 +push this 2 +add +return +function Ball.getVspeed 0 +push argument 0 +pop pointer 0 +push this 4 +return diff --git a/projects/11/Arkanoid/Ball.xml b/projects/11/Arkanoid/Ball.xml new file mode 100644 index 0000000..b6bc16f --- /dev/null +++ b/projects/11/Arkanoid/Ball.xml @@ -0,0 +1,736 @@ + + class + Ball + { + + field + int + x + , + y + , + r + , + hspeed + , + vspeed + ; + + + Ball + new + ( + + int + lx + , + int + ly + , + int + lr + , + int + lhspeed + , + int + lvspeed + + ) + + { + + + let + x + = + + + lx + + + ; + + + let + y + = + + + ly + + + ; + + + let + r + = + + + lr + + + ; + + + let + hspeed + = + + + lhspeed + + + ; + + + let + vspeed + = + + + lvspeed + + + ; + + + return + + + this + + + ; + + + } + + + + void + setPos + ( + + int + lx + , + int + ly + + ) + + { + + + do + erase + ( + ) + ; + + + let + x + = + + + lx + + + ; + + + let + y + = + + + ly + + + ; + + + return + ; + + + } + + + + void + setSpeed + ( + + int + lhspeed + , + int + lvspeed + + ) + + { + + + let + hspeed + = + + + lhspeed + + + ; + + + let + vspeed + = + + + lvspeed + + + ; + + + return + ; + + + } + + + + void + draw + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawCircle + ( + ) + ; + + + return + ; + + + } + + + + void + erase + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawCircle + ( + ) + ; + + + return + ; + + + } + + + + void + update + ( + + + ) + + { + + var + int + keyPressed + , + bLeft + , + bRight + , + bTop + , + bBottom + ; + + + + let + bLeft + = + + + getLeft + ( + ) + + + ; + + + let + bRight + = + + + getRight + ( + ) + + + ; + + + let + bTop + = + + + getTop + ( + ) + + + ; + + + let + bBottom + = + + + getBottom + ( + ) + + + ; + + + do + erase + ( + ) + ; + + + if + ( + + + bLeft + + < + + 2 + + & + + hspeed + + < + + 0 + + + ) + { + + + do + invertHspeed + ( + ) + ; + + + } + + + if + ( + + + bRight + + > + + 508 + + & + + hspeed + + > + + 0 + + + ) + { + + + do + invertHspeed + ( + ) + ; + + + } + + + if + ( + + + bTop + + < + + 2 + + & + + vspeed + + < + + 0 + + + ) + { + + + do + invertVspeed + ( + ) + ; + + + } + + + if + ( + + + bBottom + + > + + 250 + + & + + vspeed + + > + + 0 + + + ) + { + + + do + invertVspeed + ( + ) + ; + + + } + + + let + x + = + + + x + + + + + hspeed + + + ; + + + let + y + = + + + y + + + + + vspeed + + + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + invertVspeed + ( + + + ) + + { + + + let + vspeed + = + + + - + + vspeed + + + + ; + + + return + ; + + + } + + + + void + invertHspeed + ( + + + ) + + { + + + let + hspeed + = + + + - + + hspeed + + + + ; + + + return + ; + + + } + + + + int + getLeft + ( + + + ) + + { + + + return + + + x + + - + + r + + + ; + + + } + + + + int + getRight + ( + + + ) + + { + + + return + + + x + + + + + r + + + ; + + + } + + + + int + getTop + ( + + + ) + + { + + + return + + + y + + - + + r + + + ; + + + } + + + + int + getBottom + ( + + + ) + + { + + + return + + + y + + + + + r + + + ; + + + } + + + + int + getVspeed + ( + + + ) + + { + + + return + + + vspeed + + + ; + + + } + + + } + diff --git a/projects/11/Arkanoid/BallT.xml b/projects/11/Arkanoid/BallT.xml new file mode 100644 index 0000000..8b91f95 --- /dev/null +++ b/projects/11/Arkanoid/BallT.xml @@ -0,0 +1,407 @@ + + class + Ball + { + field + int + x + , + y + , + r + , + hspeed + , + vspeed + ; + constructor + Ball + new + ( + int + lx + , + int + ly + , + int + lr + , + int + lhspeed + , + int + lvspeed + ) + { + let + x + = + lx + ; + let + y + = + ly + ; + let + r + = + lr + ; + let + hspeed + = + lhspeed + ; + let + vspeed + = + lvspeed + ; + return + this + ; + } + method + void + setPos + ( + int + lx + , + int + ly + ) + { + do + erase + ( + ) + ; + let + x + = + lx + ; + let + y + = + ly + ; + return + ; + } + method + void + setSpeed + ( + int + lhspeed + , + int + lvspeed + ) + { + let + hspeed + = + lhspeed + ; + let + vspeed + = + lvspeed + ; + return + ; + } + method + void + draw + ( + ) + { + do + Screen + . + setColor + ( + true + ) + ; + do + Screen + . + drawCircle + ( + x + , + y + , + r + ) + ; + return + ; + } + method + void + erase + ( + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + Screen + . + drawCircle + ( + x + , + y + , + r + ) + ; + return + ; + } + method + void + update + ( + ) + { + var + int + keyPressed + , + bLeft + , + bRight + , + bTop + , + bBottom + ; + let + bLeft + = + getLeft + ( + ) + ; + let + bRight + = + getRight + ( + ) + ; + let + bTop + = + getTop + ( + ) + ; + let + bBottom + = + getBottom + ( + ) + ; + do + erase + ( + ) + ; + if + ( + bLeft + < + 2 + & + hspeed + < + 0 + ) + { + do + invertHspeed + ( + ) + ; + } + if + ( + bRight + > + 508 + & + hspeed + > + 0 + ) + { + do + invertHspeed + ( + ) + ; + } + if + ( + bTop + < + 2 + & + vspeed + < + 0 + ) + { + do + invertVspeed + ( + ) + ; + } + if + ( + bBottom + > + 250 + & + vspeed + > + 0 + ) + { + do + invertVspeed + ( + ) + ; + } + let + x + = + x + + + hspeed + ; + let + y + = + y + + + vspeed + ; + do + draw + ( + ) + ; + return + ; + } + method + void + invertVspeed + ( + ) + { + let + vspeed + = + - + vspeed + ; + return + ; + } + method + void + invertHspeed + ( + ) + { + let + hspeed + = + - + hspeed + ; + return + ; + } + method + int + getLeft + ( + ) + { + return + x + - + r + ; + } + method + int + getRight + ( + ) + { + return + x + + + r + ; + } + method + int + getTop + ( + ) + { + return + y + - + r + ; + } + method + int + getBottom + ( + ) + { + return + y + + + r + ; + } + method + int + getVspeed + ( + ) + { + return + vspeed + ; + } + } + diff --git a/projects/11/Arkanoid/Game.jack b/projects/11/Arkanoid/Game.jack new file mode 100644 index 0000000..812fe59 --- /dev/null +++ b/projects/11/Arkanoid/Game.jack @@ -0,0 +1,224 @@ +class Game { + field int hbricks, vbricks; + field int gameOver; + + field Rect paddle; + field Ball ball; + field Array bricks; + + constructor Game new() { + var int i, j; + var Rect curBrick; + + let gameOver = 0; + let hbricks = 8; + let vbricks = 3; + + let paddle = Rect.new(250,220,50,10); + let ball = Ball.new(250, 200, 6, 1, 1); + let bricks = Array.new(hbricks * vbricks); + + while (i < hbricks) { + while (j < vbricks) { + let bricks[i * 3 + j] = Rect.new(i * 60 + 20, j * 30 + 20, 50, 15); + let curBrick = bricks[i * 3 + j]; + do curBrick.draw(); + let j = j + 1; + } + let j = 0; + let i = i + 1; + } + + return this; + } + + method void loop() { + var int keyPressed; + + while(true) { + // Approximately 60 updates per second + do Sys.wait(16); + + if (gameOver = 0) { + do movePaddle(); + do ball.update(); + do chackBallPaddleCol(); + do checkBallBricksCol(); + + do checkGameOver(); + } else { + let keyPressed = Keyboard.keyPressed(); + if (keyPressed = 82) { + do resetGame(); + } + } + + } + return; + } + + method void resetGame() { + var int i, end; + var Rect brick; + + do Screen.clearScreen(); + + do paddle.setPos(250, 220); + do ball.setPos(250, 200); + do ball.setSpeed(1, 1); + + let end = hbricks * vbricks; + while (i < end) { + let brick = bricks[i]; + + do brick.setHidden(0); + do brick.draw(); + + let i = i + 1; + } + + let gameOver = 0; + + return; + } + + method void checkGameOver() { + var int bBottom; + + let bBottom = ball.getBottom(); + + if (bBottom > 240) { + let gameOver = 1; + + do Output.moveCursor(0,0); + do Output.println(); + do Output.printString("game over"); + do Output.println(); + do Output.printString("press r to restart"); + } + + return; + } + + method void movePaddle() { + var int keyPressed, paddleLeft, paddleRight; + + let keyPressed = Keyboard.keyPressed(); + let paddleLeft = paddle.getLeft(); + let paddleRight = paddle.getRight(); + // Move left + if((keyPressed = 130) & (paddleLeft > 0)) { + do paddle.moveLeft(2); + } + // Move right + if((keyPressed = 132) & (paddleRight < 510)) { + do paddle.moveRight(2); + } + do paddle.draw(); + + return; + } + + method void chackBallPaddleCol() { + var int paddleLeft, paddleRight, paddleTop, paddleBottom, paddleMiddle; + var int bLeft, bRight, bTop, bBottom, bMiddle, bVspeed; + + let paddleLeft = paddle.getLeft(); + let paddleRight = paddle.getRight(); + let paddleTop = paddle.getTop(); + let paddleBottom = paddle.getBottom(); + let paddleMiddle = (paddleRight + paddleLeft) / 2; + + let bLeft = ball.getLeft(); + let bRight = ball.getRight(); + let bTop = ball.getTop(); + let bBottom = ball.getBottom(); + let bMiddle = (bRight + bLeft) / 2; + let bVspeed = ball.getVspeed(); + + if((bLeft > paddleLeft) & (bRight < paddleRight)) { + if((bBottom > paddleTop) & (bVspeed > 0)) { + if (bMiddle > paddleMiddle) { + do ball.setSpeed(1, -1); + } else { + do ball.setSpeed(-1, -1); + } + } + } + + return; + } + + method void checkBallBricksCol() { + var int brLeft, brRight, brTop, brBottom, brHidden; + var int bLeft, bRight, bTop, bBottom, bVspeed; + var int overlapLeft, overlapRight, overlapTop, overlapBottom, fromLeft, fromTop; + var int minOverlapX, minOverlapY; + var int i, end; + var Rect brick; + + let bLeft = ball.getLeft(); + let bRight = ball.getRight(); + let bTop = ball.getTop(); + let bBottom = ball.getBottom(); + let bVspeed = ball.getVspeed(); + + let end = hbricks * vbricks; + while (i < end) { + let brick = bricks[i]; + + let brLeft = brick.getLeft(); + let brRight = brick.getRight(); + let brTop = brick.getTop(); + let brBottom = brick.getBottom(); + let brHidden = brick.getHidden(); + + if(brHidden < 1) { + do brick.draw(); + + // Check if there's intersection at all first + if((bLeft > brLeft) & (bRight < brRight)) { + if((bBottom > brTop) & (bTop < brBottom)) { + do brick.setHidden(1); + do brick.draw(); + + // Now calculate the collision side + // Algorithm basically copied from this video + // https://youtu.be/_4K3tsKa1Uc?t=1820 + + let overlapLeft = bRight - brLeft; + let overlapRight = brRight - bLeft; + let overlapTop = bBottom - brTop; + let overlapBottom = brBottom - bTop; + + if(Util.abs(overlapLeft) < Util.abs(overlapRight)) { + let fromLeft = 1; + let minOverlapX = overlapLeft; + } else { + let minOverlapX = overlapRight; + } + + if(Util.abs(overlapTop) < Util.abs(overlapBottom)) { + let fromTop = 1; + let minOverlapY = overlapTop; + } else { + let minOverlapY = overlapBottom; + } + + if(Util.abs(minOverlapX) < Util.abs(minOverlapY)) { + do ball.invertHspeed(); + } else { + do ball.invertVspeed(); + } + + } + } + } + + let i = i + 1; + } + + return; + } + +} \ No newline at end of file diff --git a/projects/11/Arkanoid/Game.vm b/projects/11/Arkanoid/Game.vm new file mode 100644 index 0000000..f85e93a --- /dev/null +++ b/projects/11/Arkanoid/Game.vm @@ -0,0 +1,585 @@ +function Game.new 3 +push constant 6 +call Memory.alloc 1 +pop pointer 0 +push constant 0 +pop this 2 +push constant 8 +pop this 0 +push constant 3 +pop this 1 +push constant 250 +push constant 220 +push constant 50 +push constant 10 +call Rect.new 4 +pop this 3 +push constant 250 +push constant 200 +push constant 6 +push constant 1 +push constant 1 +call Ball.new 5 +pop this 4 +push this 0 +push this 1 +call Math.multiply 2 +call Array.new 1 +pop this 5 +label WHILE10 +push local 0 +push this 0 +lt +not +if-goto WHILE11 +label WHILE20 +push local 1 +push this 1 +lt +not +if-goto WHILE21 +push this 5 +push local 0 +push constant 3 +call Math.multiply 2 +push local 1 +add +add +push local 0 +push constant 60 +call Math.multiply 2 +push constant 20 +add +push local 1 +push constant 30 +call Math.multiply 2 +push constant 20 +add +push constant 50 +push constant 15 +call Rect.new 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 5 +push local 0 +push constant 3 +call Math.multiply 2 +push local 1 +add +add +pop pointer 1 +push that 0 +pop local 2 +push local 2 +call Rect.draw 1 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE20 +label WHILE21 +push constant 0 +pop local 1 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE10 +label WHILE11 +push pointer 0 +return +function Game.loop 1 +push argument 0 +pop pointer 0 +label WHILE30 +push constant 0 +not +not +if-goto WHILE31 +push constant 16 +call Sys.wait 1 +pop temp 0 +push this 2 +push constant 0 +eq +not +if-goto IF40 +push pointer 0 +call Game.movePaddle 1 +pop temp 0 +push this 4 +call Ball.update 1 +pop temp 0 +push pointer 0 +call Game.chackBallPaddleCol 1 +pop temp 0 +push pointer 0 +call Game.checkBallBricksCol 1 +pop temp 0 +push pointer 0 +call Game.checkGameOver 1 +pop temp 0 +goto IF41 +label IF40 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 82 +eq +not +if-goto IF50 +push pointer 0 +call Game.resetGame 1 +pop temp 0 +goto IF51 +label IF50 +label IF51 +label IF41 +goto WHILE30 +label WHILE31 +push constant 0 +return +function Game.resetGame 3 +push argument 0 +pop pointer 0 +call Screen.clearScreen 0 +pop temp 0 +push this 3 +push constant 250 +push constant 220 +call Rect.setPos 3 +pop temp 0 +push this 4 +push constant 250 +push constant 200 +call Ball.setPos 3 +pop temp 0 +push this 4 +push constant 1 +push constant 1 +call Ball.setSpeed 3 +pop temp 0 +push this 0 +push this 1 +call Math.multiply 2 +pop local 1 +label WHILE60 +push local 0 +push local 1 +lt +not +if-goto WHILE61 +push this 5 +push local 0 +add +pop pointer 1 +push that 0 +pop local 2 +push local 2 +push constant 0 +call Rect.setHidden 2 +pop temp 0 +push local 2 +call Rect.draw 1 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE60 +label WHILE61 +push constant 0 +pop this 2 +push constant 0 +return +function Game.checkGameOver 1 +push argument 0 +pop pointer 0 +push this 4 +call Ball.getBottom 1 +pop local 0 +push local 0 +push constant 240 +gt +not +if-goto IF70 +push constant 1 +pop this 2 +push constant 0 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 9 +call String.new 1 +push constant 103 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 118 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 18 +call String.new 1 +push constant 112 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +goto IF71 +label IF70 +label IF71 +push constant 0 +return +function Game.movePaddle 3 +push argument 0 +pop pointer 0 +call Keyboard.keyPressed 0 +pop local 0 +push this 3 +call Rect.getLeft 1 +pop local 1 +push this 3 +call Rect.getRight 1 +pop local 2 +push local 0 +push constant 130 +eq +push local 1 +push constant 0 +gt +and +not +if-goto IF80 +push this 3 +push constant 2 +call Rect.moveLeft 2 +pop temp 0 +goto IF81 +label IF80 +label IF81 +push local 0 +push constant 132 +eq +push local 2 +push constant 510 +lt +and +not +if-goto IF90 +push this 3 +push constant 2 +call Rect.moveRight 2 +pop temp 0 +goto IF91 +label IF90 +label IF91 +push this 3 +call Rect.draw 1 +pop temp 0 +push constant 0 +return +function Game.chackBallPaddleCol 11 +push argument 0 +pop pointer 0 +push this 3 +call Rect.getLeft 1 +pop local 0 +push this 3 +call Rect.getRight 1 +pop local 1 +push this 3 +call Rect.getTop 1 +pop local 2 +push this 3 +call Rect.getBottom 1 +pop local 3 +push local 1 +push local 0 +add +push constant 2 +call Math.divide 2 +pop local 4 +push this 4 +call Ball.getLeft 1 +pop local 5 +push this 4 +call Ball.getRight 1 +pop local 6 +push this 4 +call Ball.getTop 1 +pop local 7 +push this 4 +call Ball.getBottom 1 +pop local 8 +push local 6 +push local 5 +add +push constant 2 +call Math.divide 2 +pop local 9 +push this 4 +call Ball.getVspeed 1 +pop local 10 +push local 5 +push local 0 +gt +push local 6 +push local 1 +lt +and +not +if-goto IF100 +push local 8 +push local 2 +gt +push local 10 +push constant 0 +gt +and +not +if-goto IF110 +push local 9 +push local 4 +gt +not +if-goto IF120 +push this 4 +push constant 1 +push constant 1 +neg +call Ball.setSpeed 3 +pop temp 0 +goto IF121 +label IF120 +push this 4 +push constant 1 +neg +push constant 1 +neg +call Ball.setSpeed 3 +pop temp 0 +label IF121 +goto IF111 +label IF110 +label IF111 +goto IF101 +label IF100 +label IF101 +push constant 0 +return +function Game.checkBallBricksCol 21 +push argument 0 +pop pointer 0 +push this 4 +call Ball.getLeft 1 +pop local 5 +push this 4 +call Ball.getRight 1 +pop local 6 +push this 4 +call Ball.getTop 1 +pop local 7 +push this 4 +call Ball.getBottom 1 +pop local 8 +push this 4 +call Ball.getVspeed 1 +pop local 9 +push this 0 +push this 1 +call Math.multiply 2 +pop local 19 +label WHILE130 +push local 18 +push local 19 +lt +not +if-goto WHILE131 +push this 5 +push local 18 +add +pop pointer 1 +push that 0 +pop local 20 +push local 20 +call Rect.getLeft 1 +pop local 0 +push local 20 +call Rect.getRight 1 +pop local 1 +push local 20 +call Rect.getTop 1 +pop local 2 +push local 20 +call Rect.getBottom 1 +pop local 3 +push local 20 +call Rect.getHidden 1 +pop local 4 +push local 4 +push constant 1 +lt +not +if-goto IF140 +push local 20 +call Rect.draw 1 +pop temp 0 +push local 5 +push local 0 +gt +push local 6 +push local 1 +lt +and +not +if-goto IF150 +push local 8 +push local 2 +gt +push local 7 +push local 3 +lt +and +not +if-goto IF160 +push local 20 +push constant 1 +call Rect.setHidden 2 +pop temp 0 +push local 20 +call Rect.draw 1 +pop temp 0 +push local 6 +push local 0 +sub +pop local 10 +push local 1 +push local 5 +sub +pop local 11 +push local 8 +push local 2 +sub +pop local 12 +push local 3 +push local 7 +sub +pop local 13 +push local 10 +call Util.abs 1 +push local 11 +call Util.abs 1 +lt +not +if-goto IF170 +push constant 1 +pop local 14 +push local 10 +pop local 16 +goto IF171 +label IF170 +push local 11 +pop local 16 +label IF171 +push local 12 +call Util.abs 1 +push local 13 +call Util.abs 1 +lt +not +if-goto IF180 +push constant 1 +pop local 15 +push local 12 +pop local 17 +goto IF181 +label IF180 +push local 13 +pop local 17 +label IF181 +push local 16 +call Util.abs 1 +push local 17 +call Util.abs 1 +lt +not +if-goto IF190 +push this 4 +call Ball.invertHspeed 1 +pop temp 0 +goto IF191 +label IF190 +push this 4 +call Ball.invertVspeed 1 +pop temp 0 +label IF191 +goto IF161 +label IF160 +label IF161 +goto IF151 +label IF150 +label IF151 +goto IF141 +label IF140 +label IF141 +push local 18 +push constant 1 +add +pop local 18 +goto WHILE130 +label WHILE131 +push constant 0 +return diff --git a/projects/11/Arkanoid/Game.xml b/projects/11/Arkanoid/Game.xml new file mode 100644 index 0000000..efe2172 --- /dev/null +++ b/projects/11/Arkanoid/Game.xml @@ -0,0 +1,1899 @@ + + class + Game + { + + field + int + hbricks + , + vbricks + ; + + + field + int + gameOver + ; + + + field + Rect + paddle + ; + + + field + Ball + ball + ; + + + field + Array + bricks + ; + + + Game + new + ( + + + ) + + { + + var + int + i + , + j + ; + + + var + Rect + curBrick + ; + + + + let + gameOver + = + + + 0 + + + ; + + + let + hbricks + = + + + 8 + + + ; + + + let + vbricks + = + + + 3 + + + ; + + + let + paddle + = + + + Rect + . + new + ( + ) + + + ; + + + let + ball + = + + + Ball + . + new + ( + ) + + + ; + + + let + bricks + = + + + Array + . + new + ( + ) + + + ; + + + while + ( + + + i + + < + + hbricks + + + ) + { + + + while + ( + + + j + + < + + vbricks + + + ) + { + + + let + bricks + [ + + + i + + * + + 3 + + + + + j + + + ] + = + + + Rect + . + new + ( + ) + + + ; + + + let + curBrick + = + + + [ + + + i + + * + + 3 + + + + + j + + + ] + + + ; + + + do + curBrick + . + draw + ( + ) + ; + + + let + j + = + + + j + + + + + 1 + + + ; + + + } + + + let + j + = + + + 0 + + + ; + + + let + i + = + + + i + + + + + 1 + + + ; + + + } + + + return + + + this + + + ; + + + } + + + + void + loop + ( + + + ) + + { + + var + int + keyPressed + ; + + + + while + ( + + + true + + + ) + { + + + do + Sys + . + wait + ( + ) + ; + + + if + ( + + + gameOver + + = + + 0 + + + ) + { + + + do + movePaddle + ( + ) + ; + + + do + ball + . + update + ( + ) + ; + + + do + chackBallPaddleCol + ( + ) + ; + + + do + checkBallBricksCol + ( + ) + ; + + + do + checkGameOver + ( + ) + ; + + + } + else + { + + + let + keyPressed + = + + + Keyboard + . + keyPressed + ( + ) + + + ; + + + if + ( + + + keyPressed + + = + + 82 + + + ) + { + + + do + resetGame + ( + ) + ; + + + } + + + } + + + } + + + return + ; + + + } + + + + void + resetGame + ( + + + ) + + { + + var + int + i + , + end + ; + + + var + Rect + brick + ; + + + + do + Screen + . + clearScreen + ( + ) + ; + + + do + paddle + . + setPos + ( + ) + ; + + + do + ball + . + setPos + ( + ) + ; + + + do + ball + . + setSpeed + ( + ) + ; + + + let + end + = + + + hbricks + + * + + vbricks + + + ; + + + while + ( + + + i + + < + + end + + + ) + { + + + let + brick + = + + + [ + + + i + + + ] + + + ; + + + do + brick + . + setHidden + ( + ) + ; + + + do + brick + . + draw + ( + ) + ; + + + let + i + = + + + i + + + + + 1 + + + ; + + + } + + + let + gameOver + = + + + 0 + + + ; + + + return + ; + + + } + + + + void + checkGameOver + ( + + + ) + + { + + var + int + bBottom + ; + + + + let + bBottom + = + + + ball + . + getBottom + ( + ) + + + ; + + + if + ( + + + bBottom + + > + + 240 + + + ) + { + + + let + gameOver + = + + + 1 + + + ; + + + do + Output + . + moveCursor + ( + ) + ; + + + do + Output + . + println + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + do + Output + . + println + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + } + + + return + ; + + + } + + + + void + movePaddle + ( + + + ) + + { + + var + int + keyPressed + , + paddleLeft + , + paddleRight + ; + + + + let + keyPressed + = + + + Keyboard + . + keyPressed + ( + ) + + + ; + + + let + paddleLeft + = + + + paddle + . + getLeft + ( + ) + + + ; + + + let + paddleRight + = + + + paddle + . + getRight + ( + ) + + + ; + + + if + ( + + + ( + + + keyPressed + + = + + 130 + + + ) + + & + + ( + + + paddleLeft + + > + + 0 + + + ) + + + ) + { + + + do + paddle + . + moveLeft + ( + ) + ; + + + } + + + if + ( + + + ( + + + keyPressed + + = + + 132 + + + ) + + & + + ( + + + paddleRight + + < + + 510 + + + ) + + + ) + { + + + do + paddle + . + moveRight + ( + ) + ; + + + } + + + do + paddle + . + draw + ( + ) + ; + + + return + ; + + + } + + + + void + chackBallPaddleCol + ( + + + ) + + { + + var + int + paddleLeft + , + paddleRight + , + paddleTop + , + paddleBottom + , + paddleMiddle + ; + + + var + int + bLeft + , + bRight + , + bTop + , + bBottom + , + bMiddle + , + bVspeed + ; + + + + let + paddleLeft + = + + + paddle + . + getLeft + ( + ) + + + ; + + + let + paddleRight + = + + + paddle + . + getRight + ( + ) + + + ; + + + let + paddleTop + = + + + paddle + . + getTop + ( + ) + + + ; + + + let + paddleBottom + = + + + paddle + . + getBottom + ( + ) + + + ; + + + let + paddleMiddle + = + + + ( + + + paddleRight + + + + + paddleLeft + + + ) + + / + + 2 + + + ; + + + let + bLeft + = + + + ball + . + getLeft + ( + ) + + + ; + + + let + bRight + = + + + ball + . + getRight + ( + ) + + + ; + + + let + bTop + = + + + ball + . + getTop + ( + ) + + + ; + + + let + bBottom + = + + + ball + . + getBottom + ( + ) + + + ; + + + let + bMiddle + = + + + ( + + + bRight + + + + + bLeft + + + ) + + / + + 2 + + + ; + + + let + bVspeed + = + + + ball + . + getVspeed + ( + ) + + + ; + + + if + ( + + + ( + + + bLeft + + > + + paddleLeft + + + ) + + & + + ( + + + bRight + + < + + paddleRight + + + ) + + + ) + { + + + if + ( + + + ( + + + bBottom + + > + + paddleTop + + + ) + + & + + ( + + + bVspeed + + > + + 0 + + + ) + + + ) + { + + + if + ( + + + bMiddle + + > + + paddleMiddle + + + ) + { + + + do + ball + . + setSpeed + ( + ) + ; + + + } + else + { + + + do + ball + . + setSpeed + ( + ) + ; + + + } + + + } + + + } + + + return + ; + + + } + + + + void + checkBallBricksCol + ( + + + ) + + { + + var + int + brLeft + , + brRight + , + brTop + , + brBottom + , + brHidden + ; + + + var + int + bLeft + , + bRight + , + bTop + , + bBottom + , + bVspeed + ; + + + var + int + overlapLeft + , + overlapRight + , + overlapTop + , + overlapBottom + , + fromLeft + , + fromTop + ; + + + var + int + minOverlapX + , + minOverlapY + ; + + + var + int + i + , + end + ; + + + var + Rect + brick + ; + + + + let + bLeft + = + + + ball + . + getLeft + ( + ) + + + ; + + + let + bRight + = + + + ball + . + getRight + ( + ) + + + ; + + + let + bTop + = + + + ball + . + getTop + ( + ) + + + ; + + + let + bBottom + = + + + ball + . + getBottom + ( + ) + + + ; + + + let + bVspeed + = + + + ball + . + getVspeed + ( + ) + + + ; + + + let + end + = + + + hbricks + + * + + vbricks + + + ; + + + while + ( + + + i + + < + + end + + + ) + { + + + let + brick + = + + + [ + + + i + + + ] + + + ; + + + let + brLeft + = + + + brick + . + getLeft + ( + ) + + + ; + + + let + brRight + = + + + brick + . + getRight + ( + ) + + + ; + + + let + brTop + = + + + brick + . + getTop + ( + ) + + + ; + + + let + brBottom + = + + + brick + . + getBottom + ( + ) + + + ; + + + let + brHidden + = + + + brick + . + getHidden + ( + ) + + + ; + + + if + ( + + + brHidden + + < + + 1 + + + ) + { + + + do + brick + . + draw + ( + ) + ; + + + if + ( + + + ( + + + bLeft + + > + + brLeft + + + ) + + & + + ( + + + bRight + + < + + brRight + + + ) + + + ) + { + + + if + ( + + + ( + + + bBottom + + > + + brTop + + + ) + + & + + ( + + + bTop + + < + + brBottom + + + ) + + + ) + { + + + do + brick + . + setHidden + ( + ) + ; + + + do + brick + . + draw + ( + ) + ; + + + let + overlapLeft + = + + + bRight + + - + + brLeft + + + ; + + + let + overlapRight + = + + + brRight + + - + + bLeft + + + ; + + + let + overlapTop + = + + + bBottom + + - + + brTop + + + ; + + + let + overlapBottom + = + + + brBottom + + - + + bTop + + + ; + + + if + ( + + + Util + . + abs + ( + ) + + < + + Util + . + abs + ( + ) + + + ) + { + + + let + fromLeft + = + + + 1 + + + ; + + + let + minOverlapX + = + + + overlapLeft + + + ; + + + } + else + { + + + let + minOverlapX + = + + + overlapRight + + + ; + + + } + + + if + ( + + + Util + . + abs + ( + ) + + < + + Util + . + abs + ( + ) + + + ) + { + + + let + fromTop + = + + + 1 + + + ; + + + let + minOverlapY + = + + + overlapTop + + + ; + + + } + else + { + + + let + minOverlapY + = + + + overlapBottom + + + ; + + + } + + + if + ( + + + Util + . + abs + ( + ) + + < + + Util + . + abs + ( + ) + + + ) + { + + + do + ball + . + invertHspeed + ( + ) + ; + + + } + else + { + + + do + ball + . + invertVspeed + ( + ) + ; + + + } + + + } + + + } + + + } + + + let + i + = + + + i + + + + + 1 + + + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/11/Arkanoid/GameT.xml b/projects/11/Arkanoid/GameT.xml new file mode 100644 index 0000000..5da88d6 --- /dev/null +++ b/projects/11/Arkanoid/GameT.xml @@ -0,0 +1,1145 @@ + + class + Game + { + field + int + hbricks + , + vbricks + ; + field + int + gameOver + ; + field + Rect + paddle + ; + field + Ball + ball + ; + field + Array + bricks + ; + constructor + Game + new + ( + ) + { + var + int + i + , + j + ; + var + Rect + curBrick + ; + let + gameOver + = + 0 + ; + let + hbricks + = + 8 + ; + let + vbricks + = + 3 + ; + let + paddle + = + Rect + . + new + ( + 250 + , + 220 + , + 50 + , + 10 + ) + ; + let + ball + = + Ball + . + new + ( + 250 + , + 200 + , + 6 + , + 1 + , + 1 + ) + ; + let + bricks + = + Array + . + new + ( + hbricks + * + vbricks + ) + ; + while + ( + i + < + hbricks + ) + { + while + ( + j + < + vbricks + ) + { + let + bricks + [ + i + * + 3 + + + j + ] + = + Rect + . + new + ( + i + * + 60 + + + 20 + , + j + * + 30 + + + 20 + , + 50 + , + 15 + ) + ; + let + curBrick + = + bricks + [ + i + * + 3 + + + j + ] + ; + do + curBrick + . + draw + ( + ) + ; + let + j + = + j + + + 1 + ; + } + let + j + = + 0 + ; + let + i + = + i + + + 1 + ; + } + return + this + ; + } + method + void + loop + ( + ) + { + var + int + keyPressed + ; + while + ( + true + ) + { + do + Sys + . + wait + ( + 16 + ) + ; + if + ( + gameOver + = + 0 + ) + { + do + movePaddle + ( + ) + ; + do + ball + . + update + ( + ) + ; + do + chackBallPaddleCol + ( + ) + ; + do + checkBallBricksCol + ( + ) + ; + do + checkGameOver + ( + ) + ; + } + else + { + let + keyPressed + = + Keyboard + . + keyPressed + ( + ) + ; + if + ( + keyPressed + = + 82 + ) + { + do + resetGame + ( + ) + ; + } + } + } + return + ; + } + method + void + resetGame + ( + ) + { + var + int + i + , + end + ; + var + Rect + brick + ; + do + Screen + . + clearScreen + ( + ) + ; + do + paddle + . + setPos + ( + 250 + , + 220 + ) + ; + do + ball + . + setPos + ( + 250 + , + 200 + ) + ; + do + ball + . + setSpeed + ( + 1 + , + 1 + ) + ; + let + end + = + hbricks + * + vbricks + ; + while + ( + i + < + end + ) + { + let + brick + = + bricks + [ + i + ] + ; + do + brick + . + setHidden + ( + 0 + ) + ; + do + brick + . + draw + ( + ) + ; + let + i + = + i + + + 1 + ; + } + let + gameOver + = + 0 + ; + return + ; + } + method + void + checkGameOver + ( + ) + { + var + int + bBottom + ; + let + bBottom + = + ball + . + getBottom + ( + ) + ; + if + ( + bBottom + > + 240 + ) + { + let + gameOver + = + 1 + ; + do + Output + . + moveCursor + ( + 0 + , + 0 + ) + ; + do + Output + . + println + ( + ) + ; + do + Output + . + printString + ( + game over + ) + ; + do + Output + . + println + ( + ) + ; + do + Output + . + printString + ( + press r to restart + ) + ; + } + return + ; + } + method + void + movePaddle + ( + ) + { + var + int + keyPressed + , + paddleLeft + , + paddleRight + ; + let + keyPressed + = + Keyboard + . + keyPressed + ( + ) + ; + let + paddleLeft + = + paddle + . + getLeft + ( + ) + ; + let + paddleRight + = + paddle + . + getRight + ( + ) + ; + if + ( + ( + keyPressed + = + 130 + ) + & + ( + paddleLeft + > + 0 + ) + ) + { + do + paddle + . + moveLeft + ( + 2 + ) + ; + } + if + ( + ( + keyPressed + = + 132 + ) + & + ( + paddleRight + < + 510 + ) + ) + { + do + paddle + . + moveRight + ( + 2 + ) + ; + } + do + paddle + . + draw + ( + ) + ; + return + ; + } + method + void + chackBallPaddleCol + ( + ) + { + var + int + paddleLeft + , + paddleRight + , + paddleTop + , + paddleBottom + , + paddleMiddle + ; + var + int + bLeft + , + bRight + , + bTop + , + bBottom + , + bMiddle + , + bVspeed + ; + let + paddleLeft + = + paddle + . + getLeft + ( + ) + ; + let + paddleRight + = + paddle + . + getRight + ( + ) + ; + let + paddleTop + = + paddle + . + getTop + ( + ) + ; + let + paddleBottom + = + paddle + . + getBottom + ( + ) + ; + let + paddleMiddle + = + ( + paddleRight + + + paddleLeft + ) + / + 2 + ; + let + bLeft + = + ball + . + getLeft + ( + ) + ; + let + bRight + = + ball + . + getRight + ( + ) + ; + let + bTop + = + ball + . + getTop + ( + ) + ; + let + bBottom + = + ball + . + getBottom + ( + ) + ; + let + bMiddle + = + ( + bRight + + + bLeft + ) + / + 2 + ; + let + bVspeed + = + ball + . + getVspeed + ( + ) + ; + if + ( + ( + bLeft + > + paddleLeft + ) + & + ( + bRight + < + paddleRight + ) + ) + { + if + ( + ( + bBottom + > + paddleTop + ) + & + ( + bVspeed + > + 0 + ) + ) + { + if + ( + bMiddle + > + paddleMiddle + ) + { + do + ball + . + setSpeed + ( + 1 + , + - + 1 + ) + ; + } + else + { + do + ball + . + setSpeed + ( + - + 1 + , + - + 1 + ) + ; + } + } + } + return + ; + } + method + void + checkBallBricksCol + ( + ) + { + var + int + brLeft + , + brRight + , + brTop + , + brBottom + , + brHidden + ; + var + int + bLeft + , + bRight + , + bTop + , + bBottom + , + bVspeed + ; + var + int + overlapLeft + , + overlapRight + , + overlapTop + , + overlapBottom + , + fromLeft + , + fromTop + ; + var + int + minOverlapX + , + minOverlapY + ; + var + int + i + , + end + ; + var + Rect + brick + ; + let + bLeft + = + ball + . + getLeft + ( + ) + ; + let + bRight + = + ball + . + getRight + ( + ) + ; + let + bTop + = + ball + . + getTop + ( + ) + ; + let + bBottom + = + ball + . + getBottom + ( + ) + ; + let + bVspeed + = + ball + . + getVspeed + ( + ) + ; + let + end + = + hbricks + * + vbricks + ; + while + ( + i + < + end + ) + { + let + brick + = + bricks + [ + i + ] + ; + let + brLeft + = + brick + . + getLeft + ( + ) + ; + let + brRight + = + brick + . + getRight + ( + ) + ; + let + brTop + = + brick + . + getTop + ( + ) + ; + let + brBottom + = + brick + . + getBottom + ( + ) + ; + let + brHidden + = + brick + . + getHidden + ( + ) + ; + if + ( + brHidden + < + 1 + ) + { + do + brick + . + draw + ( + ) + ; + if + ( + ( + bLeft + > + brLeft + ) + & + ( + bRight + < + brRight + ) + ) + { + if + ( + ( + bBottom + > + brTop + ) + & + ( + bTop + < + brBottom + ) + ) + { + do + brick + . + setHidden + ( + 1 + ) + ; + do + brick + . + draw + ( + ) + ; + let + overlapLeft + = + bRight + - + brLeft + ; + let + overlapRight + = + brRight + - + bLeft + ; + let + overlapTop + = + bBottom + - + brTop + ; + let + overlapBottom + = + brBottom + - + bTop + ; + if + ( + Util + . + abs + ( + overlapLeft + ) + < + Util + . + abs + ( + overlapRight + ) + ) + { + let + fromLeft + = + 1 + ; + let + minOverlapX + = + overlapLeft + ; + } + else + { + let + minOverlapX + = + overlapRight + ; + } + if + ( + Util + . + abs + ( + overlapTop + ) + < + Util + . + abs + ( + overlapBottom + ) + ) + { + let + fromTop + = + 1 + ; + let + minOverlapY + = + overlapTop + ; + } + else + { + let + minOverlapY + = + overlapBottom + ; + } + if + ( + Util + . + abs + ( + minOverlapX + ) + < + Util + . + abs + ( + minOverlapY + ) + ) + { + do + ball + . + invertHspeed + ( + ) + ; + } + else + { + do + ball + . + invertVspeed + ( + ) + ; + } + } + } + } + let + i + = + i + + + 1 + ; + } + return + ; + } + } + diff --git a/projects/11/Arkanoid/Main.jack b/projects/11/Arkanoid/Main.jack new file mode 100644 index 0000000..4769d72 --- /dev/null +++ b/projects/11/Arkanoid/Main.jack @@ -0,0 +1,8 @@ +class Main { + function void main() { + var Game game; + let game = Game.new(); + do game.loop(); + return; + } +} \ No newline at end of file diff --git a/projects/11/Arkanoid/Main.vm b/projects/11/Arkanoid/Main.vm new file mode 100644 index 0000000..87ca035 --- /dev/null +++ b/projects/11/Arkanoid/Main.vm @@ -0,0 +1,8 @@ +function Main.main 1 +call Game.new 0 +pop local 0 +push local 0 +call Game.loop 1 +pop temp 0 +push constant 0 +return diff --git a/projects/11/Arkanoid/Main.xml b/projects/11/Arkanoid/Main.xml new file mode 100644 index 0000000..f7db859 --- /dev/null +++ b/projects/11/Arkanoid/Main.xml @@ -0,0 +1,54 @@ + + class + Main + { + + void + main + ( + + + ) + + { + + var + Game + game + ; + + + + let + game + = + + + Game + . + new + ( + ) + + + ; + + + do + game + . + loop + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/11/Arkanoid/MainT.xml b/projects/11/Arkanoid/MainT.xml new file mode 100644 index 0000000..85c2d3f --- /dev/null +++ b/projects/11/Arkanoid/MainT.xml @@ -0,0 +1,35 @@ + + class + Main + { + function + void + main + ( + ) + { + var + Game + game + ; + let + game + = + Game + . + new + ( + ) + ; + do + game + . + loop + ( + ) + ; + return + ; + } + } + diff --git a/projects/11/Arkanoid/Rect.jack b/projects/11/Arkanoid/Rect.jack new file mode 100644 index 0000000..3ff3ec5 --- /dev/null +++ b/projects/11/Arkanoid/Rect.jack @@ -0,0 +1,90 @@ +class Rect { + field int x, y, width, height, hidden; + + constructor Rect new(int xl, int yl, int widthl, int heightl) { + let x = xl; + let y = yl; + let width = widthl; + let height = heightl; + let hidden = 0; + + return this; + } + + method void setPos(int lx, int ly) { + do erase(); + let x = lx; + let y = ly; + + return; + } + + method void draw() { + if (hidden = 1) { + do erase(); + return; + } + do Screen.setColor(true); + do Screen.drawRectangle(x,y,x+width,y+height); + return; + } + + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x,y,x+width,y+height); + return; + } + + method void moveLeft(int dist) { + do erase(); + let x = x - dist; + do draw(); + return; + } + + method void moveRight(int dist) { + do erase(); + let x = x + dist; + do draw(); + return; + } + + method void moveUp(int dist) { + do erase(); + let y = y - dist; + do draw(); + return; + } + + method void moveDown(int dist) { + do erase(); + let y = y + dist; + do draw(); + return; + } + + method int getLeft() { + return x; + } + + method int getRight() { + return x + width; + } + + method int getTop() { + return y; + } + + method int getBottom() { + return y + height; + } + + method int getHidden() { + return hidden; + } + + method void setHidden(int lhidden) { + let hidden = lhidden; + return; + } +} \ No newline at end of file diff --git a/projects/11/Arkanoid/Rect.vm b/projects/11/Arkanoid/Rect.vm new file mode 100644 index 0000000..2af7926 --- /dev/null +++ b/projects/11/Arkanoid/Rect.vm @@ -0,0 +1,174 @@ +function Rect.new 0 +push constant 5 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 2 +push argument 3 +pop this 3 +push constant 0 +pop this 4 +push pointer 0 +return +function Rect.setPos 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Rect.erase 1 +pop temp 0 +push argument 1 +pop this 0 +push argument 2 +pop this 1 +push constant 0 +return +function Rect.draw 0 +push argument 0 +pop pointer 0 +push this 4 +push constant 1 +eq +not +if-goto IF10 +push pointer 0 +call Rect.erase 1 +pop temp 0 +push constant 0 +return +goto IF11 +label IF10 +label IF11 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Rect.erase 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Rect.moveLeft 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Rect.erase 1 +pop temp 0 +push this 0 +push argument 1 +sub +pop this 0 +push pointer 0 +call Rect.draw 1 +pop temp 0 +push constant 0 +return +function Rect.moveRight 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Rect.erase 1 +pop temp 0 +push this 0 +push argument 1 +add +pop this 0 +push pointer 0 +call Rect.draw 1 +pop temp 0 +push constant 0 +return +function Rect.moveUp 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Rect.erase 1 +pop temp 0 +push this 1 +push argument 1 +sub +pop this 1 +push pointer 0 +call Rect.draw 1 +pop temp 0 +push constant 0 +return +function Rect.moveDown 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Rect.erase 1 +pop temp 0 +push this 1 +push argument 1 +add +pop this 1 +push pointer 0 +call Rect.draw 1 +pop temp 0 +push constant 0 +return +function Rect.getLeft 0 +push argument 0 +pop pointer 0 +push this 0 +return +function Rect.getRight 0 +push argument 0 +pop pointer 0 +push this 0 +push this 2 +add +return +function Rect.getTop 0 +push argument 0 +pop pointer 0 +push this 1 +return +function Rect.getBottom 0 +push argument 0 +pop pointer 0 +push this 1 +push this 3 +add +return +function Rect.getHidden 0 +push argument 0 +pop pointer 0 +push this 4 +return +function Rect.setHidden 0 +push argument 0 +pop pointer 0 +push argument 1 +pop this 4 +push constant 0 +return diff --git a/projects/11/Arkanoid/Rect.xml b/projects/11/Arkanoid/Rect.xml new file mode 100644 index 0000000..fc2391a --- /dev/null +++ b/projects/11/Arkanoid/Rect.xml @@ -0,0 +1,612 @@ + + class + Rect + { + + field + int + x + , + y + , + width + , + height + , + hidden + ; + + + Rect + new + ( + + int + xl + , + int + yl + , + int + widthl + , + int + heightl + + ) + + { + + + let + x + = + + + xl + + + ; + + + let + y + = + + + yl + + + ; + + + let + width + = + + + widthl + + + ; + + + let + height + = + + + heightl + + + ; + + + let + hidden + = + + + 0 + + + ; + + + return + + + this + + + ; + + + } + + + + void + setPos + ( + + int + lx + , + int + ly + + ) + + { + + + do + erase + ( + ) + ; + + + let + x + = + + + lx + + + ; + + + let + y + = + + + ly + + + ; + + + return + ; + + + } + + + + void + draw + ( + + + ) + + { + + + if + ( + + + hidden + + = + + 1 + + + ) + { + + + do + erase + ( + ) + ; + + + return + ; + + + } + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + void + erase + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + void + moveLeft + ( + + int + dist + + ) + + { + + + do + erase + ( + ) + ; + + + let + x + = + + + x + + - + + dist + + + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + moveRight + ( + + int + dist + + ) + + { + + + do + erase + ( + ) + ; + + + let + x + = + + + x + + + + + dist + + + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + moveUp + ( + + int + dist + + ) + + { + + + do + erase + ( + ) + ; + + + let + y + = + + + y + + - + + dist + + + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + moveDown + ( + + int + dist + + ) + + { + + + do + erase + ( + ) + ; + + + let + y + = + + + y + + + + + dist + + + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + int + getLeft + ( + + + ) + + { + + + return + + + x + + + ; + + + } + + + + int + getRight + ( + + + ) + + { + + + return + + + x + + + + + width + + + ; + + + } + + + + int + getTop + ( + + + ) + + { + + + return + + + y + + + ; + + + } + + + + int + getBottom + ( + + + ) + + { + + + return + + + y + + + + + height + + + ; + + + } + + + + int + getHidden + ( + + + ) + + { + + + return + + + hidden + + + ; + + + } + + + + void + setHidden + ( + + int + lhidden + + ) + + { + + + let + hidden + = + + + lhidden + + + ; + + + return + ; + + + } + + + } + diff --git a/projects/11/Arkanoid/RectT.xml b/projects/11/Arkanoid/RectT.xml new file mode 100644 index 0000000..230a825 --- /dev/null +++ b/projects/11/Arkanoid/RectT.xml @@ -0,0 +1,360 @@ + + class + Rect + { + field + int + x + , + y + , + width + , + height + , + hidden + ; + constructor + Rect + new + ( + int + xl + , + int + yl + , + int + widthl + , + int + heightl + ) + { + let + x + = + xl + ; + let + y + = + yl + ; + let + width + = + widthl + ; + let + height + = + heightl + ; + let + hidden + = + 0 + ; + return + this + ; + } + method + void + setPos + ( + int + lx + , + int + ly + ) + { + do + erase + ( + ) + ; + let + x + = + lx + ; + let + y + = + ly + ; + return + ; + } + method + void + draw + ( + ) + { + if + ( + hidden + = + 1 + ) + { + do + erase + ( + ) + ; + return + ; + } + do + Screen + . + setColor + ( + true + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + width + , + y + + + height + ) + ; + return + ; + } + method + void + erase + ( + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + width + , + y + + + height + ) + ; + return + ; + } + method + void + moveLeft + ( + int + dist + ) + { + do + erase + ( + ) + ; + let + x + = + x + - + dist + ; + do + draw + ( + ) + ; + return + ; + } + method + void + moveRight + ( + int + dist + ) + { + do + erase + ( + ) + ; + let + x + = + x + + + dist + ; + do + draw + ( + ) + ; + return + ; + } + method + void + moveUp + ( + int + dist + ) + { + do + erase + ( + ) + ; + let + y + = + y + - + dist + ; + do + draw + ( + ) + ; + return + ; + } + method + void + moveDown + ( + int + dist + ) + { + do + erase + ( + ) + ; + let + y + = + y + + + dist + ; + do + draw + ( + ) + ; + return + ; + } + method + int + getLeft + ( + ) + { + return + x + ; + } + method + int + getRight + ( + ) + { + return + x + + + width + ; + } + method + int + getTop + ( + ) + { + return + y + ; + } + method + int + getBottom + ( + ) + { + return + y + + + height + ; + } + method + int + getHidden + ( + ) + { + return + hidden + ; + } + method + void + setHidden + ( + int + lhidden + ) + { + let + hidden + = + lhidden + ; + return + ; + } + } + diff --git a/projects/11/Arkanoid/Util.jack b/projects/11/Arkanoid/Util.jack new file mode 100644 index 0000000..d87b42a --- /dev/null +++ b/projects/11/Arkanoid/Util.jack @@ -0,0 +1,9 @@ +class Util { + function int abs(int n) { + if (n < 0) { + return -n; + } else { + return n; + } + } +} \ No newline at end of file diff --git a/projects/11/Arkanoid/Util.vm b/projects/11/Arkanoid/Util.vm new file mode 100644 index 0000000..e2faa19 --- /dev/null +++ b/projects/11/Arkanoid/Util.vm @@ -0,0 +1,14 @@ +function Util.abs 0 +push argument 0 +push constant 0 +lt +not +if-goto IF10 +push argument 0 +neg +return +goto IF11 +label IF10 +push argument 0 +return +label IF11 diff --git a/projects/11/Arkanoid/Util.xml b/projects/11/Arkanoid/Util.xml new file mode 100644 index 0000000..3b1a403 --- /dev/null +++ b/projects/11/Arkanoid/Util.xml @@ -0,0 +1,66 @@ + + class + Util + { + + int + abs + ( + + int + n + + ) + + { + + + if + ( + + + n + + < + + 0 + + + ) + { + + + return + + + - + + n + + + + ; + + + } + else + { + + + return + + + n + + + ; + + + } + + + } + + + } + diff --git a/projects/11/Arkanoid/UtilT.xml b/projects/11/Arkanoid/UtilT.xml new file mode 100644 index 0000000..a492cb1 --- /dev/null +++ b/projects/11/Arkanoid/UtilT.xml @@ -0,0 +1,33 @@ + + class + Util + { + function + int + abs + ( + int + n + ) + { + if + ( + n + < + 0 + ) + { + return + - + n + ; + } + else + { + return + n + ; + } + } + } + diff --git a/projects/11/Arkanoid/source/Ball.jack b/projects/11/Arkanoid/source/Ball.jack new file mode 100644 index 0000000..b16dcf1 --- /dev/null +++ b/projects/11/Arkanoid/source/Ball.jack @@ -0,0 +1,104 @@ +class Ball { + field int x,y, r, hspeed, vspeed; + + constructor Ball new(int lx, int ly, int lr, int lhspeed, int lvspeed) { + let x = lx; + let y = ly; + let r = lr; + + let hspeed = lhspeed; + let vspeed = lvspeed; + + return this; + } + + method void setPos(int lx, int ly) { + do erase(); + + let x = lx; + let y = ly; + + return; + } + + method void setSpeed(int lhspeed, int lvspeed) { + let hspeed = lhspeed; + let vspeed = lvspeed; + + return; + } + + method void draw() { + do Screen.setColor(true); + do Screen.drawCircle(x,y,r); + return; + } + + method void erase() { + do Screen.setColor(false); + do Screen.drawCircle(x,y,r); + return; + } + + method void update() { + var int keyPressed, bLeft, bRight, bTop, bBottom; + + let bLeft = getLeft(); + let bRight = getRight(); + let bTop = getTop(); + let bBottom = getBottom(); + + do erase(); + + // 2 pixel margin on the sides just in case + if (bLeft < 2 & hspeed < 0) { + do invertHspeed(); + } + if (bRight > 508 & hspeed > 0) { + do invertHspeed(); + } + if (bTop < 2 & vspeed < 0) { + do invertVspeed(); + } + if (bBottom > 250 & vspeed > 0) { + do invertVspeed(); + } + + let x = x + hspeed; + let y = y + vspeed; + + do draw(); + + return; + } + + method void invertVspeed() { + let vspeed = -vspeed; + return; + } + + method void invertHspeed() { + let hspeed = -hspeed; + return; + } + + method int getLeft() { + return x - r; + } + + method int getRight() { + return x + r; + } + + method int getTop() { + return y - r; + } + + method int getBottom() { + return y + r; + } + + method int getVspeed() { + return vspeed; + } +} \ No newline at end of file diff --git a/projects/11/Arkanoid/source/Game.jack b/projects/11/Arkanoid/source/Game.jack new file mode 100644 index 0000000..812fe59 --- /dev/null +++ b/projects/11/Arkanoid/source/Game.jack @@ -0,0 +1,224 @@ +class Game { + field int hbricks, vbricks; + field int gameOver; + + field Rect paddle; + field Ball ball; + field Array bricks; + + constructor Game new() { + var int i, j; + var Rect curBrick; + + let gameOver = 0; + let hbricks = 8; + let vbricks = 3; + + let paddle = Rect.new(250,220,50,10); + let ball = Ball.new(250, 200, 6, 1, 1); + let bricks = Array.new(hbricks * vbricks); + + while (i < hbricks) { + while (j < vbricks) { + let bricks[i * 3 + j] = Rect.new(i * 60 + 20, j * 30 + 20, 50, 15); + let curBrick = bricks[i * 3 + j]; + do curBrick.draw(); + let j = j + 1; + } + let j = 0; + let i = i + 1; + } + + return this; + } + + method void loop() { + var int keyPressed; + + while(true) { + // Approximately 60 updates per second + do Sys.wait(16); + + if (gameOver = 0) { + do movePaddle(); + do ball.update(); + do chackBallPaddleCol(); + do checkBallBricksCol(); + + do checkGameOver(); + } else { + let keyPressed = Keyboard.keyPressed(); + if (keyPressed = 82) { + do resetGame(); + } + } + + } + return; + } + + method void resetGame() { + var int i, end; + var Rect brick; + + do Screen.clearScreen(); + + do paddle.setPos(250, 220); + do ball.setPos(250, 200); + do ball.setSpeed(1, 1); + + let end = hbricks * vbricks; + while (i < end) { + let brick = bricks[i]; + + do brick.setHidden(0); + do brick.draw(); + + let i = i + 1; + } + + let gameOver = 0; + + return; + } + + method void checkGameOver() { + var int bBottom; + + let bBottom = ball.getBottom(); + + if (bBottom > 240) { + let gameOver = 1; + + do Output.moveCursor(0,0); + do Output.println(); + do Output.printString("game over"); + do Output.println(); + do Output.printString("press r to restart"); + } + + return; + } + + method void movePaddle() { + var int keyPressed, paddleLeft, paddleRight; + + let keyPressed = Keyboard.keyPressed(); + let paddleLeft = paddle.getLeft(); + let paddleRight = paddle.getRight(); + // Move left + if((keyPressed = 130) & (paddleLeft > 0)) { + do paddle.moveLeft(2); + } + // Move right + if((keyPressed = 132) & (paddleRight < 510)) { + do paddle.moveRight(2); + } + do paddle.draw(); + + return; + } + + method void chackBallPaddleCol() { + var int paddleLeft, paddleRight, paddleTop, paddleBottom, paddleMiddle; + var int bLeft, bRight, bTop, bBottom, bMiddle, bVspeed; + + let paddleLeft = paddle.getLeft(); + let paddleRight = paddle.getRight(); + let paddleTop = paddle.getTop(); + let paddleBottom = paddle.getBottom(); + let paddleMiddle = (paddleRight + paddleLeft) / 2; + + let bLeft = ball.getLeft(); + let bRight = ball.getRight(); + let bTop = ball.getTop(); + let bBottom = ball.getBottom(); + let bMiddle = (bRight + bLeft) / 2; + let bVspeed = ball.getVspeed(); + + if((bLeft > paddleLeft) & (bRight < paddleRight)) { + if((bBottom > paddleTop) & (bVspeed > 0)) { + if (bMiddle > paddleMiddle) { + do ball.setSpeed(1, -1); + } else { + do ball.setSpeed(-1, -1); + } + } + } + + return; + } + + method void checkBallBricksCol() { + var int brLeft, brRight, brTop, brBottom, brHidden; + var int bLeft, bRight, bTop, bBottom, bVspeed; + var int overlapLeft, overlapRight, overlapTop, overlapBottom, fromLeft, fromTop; + var int minOverlapX, minOverlapY; + var int i, end; + var Rect brick; + + let bLeft = ball.getLeft(); + let bRight = ball.getRight(); + let bTop = ball.getTop(); + let bBottom = ball.getBottom(); + let bVspeed = ball.getVspeed(); + + let end = hbricks * vbricks; + while (i < end) { + let brick = bricks[i]; + + let brLeft = brick.getLeft(); + let brRight = brick.getRight(); + let brTop = brick.getTop(); + let brBottom = brick.getBottom(); + let brHidden = brick.getHidden(); + + if(brHidden < 1) { + do brick.draw(); + + // Check if there's intersection at all first + if((bLeft > brLeft) & (bRight < brRight)) { + if((bBottom > brTop) & (bTop < brBottom)) { + do brick.setHidden(1); + do brick.draw(); + + // Now calculate the collision side + // Algorithm basically copied from this video + // https://youtu.be/_4K3tsKa1Uc?t=1820 + + let overlapLeft = bRight - brLeft; + let overlapRight = brRight - bLeft; + let overlapTop = bBottom - brTop; + let overlapBottom = brBottom - bTop; + + if(Util.abs(overlapLeft) < Util.abs(overlapRight)) { + let fromLeft = 1; + let minOverlapX = overlapLeft; + } else { + let minOverlapX = overlapRight; + } + + if(Util.abs(overlapTop) < Util.abs(overlapBottom)) { + let fromTop = 1; + let minOverlapY = overlapTop; + } else { + let minOverlapY = overlapBottom; + } + + if(Util.abs(minOverlapX) < Util.abs(minOverlapY)) { + do ball.invertHspeed(); + } else { + do ball.invertVspeed(); + } + + } + } + } + + let i = i + 1; + } + + return; + } + +} \ No newline at end of file diff --git a/projects/11/Arkanoid/source/Main.jack b/projects/11/Arkanoid/source/Main.jack new file mode 100644 index 0000000..4769d72 --- /dev/null +++ b/projects/11/Arkanoid/source/Main.jack @@ -0,0 +1,8 @@ +class Main { + function void main() { + var Game game; + let game = Game.new(); + do game.loop(); + return; + } +} \ No newline at end of file diff --git a/projects/11/Arkanoid/source/Rect.jack b/projects/11/Arkanoid/source/Rect.jack new file mode 100644 index 0000000..3ff3ec5 --- /dev/null +++ b/projects/11/Arkanoid/source/Rect.jack @@ -0,0 +1,90 @@ +class Rect { + field int x, y, width, height, hidden; + + constructor Rect new(int xl, int yl, int widthl, int heightl) { + let x = xl; + let y = yl; + let width = widthl; + let height = heightl; + let hidden = 0; + + return this; + } + + method void setPos(int lx, int ly) { + do erase(); + let x = lx; + let y = ly; + + return; + } + + method void draw() { + if (hidden = 1) { + do erase(); + return; + } + do Screen.setColor(true); + do Screen.drawRectangle(x,y,x+width,y+height); + return; + } + + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x,y,x+width,y+height); + return; + } + + method void moveLeft(int dist) { + do erase(); + let x = x - dist; + do draw(); + return; + } + + method void moveRight(int dist) { + do erase(); + let x = x + dist; + do draw(); + return; + } + + method void moveUp(int dist) { + do erase(); + let y = y - dist; + do draw(); + return; + } + + method void moveDown(int dist) { + do erase(); + let y = y + dist; + do draw(); + return; + } + + method int getLeft() { + return x; + } + + method int getRight() { + return x + width; + } + + method int getTop() { + return y; + } + + method int getBottom() { + return y + height; + } + + method int getHidden() { + return hidden; + } + + method void setHidden(int lhidden) { + let hidden = lhidden; + return; + } +} \ No newline at end of file diff --git a/projects/11/Arkanoid/source/Util.jack b/projects/11/Arkanoid/source/Util.jack new file mode 100644 index 0000000..d87b42a --- /dev/null +++ b/projects/11/Arkanoid/source/Util.jack @@ -0,0 +1,9 @@ +class Util { + function int abs(int n) { + if (n < 0) { + return -n; + } else { + return n; + } + } +} \ No newline at end of file diff --git a/projects/11/Average/Main.jack b/projects/11/Average/Main.jack new file mode 100644 index 0000000..d560bf1 --- /dev/null +++ b/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/projects/11/Average/Main.vm b/projects/11/Average/Main.vm new file mode 100644 index 0000000..6b60226 --- /dev/null +++ b/projects/11/Average/Main.vm @@ -0,0 +1,149 @@ +function Main.main 4 +push constant 18 +call String.new 1 +push constant 72 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 119 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 63 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Keyboard.readInt 1 +pop local 1 +push local 1 +call Array.new 1 +pop local 0 +push constant 0 +pop local 2 +label WHILE10 +push local 2 +push local 1 +lt +not +if-goto WHILE11 +push local 0 +push local 2 +add +push constant 16 +call String.new 1 +push constant 69 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Keyboard.readInt 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 3 +push local 0 +push local 2 +add +pop pointer 1 +push that 0 +add +pop local 3 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE10 +label WHILE11 +push constant 15 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 118 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 3 +push local 1 +call Math.divide 2 +call Output.printInt 1 +pop temp 0 +push constant 0 +return diff --git a/projects/11/Average/Main.xml b/projects/11/Average/Main.xml new file mode 100644 index 0000000..30672aa --- /dev/null +++ b/projects/11/Average/Main.xml @@ -0,0 +1,179 @@ + + class + Main + { + + void + main + ( + + + ) + + { + + var + Array + a + ; + + + var + int + length + ; + + + var + int + i + , + sum + ; + + + + let + length + = + + + Keyboard + . + readInt + ( + ) + + + ; + + + let + a + = + + + Array + . + new + ( + ) + + + ; + + + let + i + = + + + 0 + + + ; + + + while + ( + + + i + + < + + length + + + ) + { + + + let + a + [ + + + i + + + ] + = + + + Keyboard + . + readInt + ( + ) + + + ; + + + let + sum + = + + + sum + + + + + [ + + + i + + + ] + + + ; + + + let + i + = + + + i + + + + + 1 + + + ; + + + } + + + do + Output + . + printString + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/11/Average/MainT.xml b/projects/11/Average/MainT.xml new file mode 100644 index 0000000..f7a66c6 --- /dev/null +++ b/projects/11/Average/MainT.xml @@ -0,0 +1,110 @@ + + 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 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/projects/11/ComplexArrays/Main.jack b/projects/11/ComplexArrays/Main.jack new file mode 100644 index 0000000..c914f1d --- /dev/null +++ b/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/projects/11/ComplexArrays/Main.vm b/projects/11/ComplexArrays/Main.vm new file mode 100644 index 0000000..e11d1fe --- /dev/null +++ b/projects/11/ComplexArrays/Main.vm @@ -0,0 +1,703 @@ +function Main.main 3 +push constant 10 +call Array.new 1 +pop local 0 +push constant 5 +call Array.new 1 +pop local 1 +push constant 1 +call Array.new 1 +pop local 2 +push local 0 +push constant 3 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 4 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 5 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +add +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +push constant 3 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push local 1 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +add +pop pointer 1 +push that 0 +add +push local 0 +push local 0 +push constant 5 +add +pop pointer 1 +push that 0 +add +pop pointer 1 +push that 0 +push local 1 +push constant 7 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +sub +push constant 2 +call Main.double 1 +sub +push constant 1 +add +add +pop pointer 1 +push that 0 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 2 +push constant 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 2 +push constant 0 +add +pop pointer 1 +push that 0 +pop local 2 +push constant 43 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 49 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 53 +call String.appendChar 2 +push constant 59 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 1 +push constant 2 +add +pop pointer 1 +push that 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 44 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 52 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +push constant 59 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +push constant 5 +add +pop pointer 1 +push that 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 43 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 51 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +push constant 59 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 2 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 0 +pop local 2 +push local 2 +push constant 0 +eq +not +if-goto IF10 +push local 0 +push constant 10 +call Main.fill 2 +pop temp 0 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +pop local 2 +push local 2 +push constant 1 +add +push constant 33 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 7 +add +pop pointer 1 +push that 0 +pop local 2 +push local 2 +push constant 1 +add +push constant 77 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +pop local 1 +push local 1 +push constant 1 +add +push local 1 +push constant 1 +add +pop pointer 1 +push that 0 +push local 2 +push constant 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF11 +label IF10 +label IF11 +push constant 44 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 52 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 55 +call String.appendChar 2 +push constant 55 +call String.appendChar 2 +push constant 59 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 2 +push constant 1 +add +pop pointer 1 +push that 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 45 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 53 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 49 +call String.appendChar 2 +push constant 49 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +push constant 59 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 1 +push constant 1 +add +pop pointer 1 +push that 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 0 +return +function Main.double 0 +push argument 0 +push constant 2 +call Math.multiply 2 +return +function Main.fill 0 +label WHILE20 +push argument 1 +push constant 0 +gt +not +if-goto WHILE21 +push argument 1 +push constant 1 +sub +pop argument 1 +push argument 0 +push argument 1 +add +push constant 3 +call Array.new 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE20 +label WHILE21 +push constant 0 +return diff --git a/projects/11/ComplexArrays/Main.xml b/projects/11/ComplexArrays/Main.xml new file mode 100644 index 0000000..1c759f0 --- /dev/null +++ b/projects/11/ComplexArrays/Main.xml @@ -0,0 +1,689 @@ + + class + Main + { + + void + main + ( + + + ) + + { + + var + Array + a + , + b + , + c + ; + + + + let + a + = + + + Array + . + new + ( + ) + + + ; + + + let + b + = + + + Array + . + new + ( + ) + + + ; + + + let + c + = + + + Array + . + new + ( + ) + + + ; + + + let + a + [ + + + 3 + + + ] + = + + + 2 + + + ; + + + let + a + [ + + + 4 + + + ] + = + + + 8 + + + ; + + + let + a + [ + + + 5 + + + ] + = + + + 4 + + + ; + + + let + b + [ + + + [ + + + 3 + + + ] + + + ] + = + + + [ + + + 3 + + + ] + + + + + 3 + + + ; + + + let + a + [ + + + [ + + + [ + + + 3 + + + ] + + + ] + + + ] + = + + + [ + + + [ + + + 5 + + + ] + + + ] + + * + + [ + + + ( + + + ( + + + 7 + + - + + [ + + + 3 + + + ] + + + ) + + - + + Main + . + double + ( + ) + + + ) + + + + + 1 + + + ] + + + ; + + + let + c + [ + + + 0 + + + ] + = + + + null + + + ; + + + let + c + = + + + [ + + + 0 + + + ] + + + ; + + + do + Output + . + printString + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + do + Output + . + println + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + do + Output + . + println + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + do + Output + . + println + ( + ) + ; + + + let + c + = + + + null + + + ; + + + if + ( + + + c + + = + + null + + + ) + { + + + do + Main + . + fill + ( + ) + ; + + + let + c + = + + + [ + + + 3 + + + ] + + + ; + + + let + c + [ + + + 1 + + + ] + = + + + 33 + + + ; + + + let + c + = + + + [ + + + 7 + + + ] + + + ; + + + let + c + [ + + + 1 + + + ] + = + + + 77 + + + ; + + + let + b + = + + + [ + + + 3 + + + ] + + + ; + + + let + b + [ + + + 1 + + + ] + = + + + [ + + + 1 + + + ] + + + + + [ + + + 1 + + + ] + + + ; + + + } + + + do + Output + . + printString + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + do + Output + . + println + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + do + Output + . + println + ( + ) + ; + + + return + ; + + + } + + + + int + double + ( + + int + a + + ) + + { + + + return + + + a + + * + + 2 + + + ; + + + } + + + + void + fill + ( + + Array + a + , + int + size + + ) + + { + + + while + ( + + + size + + > + + 0 + + + ) + { + + + let + size + = + + + size + + - + + 1 + + + ; + + + let + a + [ + + + size + + + ] + = + + + Array + . + new + ( + ) + + + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/11/ComplexArrays/MainT.xml b/projects/11/ComplexArrays/MainT.xml new file mode 100644 index 0000000..268c33b --- /dev/null +++ b/projects/11/ComplexArrays/MainT.xml @@ -0,0 +1,414 @@ + + 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 + ; + let + a + [ + b + [ + a + [ + 3 + ] + ] + ] + = + a + [ + a + [ + 5 + ] + ] + * + b + [ + ( + ( + 7 + - + a + [ + 3 + ] + ) + - + Main + . + double + ( + 2 + ) + ) + + + 1 + ] + ; + 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 + ] + ; + } + 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/projects/11/ConvertToBin/Main.jack b/projects/11/ConvertToBin/Main.jack new file mode 100644 index 0000000..d2f52ff --- /dev/null +++ b/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/projects/11/ConvertToBin/Main.vm b/projects/11/ConvertToBin/Main.vm new file mode 100644 index 0000000..a911732 --- /dev/null +++ b/projects/11/ConvertToBin/Main.vm @@ -0,0 +1,106 @@ +function Main.main 1 +push constant 8001 +push constant 16 +push constant 1 +neg +call Main.fillMemory 3 +pop temp 0 +push constant 8000 +call Memory.peek 1 +pop local 0 +push local 0 +call Main.convert 1 +pop temp 0 +push constant 0 +return +function Main.convert 3 +push constant 0 +not +pop local 2 +label WHILE10 +push local 2 +not +if-goto WHILE11 +push local 1 +push constant 1 +add +pop local 1 +push local 0 +call Main.nextMask 1 +pop local 0 +push local 1 +push constant 16 +gt +not +not +if-goto IF20 +push argument 0 +push local 0 +and +push constant 0 +eq +not +not +if-goto IF30 +push constant 8000 +push local 1 +add +push constant 1 +call Memory.poke 2 +pop temp 0 +goto IF31 +label IF30 +push constant 8000 +push local 1 +add +push constant 0 +call Memory.poke 2 +pop temp 0 +label IF31 +goto IF21 +label IF20 +push constant 0 +pop local 2 +label IF21 +goto WHILE10 +label WHILE11 +push constant 0 +return +function Main.nextMask 0 +push argument 0 +push constant 0 +eq +not +if-goto IF40 +push constant 1 +return +goto IF41 +label IF40 +push argument 0 +push constant 2 +call Math.multiply 2 +return +label IF41 +function Main.fillMemory 0 +label WHILE50 +push argument 1 +push constant 0 +gt +not +if-goto WHILE51 +push argument 0 +push argument 2 +call Memory.poke 2 +pop temp 0 +push argument 1 +push constant 1 +sub +pop argument 1 +push argument 0 +push constant 1 +add +pop argument 0 +goto WHILE50 +label WHILE51 +push constant 0 +return diff --git a/projects/11/ConvertToBin/Main.xml b/projects/11/ConvertToBin/Main.xml new file mode 100644 index 0000000..1291ea2 --- /dev/null +++ b/projects/11/ConvertToBin/Main.xml @@ -0,0 +1,399 @@ + + class + Main + { + + void + main + ( + + + ) + + { + + var + int + value + ; + + + + do + Main + . + fillMemory + ( + ) + ; + + + let + value + = + + + Memory + . + peek + ( + ) + + + ; + + + do + Main + . + convert + ( + ) + ; + + + return + ; + + + } + + + + void + convert + ( + + int + value + + ) + + { + + var + int + mask + , + position + ; + + + var + boolean + loop + ; + + + + let + loop + = + + + true + + + ; + + + while + ( + + + loop + + + ) + { + + + let + position + = + + + position + + + + + 1 + + + ; + + + let + mask + = + + + Main + . + nextMask + ( + ) + + + ; + + + if + ( + + + ~ + + ( + + + position + + > + + 16 + + + ) + + + + ) + { + + + if + ( + + + ~ + + ( + + + ( + + + value + + & + + mask + + + ) + + = + + 0 + + + ) + + + + ) + { + + + do + Memory + . + poke + ( + ) + ; + + + } + else + { + + + do + Memory + . + poke + ( + ) + ; + + + } + + + } + else + { + + + let + loop + = + + + false + + + ; + + + } + + + } + + + return + ; + + + } + + + + int + nextMask + ( + + int + mask + + ) + + { + + + if + ( + + + mask + + = + + 0 + + + ) + { + + + return + + + 1 + + + ; + + + } + else + { + + + return + + + mask + + * + + 2 + + + ; + + + } + + + } + + + + void + fillMemory + ( + + int + startAddress + , + int + length + , + int + value + + ) + + { + + + while + ( + + + length + + > + + 0 + + + ) + { + + + do + Memory + . + poke + ( + ) + ; + + + let + length + = + + + length + + - + + 1 + + + ; + + + let + startAddress + = + + + startAddress + + + + + 1 + + + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/11/ConvertToBin/MainT.xml b/projects/11/ConvertToBin/MainT.xml new file mode 100644 index 0000000..e69de36 --- /dev/null +++ b/projects/11/ConvertToBin/MainT.xml @@ -0,0 +1,237 @@ + + class + Main + { + function + void + main + ( + ) + { + var + int + value + ; + do + Main + . + fillMemory + ( + 8001 + , + 16 + , + - + 1 + ) + ; + let + value + = + Memory + . + peek + ( + 8000 + ) + ; + do + Main + . + convert + ( + value + ) + ; + return + ; + } + 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 + ; + } + function + int + nextMask + ( + int + mask + ) + { + if + ( + mask + = + 0 + ) + { + return + 1 + ; + } + else + { + return + mask + * + 2 + ; + } + } + 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/projects/11/Pong/Array.jack b/projects/11/Pong/Array.jack new file mode 100644 index 0000000..e949198 --- /dev/null +++ b/projects/11/Pong/Array.jack @@ -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/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) { + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/projects/11/Pong/Array.vm b/projects/11/Pong/Array.vm new file mode 100644 index 0000000..c0cd797 --- /dev/null +++ b/projects/11/Pong/Array.vm @@ -0,0 +1,12 @@ +function Array.new 0 +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/projects/11/Pong/Ball.jack b/projects/11/Pong/Ball.jack new file mode 100644 index 0000000..5e7c9a8 --- /dev/null +++ b/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/projects/11/Pong/Ball.vm b/projects/11/Pong/Ball.vm new file mode 100644 index 0000000..8269c1c --- /dev/null +++ b/projects/11/Pong/Ball.vm @@ -0,0 +1,444 @@ +function Ball.new 0 +push constant 15 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 10 +push argument 3 +push constant 6 +sub +pop this 11 +push argument 4 +pop this 12 +push argument 5 +push constant 6 +sub +pop this 13 +push constant 0 +pop this 14 +push pointer 0 +call Ball.show 1 +pop temp 0 +push pointer 0 +return +function Ball.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function Ball.show 0 +push argument 0 +pop pointer 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Ball.draw 1 +pop temp 0 +push constant 0 +return +function Ball.hide 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Ball.draw 1 +pop temp 0 +push constant 0 +return +function Ball.draw 0 +push argument 0 +pop pointer 0 +push this 0 +push this 1 +push this 0 +push constant 5 +add +push this 1 +push constant 5 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Ball.getLeft 0 +push argument 0 +pop pointer 0 +push this 0 +return +function Ball.getRight 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 5 +add +return +function Ball.setDestination 3 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +sub +pop this 2 +push argument 2 +push this 1 +sub +pop this 3 +push this 2 +call Math.abs 1 +pop local 0 +push this 3 +call Math.abs 1 +pop local 1 +push local 0 +push local 1 +lt +pop this 7 +push this 7 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +pop local 2 +push local 1 +pop local 0 +push local 2 +pop local 1 +push this 1 +push argument 2 +lt +pop this 8 +push this 0 +push argument 1 +lt +pop this 9 +goto IF_END0 +label IF_FALSE0 +push this 0 +push argument 1 +lt +pop this 8 +push this 1 +push argument 2 +lt +pop this 9 +label IF_END0 +push constant 2 +push local 1 +call Math.multiply 2 +push local 0 +sub +pop this 4 +push constant 2 +push local 1 +call Math.multiply 2 +pop this 5 +push constant 2 +push local 1 +push local 0 +sub +call Math.multiply 2 +pop this 6 +push constant 0 +return +function Ball.move 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Ball.hide 1 +pop temp 0 +push this 4 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 4 +push this 5 +add +pop this 4 +goto IF_END0 +label IF_FALSE0 +push this 4 +push this 6 +add +pop this 4 +push this 9 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push this 7 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push this 0 +push constant 4 +add +pop this 0 +goto IF_END2 +label IF_FALSE2 +push this 1 +push constant 4 +add +pop this 1 +label IF_END2 +goto IF_END1 +label IF_FALSE1 +push this 7 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push this 0 +push constant 4 +sub +pop this 0 +goto IF_END3 +label IF_FALSE3 +push this 1 +push constant 4 +sub +pop this 1 +label IF_END3 +label IF_END1 +label IF_END0 +push this 8 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push this 7 +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push this 1 +push constant 4 +add +pop this 1 +goto IF_END5 +label IF_FALSE5 +push this 0 +push constant 4 +add +pop this 0 +label IF_END5 +goto IF_END4 +label IF_FALSE4 +push this 7 +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push this 1 +push constant 4 +sub +pop this 1 +goto IF_END6 +label IF_FALSE6 +push this 0 +push constant 4 +sub +pop this 0 +label IF_END6 +label IF_END4 +push this 0 +push this 10 +gt +not +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push constant 1 +pop this 14 +push this 10 +pop this 0 +label IF_FALSE7 +push this 0 +push this 11 +lt +not +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push constant 2 +pop this 14 +push this 11 +pop this 0 +label IF_FALSE8 +push this 1 +push this 12 +gt +not +if-goto IF_TRUE9 +goto IF_FALSE9 +label IF_TRUE9 +push constant 3 +pop this 14 +push this 12 +pop this 1 +label IF_FALSE9 +push this 1 +push this 13 +lt +not +if-goto IF_TRUE10 +goto IF_FALSE10 +label IF_TRUE10 +push constant 4 +pop this 14 +push this 13 +pop this 1 +label IF_FALSE10 +push pointer 0 +call Ball.show 1 +pop temp 0 +push this 14 +return +function Ball.bounce 5 +push argument 0 +pop pointer 0 +push this 2 +push constant 10 +call Math.divide 2 +pop local 2 +push this 3 +push constant 10 +call Math.divide 2 +pop local 3 +push argument 1 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 10 +pop local 4 +goto IF_END0 +label IF_FALSE0 +push this 2 +push constant 0 +lt +not +push argument 1 +push constant 1 +eq +and +push this 2 +push constant 0 +lt +push argument 1 +push constant 1 +neg +eq +and +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 20 +pop local 4 +goto IF_END1 +label IF_FALSE1 +push constant 5 +pop local 4 +label IF_END1 +label IF_END0 +push this 14 +push constant 1 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 506 +pop local 0 +push local 3 +push constant 50 +neg +call Math.multiply 2 +push local 2 +call Math.divide 2 +pop local 1 +push this 1 +push local 1 +push local 4 +call Math.multiply 2 +add +pop local 1 +goto IF_END2 +label IF_FALSE2 +push this 14 +push constant 2 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +pop local 0 +push local 3 +push constant 50 +call Math.multiply 2 +push local 2 +call Math.divide 2 +pop local 1 +push this 1 +push local 1 +push local 4 +call Math.multiply 2 +add +pop local 1 +goto IF_END3 +label IF_FALSE3 +push this 14 +push constant 3 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 250 +pop local 1 +push local 2 +push constant 25 +neg +call Math.multiply 2 +push local 3 +call Math.divide 2 +pop local 0 +push this 0 +push local 0 +push local 4 +call Math.multiply 2 +add +pop local 0 +goto IF_END4 +label IF_FALSE4 +push constant 0 +pop local 1 +push local 2 +push constant 25 +call Math.multiply 2 +push local 3 +call Math.divide 2 +pop local 0 +push this 0 +push local 0 +push local 4 +call Math.multiply 2 +add +pop local 0 +label IF_END4 +label IF_END3 +label IF_END2 +push pointer 0 +push local 0 +push local 1 +call Ball.setDestination 3 +pop temp 0 +push constant 0 +return diff --git a/projects/11/Pong/Ball.xml b/projects/11/Pong/Ball.xml new file mode 100644 index 0000000..be88e25 --- /dev/null +++ b/projects/11/Pong/Ball.xml @@ -0,0 +1,1758 @@ + + class + Ball + { + + field + int + x + , + y + ; + + + field + int + lengthx + , + lengthy + ; + + + field + int + d + , + straightD + , + diagonalD + ; + + + field + boolean + invert + , + positivex + , + positivey + ; + + + field + int + leftWall + , + rightWall + , + topWall + , + bottomWall + ; + + + field + int + wall + ; + + + 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 + + + ; + + + let + topWall + = + + + AtopWall + + + ; + + + let + bottomWall + = + + + AbottomWall + + - + + 6 + + + ; + + + let + wall + = + + + 0 + + + ; + + + do + show + ( + ) + ; + + + return + + + this + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + void + show + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + hide + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + draw + ( + + + ) + + { + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + int + getLeft + ( + + + ) + + { + + + return + + + x + + + ; + + + } + + + + int + getRight + ( + + + ) + + { + + + return + + + x + + + + + 5 + + + ; + + + } + + + + void + setDestination + ( + + int + destx + , + int + desty + + ) + + { + + var + int + dx + , + dy + , + temp + ; + + + + let + lengthx + = + + + destx + + - + + x + + + ; + + + let + lengthy + = + + + desty + + - + + y + + + ; + + + let + dx + = + + + Math + . + abs + ( + ) + + + ; + + + let + dy + = + + + Math + . + abs + ( + ) + + + ; + + + let + invert + = + + + ( + + + dx + + < + + dy + + + ) + + + ; + + + if + ( + + + invert + + + ) + { + + + let + temp + = + + + dx + + + ; + + + 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 + ; + + + } + + + + 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 + + + ; + + + } + + + + void + bounce + ( + + int + bouncingDirection + + ) + + { + + var + int + newx + , + newy + , + divLengthx + , + divLengthy + , + factor + ; + + + + 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 + + + ; + + + } + else + { + + + let + factor + = + + + 5 + + + ; + + + } + + + } + + + 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 + { + + + let + newy + = + + + 0 + + + ; + + + let + newx + = + + + ( + + + divLengthx + + * + + 25 + + + ) + + / + + divLengthy + + + ; + + + let + newx + = + + + x + + + + + ( + + + newx + + * + + factor + + + ) + + + ; + + + } + + + } + + + } + + + do + setDestination + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/11/Pong/BallT.xml b/projects/11/Pong/BallT.xml new file mode 100644 index 0000000..cabd2f8 --- /dev/null +++ b/projects/11/Pong/BallT.xml @@ -0,0 +1,881 @@ + + class + Ball + { + field + int + x + , + y + ; + field + int + lengthx + , + lengthy + ; + field + int + d + , + straightD + , + diagonalD + ; + field + boolean + invert + , + positivex + , + positivey + ; + field + int + leftWall + , + rightWall + , + topWall + , + bottomWall + ; + field + int + wall + ; + 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 + ; + let + topWall + = + AtopWall + ; + let + bottomWall + = + AbottomWall + - + 6 + ; + let + wall + = + 0 + ; + do + show + ( + ) + ; + return + this + ; + } + method + void + dispose + ( + ) + { + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + method + void + show + ( + ) + { + do + Screen + . + setColor + ( + true + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + hide + ( + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + draw + ( + ) + { + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + 5 + , + y + + + 5 + ) + ; + return + ; + } + method + int + getLeft + ( + ) + { + return + x + ; + } + method + int + getRight + ( + ) + { + return + x + + + 5 + ; + } + 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 + ; + 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 + ; + } + 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 + ; + } + method + void + bounce + ( + int + bouncingDirection + ) + { + var + int + newx + , + newy + , + divLengthx + , + divLengthy + , + factor + ; + 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 + ; + } + else + { + let + factor + = + 5 + ; + } + } + 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 + { + let + newy + = + 0 + ; + let + newx + = + ( + divLengthx + * + 25 + ) + / + divLengthy + ; + let + newx + = + x + + + ( + newx + * + factor + ) + ; + } + } + } + do + setDestination + ( + newx + , + newy + ) + ; + return + ; + } + } + diff --git a/projects/11/Pong/Bat.jack b/projects/11/Pong/Bat.jack new file mode 100644 index 0000000..25e67f4 --- /dev/null +++ b/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/projects/11/Pong/Bat.vm b/projects/11/Pong/Bat.vm new file mode 100644 index 0000000..f158c82 --- /dev/null +++ b/projects/11/Pong/Bat.vm @@ -0,0 +1,207 @@ +function Bat.new 0 +push constant 5 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 2 +push argument 3 +pop this 3 +push constant 2 +pop this 4 +push pointer 0 +call Bat.show 1 +pop temp 0 +push pointer 0 +return +function Bat.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function Bat.show 0 +push argument 0 +pop pointer 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Bat.draw 1 +pop temp 0 +push constant 0 +return +function Bat.hide 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Bat.draw 1 +pop temp 0 +push constant 0 +return +function Bat.draw 0 +push argument 0 +pop pointer 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Bat.setDirection 0 +push argument 0 +pop pointer 0 +push argument 1 +pop this 4 +push constant 0 +return +function Bat.getLeft 0 +push argument 0 +pop pointer 0 +push this 0 +return +function Bat.getRight 0 +push argument 0 +pop pointer 0 +push this 0 +push this 2 +add +return +function Bat.setWidth 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Bat.hide 1 +pop temp 0 +push argument 1 +pop this 2 +push pointer 0 +call Bat.show 1 +pop temp 0 +push constant 0 +return +function Bat.move 0 +push argument 0 +pop pointer 0 +push this 4 +push constant 1 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 0 +push constant 4 +sub +pop this 0 +push this 0 +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop this 0 +label IF_FALSE1 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 2 +add +push constant 1 +add +push this 1 +push this 0 +push this 2 +add +push constant 4 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push constant 3 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push this 0 +push constant 4 +add +pop this 0 +push this 0 +push this 2 +add +push constant 511 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 511 +push this 2 +sub +pop this 0 +label IF_FALSE2 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push constant 4 +sub +push this 1 +push this 0 +push constant 1 +sub +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 2 +add +push constant 3 +sub +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +label IF_END0 +push constant 0 +return diff --git a/projects/11/Pong/Bat.xml b/projects/11/Pong/Bat.xml new file mode 100644 index 0000000..1a56212 --- /dev/null +++ b/projects/11/Pong/Bat.xml @@ -0,0 +1,587 @@ + + class + Bat + { + + field + int + x + , + y + ; + + + field + int + width + , + height + ; + + + field + int + direction + ; + + + 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 + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + void + show + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + hide + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + draw + ( + + + ) + + { + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + void + setDirection + ( + + int + Adirection + + ) + + { + + + let + direction + = + + + Adirection + + + ; + + + return + ; + + + } + + + + int + getLeft + ( + + + ) + + { + + + return + + + x + + + ; + + + } + + + + int + getRight + ( + + + ) + + { + + + return + + + x + + + + + width + + + ; + + + } + + + + void + setWidth + ( + + int + Awidth + + ) + + { + + + do + hide + ( + ) + ; + + + let + width + = + + + Awidth + + + ; + + + do + show + ( + ) + ; + + + return + ; + + + } + + + + void + move + ( + + + ) + + { + + + if + ( + + + direction + + = + + 1 + + + ) + { + + + let + x + = + + + x + + - + + 4 + + + ; + + + if + ( + + + x + + < + + 0 + + + ) + { + + + let + x + = + + + 0 + + + ; + + + } + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + else + { + + + let + x + = + + + x + + + + + 4 + + + ; + + + if + ( + + + ( + + + x + + + + + width + + + ) + + > + + 511 + + + ) + { + + + let + x + = + + + 511 + + - + + width + + + ; + + + } + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/11/Pong/BatT.xml b/projects/11/Pong/BatT.xml new file mode 100644 index 0000000..574a551 --- /dev/null +++ b/projects/11/Pong/BatT.xml @@ -0,0 +1,413 @@ + + class + Bat + { + field + int + x + , + y + ; + field + int + width + , + height + ; + field + int + direction + ; + 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 + ; + } + method + void + dispose + ( + ) + { + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + method + void + show + ( + ) + { + do + Screen + . + setColor + ( + true + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + hide + ( + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + draw + ( + ) + { + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + width + , + y + + + height + ) + ; + return + ; + } + method + void + setDirection + ( + int + Adirection + ) + { + let + direction + = + Adirection + ; + return + ; + } + method + int + getLeft + ( + ) + { + return + x + ; + } + method + int + getRight + ( + ) + { + return + x + + + width + ; + } + method + void + setWidth + ( + int + Awidth + ) + { + do + hide + ( + ) + ; + let + width + = + Awidth + ; + do + show + ( + ) + ; + return + ; + } + 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/projects/11/Pong/Keyboard.jack b/projects/11/Pong/Keyboard.jack new file mode 100644 index 0000000..d0e4022 --- /dev/null +++ b/projects/11/Pong/Keyboard.jack @@ -0,0 +1,92 @@ +// 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 { + + static Array kbd; + + /** Initializes the keyboard. */ + function void init() { + let kbd = 24576; + return; + } + + /** + * 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() { + return kbd[0]; + } + + /** + * 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() { + var char key; + while(kbd[0] = 0) {} + let key = kbd[0]; + do Output.printChar(key); + while(kbd[0] = key) {} + return key; + } + + /** + * 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) { + var String str; + var char chr; + let str = String.new(32); + do Output.printString(message); + while (true) { + let chr = Keyboard.readChar(); + if(chr = 128) { + return str; + } + if(chr = 129) { + do str.eraseLastChar(); + } else { + let str = str.appendChar(chr); + } + } + return str; + } + + /** + * 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) { + var String str; + let str = Keyboard.readLine(message); + return str.intValue(); + } +} diff --git a/projects/11/Pong/Keyboard.vm b/projects/11/Pong/Keyboard.vm new file mode 100644 index 0000000..91da157 --- /dev/null +++ b/projects/11/Pong/Keyboard.vm @@ -0,0 +1,98 @@ +function Keyboard.init 0 +push constant 24576 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 1 +label WHILE_EXP0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP1 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +eq +not +if-goto WHILE_END1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +return +function Keyboard.readLine 2 +push constant 32 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 1 +push local 1 +push constant 128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +return +label IF_FALSE0 +push local 1 +push constant 129 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 1 +call String.appendChar 2 +pop local 0 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Keyboard.readInt 1 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +return diff --git a/projects/11/Pong/Main.jack b/projects/11/Pong/Main.jack new file mode 100644 index 0000000..56e9a83 --- /dev/null +++ b/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/projects/11/Pong/Main.vm b/projects/11/Pong/Main.vm new file mode 100644 index 0000000..94d76d7 --- /dev/null +++ b/projects/11/Pong/Main.vm @@ -0,0 +1,13 @@ +function Main.main 1 +call PongGame.newInstance 0 +pop temp 0 +call PongGame.getInstance 0 +pop local 0 +push local 0 +call PongGame.run 1 +pop temp 0 +push local 0 +call PongGame.dispose 1 +pop temp 0 +push constant 0 +return diff --git a/projects/11/Pong/Main.xml b/projects/11/Pong/Main.xml new file mode 100644 index 0000000..310f4f3 --- /dev/null +++ b/projects/11/Pong/Main.xml @@ -0,0 +1,72 @@ + + class + Main + { + + void + main + ( + + + ) + + { + + var + PongGame + game + ; + + + + do + PongGame + . + newInstance + ( + ) + ; + + + let + game + = + + + PongGame + . + getInstance + ( + ) + + + ; + + + do + game + . + run + ( + ) + ; + + + do + game + . + dispose + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/11/Pong/MainT.xml b/projects/11/Pong/MainT.xml new file mode 100644 index 0000000..7dcfbe6 --- /dev/null +++ b/projects/11/Pong/MainT.xml @@ -0,0 +1,49 @@ + + class + Main + { + function + void + main + ( + ) + { + var + PongGame + game + ; + do + PongGame + . + newInstance + ( + ) + ; + let + game + = + PongGame + . + getInstance + ( + ) + ; + do + game + . + run + ( + ) + ; + do + game + . + dispose + ( + ) + ; + return + ; + } + } + diff --git a/projects/11/Pong/Math.jack b/projects/11/Pong/Math.jack new file mode 100644 index 0000000..ed50f54 --- /dev/null +++ b/projects/11/Pong/Math.jack @@ -0,0 +1,142 @@ +// 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 { + + static Array twoToThe; + + /** Initializes the library. */ + function void init() { + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x < 0) { + return -x; + } else { + return 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) { + var int sum, shiftedX, i; + let sum = 0; + let shiftedX = x; + let i = 0; + while (i < 16) { + if(Math.bit(y, i)) { + let sum = sum + shiftedX; + } + let shiftedX = shiftedX + shiftedX; + let i = i + 1; + } + return sum; + } + + /** 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) { + var int q, tres; + if(x < 0 & y < 0) { + return Math.divide(Math.abs(x), Math.abs(y)); + } + if(x < 0 | y < 0) { + return -Math.divide(Math.abs(x), Math.abs(y)); + } + if(y > x) { + return 0; + } + if(y < 0) { + return 0; + } + let q = Math.divide(x, 2 * y); + if((x - (2 * q * y)) < y) { + return 2 * q; + } else { + return 2 * q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int y, j; + let y = 0; + let j = 7; + while(j > -1) { + if (~((Math.pow((y + Math.pow(2, j)), 2) > x)) & (Math.pow((y + Math.pow(2, j)), 2) > 0)) { + let y = y + Math.pow(2, j); + } + let j = j - 1; + } + return y; + } + + function int pow(int x, int p) { + var int r, i; + let i = 0; + let r = 1; + while (i < p) { + let r = r * x; + let i = i + 1; + } + return r; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if(a > b) { + return a; + } else { + return b; + } + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if(a > b) { + return b; + } else { + return a; + } + } +} diff --git a/projects/11/Pong/Math.vm b/projects/11/Pong/Math.vm new file mode 100644 index 0000000..e03fd3e --- /dev/null +++ b/projects/11/Pong/Math.vm @@ -0,0 +1,394 @@ +function Math.init 0 +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Math.bit 0 +push argument 0 +push argument 1 +push static 0 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 +function Math.multiply 3 +push constant 0 +pop local 0 +push argument 0 +pop local 1 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 16 +lt +not +if-goto WHILE_END0 +push argument 1 +push local 2 +call Math.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 1 +add +pop local 0 +label IF_FALSE0 +push local 1 +push local 1 +add +pop local 1 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.divide 2 +push argument 0 +push constant 0 +lt +push argument 1 +and +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +return +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +or +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +neg +return +label IF_FALSE1 +push argument 1 +push argument 0 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +return +label IF_FALSE3 +push argument 0 +push constant 2 +push argument 1 +call Math.multiply 2 +call Math.divide 2 +pop local 0 +push argument 0 +push constant 2 +push local 0 +call Math.multiply 2 +push argument 1 +call Math.multiply 2 +sub +push argument 1 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 2 +push local 0 +call Math.multiply 2 +return +goto IF_END4 +label IF_FALSE4 +push constant 2 +push local 0 +call Math.multiply 2 +push constant 1 +add +return +label IF_END4 +function Math.sqrt 2 +push constant 0 +pop local 0 +push constant 7 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push argument 0 +gt +not +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push constant 0 +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +pop local 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.pow 2 +push constant 0 +pop local 1 +push constant 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push argument 1 +lt +not +if-goto WHILE_END0 +push local 0 +push argument 0 +call Math.multiply 2 +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +return +label IF_END0 +function Math.min 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 diff --git a/projects/11/Pong/Memory.jack b/projects/11/Pong/Memory.jack new file mode 100644 index 0000000..7edeee6 --- /dev/null +++ b/projects/11/Pong/Memory.jack @@ -0,0 +1,73 @@ +// 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 { + + static Array memory; + static Array heap; + static Array freeList; + + /** Initializes the class. */ + function void init() { + let memory = 0; + let heap = 2048; + let freeList = 2048; + let heap[0] = 0; + let heap[1] = 14335; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return memory[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let memory[address] = value; + return; + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + var Array curList, found; + let curList = freeList; + while (curList > 0) { + if (curList[1] > (size + 1)) { + do Memory.poke(8010, 1); + let found = curList + curList[1] - size; + let curList[1] = curList[1] - size - 2; + let found[0] = 0; + let found[1] = size; + return found; + } else { + let curList = curList[0]; + } + } + return 0; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array curList; + let curList = freeList; + if(curList = 0) { + let freeList = o; + return; + } + while (curList[0] > 0) { + let curList = curList[0]; + } + let curList = o; + return; + } +} diff --git a/projects/11/Pong/Memory.vm b/projects/11/Pong/Memory.vm new file mode 100644 index 0000000..8b513e9 --- /dev/null +++ b/projects/11/Pong/Memory.vm @@ -0,0 +1,161 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +pop static 1 +push constant 2048 +pop static 2 +push constant 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 1 +add +push constant 14335 +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 static 2 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 1 +add +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8010 +push constant 1 +call Memory.poke 2 +pop temp 0 +push local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +add +push argument 0 +sub +pop local 1 +push constant 1 +push local 0 +add +push constant 1 +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 0 +push local 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Memory.deAlloc 1 +push static 2 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop static 2 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push argument 0 +pop local 0 +push constant 0 +return diff --git a/projects/11/Pong/Output.jack b/projects/11/Pong/Output.jack new file mode 100644 index 0000000..21629b7 --- /dev/null +++ b/projects/11/Pong/Output.jack @@ -0,0 +1,288 @@ +// 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; + static int hPos, vPos; + static Array twoToThe; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + let hPos = 0; + let vPos = 0; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + do Output.initMap(); + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + // 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,12,30,51,51,51,63,51,51,51,0,0); // A + 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) { + let hPos = j; + let vPos = i; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array map; + var int i, j; + let i = 0; + let j = 0; + let map = Output.getMap(c); + while (i < 11) { + while (j < 8) { + if(Output.bit(map[i], j)) { + do Screen.setColor(true); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } else { + do Screen.setColor(false); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } + let j = j + 1; + } + let i = i + 1; + let j = 0; + } + let hPos = hPos + 1; + if(hPos > 63) { + let hPos = 0; + let vPos = vPos + 1; + } + if(vPos > 22) { + let vPos = 0; + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int l; + let l = 0; + while (l < s.length()) { + do Output.printChar(s.charAt(l)); + let l = l + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String intstr; + let intstr = String.new(6); + do intstr.setInt(i); + do Output.printString(intstr); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + let vPos = vPos + 1; + if(vPos > 22) { + let vPos = 0; + } + let hPos = 0; + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + let hPos = hPos - 1; + if (hPos < 0) { + let hPos = 0; + } + return; + } +} diff --git a/projects/11/Pong/Output.vm b/projects/11/Pong/Output.vm new file mode 100644 index 0000000..0b6f718 --- /dev/null +++ b/projects/11/Pong/Output.vm @@ -0,0 +1,1818 @@ +function Output.init 0 +push constant 0 +pop static 1 +push constant 0 +pop static 2 +push constant 16 +call Array.new 1 +pop static 3 +push constant 0 +push static 3 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 3 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 3 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 3 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 3 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 3 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 3 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 3 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 3 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 3 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 3 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 3 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 3 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 3 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 3 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 3 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +call Output.initMap 0 +pop temp 0 +push constant 0 +return +function Output.bit 0 +push argument 0 +push argument 1 +push static 3 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +function Output.initMap 1 +push constant 127 +call Array.new 1 +pop static 0 +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 51 +push constant 63 +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 0 +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.getMap 0 +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 argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Output.moveCursor 0 +push argument 1 +pop static 1 +push argument 0 +pop static 2 +push constant 0 +return +function Output.printChar 3 +push constant 0 +pop local 1 +push constant 0 +pop local 2 +push argument 0 +call Output.getMap 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 2 +push constant 8 +lt +not +if-goto WHILE_END1 +push local 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 2 +call Output.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push constant 1 +add +pop local 1 +push constant 0 +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push static 1 +push constant 1 +add +pop static 1 +push static 1 +push constant 63 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop static 1 +push static 2 +push constant 1 +add +pop static 2 +label IF_FALSE1 +push static 2 +push constant 22 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +pop static 2 +label IF_FALSE2 +push constant 0 +return +function Output.printString 1 +push constant 0 +pop local 0 +label WHILE_EXP0 +push local 0 +push argument 0 +call String.length 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 1 +push constant 6 +call String.new 1 +pop local 0 +push local 0 +push argument 0 +call String.setInt 2 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 2 +push constant 1 +add +pop static 2 +push static 2 +push constant 22 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 2 +label IF_FALSE0 +push constant 0 +pop static 1 +push constant 0 +return +function Output.backSpace 0 +push static 1 +push constant 1 +sub +pop static 1 +push static 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 1 +label IF_FALSE0 +push constant 0 +return diff --git a/projects/11/Pong/PongGame.jack b/projects/11/Pong/PongGame.jack new file mode 100644 index 0000000..20fe2d3 --- /dev/null +++ b/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/projects/11/Pong/PongGame.vm b/projects/11/Pong/PongGame.vm new file mode 100644 index 0000000..5bb75ec --- /dev/null +++ b/projects/11/Pong/PongGame.vm @@ -0,0 +1,318 @@ +function PongGame.new 0 +push constant 7 +call Memory.alloc 1 +pop pointer 0 +call Screen.clearScreen 0 +pop temp 0 +push constant 50 +pop this 6 +push constant 230 +push constant 229 +push this 6 +push constant 7 +call Bat.new 4 +pop this 0 +push constant 253 +push constant 222 +push constant 0 +push constant 511 +push constant 0 +push constant 229 +call Ball.new 6 +pop this 1 +push this 1 +push constant 400 +push constant 0 +call Ball.setDestination 3 +pop temp 0 +push constant 0 +push constant 238 +push constant 511 +push constant 240 +call Screen.drawRectangle 4 +pop temp 0 +push constant 22 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 8 +call String.new 1 +push constant 83 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push constant 0 +pop this 3 +push constant 0 +pop this 4 +push constant 0 +pop this 2 +push constant 0 +pop this 5 +push pointer 0 +return +function PongGame.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +call Bat.dispose 1 +pop temp 0 +push this 1 +call Ball.dispose 1 +pop temp 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function PongGame.newInstance 0 +call PongGame.new 0 +pop static 0 +push constant 0 +return +function PongGame.getInstance 0 +push static 0 +return +function PongGame.run 1 +push argument 0 +pop pointer 0 +label WHILE_EXP0 +push this 3 +not +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +push this 3 +not +and +not +if-goto WHILE_END1 +call Keyboard.keyPressed 0 +pop local 0 +push this 0 +call Bat.move 1 +pop temp 0 +push pointer 0 +call PongGame.moveBall 1 +pop temp 0 +push constant 50 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +push constant 130 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 0 +push constant 1 +call Bat.setDirection 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push local 0 +push constant 132 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push this 0 +push constant 2 +call Bat.setDirection 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push constant 140 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +not +pop this 3 +label IF_FALSE2 +label IF_END1 +label IF_END0 +label WHILE_EXP2 +push local 0 +push constant 0 +eq +not +push this 3 +not +and +not +if-goto WHILE_END2 +call Keyboard.keyPressed 0 +pop local 0 +push this 0 +call Bat.move 1 +pop temp 0 +push pointer 0 +call PongGame.moveBall 1 +pop temp 0 +push constant 50 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP2 +label WHILE_END2 +goto WHILE_EXP0 +label WHILE_END0 +push this 3 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 10 +push constant 27 +call Output.moveCursor 2 +pop temp 0 +push constant 9 +call String.new 1 +push constant 71 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 79 +call String.appendChar 2 +push constant 118 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +label IF_FALSE3 +push constant 0 +return +function PongGame.moveBall 5 +push argument 0 +pop pointer 0 +push this 1 +call Ball.move 1 +pop this 2 +push this 2 +push constant 0 +gt +push this 2 +push this 5 +eq +not +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 2 +pop this 5 +push constant 0 +pop local 0 +push this 0 +call Bat.getLeft 1 +pop local 1 +push this 0 +call Bat.getRight 1 +pop local 2 +push this 1 +call Ball.getLeft 1 +pop local 3 +push this 1 +call Ball.getRight 1 +pop local 4 +push this 2 +push constant 4 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +push local 4 +gt +push local 2 +push local 3 +lt +or +pop this 3 +push this 3 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 4 +push local 1 +push constant 10 +add +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 1 +neg +pop local 0 +goto IF_END3 +label IF_FALSE3 +push local 3 +push local 2 +push constant 10 +sub +gt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 1 +pop local 0 +label IF_FALSE4 +label IF_END3 +push this 6 +push constant 2 +sub +pop this 6 +push this 0 +push this 6 +call Bat.setWidth 2 +pop temp 0 +push this 4 +push constant 1 +add +pop this 4 +push constant 22 +push constant 7 +call Output.moveCursor 2 +pop temp 0 +push this 4 +call Output.printInt 1 +pop temp 0 +label IF_FALSE2 +label IF_FALSE1 +push this 1 +push local 0 +call Ball.bounce 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +return diff --git a/projects/11/Pong/PongGame.xml b/projects/11/Pong/PongGame.xml new file mode 100644 index 0000000..da89d52 --- /dev/null +++ b/projects/11/Pong/PongGame.xml @@ -0,0 +1,1035 @@ + + class + PongGame + { + + static + PongGame + instance + ; + + + field + Bat + bat + ; + + + field + Ball + ball + ; + + + field + int + wall + ; + + + field + boolean + exit + ; + + + field + int + score + ; + + + field + int + lastWall + ; + + + field + int + batWidth + ; + + + PongGame + new + ( + + + ) + + { + + + do + Screen + . + clearScreen + ( + ) + ; + + + let + batWidth + = + + + 50 + + + ; + + + let + bat + = + + + Bat + . + new + ( + ) + + + ; + + + let + ball + = + + + Ball + . + new + ( + ) + + + ; + + + do + ball + . + setDestination + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + do + Output + . + moveCursor + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + let + exit + = + + + false + + + ; + + + let + score + = + + + 0 + + + ; + + + let + wall + = + + + 0 + + + ; + + + let + lastWall + = + + + 0 + + + ; + + + return + + + this + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + bat + . + dispose + ( + ) + ; + + + do + ball + . + dispose + ( + ) + ; + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + void + newInstance + ( + + + ) + + { + + + let + instance + = + + + PongGame + . + new + ( + ) + + + ; + + + return + ; + + + } + + + + PongGame + getInstance + ( + + + ) + + { + + + return + + + instance + + + ; + + + } + + + + void + run + ( + + + ) + + { + + var + char + key + ; + + + + while + ( + + + ~ + + exit + + + + ) + { + + + while + ( + + + ( + + + key + + = + + 0 + + + ) + + & + + ( + + + ~ + + exit + + + + ) + + + ) + { + + + let + key + = + + + Keyboard + . + keyPressed + ( + ) + + + ; + + + do + bat + . + move + ( + ) + ; + + + do + moveBall + ( + ) + ; + + + do + Sys + . + wait + ( + ) + ; + + + } + + + if + ( + + + key + + = + + 130 + + + ) + { + + + do + bat + . + setDirection + ( + ) + ; + + + } + else + { + + + if + ( + + + key + + = + + 132 + + + ) + { + + + do + bat + . + setDirection + ( + ) + ; + + + } + else + { + + + if + ( + + + key + + = + + 140 + + + ) + { + + + let + exit + = + + + true + + + ; + + + } + + + } + + + } + + + while + ( + + + ( + + + ~ + + ( + + + key + + = + + 0 + + + ) + + + + ) + + & + + ( + + + ~ + + exit + + + + ) + + + ) + { + + + let + key + = + + + Keyboard + . + keyPressed + ( + ) + + + ; + + + do + bat + . + move + ( + ) + ; + + + do + moveBall + ( + ) + ; + + + do + Sys + . + wait + ( + ) + ; + + + } + + + } + + + if + ( + + + exit + + + ) + { + + + do + Output + . + moveCursor + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + } + + + return + ; + + + } + + + + 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 + ( + ) + ; + + + let + score + = + + + score + + + + + 1 + + + ; + + + do + Output + . + moveCursor + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + } + + + } + + + do + ball + . + bounce + ( + ) + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/11/Pong/PongGameT.xml b/projects/11/Pong/PongGameT.xml new file mode 100644 index 0000000..4d0fdc9 --- /dev/null +++ b/projects/11/Pong/PongGameT.xml @@ -0,0 +1,614 @@ + + class + PongGame + { + static + PongGame + instance + ; + field + Bat + bat + ; + field + Ball + ball + ; + field + int + wall + ; + field + boolean + exit + ; + field + int + score + ; + field + int + lastWall + ; + field + int + batWidth + ; + constructor + PongGame + new + ( + ) + { + do + Screen + . + clearScreen + ( + ) + ; + let + batWidth + = + 50 + ; + 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 + ; + } + method + void + dispose + ( + ) + { + do + bat + . + dispose + ( + ) + ; + do + ball + . + dispose + ( + ) + ; + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + function + void + newInstance + ( + ) + { + let + instance + = + PongGame + . + new + ( + ) + ; + return + ; + } + function + PongGame + getInstance + ( + ) + { + return + instance + ; + } + method + void + run + ( + ) + { + var + char + key + ; + while + ( + ~ + exit + ) + { + 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 + ; + } + } + } + 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 + ; + } + 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 + ; + } + } + diff --git a/projects/11/Pong/Screen.jack b/projects/11/Pong/Screen.jack new file mode 100644 index 0000000..79e1ae2 --- /dev/null +++ b/projects/11/Pong/Screen.jack @@ -0,0 +1,162 @@ +// 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/Screen.jack + +/** + * A library of functions for displaying graphics on the screen. + * The Hack physical screen consists of 512 rows (indexed 0..511, top to bottom) + * of 256 pixels each (indexed 0..255, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + static Array twoToThe; + static boolean color; + + /** Initializes the Screen. */ + function void init() { + let color = true; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int x, y; + var boolean prevColor; + let x = 0; + let y = 0; + let prevColor = color; + let color = false; + while (x < 256) { + while (y < 512) { + do Screen.drawPixel(x, y); + let y = y + 1; + } + let x = x + 1; + } + let color = prevColor; + return; + } + + /** Sets the current color, to be used for all subsequent drawXXX commands. + * Black is represented by true, white by false. */ + function void setColor(boolean b) { + let color = b; + return; + } + + /** Draws the (x,y) pixel, using the current color. */ + function void drawPixel(int x, int y) { + var Array address, value; + let address = (32 * y) + (x/16); + let value = Memory.peek(16384 + address); + if(color) { + let value = value | twoToThe[x & 15]; + } else { + let value = value & (~(twoToThe[x & 15])); + } + do Memory.poke(16384 + address, value); + return; + } + + /** Draws a line from pixel (x1,y1) to pixel (x2,y2), using the current color. */ + function void drawLine(int x1, int y1, int x2, int y2) { + var int dx, dy, a, b, diff; + let dx = x2-x1; + let dy = y2-y1; + let a = 0; + let b = 0; + let diff = 0; + if(dx = 0) { + while(~(dy = 0)) { + do Screen.drawPixel(x1, y1 + dy); + if(dy > 0) { + let dy = dy - 1; + } else { + let dy = dy + 1; + } + } + return; + } + if(dy = 0) { + while(~(dx = 0)) { + do Screen.drawPixel(x1 + dx, y1); + if (dx > 0) { + let dx = dx - 1; + } else { + let dx = dx + 1; + } + } + return; + } + while((~(Math.abs(a) > Math.abs(dx))) & (~(Math.abs(b) > Math.abs(dy)))) { + do Screen.drawPixel(x1 + a, y1 + b); + if(diff < 0) { + if(dx > 0) { + let a = a + 1; + } + if(dx < 0) { + let a = a - 1; + } + let diff = diff + Math.abs(dy); + } else { + if(dy > 0) { + let b = b + 1; + } + if(dy < 0) { + let b = b - 1; + } + let diff = diff - Math.abs(dx); + } + } + return; + } + + /** Draws a filled rectangle whose top left corner is (x1, y1) + * and bottom right corner is (x2,y2), using the current color. */ + function void drawRectangle(int x1, int y1, int x2, int y2) { + var int dy; + let dy = y2 - y1; + while(~(Math.abs(dy) = 0)) { + if (dy > 0) { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy - 1; + } else { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy + 1; + } + } + return; + } + + /** Draws a filled circle of radius r<=181 around (x,y), using the current color. */ + function void drawCircle(int x, int y, int r) { + var int dy; + let dy = -r; + if (r > 181) { + return; + } + while(dy < (r + 1)) { + do Screen.drawLine(x-Math.sqrt((r*r)-(dy*dy)),y + dy,x+Math.sqrt((r*r)-(dy*dy)),y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/11/Pong/Screen.vm b/projects/11/Pong/Screen.vm new file mode 100644 index 0000000..a89b523 --- /dev/null +++ b/projects/11/Pong/Screen.vm @@ -0,0 +1,534 @@ +function Screen.init 0 +push constant 0 +not +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Screen.clearScreen 3 +push constant 0 +pop local 0 +push constant 0 +pop local 1 +push static 1 +pop local 2 +push constant 0 +pop static 1 +label WHILE_EXP0 +push local 0 +push constant 256 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 1 +push constant 512 +lt +not +if-goto WHILE_END1 +push local 0 +push local 1 +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 2 +pop static 1 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 1 +push constant 0 +return +function Screen.drawPixel 2 +push constant 32 +push argument 1 +call Math.multiply 2 +push argument 0 +push constant 16 +call Math.divide 2 +add +pop local 0 +push constant 16384 +push local 0 +add +call Memory.peek 1 +pop local 1 +push static 1 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +or +pop local 1 +goto IF_END0 +label IF_FALSE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +not +and +pop local 1 +label IF_END0 +push constant 16384 +push local 0 +add +push local 1 +call Memory.poke 2 +pop temp 0 +push constant 0 +return +function Screen.drawLine 5 +push argument 2 +push argument 0 +sub +pop local 0 +push argument 3 +push argument 1 +sub +pop local 1 +push constant 0 +pop local 2 +push constant 0 +pop local 3 +push constant 0 +pop local 4 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push argument 0 +push argument 1 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +push constant 1 +sub +pop local 1 +goto IF_END1 +label IF_FALSE1 +push local 1 +push constant 1 +add +pop local 1 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +label IF_FALSE0 +push local 1 +push constant 0 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +not +not +if-goto WHILE_END1 +push argument 0 +push local 0 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END3 +label IF_FALSE3 +push local 0 +push constant 1 +add +pop local 0 +label IF_END3 +goto WHILE_EXP1 +label WHILE_END1 +push constant 0 +return +label IF_FALSE2 +label WHILE_EXP2 +push local 2 +call Math.abs 1 +push local 0 +call Math.abs 1 +gt +not +push local 3 +call Math.abs 1 +push local 1 +call Math.abs 1 +gt +not +and +not +if-goto WHILE_END2 +push argument 0 +push local 2 +add +push argument 1 +push local 3 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 0 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 0 +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 2 +push constant 1 +add +pop local 2 +label IF_FALSE5 +push local 0 +push constant 0 +lt +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push local 2 +push constant 1 +sub +pop local 2 +label IF_FALSE6 +push local 4 +push local 1 +call Math.abs 1 +add +pop local 4 +goto IF_END4 +label IF_FALSE4 +push local 1 +push constant 0 +gt +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push local 3 +push constant 1 +add +pop local 3 +label IF_FALSE7 +push local 1 +push constant 0 +lt +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push local 3 +push constant 1 +sub +pop local 3 +label IF_FALSE8 +push local 4 +push local 0 +call Math.abs 1 +sub +pop local 4 +label IF_END4 +goto WHILE_EXP2 +label WHILE_END2 +push constant 0 +return +function Screen.drawRectangle 1 +push argument 3 +push argument 1 +sub +pop local 0 +label WHILE_EXP0 +push local 0 +call Math.abs 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawCircle 1 +push argument 2 +neg +pop local 0 +push argument 2 +push constant 181 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push local 0 +push argument 2 +push constant 1 +add +lt +not +if-goto WHILE_END0 +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +sub +push argument 1 +push local 0 +add +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +add +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/11/Pong/String.jack b/projects/11/Pong/String.jack new file mode 100644 index 0000000..6a1ab29 --- /dev/null +++ b/projects/11/Pong/String.jack @@ -0,0 +1,136 @@ +// 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 { + + field Array str; + field int length; + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + if(maxLength > 0) { + let str = Array.new(maxLength); + } else { + let str = 0; + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Returns the current length of this string. */ + method int length() { + return length; + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + let str[length - 1] = 0; + let length = length - 1; + return; + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + var int val, i, d; + var boolean neg; + let i = 0; + if(str[i] = 45) { + let neg = true; + let i = 1; + } + while(i < length) { + let d = str[i] - 48; + let val = val * 10 + d; + let i = i + 1; + } + if(neg) { + return -val; + } + return val; + } + + function String int2String(int val) { + var String string; + var int lastDigit, c; + let string = String.new(64); + let lastDigit = val - ((val / 10) * 10); + let c = lastDigit + 48; + if(val < 10) { + do string.appendChar(c); + return string; + } else { + do string.dispose(); + let string = String.int2String(val / 10); + do string.appendChar(c); + return string; + } + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var String temp; + var int i; + let length = 0; + if(val < 0) { + do appendChar(45); + } + let i = 0; + let temp = String.int2String(Math.abs(val)); + while(i < temp.length()) { + do appendChar(temp.charAt(i)); + let i = i + 1; + } + do temp.dispose(); + return; + } + + /** Returns the new line character. */ + function char newLine() { + return 128; + } + + /** Returns the backspace character. */ + function char backSpace() { + return 129; + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + return 34; + } +} diff --git a/projects/11/Pong/String.vm b/projects/11/Pong/String.vm new file mode 100644 index 0000000..5c65675 --- /dev/null +++ b/projects/11/Pong/String.vm @@ -0,0 +1,250 @@ +function String.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Array.new 1 +pop this 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 0 +label IF_END0 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +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 1 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +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 1 +push this 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +add +pop this 1 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +sub +push this 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +sub +pop this 1 +push constant 0 +return +function String.intValue 4 +push argument 0 +pop pointer 0 +push constant 0 +pop local 1 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +pop local 3 +push constant 1 +pop local 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 1 +push this 1 +lt +not +if-goto WHILE_END0 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 0 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +neg +return +label IF_FALSE1 +push local 0 +return +function String.int2String 3 +push constant 64 +call String.new 1 +pop local 0 +push argument 0 +push argument 0 +push constant 10 +call Math.divide 2 +push constant 10 +call Math.multiply 2 +sub +pop local 1 +push local 1 +push constant 48 +add +pop local 2 +push argument 0 +push constant 10 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +goto IF_END0 +label IF_FALSE0 +push local 0 +call String.dispose 1 +pop temp 0 +push argument 0 +push constant 10 +call Math.divide 2 +call String.int2String 1 +pop local 0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +label IF_END0 +function String.setInt 2 +push argument 0 +pop pointer 0 +push constant 0 +pop this 1 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push pointer 0 +push constant 45 +call String.appendChar 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +pop local 1 +push argument 1 +call Math.abs 1 +call String.int2String 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push local 0 +call String.length 1 +lt +not +if-goto WHILE_END0 +push pointer 0 +push local 0 +push local 1 +call String.charAt 2 +call String.appendChar 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +call String.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/projects/11/Pong/Sys.jack b/projects/11/Pong/Sys.jack new file mode 100644 index 0000000..3aea36b --- /dev/null +++ b/projects/11/Pong/Sys.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/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + do Memory.init(); + do Math.init(); + do Screen.init(); + do Output.init(); + do Keyboard.init(); + do Main.main(); + do Sys.halt(); + return; + } + + /** Halts the program execution. */ + function void halt() { + while(true){} + return; + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + let i = 10000; + while(i > 0) { + let i = i - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + do Output.printString("ERR"); + do Output.printInt(errorCode); + do Sys.halt(); + return; + } +} diff --git a/projects/11/Pong/Sys.vm b/projects/11/Pong/Sys.vm new file mode 100644 index 0000000..05b7a18 --- /dev/null +++ b/projects/11/Pong/Sys.vm @@ -0,0 +1,62 @@ +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 constant 10000 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 3 +call String.new 1 +push constant 69 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +call Output.printString 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/projects/11/Seven/Main.jack b/projects/11/Seven/Main.jack new file mode 100644 index 0000000..6f501c0 --- /dev/null +++ b/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/projects/11/Seven/Main.vm b/projects/11/Seven/Main.vm new file mode 100644 index 0000000..78b8418 --- /dev/null +++ b/projects/11/Seven/Main.vm @@ -0,0 +1,8 @@ +function Main.main 0 +push constant 1 +push constant 2 +push constant 3 +call Math.multiply 2 +add +call Output.printInt 1 +return diff --git a/projects/11/Seven/Main.xml b/projects/11/Seven/Main.xml new file mode 100644 index 0000000..74af8d7 --- /dev/null +++ b/projects/11/Seven/Main.xml @@ -0,0 +1,34 @@ + + class + Main + { + + function + void + main + ( + + + ) + + { + + + do + Output + . + printInt + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/11/Seven/MainT.xml b/projects/11/Seven/MainT.xml new file mode 100644 index 0000000..f1c2c2f --- /dev/null +++ b/projects/11/Seven/MainT.xml @@ -0,0 +1,29 @@ + + class + Main + { + function + void + main + ( + ) + { + do + Output + . + printInt + ( + 1 + + + ( + 2 + * + 3 + ) + ) + ; + return + ; + } + } + diff --git a/projects/11/Square/Main.jack b/projects/11/Square/Main.jack new file mode 100644 index 0000000..a1933d9 --- /dev/null +++ b/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/projects/11/Square/Main.vm b/projects/11/Square/Main.vm new file mode 100644 index 0000000..a3b355b --- /dev/null +++ b/projects/11/Square/Main.vm @@ -0,0 +1,11 @@ +function Main.main 1 +call SquareGame.new 0 +pop local 0 +push local 0 +call SquareGame.run 1 +pop temp 0 +push local 0 +call SquareGame.dispose 1 +pop temp 0 +push constant 0 +return diff --git a/projects/11/Square/Main.xml b/projects/11/Square/Main.xml new file mode 100644 index 0000000..25c05ea --- /dev/null +++ b/projects/11/Square/Main.xml @@ -0,0 +1,63 @@ + + class + Main + { + + void + main + ( + + + ) + + { + + var + SquareGame + game + ; + + + + let + game + = + + + SquareGame + . + new + ( + ) + + + ; + + + do + game + . + run + ( + ) + ; + + + do + game + . + dispose + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/11/Square/MainT.xml b/projects/11/Square/MainT.xml new file mode 100644 index 0000000..622b5d0 --- /dev/null +++ b/projects/11/Square/MainT.xml @@ -0,0 +1,42 @@ + + class + Main + { + function + void + main + ( + ) + { + var + SquareGame + game + ; + let + game + = + SquareGame + . + new + ( + ) + ; + do + game + . + run + ( + ) + ; + do + game + . + dispose + ( + ) + ; + return + ; + } + } + diff --git a/projects/11/Square/Square.jack b/projects/11/Square/Square.jack new file mode 100644 index 0000000..5a92838 --- /dev/null +++ b/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/projects/11/Square/Square.vm b/projects/11/Square/Square.vm new file mode 100644 index 0000000..415d5af --- /dev/null +++ b/projects/11/Square/Square.vm @@ -0,0 +1,310 @@ +function Square.new 0 +push constant 3 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 2 +push pointer 0 +call Square.draw 1 +pop temp 0 +push pointer 0 +return +function Square.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function Square.draw 0 +push argument 0 +pop pointer 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Square.erase 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Square.incSize 0 +push argument 0 +pop pointer 0 +push this 1 +push this 2 +add +push constant 254 +lt +push this 0 +push this 2 +add +push constant 510 +lt +and +not +if-goto IF10 +push pointer 0 +call Square.erase 1 +pop temp 0 +push this 2 +push constant 2 +add +pop this 2 +push pointer 0 +call Square.draw 1 +pop temp 0 +goto IF11 +label IF10 +label IF11 +push constant 0 +return +function Square.decSize 0 +push argument 0 +pop pointer 0 +push this 2 +push constant 2 +gt +not +if-goto IF20 +push pointer 0 +call Square.erase 1 +pop temp 0 +push this 2 +push constant 2 +sub +pop this 2 +push pointer 0 +call Square.draw 1 +pop temp 0 +goto IF21 +label IF20 +label IF21 +push constant 0 +return +function Square.moveUp 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +gt +not +if-goto IF30 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +add +push constant 1 +sub +push this 0 +push this 2 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +push this 1 +push constant 2 +sub +pop this 1 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push constant 1 +add +call Screen.drawRectangle 4 +pop temp 0 +goto IF31 +label IF30 +label IF31 +push constant 0 +return +function Square.moveDown 0 +push argument 0 +pop pointer 0 +push this 1 +push this 2 +add +push constant 254 +lt +not +if-goto IF40 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push constant 1 +add +call Screen.drawRectangle 4 +pop temp 0 +push this 1 +push constant 2 +add +pop this 1 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +add +push constant 1 +sub +push this 0 +push this 2 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +goto IF41 +label IF40 +label IF41 +push constant 0 +return +function Square.moveLeft 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 1 +gt +not +if-goto IF50 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 2 +add +push constant 1 +sub +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +push this 0 +push constant 2 +sub +pop this 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push constant 1 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +goto IF51 +label IF50 +label IF51 +push constant 0 +return +function Square.moveRight 0 +push argument 0 +pop pointer 0 +push this 0 +push this 2 +add +push constant 510 +lt +not +if-goto IF60 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push constant 1 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +push this 0 +push constant 2 +add +pop this 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 2 +add +push constant 1 +sub +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 2 +add +call Screen.drawRectangle 4 +pop temp 0 +goto IF61 +label IF60 +label IF61 +push constant 0 +return diff --git a/projects/11/Square/Square.xml b/projects/11/Square/Square.xml new file mode 100644 index 0000000..bebe305 --- /dev/null +++ b/projects/11/Square/Square.xml @@ -0,0 +1,728 @@ + + class + Square + { + + field + int + x + , + y + ; + + + field + int + size + ; + + + Square + new + ( + + int + Ax + , + int + Ay + , + int + Asize + + ) + + { + + + let + x + = + + + Ax + + + ; + + + let + y + = + + + Ay + + + ; + + + let + size + = + + + Asize + + + ; + + + do + draw + ( + ) + ; + + + return + + + this + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + void + draw + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + void + erase + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + void + incSize + ( + + + ) + + { + + + if + ( + + + ( + + + ( + + + y + + + + + size + + + ) + + < + + 254 + + + ) + + & + + ( + + + ( + + + x + + + + + size + + + ) + + < + + 510 + + + ) + + + ) + { + + + do + erase + ( + ) + ; + + + let + size + = + + + size + + + + + 2 + + + ; + + + do + draw + ( + ) + ; + + + } + + + return + ; + + + } + + + + void + decSize + ( + + + ) + + { + + + if + ( + + + size + + > + + 2 + + + ) + { + + + do + erase + ( + ) + ; + + + let + size + = + + + size + + - + + 2 + + + ; + + + do + draw + ( + ) + ; + + + } + + + return + ; + + + } + + + + void + moveUp + ( + + + ) + + { + + + if + ( + + + y + + > + + 1 + + + ) + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + let + y + = + + + y + + - + + 2 + + + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + + + return + ; + + + } + + + + void + moveDown + ( + + + ) + + { + + + if + ( + + + ( + + + y + + + + + size + + + ) + + < + + 254 + + + ) + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + let + y + = + + + y + + + + + 2 + + + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + + + return + ; + + + } + + + + void + moveLeft + ( + + + ) + + { + + + if + ( + + + x + + > + + 1 + + + ) + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + let + x + = + + + x + + - + + 2 + + + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + + + return + ; + + + } + + + + void + moveRight + ( + + + ) + + { + + + if + ( + + + ( + + + x + + + + + size + + + ) + + < + + 510 + + + ) + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + let + x + = + + + x + + + + + 2 + + + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/11/Square/SquareGame.jack b/projects/11/Square/SquareGame.jack new file mode 100644 index 0000000..e8592ee --- /dev/null +++ b/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/projects/11/Square/SquareGame.vm b/projects/11/Square/SquareGame.vm new file mode 100644 index 0000000..19e8290 --- /dev/null +++ b/projects/11/Square/SquareGame.vm @@ -0,0 +1,190 @@ +function SquareGame.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push constant 0 +push constant 0 +push constant 30 +call Square.new 3 +pop this 0 +push constant 0 +pop this 1 +push pointer 0 +return +function SquareGame.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +call Square.dispose 1 +pop temp 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function SquareGame.moveSquare 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +eq +not +if-goto IF10 +push this 0 +call Square.moveUp 1 +pop temp 0 +goto IF11 +label IF10 +label IF11 +push this 1 +push constant 2 +eq +not +if-goto IF20 +push this 0 +call Square.moveDown 1 +pop temp 0 +goto IF21 +label IF20 +label IF21 +push this 1 +push constant 3 +eq +not +if-goto IF30 +push this 0 +call Square.moveLeft 1 +pop temp 0 +goto IF31 +label IF30 +label IF31 +push this 1 +push constant 4 +eq +not +if-goto IF40 +push this 0 +call Square.moveRight 1 +pop temp 0 +goto IF41 +label IF40 +label IF41 +push constant 5 +call Sys.wait 1 +pop temp 0 +push constant 0 +return +function SquareGame.run 2 +push argument 0 +pop pointer 0 +push constant 0 +pop local 1 +label WHILE50 +push local 1 +not +not +if-goto WHILE51 +label WHILE60 +push local 0 +push constant 0 +eq +not +if-goto WHILE61 +call Keyboard.keyPressed 0 +pop local 0 +push pointer 0 +call SquareGame.moveSquare 1 +pop temp 0 +goto WHILE60 +label WHILE61 +push local 0 +push constant 81 +eq +not +if-goto IF70 +push constant 0 +not +pop local 1 +goto IF71 +label IF70 +label IF71 +push local 0 +push constant 90 +eq +not +if-goto IF80 +push this 0 +call Square.decSize 1 +pop temp 0 +goto IF81 +label IF80 +label IF81 +push local 0 +push constant 88 +eq +not +if-goto IF90 +push this 0 +call Square.incSize 1 +pop temp 0 +goto IF91 +label IF90 +label IF91 +push local 0 +push constant 131 +eq +not +if-goto IF100 +push constant 1 +pop this 1 +goto IF101 +label IF100 +label IF101 +push local 0 +push constant 133 +eq +not +if-goto IF110 +push constant 2 +pop this 1 +goto IF111 +label IF110 +label IF111 +push local 0 +push constant 130 +eq +not +if-goto IF120 +push constant 3 +pop this 1 +goto IF121 +label IF120 +label IF121 +push local 0 +push constant 132 +eq +not +if-goto IF130 +push constant 4 +pop this 1 +goto IF131 +label IF130 +label IF131 +label WHILE140 +push local 0 +push constant 0 +eq +not +not +if-goto WHILE141 +call Keyboard.keyPressed 0 +pop local 0 +push pointer 0 +call SquareGame.moveSquare 1 +pop temp 0 +goto WHILE140 +label WHILE141 +goto WHILE50 +label WHILE51 +push constant 0 +return diff --git a/projects/11/Square/SquareGame.xml b/projects/11/Square/SquareGame.xml new file mode 100644 index 0000000..6db22b8 --- /dev/null +++ b/projects/11/Square/SquareGame.xml @@ -0,0 +1,584 @@ + + class + SquareGame + { + + field + Square + square + ; + + + field + int + direction + ; + + + SquareGame + new + ( + + + ) + + { + + + let + square + = + + + Square + . + new + ( + ) + + + ; + + + let + direction + = + + + 0 + + + ; + + + return + + + this + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + square + . + dispose + ( + ) + ; + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + 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 + ( + ) + ; + + + return + ; + + + } + + + + 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/projects/11/Square/SquareGameT.xml b/projects/11/Square/SquareGameT.xml new file mode 100644 index 0000000..1140ee6 --- /dev/null +++ b/projects/11/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/projects/11/Square/SquareT.xml b/projects/11/Square/SquareT.xml new file mode 100644 index 0000000..5170f6f --- /dev/null +++ b/projects/11/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/projects/12/Array.jack b/projects/12/Array.jack new file mode 100644 index 0000000..e949198 --- /dev/null +++ b/projects/12/Array.jack @@ -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/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) { + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/projects/12/ArrayTest/Array.jack b/projects/12/ArrayTest/Array.jack new file mode 100644 index 0000000..e949198 --- /dev/null +++ b/projects/12/ArrayTest/Array.jack @@ -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/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) { + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/projects/12/ArrayTest/Array.vm b/projects/12/ArrayTest/Array.vm new file mode 100644 index 0000000..c0cd797 --- /dev/null +++ b/projects/12/ArrayTest/Array.vm @@ -0,0 +1,12 @@ +function Array.new 0 +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/projects/12/ArrayTest/ArrayTest.cmp b/projects/12/ArrayTest/ArrayTest.cmp new file mode 100644 index 0000000..e9f4e75 --- /dev/null +++ b/projects/12/ArrayTest/ArrayTest.cmp @@ -0,0 +1,2 @@ +|RAM[8000]|RAM[8001]|RAM[8002]|RAM[8003]| +| 222 | 122 | 100 | 10 | diff --git a/projects/12/ArrayTest/ArrayTest.tst b/projects/12/ArrayTest/ArrayTest.tst new file mode 100644 index 0000000..8123b92 --- /dev/null +++ b/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/projects/12/ArrayTest/Keyboard.jack b/projects/12/ArrayTest/Keyboard.jack new file mode 100644 index 0000000..d0e4022 --- /dev/null +++ b/projects/12/ArrayTest/Keyboard.jack @@ -0,0 +1,92 @@ +// 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 { + + static Array kbd; + + /** Initializes the keyboard. */ + function void init() { + let kbd = 24576; + return; + } + + /** + * 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() { + return kbd[0]; + } + + /** + * 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() { + var char key; + while(kbd[0] = 0) {} + let key = kbd[0]; + do Output.printChar(key); + while(kbd[0] = key) {} + return key; + } + + /** + * 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) { + var String str; + var char chr; + let str = String.new(32); + do Output.printString(message); + while (true) { + let chr = Keyboard.readChar(); + if(chr = 128) { + return str; + } + if(chr = 129) { + do str.eraseLastChar(); + } else { + let str = str.appendChar(chr); + } + } + return str; + } + + /** + * 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) { + var String str; + let str = Keyboard.readLine(message); + return str.intValue(); + } +} diff --git a/projects/12/ArrayTest/Keyboard.vm b/projects/12/ArrayTest/Keyboard.vm new file mode 100644 index 0000000..91da157 --- /dev/null +++ b/projects/12/ArrayTest/Keyboard.vm @@ -0,0 +1,98 @@ +function Keyboard.init 0 +push constant 24576 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 1 +label WHILE_EXP0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP1 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +eq +not +if-goto WHILE_END1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +return +function Keyboard.readLine 2 +push constant 32 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 1 +push local 1 +push constant 128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +return +label IF_FALSE0 +push local 1 +push constant 129 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 1 +call String.appendChar 2 +pop local 0 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Keyboard.readInt 1 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +return diff --git a/projects/12/ArrayTest/Main.jack b/projects/12/ArrayTest/Main.jack new file mode 100644 index 0000000..c28754d --- /dev/null +++ b/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/projects/12/ArrayTest/Main.vm b/projects/12/ArrayTest/Main.vm new file mode 100644 index 0000000..141f20a --- /dev/null +++ b/projects/12/ArrayTest/Main.vm @@ -0,0 +1,131 @@ +function Main.main 4 +push constant 8000 +pop local 0 +push constant 3 +call Array.new 1 +pop local 1 +push constant 2 +push local 1 +add +push constant 222 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +push local 0 +add +push constant 2 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +call Array.new 1 +pop local 2 +push constant 1 +push local 2 +add +push constant 2 +push local 1 +add +pop pointer 1 +push that 0 +push constant 100 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push constant 1 +push local 2 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 500 +call Array.new 1 +pop local 3 +push constant 499 +push local 3 +add +push constant 2 +push local 1 +add +pop pointer 1 +push that 0 +push constant 1 +push local 2 +add +pop pointer 1 +push that 0 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push constant 499 +push local 3 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +call Array.dispose 1 +pop temp 0 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 3 +call Array.new 1 +pop local 2 +push constant 0 +push local 2 +add +push constant 499 +push local 3 +add +pop pointer 1 +push that 0 +push constant 90 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push constant 0 +push local 2 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 3 +call Array.dispose 1 +pop temp 0 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/ArrayTest/Math.jack b/projects/12/ArrayTest/Math.jack new file mode 100644 index 0000000..ed50f54 --- /dev/null +++ b/projects/12/ArrayTest/Math.jack @@ -0,0 +1,142 @@ +// 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 { + + static Array twoToThe; + + /** Initializes the library. */ + function void init() { + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x < 0) { + return -x; + } else { + return 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) { + var int sum, shiftedX, i; + let sum = 0; + let shiftedX = x; + let i = 0; + while (i < 16) { + if(Math.bit(y, i)) { + let sum = sum + shiftedX; + } + let shiftedX = shiftedX + shiftedX; + let i = i + 1; + } + return sum; + } + + /** 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) { + var int q, tres; + if(x < 0 & y < 0) { + return Math.divide(Math.abs(x), Math.abs(y)); + } + if(x < 0 | y < 0) { + return -Math.divide(Math.abs(x), Math.abs(y)); + } + if(y > x) { + return 0; + } + if(y < 0) { + return 0; + } + let q = Math.divide(x, 2 * y); + if((x - (2 * q * y)) < y) { + return 2 * q; + } else { + return 2 * q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int y, j; + let y = 0; + let j = 7; + while(j > -1) { + if (~((Math.pow((y + Math.pow(2, j)), 2) > x)) & (Math.pow((y + Math.pow(2, j)), 2) > 0)) { + let y = y + Math.pow(2, j); + } + let j = j - 1; + } + return y; + } + + function int pow(int x, int p) { + var int r, i; + let i = 0; + let r = 1; + while (i < p) { + let r = r * x; + let i = i + 1; + } + return r; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if(a > b) { + return a; + } else { + return b; + } + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if(a > b) { + return b; + } else { + return a; + } + } +} diff --git a/projects/12/ArrayTest/Math.vm b/projects/12/ArrayTest/Math.vm new file mode 100644 index 0000000..e03fd3e --- /dev/null +++ b/projects/12/ArrayTest/Math.vm @@ -0,0 +1,394 @@ +function Math.init 0 +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Math.bit 0 +push argument 0 +push argument 1 +push static 0 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 +function Math.multiply 3 +push constant 0 +pop local 0 +push argument 0 +pop local 1 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 16 +lt +not +if-goto WHILE_END0 +push argument 1 +push local 2 +call Math.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 1 +add +pop local 0 +label IF_FALSE0 +push local 1 +push local 1 +add +pop local 1 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.divide 2 +push argument 0 +push constant 0 +lt +push argument 1 +and +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +return +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +or +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +neg +return +label IF_FALSE1 +push argument 1 +push argument 0 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +return +label IF_FALSE3 +push argument 0 +push constant 2 +push argument 1 +call Math.multiply 2 +call Math.divide 2 +pop local 0 +push argument 0 +push constant 2 +push local 0 +call Math.multiply 2 +push argument 1 +call Math.multiply 2 +sub +push argument 1 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 2 +push local 0 +call Math.multiply 2 +return +goto IF_END4 +label IF_FALSE4 +push constant 2 +push local 0 +call Math.multiply 2 +push constant 1 +add +return +label IF_END4 +function Math.sqrt 2 +push constant 0 +pop local 0 +push constant 7 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push argument 0 +gt +not +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push constant 0 +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +pop local 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.pow 2 +push constant 0 +pop local 1 +push constant 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push argument 1 +lt +not +if-goto WHILE_END0 +push local 0 +push argument 0 +call Math.multiply 2 +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +return +label IF_END0 +function Math.min 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 diff --git a/projects/12/ArrayTest/Memory.jack b/projects/12/ArrayTest/Memory.jack new file mode 100644 index 0000000..7edeee6 --- /dev/null +++ b/projects/12/ArrayTest/Memory.jack @@ -0,0 +1,73 @@ +// 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 { + + static Array memory; + static Array heap; + static Array freeList; + + /** Initializes the class. */ + function void init() { + let memory = 0; + let heap = 2048; + let freeList = 2048; + let heap[0] = 0; + let heap[1] = 14335; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return memory[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let memory[address] = value; + return; + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + var Array curList, found; + let curList = freeList; + while (curList > 0) { + if (curList[1] > (size + 1)) { + do Memory.poke(8010, 1); + let found = curList + curList[1] - size; + let curList[1] = curList[1] - size - 2; + let found[0] = 0; + let found[1] = size; + return found; + } else { + let curList = curList[0]; + } + } + return 0; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array curList; + let curList = freeList; + if(curList = 0) { + let freeList = o; + return; + } + while (curList[0] > 0) { + let curList = curList[0]; + } + let curList = o; + return; + } +} diff --git a/projects/12/ArrayTest/Memory.vm b/projects/12/ArrayTest/Memory.vm new file mode 100644 index 0000000..8b513e9 --- /dev/null +++ b/projects/12/ArrayTest/Memory.vm @@ -0,0 +1,161 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +pop static 1 +push constant 2048 +pop static 2 +push constant 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 1 +add +push constant 14335 +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 static 2 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 1 +add +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8010 +push constant 1 +call Memory.poke 2 +pop temp 0 +push local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +add +push argument 0 +sub +pop local 1 +push constant 1 +push local 0 +add +push constant 1 +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 0 +push local 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Memory.deAlloc 1 +push static 2 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop static 2 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push argument 0 +pop local 0 +push constant 0 +return diff --git a/projects/12/ArrayTest/Output.jack b/projects/12/ArrayTest/Output.jack new file mode 100644 index 0000000..21629b7 --- /dev/null +++ b/projects/12/ArrayTest/Output.jack @@ -0,0 +1,288 @@ +// 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; + static int hPos, vPos; + static Array twoToThe; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + let hPos = 0; + let vPos = 0; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + do Output.initMap(); + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + // 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,12,30,51,51,51,63,51,51,51,0,0); // A + 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) { + let hPos = j; + let vPos = i; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array map; + var int i, j; + let i = 0; + let j = 0; + let map = Output.getMap(c); + while (i < 11) { + while (j < 8) { + if(Output.bit(map[i], j)) { + do Screen.setColor(true); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } else { + do Screen.setColor(false); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } + let j = j + 1; + } + let i = i + 1; + let j = 0; + } + let hPos = hPos + 1; + if(hPos > 63) { + let hPos = 0; + let vPos = vPos + 1; + } + if(vPos > 22) { + let vPos = 0; + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int l; + let l = 0; + while (l < s.length()) { + do Output.printChar(s.charAt(l)); + let l = l + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String intstr; + let intstr = String.new(6); + do intstr.setInt(i); + do Output.printString(intstr); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + let vPos = vPos + 1; + if(vPos > 22) { + let vPos = 0; + } + let hPos = 0; + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + let hPos = hPos - 1; + if (hPos < 0) { + let hPos = 0; + } + return; + } +} diff --git a/projects/12/ArrayTest/Output.vm b/projects/12/ArrayTest/Output.vm new file mode 100644 index 0000000..0b6f718 --- /dev/null +++ b/projects/12/ArrayTest/Output.vm @@ -0,0 +1,1818 @@ +function Output.init 0 +push constant 0 +pop static 1 +push constant 0 +pop static 2 +push constant 16 +call Array.new 1 +pop static 3 +push constant 0 +push static 3 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 3 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 3 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 3 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 3 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 3 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 3 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 3 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 3 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 3 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 3 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 3 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 3 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 3 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 3 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 3 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +call Output.initMap 0 +pop temp 0 +push constant 0 +return +function Output.bit 0 +push argument 0 +push argument 1 +push static 3 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +function Output.initMap 1 +push constant 127 +call Array.new 1 +pop static 0 +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 51 +push constant 63 +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 0 +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.getMap 0 +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 argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Output.moveCursor 0 +push argument 1 +pop static 1 +push argument 0 +pop static 2 +push constant 0 +return +function Output.printChar 3 +push constant 0 +pop local 1 +push constant 0 +pop local 2 +push argument 0 +call Output.getMap 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 2 +push constant 8 +lt +not +if-goto WHILE_END1 +push local 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 2 +call Output.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push constant 1 +add +pop local 1 +push constant 0 +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push static 1 +push constant 1 +add +pop static 1 +push static 1 +push constant 63 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop static 1 +push static 2 +push constant 1 +add +pop static 2 +label IF_FALSE1 +push static 2 +push constant 22 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +pop static 2 +label IF_FALSE2 +push constant 0 +return +function Output.printString 1 +push constant 0 +pop local 0 +label WHILE_EXP0 +push local 0 +push argument 0 +call String.length 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 1 +push constant 6 +call String.new 1 +pop local 0 +push local 0 +push argument 0 +call String.setInt 2 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 2 +push constant 1 +add +pop static 2 +push static 2 +push constant 22 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 2 +label IF_FALSE0 +push constant 0 +pop static 1 +push constant 0 +return +function Output.backSpace 0 +push static 1 +push constant 1 +sub +pop static 1 +push static 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 1 +label IF_FALSE0 +push constant 0 +return diff --git a/projects/12/ArrayTest/Screen.jack b/projects/12/ArrayTest/Screen.jack new file mode 100644 index 0000000..79e1ae2 --- /dev/null +++ b/projects/12/ArrayTest/Screen.jack @@ -0,0 +1,162 @@ +// 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/Screen.jack + +/** + * A library of functions for displaying graphics on the screen. + * The Hack physical screen consists of 512 rows (indexed 0..511, top to bottom) + * of 256 pixels each (indexed 0..255, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + static Array twoToThe; + static boolean color; + + /** Initializes the Screen. */ + function void init() { + let color = true; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int x, y; + var boolean prevColor; + let x = 0; + let y = 0; + let prevColor = color; + let color = false; + while (x < 256) { + while (y < 512) { + do Screen.drawPixel(x, y); + let y = y + 1; + } + let x = x + 1; + } + let color = prevColor; + return; + } + + /** Sets the current color, to be used for all subsequent drawXXX commands. + * Black is represented by true, white by false. */ + function void setColor(boolean b) { + let color = b; + return; + } + + /** Draws the (x,y) pixel, using the current color. */ + function void drawPixel(int x, int y) { + var Array address, value; + let address = (32 * y) + (x/16); + let value = Memory.peek(16384 + address); + if(color) { + let value = value | twoToThe[x & 15]; + } else { + let value = value & (~(twoToThe[x & 15])); + } + do Memory.poke(16384 + address, value); + return; + } + + /** Draws a line from pixel (x1,y1) to pixel (x2,y2), using the current color. */ + function void drawLine(int x1, int y1, int x2, int y2) { + var int dx, dy, a, b, diff; + let dx = x2-x1; + let dy = y2-y1; + let a = 0; + let b = 0; + let diff = 0; + if(dx = 0) { + while(~(dy = 0)) { + do Screen.drawPixel(x1, y1 + dy); + if(dy > 0) { + let dy = dy - 1; + } else { + let dy = dy + 1; + } + } + return; + } + if(dy = 0) { + while(~(dx = 0)) { + do Screen.drawPixel(x1 + dx, y1); + if (dx > 0) { + let dx = dx - 1; + } else { + let dx = dx + 1; + } + } + return; + } + while((~(Math.abs(a) > Math.abs(dx))) & (~(Math.abs(b) > Math.abs(dy)))) { + do Screen.drawPixel(x1 + a, y1 + b); + if(diff < 0) { + if(dx > 0) { + let a = a + 1; + } + if(dx < 0) { + let a = a - 1; + } + let diff = diff + Math.abs(dy); + } else { + if(dy > 0) { + let b = b + 1; + } + if(dy < 0) { + let b = b - 1; + } + let diff = diff - Math.abs(dx); + } + } + return; + } + + /** Draws a filled rectangle whose top left corner is (x1, y1) + * and bottom right corner is (x2,y2), using the current color. */ + function void drawRectangle(int x1, int y1, int x2, int y2) { + var int dy; + let dy = y2 - y1; + while(~(Math.abs(dy) = 0)) { + if (dy > 0) { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy - 1; + } else { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy + 1; + } + } + return; + } + + /** Draws a filled circle of radius r<=181 around (x,y), using the current color. */ + function void drawCircle(int x, int y, int r) { + var int dy; + let dy = -r; + if (r > 181) { + return; + } + while(dy < (r + 1)) { + do Screen.drawLine(x-Math.sqrt((r*r)-(dy*dy)),y + dy,x+Math.sqrt((r*r)-(dy*dy)),y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/ArrayTest/Screen.vm b/projects/12/ArrayTest/Screen.vm new file mode 100644 index 0000000..a89b523 --- /dev/null +++ b/projects/12/ArrayTest/Screen.vm @@ -0,0 +1,534 @@ +function Screen.init 0 +push constant 0 +not +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Screen.clearScreen 3 +push constant 0 +pop local 0 +push constant 0 +pop local 1 +push static 1 +pop local 2 +push constant 0 +pop static 1 +label WHILE_EXP0 +push local 0 +push constant 256 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 1 +push constant 512 +lt +not +if-goto WHILE_END1 +push local 0 +push local 1 +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 2 +pop static 1 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 1 +push constant 0 +return +function Screen.drawPixel 2 +push constant 32 +push argument 1 +call Math.multiply 2 +push argument 0 +push constant 16 +call Math.divide 2 +add +pop local 0 +push constant 16384 +push local 0 +add +call Memory.peek 1 +pop local 1 +push static 1 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +or +pop local 1 +goto IF_END0 +label IF_FALSE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +not +and +pop local 1 +label IF_END0 +push constant 16384 +push local 0 +add +push local 1 +call Memory.poke 2 +pop temp 0 +push constant 0 +return +function Screen.drawLine 5 +push argument 2 +push argument 0 +sub +pop local 0 +push argument 3 +push argument 1 +sub +pop local 1 +push constant 0 +pop local 2 +push constant 0 +pop local 3 +push constant 0 +pop local 4 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push argument 0 +push argument 1 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +push constant 1 +sub +pop local 1 +goto IF_END1 +label IF_FALSE1 +push local 1 +push constant 1 +add +pop local 1 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +label IF_FALSE0 +push local 1 +push constant 0 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +not +not +if-goto WHILE_END1 +push argument 0 +push local 0 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END3 +label IF_FALSE3 +push local 0 +push constant 1 +add +pop local 0 +label IF_END3 +goto WHILE_EXP1 +label WHILE_END1 +push constant 0 +return +label IF_FALSE2 +label WHILE_EXP2 +push local 2 +call Math.abs 1 +push local 0 +call Math.abs 1 +gt +not +push local 3 +call Math.abs 1 +push local 1 +call Math.abs 1 +gt +not +and +not +if-goto WHILE_END2 +push argument 0 +push local 2 +add +push argument 1 +push local 3 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 0 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 0 +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 2 +push constant 1 +add +pop local 2 +label IF_FALSE5 +push local 0 +push constant 0 +lt +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push local 2 +push constant 1 +sub +pop local 2 +label IF_FALSE6 +push local 4 +push local 1 +call Math.abs 1 +add +pop local 4 +goto IF_END4 +label IF_FALSE4 +push local 1 +push constant 0 +gt +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push local 3 +push constant 1 +add +pop local 3 +label IF_FALSE7 +push local 1 +push constant 0 +lt +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push local 3 +push constant 1 +sub +pop local 3 +label IF_FALSE8 +push local 4 +push local 0 +call Math.abs 1 +sub +pop local 4 +label IF_END4 +goto WHILE_EXP2 +label WHILE_END2 +push constant 0 +return +function Screen.drawRectangle 1 +push argument 3 +push argument 1 +sub +pop local 0 +label WHILE_EXP0 +push local 0 +call Math.abs 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawCircle 1 +push argument 2 +neg +pop local 0 +push argument 2 +push constant 181 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push local 0 +push argument 2 +push constant 1 +add +lt +not +if-goto WHILE_END0 +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +sub +push argument 1 +push local 0 +add +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +add +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/12/ArrayTest/String.jack b/projects/12/ArrayTest/String.jack new file mode 100644 index 0000000..6a1ab29 --- /dev/null +++ b/projects/12/ArrayTest/String.jack @@ -0,0 +1,136 @@ +// 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 { + + field Array str; + field int length; + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + if(maxLength > 0) { + let str = Array.new(maxLength); + } else { + let str = 0; + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Returns the current length of this string. */ + method int length() { + return length; + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + let str[length - 1] = 0; + let length = length - 1; + return; + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + var int val, i, d; + var boolean neg; + let i = 0; + if(str[i] = 45) { + let neg = true; + let i = 1; + } + while(i < length) { + let d = str[i] - 48; + let val = val * 10 + d; + let i = i + 1; + } + if(neg) { + return -val; + } + return val; + } + + function String int2String(int val) { + var String string; + var int lastDigit, c; + let string = String.new(64); + let lastDigit = val - ((val / 10) * 10); + let c = lastDigit + 48; + if(val < 10) { + do string.appendChar(c); + return string; + } else { + do string.dispose(); + let string = String.int2String(val / 10); + do string.appendChar(c); + return string; + } + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var String temp; + var int i; + let length = 0; + if(val < 0) { + do appendChar(45); + } + let i = 0; + let temp = String.int2String(Math.abs(val)); + while(i < temp.length()) { + do appendChar(temp.charAt(i)); + let i = i + 1; + } + do temp.dispose(); + return; + } + + /** Returns the new line character. */ + function char newLine() { + return 128; + } + + /** Returns the backspace character. */ + function char backSpace() { + return 129; + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + return 34; + } +} diff --git a/projects/12/ArrayTest/String.vm b/projects/12/ArrayTest/String.vm new file mode 100644 index 0000000..5c65675 --- /dev/null +++ b/projects/12/ArrayTest/String.vm @@ -0,0 +1,250 @@ +function String.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Array.new 1 +pop this 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 0 +label IF_END0 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +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 1 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +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 1 +push this 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +add +pop this 1 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +sub +push this 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +sub +pop this 1 +push constant 0 +return +function String.intValue 4 +push argument 0 +pop pointer 0 +push constant 0 +pop local 1 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +pop local 3 +push constant 1 +pop local 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 1 +push this 1 +lt +not +if-goto WHILE_END0 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 0 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +neg +return +label IF_FALSE1 +push local 0 +return +function String.int2String 3 +push constant 64 +call String.new 1 +pop local 0 +push argument 0 +push argument 0 +push constant 10 +call Math.divide 2 +push constant 10 +call Math.multiply 2 +sub +pop local 1 +push local 1 +push constant 48 +add +pop local 2 +push argument 0 +push constant 10 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +goto IF_END0 +label IF_FALSE0 +push local 0 +call String.dispose 1 +pop temp 0 +push argument 0 +push constant 10 +call Math.divide 2 +call String.int2String 1 +pop local 0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +label IF_END0 +function String.setInt 2 +push argument 0 +pop pointer 0 +push constant 0 +pop this 1 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push pointer 0 +push constant 45 +call String.appendChar 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +pop local 1 +push argument 1 +call Math.abs 1 +call String.int2String 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push local 0 +call String.length 1 +lt +not +if-goto WHILE_END0 +push pointer 0 +push local 0 +push local 1 +call String.charAt 2 +call String.appendChar 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +call String.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/projects/12/ArrayTest/Sys.jack b/projects/12/ArrayTest/Sys.jack new file mode 100644 index 0000000..3aea36b --- /dev/null +++ b/projects/12/ArrayTest/Sys.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/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + do Memory.init(); + do Math.init(); + do Screen.init(); + do Output.init(); + do Keyboard.init(); + do Main.main(); + do Sys.halt(); + return; + } + + /** Halts the program execution. */ + function void halt() { + while(true){} + return; + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + let i = 10000; + while(i > 0) { + let i = i - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + do Output.printString("ERR"); + do Output.printInt(errorCode); + do Sys.halt(); + return; + } +} diff --git a/projects/12/ArrayTest/Sys.vm b/projects/12/ArrayTest/Sys.vm new file mode 100644 index 0000000..05b7a18 --- /dev/null +++ b/projects/12/ArrayTest/Sys.vm @@ -0,0 +1,62 @@ +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 constant 10000 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 3 +call String.new 1 +push constant 69 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +call Output.printString 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/projects/12/Keyboard.jack b/projects/12/Keyboard.jack new file mode 100644 index 0000000..d0e4022 --- /dev/null +++ b/projects/12/Keyboard.jack @@ -0,0 +1,92 @@ +// 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 { + + static Array kbd; + + /** Initializes the keyboard. */ + function void init() { + let kbd = 24576; + return; + } + + /** + * 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() { + return kbd[0]; + } + + /** + * 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() { + var char key; + while(kbd[0] = 0) {} + let key = kbd[0]; + do Output.printChar(key); + while(kbd[0] = key) {} + return key; + } + + /** + * 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) { + var String str; + var char chr; + let str = String.new(32); + do Output.printString(message); + while (true) { + let chr = Keyboard.readChar(); + if(chr = 128) { + return str; + } + if(chr = 129) { + do str.eraseLastChar(); + } else { + let str = str.appendChar(chr); + } + } + return str; + } + + /** + * 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) { + var String str; + let str = Keyboard.readLine(message); + return str.intValue(); + } +} diff --git a/projects/12/KeyboardTest/Keyboard.jack b/projects/12/KeyboardTest/Keyboard.jack new file mode 100644 index 0000000..d0e4022 --- /dev/null +++ b/projects/12/KeyboardTest/Keyboard.jack @@ -0,0 +1,92 @@ +// 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 { + + static Array kbd; + + /** Initializes the keyboard. */ + function void init() { + let kbd = 24576; + return; + } + + /** + * 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() { + return kbd[0]; + } + + /** + * 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() { + var char key; + while(kbd[0] = 0) {} + let key = kbd[0]; + do Output.printChar(key); + while(kbd[0] = key) {} + return key; + } + + /** + * 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) { + var String str; + var char chr; + let str = String.new(32); + do Output.printString(message); + while (true) { + let chr = Keyboard.readChar(); + if(chr = 128) { + return str; + } + if(chr = 129) { + do str.eraseLastChar(); + } else { + let str = str.appendChar(chr); + } + } + return str; + } + + /** + * 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) { + var String str; + let str = Keyboard.readLine(message); + return str.intValue(); + } +} diff --git a/projects/12/KeyboardTest/Keyboard.vm b/projects/12/KeyboardTest/Keyboard.vm new file mode 100644 index 0000000..91da157 --- /dev/null +++ b/projects/12/KeyboardTest/Keyboard.vm @@ -0,0 +1,98 @@ +function Keyboard.init 0 +push constant 24576 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 1 +label WHILE_EXP0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP1 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +eq +not +if-goto WHILE_END1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +return +function Keyboard.readLine 2 +push constant 32 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 1 +push local 1 +push constant 128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +return +label IF_FALSE0 +push local 1 +push constant 129 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 1 +call String.appendChar 2 +pop local 0 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Keyboard.readInt 1 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +return diff --git a/projects/12/KeyboardTest/KeyboardTestOutput.gif b/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/projects/12/KeyboardTest/Main.jack b/projects/12/KeyboardTest/Main.jack new file mode 100644 index 0000000..81d1d8c --- /dev/null +++ b/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/projects/12/KeyboardTest/Main.vm b/projects/12/KeyboardTest/Main.vm new file mode 100644 index 0000000..aec89d6 --- /dev/null +++ b/projects/12/KeyboardTest/Main.vm @@ -0,0 +1,949 @@ +function Main.main 5 +push constant 0 +pop local 4 +push constant 16 +call String.new 1 +push constant 107 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 80 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +label WHILE_EXP0 +push local 4 +not +not +if-goto WHILE_END0 +push constant 32 +call String.new 1 +push constant 80 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 80 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 68 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 119 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +label WHILE_EXP1 +push local 1 +push constant 0 +eq +not +if-goto WHILE_END1 +call Keyboard.keyPressed 0 +pop local 1 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +pop local 0 +label WHILE_EXP2 +push local 1 +push constant 0 +eq +not +not +if-goto WHILE_END2 +call Keyboard.keyPressed 0 +pop local 1 +goto WHILE_EXP2 +label WHILE_END2 +call Output.println 0 +pop temp 0 +push local 0 +push constant 137 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 2 +call String.new 1 +push constant 111 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 0 +not +pop local 4 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +pop local 4 +push constant 14 +call String.new 1 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 67 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 59 +call String.new 1 +push constant 40 +call String.appendChar 2 +push constant 86 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 41 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +label WHILE_EXP3 +push local 4 +not +not +if-goto WHILE_END3 +push constant 29 +call String.new 1 +push constant 80 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 51 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Keyboard.readChar 0 +pop local 0 +call Output.println 0 +pop temp 0 +push local 0 +push constant 51 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 2 +call String.new 1 +push constant 111 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 0 +not +pop local 4 +label IF_FALSE1 +goto WHILE_EXP3 +label WHILE_END3 +push constant 0 +pop local 4 +push constant 14 +call String.new 1 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 76 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 38 +call String.new 1 +push constant 40 +call String.appendChar 2 +push constant 86 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 41 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +label WHILE_EXP4 +push local 4 +not +not +if-goto WHILE_END4 +push constant 36 +call String.new 1 +push constant 80 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 74 +call String.appendChar 2 +push constant 65 +call String.appendChar 2 +push constant 67 +call String.appendChar 2 +push constant 75 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Keyboard.readLine 1 +pop local 2 +push local 2 +call String.length 1 +push constant 4 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 2 +push constant 0 +call String.charAt 2 +push constant 74 +eq +push local 2 +push constant 1 +call String.charAt 2 +push constant 65 +eq +and +push local 2 +push constant 2 +call String.charAt 2 +push constant 67 +eq +and +push local 2 +push constant 3 +call String.charAt 2 +push constant 75 +eq +and +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 2 +call String.new 1 +push constant 111 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 0 +not +pop local 4 +label IF_FALSE3 +label IF_FALSE2 +goto WHILE_EXP4 +label WHILE_END4 +push constant 0 +pop local 4 +push constant 13 +call String.new 1 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 73 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 38 +call String.new 1 +push constant 40 +call String.appendChar 2 +push constant 86 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 41 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +label WHILE_EXP5 +push local 4 +not +not +if-goto WHILE_END5 +push constant 38 +call String.new 1 +push constant 80 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 45 +call String.appendChar 2 +push constant 51 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 49 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 51 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Keyboard.readInt 1 +pop local 3 +push local 3 +push constant 32123 +neg +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 2 +call String.new 1 +push constant 111 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 0 +not +pop local 4 +label IF_FALSE4 +goto WHILE_EXP5 +label WHILE_END5 +call Output.println 0 +pop temp 0 +push constant 27 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/Math.jack b/projects/12/Math.jack new file mode 100644 index 0000000..ed50f54 --- /dev/null +++ b/projects/12/Math.jack @@ -0,0 +1,142 @@ +// 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 { + + static Array twoToThe; + + /** Initializes the library. */ + function void init() { + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x < 0) { + return -x; + } else { + return 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) { + var int sum, shiftedX, i; + let sum = 0; + let shiftedX = x; + let i = 0; + while (i < 16) { + if(Math.bit(y, i)) { + let sum = sum + shiftedX; + } + let shiftedX = shiftedX + shiftedX; + let i = i + 1; + } + return sum; + } + + /** 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) { + var int q, tres; + if(x < 0 & y < 0) { + return Math.divide(Math.abs(x), Math.abs(y)); + } + if(x < 0 | y < 0) { + return -Math.divide(Math.abs(x), Math.abs(y)); + } + if(y > x) { + return 0; + } + if(y < 0) { + return 0; + } + let q = Math.divide(x, 2 * y); + if((x - (2 * q * y)) < y) { + return 2 * q; + } else { + return 2 * q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int y, j; + let y = 0; + let j = 7; + while(j > -1) { + if (~((Math.pow((y + Math.pow(2, j)), 2) > x)) & (Math.pow((y + Math.pow(2, j)), 2) > 0)) { + let y = y + Math.pow(2, j); + } + let j = j - 1; + } + return y; + } + + function int pow(int x, int p) { + var int r, i; + let i = 0; + let r = 1; + while (i < p) { + let r = r * x; + let i = i + 1; + } + return r; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if(a > b) { + return a; + } else { + return b; + } + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if(a > b) { + return b; + } else { + return a; + } + } +} diff --git a/projects/12/MathTest/Main.jack b/projects/12/MathTest/Main.jack new file mode 100644 index 0000000..93f056e --- /dev/null +++ b/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/projects/12/MathTest/Main.vm b/projects/12/MathTest/Main.vm new file mode 100644 index 0000000..025f20c --- /dev/null +++ b/projects/12/MathTest/Main.vm @@ -0,0 +1,162 @@ +function Main.main 1 +push constant 8000 +pop local 0 +push constant 0 +push local 0 +add +push constant 2 +push constant 3 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 30 +neg +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push constant 100 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push constant 1 +push constant 2 +push local 0 +add +pop pointer 1 +push that 0 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push constant 3 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push constant 9 +push constant 3 +call Math.divide 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push constant 18000 +neg +push constant 6 +call Math.divide 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push constant 32766 +push constant 32767 +neg +call Math.divide 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push constant 9 +call Math.sqrt 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push local 0 +add +push constant 32767 +call Math.sqrt 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push local 0 +add +push constant 345 +push constant 123 +call Math.min 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push local 0 +add +push constant 123 +push constant 345 +neg +call Math.max 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push local 0 +add +push constant 27 +call Math.abs 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push local 0 +add +push constant 32767 +neg +call Math.abs 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return diff --git a/projects/12/MathTest/Math.jack b/projects/12/MathTest/Math.jack new file mode 100644 index 0000000..ed50f54 --- /dev/null +++ b/projects/12/MathTest/Math.jack @@ -0,0 +1,142 @@ +// 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 { + + static Array twoToThe; + + /** Initializes the library. */ + function void init() { + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x < 0) { + return -x; + } else { + return 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) { + var int sum, shiftedX, i; + let sum = 0; + let shiftedX = x; + let i = 0; + while (i < 16) { + if(Math.bit(y, i)) { + let sum = sum + shiftedX; + } + let shiftedX = shiftedX + shiftedX; + let i = i + 1; + } + return sum; + } + + /** 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) { + var int q, tres; + if(x < 0 & y < 0) { + return Math.divide(Math.abs(x), Math.abs(y)); + } + if(x < 0 | y < 0) { + return -Math.divide(Math.abs(x), Math.abs(y)); + } + if(y > x) { + return 0; + } + if(y < 0) { + return 0; + } + let q = Math.divide(x, 2 * y); + if((x - (2 * q * y)) < y) { + return 2 * q; + } else { + return 2 * q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int y, j; + let y = 0; + let j = 7; + while(j > -1) { + if (~((Math.pow((y + Math.pow(2, j)), 2) > x)) & (Math.pow((y + Math.pow(2, j)), 2) > 0)) { + let y = y + Math.pow(2, j); + } + let j = j - 1; + } + return y; + } + + function int pow(int x, int p) { + var int r, i; + let i = 0; + let r = 1; + while (i < p) { + let r = r * x; + let i = i + 1; + } + return r; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if(a > b) { + return a; + } else { + return b; + } + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if(a > b) { + return b; + } else { + return a; + } + } +} diff --git a/projects/12/MathTest/Math.vm b/projects/12/MathTest/Math.vm new file mode 100644 index 0000000..e03fd3e --- /dev/null +++ b/projects/12/MathTest/Math.vm @@ -0,0 +1,394 @@ +function Math.init 0 +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Math.bit 0 +push argument 0 +push argument 1 +push static 0 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 +function Math.multiply 3 +push constant 0 +pop local 0 +push argument 0 +pop local 1 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 16 +lt +not +if-goto WHILE_END0 +push argument 1 +push local 2 +call Math.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 1 +add +pop local 0 +label IF_FALSE0 +push local 1 +push local 1 +add +pop local 1 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.divide 2 +push argument 0 +push constant 0 +lt +push argument 1 +and +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +return +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +or +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +neg +return +label IF_FALSE1 +push argument 1 +push argument 0 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +return +label IF_FALSE3 +push argument 0 +push constant 2 +push argument 1 +call Math.multiply 2 +call Math.divide 2 +pop local 0 +push argument 0 +push constant 2 +push local 0 +call Math.multiply 2 +push argument 1 +call Math.multiply 2 +sub +push argument 1 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 2 +push local 0 +call Math.multiply 2 +return +goto IF_END4 +label IF_FALSE4 +push constant 2 +push local 0 +call Math.multiply 2 +push constant 1 +add +return +label IF_END4 +function Math.sqrt 2 +push constant 0 +pop local 0 +push constant 7 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push argument 0 +gt +not +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push constant 0 +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +pop local 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.pow 2 +push constant 0 +pop local 1 +push constant 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push argument 1 +lt +not +if-goto WHILE_END0 +push local 0 +push argument 0 +call Math.multiply 2 +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +return +label IF_END0 +function Math.min 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 diff --git a/projects/12/MathTest/MathTest.cmp b/projects/12/MathTest/MathTest.cmp new file mode 100644 index 0000000..8b5a504 --- /dev/null +++ b/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/projects/12/MathTest/MathTest.tst b/projects/12/MathTest/MathTest.tst new file mode 100644 index 0000000..01b683a --- /dev/null +++ b/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/projects/12/Memory.jack b/projects/12/Memory.jack new file mode 100644 index 0000000..7edeee6 --- /dev/null +++ b/projects/12/Memory.jack @@ -0,0 +1,73 @@ +// 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 { + + static Array memory; + static Array heap; + static Array freeList; + + /** Initializes the class. */ + function void init() { + let memory = 0; + let heap = 2048; + let freeList = 2048; + let heap[0] = 0; + let heap[1] = 14335; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return memory[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let memory[address] = value; + return; + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + var Array curList, found; + let curList = freeList; + while (curList > 0) { + if (curList[1] > (size + 1)) { + do Memory.poke(8010, 1); + let found = curList + curList[1] - size; + let curList[1] = curList[1] - size - 2; + let found[0] = 0; + let found[1] = size; + return found; + } else { + let curList = curList[0]; + } + } + return 0; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array curList; + let curList = freeList; + if(curList = 0) { + let freeList = o; + return; + } + while (curList[0] > 0) { + let curList = curList[0]; + } + let curList = o; + return; + } +} diff --git a/projects/12/MemoryTest/Main.jack b/projects/12/MemoryTest/Main.jack new file mode 100644 index 0000000..85790fd --- /dev/null +++ b/projects/12/MemoryTest/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/MemoryTest/Main.jack + +/** Test program for the OS Memory class. */ +class Main { + + /** Performs various memory manipulations. */ + function void main() { + var int temp; + 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 b = Array.new(3); + let b[1] = a[2] - 100; + do Memory.poke(8003, b[1]); // RAM[8003] = 122 + + let c = Array.new(500); + let c[499] = a[2] - b[1]; + do Memory.poke(8004, c[499]); // RAM[8004] = 100 + + do a.dispose(); // uses Memory.deAlloc + do b.dispose(); + + let b = Array.new(3); + let b[0] = c[499] - 90; + do Memory.poke(8005, b[0]); // RAM[8005] = 10 + + do c.dispose(); + do b.dispose(); + + return; + } +} diff --git a/projects/12/MemoryTest/Main.vm b/projects/12/MemoryTest/Main.vm new file mode 100644 index 0000000..a3a9e81 --- /dev/null +++ b/projects/12/MemoryTest/Main.vm @@ -0,0 +1,126 @@ +function Main.main 4 +push constant 8000 +push constant 333 +call Memory.poke 2 +pop temp 0 +push constant 8000 +call Memory.peek 1 +pop local 0 +push constant 8001 +push local 0 +push constant 1 +add +call Memory.poke 2 +pop temp 0 +push constant 3 +call Array.new 1 +pop local 1 +push constant 2 +push local 1 +add +push constant 222 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8002 +push constant 2 +push local 1 +add +pop pointer 1 +push that 0 +call Memory.poke 2 +pop temp 0 +push constant 3 +call Array.new 1 +pop local 2 +push constant 1 +push local 2 +add +push constant 2 +push local 1 +add +pop pointer 1 +push that 0 +push constant 100 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8003 +push constant 1 +push local 2 +add +pop pointer 1 +push that 0 +call Memory.poke 2 +pop temp 0 +push constant 500 +call Array.new 1 +pop local 3 +push constant 499 +push local 3 +add +push constant 2 +push local 1 +add +pop pointer 1 +push that 0 +push constant 1 +push local 2 +add +pop pointer 1 +push that 0 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8004 +push constant 499 +push local 3 +add +pop pointer 1 +push that 0 +call Memory.poke 2 +pop temp 0 +push local 1 +call Array.dispose 1 +pop temp 0 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 3 +call Array.new 1 +pop local 2 +push constant 0 +push local 2 +add +push constant 499 +push local 3 +add +pop pointer 1 +push that 0 +push constant 90 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8005 +push constant 0 +push local 2 +add +pop pointer 1 +push that 0 +call Memory.poke 2 +pop temp 0 +push local 3 +call Array.dispose 1 +pop temp 0 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/MemoryTest/Memory.jack b/projects/12/MemoryTest/Memory.jack new file mode 100644 index 0000000..7edeee6 --- /dev/null +++ b/projects/12/MemoryTest/Memory.jack @@ -0,0 +1,73 @@ +// 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 { + + static Array memory; + static Array heap; + static Array freeList; + + /** Initializes the class. */ + function void init() { + let memory = 0; + let heap = 2048; + let freeList = 2048; + let heap[0] = 0; + let heap[1] = 14335; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return memory[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let memory[address] = value; + return; + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + var Array curList, found; + let curList = freeList; + while (curList > 0) { + if (curList[1] > (size + 1)) { + do Memory.poke(8010, 1); + let found = curList + curList[1] - size; + let curList[1] = curList[1] - size - 2; + let found[0] = 0; + let found[1] = size; + return found; + } else { + let curList = curList[0]; + } + } + return 0; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array curList; + let curList = freeList; + if(curList = 0) { + let freeList = o; + return; + } + while (curList[0] > 0) { + let curList = curList[0]; + } + let curList = o; + return; + } +} diff --git a/projects/12/MemoryTest/Memory.vm b/projects/12/MemoryTest/Memory.vm new file mode 100644 index 0000000..8b513e9 --- /dev/null +++ b/projects/12/MemoryTest/Memory.vm @@ -0,0 +1,161 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +pop static 1 +push constant 2048 +pop static 2 +push constant 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 1 +add +push constant 14335 +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 static 2 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 1 +add +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8010 +push constant 1 +call Memory.poke 2 +pop temp 0 +push local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +add +push argument 0 +sub +pop local 1 +push constant 1 +push local 0 +add +push constant 1 +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 0 +push local 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Memory.deAlloc 1 +push static 2 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop static 2 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push argument 0 +pop local 0 +push constant 0 +return diff --git a/projects/12/MemoryTest/MemoryTest.cmp b/projects/12/MemoryTest/MemoryTest.cmp new file mode 100644 index 0000000..8259ed2 --- /dev/null +++ b/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/projects/12/MemoryTest/MemoryTest.tst b/projects/12/MemoryTest/MemoryTest.tst new file mode 100644 index 0000000..32d92f6 --- /dev/null +++ b/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/projects/12/Output.jack b/projects/12/Output.jack new file mode 100644 index 0000000..21629b7 --- /dev/null +++ b/projects/12/Output.jack @@ -0,0 +1,288 @@ +// 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; + static int hPos, vPos; + static Array twoToThe; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + let hPos = 0; + let vPos = 0; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + do Output.initMap(); + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + // 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,12,30,51,51,51,63,51,51,51,0,0); // A + 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) { + let hPos = j; + let vPos = i; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array map; + var int i, j; + let i = 0; + let j = 0; + let map = Output.getMap(c); + while (i < 11) { + while (j < 8) { + if(Output.bit(map[i], j)) { + do Screen.setColor(true); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } else { + do Screen.setColor(false); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } + let j = j + 1; + } + let i = i + 1; + let j = 0; + } + let hPos = hPos + 1; + if(hPos > 63) { + let hPos = 0; + let vPos = vPos + 1; + } + if(vPos > 22) { + let vPos = 0; + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int l; + let l = 0; + while (l < s.length()) { + do Output.printChar(s.charAt(l)); + let l = l + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String intstr; + let intstr = String.new(6); + do intstr.setInt(i); + do Output.printString(intstr); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + let vPos = vPos + 1; + if(vPos > 22) { + let vPos = 0; + } + let hPos = 0; + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + let hPos = hPos - 1; + if (hPos < 0) { + let hPos = 0; + } + return; + } +} diff --git a/projects/12/OutputTest/Array.jack b/projects/12/OutputTest/Array.jack new file mode 100644 index 0000000..e949198 --- /dev/null +++ b/projects/12/OutputTest/Array.jack @@ -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/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) { + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/projects/12/OutputTest/Array.vm b/projects/12/OutputTest/Array.vm new file mode 100644 index 0000000..c0cd797 --- /dev/null +++ b/projects/12/OutputTest/Array.vm @@ -0,0 +1,12 @@ +function Array.new 0 +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/projects/12/OutputTest/Keyboard.jack b/projects/12/OutputTest/Keyboard.jack new file mode 100644 index 0000000..d0e4022 --- /dev/null +++ b/projects/12/OutputTest/Keyboard.jack @@ -0,0 +1,92 @@ +// 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 { + + static Array kbd; + + /** Initializes the keyboard. */ + function void init() { + let kbd = 24576; + return; + } + + /** + * 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() { + return kbd[0]; + } + + /** + * 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() { + var char key; + while(kbd[0] = 0) {} + let key = kbd[0]; + do Output.printChar(key); + while(kbd[0] = key) {} + return key; + } + + /** + * 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) { + var String str; + var char chr; + let str = String.new(32); + do Output.printString(message); + while (true) { + let chr = Keyboard.readChar(); + if(chr = 128) { + return str; + } + if(chr = 129) { + do str.eraseLastChar(); + } else { + let str = str.appendChar(chr); + } + } + return str; + } + + /** + * 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) { + var String str; + let str = Keyboard.readLine(message); + return str.intValue(); + } +} diff --git a/projects/12/OutputTest/Keyboard.vm b/projects/12/OutputTest/Keyboard.vm new file mode 100644 index 0000000..91da157 --- /dev/null +++ b/projects/12/OutputTest/Keyboard.vm @@ -0,0 +1,98 @@ +function Keyboard.init 0 +push constant 24576 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 1 +label WHILE_EXP0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP1 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +eq +not +if-goto WHILE_END1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +return +function Keyboard.readLine 2 +push constant 32 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 1 +push local 1 +push constant 128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +return +label IF_FALSE0 +push local 1 +push constant 129 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 1 +call String.appendChar 2 +pop local 0 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Keyboard.readInt 1 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +return diff --git a/projects/12/OutputTest/Main.jack b/projects/12/OutputTest/Main.jack new file mode 100644 index 0000000..46e45e3 --- /dev/null +++ b/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/projects/12/OutputTest/Main.vm b/projects/12/OutputTest/Main.vm new file mode 100644 index 0000000..0a4c951 --- /dev/null +++ b/projects/12/OutputTest/Main.vm @@ -0,0 +1,254 @@ +function Main.main 1 +push constant 1 +call String.new 1 +pop local 0 +push local 0 +call String.doubleQuote 0 +call String.appendChar 2 +pop temp 0 +push constant 0 +push constant 63 +call Output.moveCursor 2 +pop temp 0 +push constant 66 +call Output.printChar 1 +pop temp 0 +push constant 22 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 67 +call Output.printChar 1 +pop temp 0 +push constant 22 +push constant 63 +call Output.moveCursor 2 +pop temp 0 +push constant 68 +call Output.printChar 1 +pop temp 0 +push constant 65 +call Output.printChar 1 +pop temp 0 +push constant 2 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 10 +call String.new 1 +push constant 48 +call String.appendChar 2 +push constant 49 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 51 +call String.appendChar 2 +push constant 52 +call String.appendChar 2 +push constant 53 +call String.appendChar 2 +push constant 54 +call String.appendChar 2 +push constant 55 +call String.appendChar 2 +push constant 56 +call String.appendChar 2 +push constant 57 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 53 +call String.new 1 +push constant 65 +call String.appendChar 2 +push constant 66 +call String.appendChar 2 +push constant 67 +call String.appendChar 2 +push constant 68 +call String.appendChar 2 +push constant 69 +call String.appendChar 2 +push constant 70 +call String.appendChar 2 +push constant 71 +call String.appendChar 2 +push constant 72 +call String.appendChar 2 +push constant 73 +call String.appendChar 2 +push constant 74 +call String.appendChar 2 +push constant 75 +call String.appendChar 2 +push constant 76 +call String.appendChar 2 +push constant 77 +call String.appendChar 2 +push constant 78 +call String.appendChar 2 +push constant 79 +call String.appendChar 2 +push constant 80 +call String.appendChar 2 +push constant 81 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 83 +call String.appendChar 2 +push constant 84 +call String.appendChar 2 +push constant 85 +call String.appendChar 2 +push constant 86 +call String.appendChar 2 +push constant 87 +call String.appendChar 2 +push constant 88 +call String.appendChar 2 +push constant 89 +call String.appendChar 2 +push constant 90 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 106 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 113 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 118 +call String.appendChar 2 +push constant 119 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 122 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 30 +call String.new 1 +push constant 33 +call String.appendChar 2 +push constant 35 +call String.appendChar 2 +push constant 36 +call String.appendChar 2 +push constant 37 +call String.appendChar 2 +push constant 38 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 40 +call String.appendChar 2 +push constant 41 +call String.appendChar 2 +push constant 42 +call String.appendChar 2 +push constant 43 +call String.appendChar 2 +push constant 44 +call String.appendChar 2 +push constant 45 +call String.appendChar 2 +push constant 46 +call String.appendChar 2 +push constant 47 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 59 +call String.appendChar 2 +push constant 60 +call String.appendChar 2 +push constant 61 +call String.appendChar 2 +push constant 62 +call String.appendChar 2 +push constant 63 +call String.appendChar 2 +push constant 64 +call String.appendChar 2 +push constant 91 +call String.appendChar 2 +push constant 93 +call String.appendChar 2 +push constant 94 +call String.appendChar 2 +push constant 95 +call String.appendChar 2 +push constant 96 +call String.appendChar 2 +push constant 123 +call String.appendChar 2 +push constant 124 +call String.appendChar 2 +push constant 125 +call String.appendChar 2 +push constant 126 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 12345 +neg +call Output.printInt 1 +pop temp 0 +call Output.backSpace 0 +pop temp 0 +push constant 6789 +call Output.printInt 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/OutputTest/Math.jack b/projects/12/OutputTest/Math.jack new file mode 100644 index 0000000..ed50f54 --- /dev/null +++ b/projects/12/OutputTest/Math.jack @@ -0,0 +1,142 @@ +// 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 { + + static Array twoToThe; + + /** Initializes the library. */ + function void init() { + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x < 0) { + return -x; + } else { + return 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) { + var int sum, shiftedX, i; + let sum = 0; + let shiftedX = x; + let i = 0; + while (i < 16) { + if(Math.bit(y, i)) { + let sum = sum + shiftedX; + } + let shiftedX = shiftedX + shiftedX; + let i = i + 1; + } + return sum; + } + + /** 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) { + var int q, tres; + if(x < 0 & y < 0) { + return Math.divide(Math.abs(x), Math.abs(y)); + } + if(x < 0 | y < 0) { + return -Math.divide(Math.abs(x), Math.abs(y)); + } + if(y > x) { + return 0; + } + if(y < 0) { + return 0; + } + let q = Math.divide(x, 2 * y); + if((x - (2 * q * y)) < y) { + return 2 * q; + } else { + return 2 * q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int y, j; + let y = 0; + let j = 7; + while(j > -1) { + if (~((Math.pow((y + Math.pow(2, j)), 2) > x)) & (Math.pow((y + Math.pow(2, j)), 2) > 0)) { + let y = y + Math.pow(2, j); + } + let j = j - 1; + } + return y; + } + + function int pow(int x, int p) { + var int r, i; + let i = 0; + let r = 1; + while (i < p) { + let r = r * x; + let i = i + 1; + } + return r; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if(a > b) { + return a; + } else { + return b; + } + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if(a > b) { + return b; + } else { + return a; + } + } +} diff --git a/projects/12/OutputTest/Math.vm b/projects/12/OutputTest/Math.vm new file mode 100644 index 0000000..e03fd3e --- /dev/null +++ b/projects/12/OutputTest/Math.vm @@ -0,0 +1,394 @@ +function Math.init 0 +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Math.bit 0 +push argument 0 +push argument 1 +push static 0 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 +function Math.multiply 3 +push constant 0 +pop local 0 +push argument 0 +pop local 1 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 16 +lt +not +if-goto WHILE_END0 +push argument 1 +push local 2 +call Math.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 1 +add +pop local 0 +label IF_FALSE0 +push local 1 +push local 1 +add +pop local 1 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.divide 2 +push argument 0 +push constant 0 +lt +push argument 1 +and +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +return +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +or +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +neg +return +label IF_FALSE1 +push argument 1 +push argument 0 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +return +label IF_FALSE3 +push argument 0 +push constant 2 +push argument 1 +call Math.multiply 2 +call Math.divide 2 +pop local 0 +push argument 0 +push constant 2 +push local 0 +call Math.multiply 2 +push argument 1 +call Math.multiply 2 +sub +push argument 1 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 2 +push local 0 +call Math.multiply 2 +return +goto IF_END4 +label IF_FALSE4 +push constant 2 +push local 0 +call Math.multiply 2 +push constant 1 +add +return +label IF_END4 +function Math.sqrt 2 +push constant 0 +pop local 0 +push constant 7 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push argument 0 +gt +not +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push constant 0 +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +pop local 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.pow 2 +push constant 0 +pop local 1 +push constant 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push argument 1 +lt +not +if-goto WHILE_END0 +push local 0 +push argument 0 +call Math.multiply 2 +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +return +label IF_END0 +function Math.min 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 diff --git a/projects/12/OutputTest/Memory.jack b/projects/12/OutputTest/Memory.jack new file mode 100644 index 0000000..7edeee6 --- /dev/null +++ b/projects/12/OutputTest/Memory.jack @@ -0,0 +1,73 @@ +// 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 { + + static Array memory; + static Array heap; + static Array freeList; + + /** Initializes the class. */ + function void init() { + let memory = 0; + let heap = 2048; + let freeList = 2048; + let heap[0] = 0; + let heap[1] = 14335; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return memory[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let memory[address] = value; + return; + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + var Array curList, found; + let curList = freeList; + while (curList > 0) { + if (curList[1] > (size + 1)) { + do Memory.poke(8010, 1); + let found = curList + curList[1] - size; + let curList[1] = curList[1] - size - 2; + let found[0] = 0; + let found[1] = size; + return found; + } else { + let curList = curList[0]; + } + } + return 0; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array curList; + let curList = freeList; + if(curList = 0) { + let freeList = o; + return; + } + while (curList[0] > 0) { + let curList = curList[0]; + } + let curList = o; + return; + } +} diff --git a/projects/12/OutputTest/Memory.vm b/projects/12/OutputTest/Memory.vm new file mode 100644 index 0000000..8b513e9 --- /dev/null +++ b/projects/12/OutputTest/Memory.vm @@ -0,0 +1,161 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +pop static 1 +push constant 2048 +pop static 2 +push constant 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 1 +add +push constant 14335 +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 static 2 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 1 +add +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8010 +push constant 1 +call Memory.poke 2 +pop temp 0 +push local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +add +push argument 0 +sub +pop local 1 +push constant 1 +push local 0 +add +push constant 1 +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 0 +push local 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Memory.deAlloc 1 +push static 2 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop static 2 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push argument 0 +pop local 0 +push constant 0 +return diff --git a/projects/12/OutputTest/Output.jack b/projects/12/OutputTest/Output.jack new file mode 100644 index 0000000..21629b7 --- /dev/null +++ b/projects/12/OutputTest/Output.jack @@ -0,0 +1,288 @@ +// 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; + static int hPos, vPos; + static Array twoToThe; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + let hPos = 0; + let vPos = 0; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + do Output.initMap(); + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + // 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,12,30,51,51,51,63,51,51,51,0,0); // A + 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) { + let hPos = j; + let vPos = i; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array map; + var int i, j; + let i = 0; + let j = 0; + let map = Output.getMap(c); + while (i < 11) { + while (j < 8) { + if(Output.bit(map[i], j)) { + do Screen.setColor(true); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } else { + do Screen.setColor(false); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } + let j = j + 1; + } + let i = i + 1; + let j = 0; + } + let hPos = hPos + 1; + if(hPos > 63) { + let hPos = 0; + let vPos = vPos + 1; + } + if(vPos > 22) { + let vPos = 0; + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int l; + let l = 0; + while (l < s.length()) { + do Output.printChar(s.charAt(l)); + let l = l + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String intstr; + let intstr = String.new(6); + do intstr.setInt(i); + do Output.printString(intstr); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + let vPos = vPos + 1; + if(vPos > 22) { + let vPos = 0; + } + let hPos = 0; + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + let hPos = hPos - 1; + if (hPos < 0) { + let hPos = 0; + } + return; + } +} diff --git a/projects/12/OutputTest/Output.vm b/projects/12/OutputTest/Output.vm new file mode 100644 index 0000000..0b6f718 --- /dev/null +++ b/projects/12/OutputTest/Output.vm @@ -0,0 +1,1818 @@ +function Output.init 0 +push constant 0 +pop static 1 +push constant 0 +pop static 2 +push constant 16 +call Array.new 1 +pop static 3 +push constant 0 +push static 3 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 3 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 3 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 3 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 3 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 3 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 3 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 3 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 3 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 3 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 3 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 3 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 3 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 3 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 3 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 3 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +call Output.initMap 0 +pop temp 0 +push constant 0 +return +function Output.bit 0 +push argument 0 +push argument 1 +push static 3 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +function Output.initMap 1 +push constant 127 +call Array.new 1 +pop static 0 +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 51 +push constant 63 +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 0 +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.getMap 0 +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 argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Output.moveCursor 0 +push argument 1 +pop static 1 +push argument 0 +pop static 2 +push constant 0 +return +function Output.printChar 3 +push constant 0 +pop local 1 +push constant 0 +pop local 2 +push argument 0 +call Output.getMap 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 2 +push constant 8 +lt +not +if-goto WHILE_END1 +push local 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 2 +call Output.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push constant 1 +add +pop local 1 +push constant 0 +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push static 1 +push constant 1 +add +pop static 1 +push static 1 +push constant 63 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop static 1 +push static 2 +push constant 1 +add +pop static 2 +label IF_FALSE1 +push static 2 +push constant 22 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +pop static 2 +label IF_FALSE2 +push constant 0 +return +function Output.printString 1 +push constant 0 +pop local 0 +label WHILE_EXP0 +push local 0 +push argument 0 +call String.length 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 1 +push constant 6 +call String.new 1 +pop local 0 +push local 0 +push argument 0 +call String.setInt 2 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 2 +push constant 1 +add +pop static 2 +push static 2 +push constant 22 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 2 +label IF_FALSE0 +push constant 0 +pop static 1 +push constant 0 +return +function Output.backSpace 0 +push static 1 +push constant 1 +sub +pop static 1 +push static 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 1 +label IF_FALSE0 +push constant 0 +return diff --git a/projects/12/OutputTest/OutputTestOutput.gif b/projects/12/OutputTest/OutputTestOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8ec2c087f7817b026f37825cdd9870ebef4ee45 GIT binary patch literal 6184 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 0) { + let dy = dy - 1; + } else { + let dy = dy + 1; + } + } + return; + } + if(dy = 0) { + while(~(dx = 0)) { + do Screen.drawPixel(x1 + dx, y1); + if (dx > 0) { + let dx = dx - 1; + } else { + let dx = dx + 1; + } + } + return; + } + while((~(Math.abs(a) > Math.abs(dx))) & (~(Math.abs(b) > Math.abs(dy)))) { + do Screen.drawPixel(x1 + a, y1 + b); + if(diff < 0) { + if(dx > 0) { + let a = a + 1; + } + if(dx < 0) { + let a = a - 1; + } + let diff = diff + Math.abs(dy); + } else { + if(dy > 0) { + let b = b + 1; + } + if(dy < 0) { + let b = b - 1; + } + let diff = diff - Math.abs(dx); + } + } + return; + } + + /** Draws a filled rectangle whose top left corner is (x1, y1) + * and bottom right corner is (x2,y2), using the current color. */ + function void drawRectangle(int x1, int y1, int x2, int y2) { + var int dy; + let dy = y2 - y1; + while(~(Math.abs(dy) = 0)) { + if (dy > 0) { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy - 1; + } else { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy + 1; + } + } + return; + } + + /** Draws a filled circle of radius r<=181 around (x,y), using the current color. */ + function void drawCircle(int x, int y, int r) { + var int dy; + let dy = -r; + if (r > 181) { + return; + } + while(dy < (r + 1)) { + do Screen.drawLine(x-Math.sqrt((r*r)-(dy*dy)),y + dy,x+Math.sqrt((r*r)-(dy*dy)),y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/OutputTest/Screen.vm b/projects/12/OutputTest/Screen.vm new file mode 100644 index 0000000..a89b523 --- /dev/null +++ b/projects/12/OutputTest/Screen.vm @@ -0,0 +1,534 @@ +function Screen.init 0 +push constant 0 +not +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Screen.clearScreen 3 +push constant 0 +pop local 0 +push constant 0 +pop local 1 +push static 1 +pop local 2 +push constant 0 +pop static 1 +label WHILE_EXP0 +push local 0 +push constant 256 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 1 +push constant 512 +lt +not +if-goto WHILE_END1 +push local 0 +push local 1 +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 2 +pop static 1 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 1 +push constant 0 +return +function Screen.drawPixel 2 +push constant 32 +push argument 1 +call Math.multiply 2 +push argument 0 +push constant 16 +call Math.divide 2 +add +pop local 0 +push constant 16384 +push local 0 +add +call Memory.peek 1 +pop local 1 +push static 1 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +or +pop local 1 +goto IF_END0 +label IF_FALSE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +not +and +pop local 1 +label IF_END0 +push constant 16384 +push local 0 +add +push local 1 +call Memory.poke 2 +pop temp 0 +push constant 0 +return +function Screen.drawLine 5 +push argument 2 +push argument 0 +sub +pop local 0 +push argument 3 +push argument 1 +sub +pop local 1 +push constant 0 +pop local 2 +push constant 0 +pop local 3 +push constant 0 +pop local 4 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push argument 0 +push argument 1 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +push constant 1 +sub +pop local 1 +goto IF_END1 +label IF_FALSE1 +push local 1 +push constant 1 +add +pop local 1 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +label IF_FALSE0 +push local 1 +push constant 0 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +not +not +if-goto WHILE_END1 +push argument 0 +push local 0 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END3 +label IF_FALSE3 +push local 0 +push constant 1 +add +pop local 0 +label IF_END3 +goto WHILE_EXP1 +label WHILE_END1 +push constant 0 +return +label IF_FALSE2 +label WHILE_EXP2 +push local 2 +call Math.abs 1 +push local 0 +call Math.abs 1 +gt +not +push local 3 +call Math.abs 1 +push local 1 +call Math.abs 1 +gt +not +and +not +if-goto WHILE_END2 +push argument 0 +push local 2 +add +push argument 1 +push local 3 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 0 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 0 +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 2 +push constant 1 +add +pop local 2 +label IF_FALSE5 +push local 0 +push constant 0 +lt +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push local 2 +push constant 1 +sub +pop local 2 +label IF_FALSE6 +push local 4 +push local 1 +call Math.abs 1 +add +pop local 4 +goto IF_END4 +label IF_FALSE4 +push local 1 +push constant 0 +gt +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push local 3 +push constant 1 +add +pop local 3 +label IF_FALSE7 +push local 1 +push constant 0 +lt +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push local 3 +push constant 1 +sub +pop local 3 +label IF_FALSE8 +push local 4 +push local 0 +call Math.abs 1 +sub +pop local 4 +label IF_END4 +goto WHILE_EXP2 +label WHILE_END2 +push constant 0 +return +function Screen.drawRectangle 1 +push argument 3 +push argument 1 +sub +pop local 0 +label WHILE_EXP0 +push local 0 +call Math.abs 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawCircle 1 +push argument 2 +neg +pop local 0 +push argument 2 +push constant 181 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push local 0 +push argument 2 +push constant 1 +add +lt +not +if-goto WHILE_END0 +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +sub +push argument 1 +push local 0 +add +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +add +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/12/OutputTest/String.jack b/projects/12/OutputTest/String.jack new file mode 100644 index 0000000..6a1ab29 --- /dev/null +++ b/projects/12/OutputTest/String.jack @@ -0,0 +1,136 @@ +// 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 { + + field Array str; + field int length; + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + if(maxLength > 0) { + let str = Array.new(maxLength); + } else { + let str = 0; + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Returns the current length of this string. */ + method int length() { + return length; + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + let str[length - 1] = 0; + let length = length - 1; + return; + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + var int val, i, d; + var boolean neg; + let i = 0; + if(str[i] = 45) { + let neg = true; + let i = 1; + } + while(i < length) { + let d = str[i] - 48; + let val = val * 10 + d; + let i = i + 1; + } + if(neg) { + return -val; + } + return val; + } + + function String int2String(int val) { + var String string; + var int lastDigit, c; + let string = String.new(64); + let lastDigit = val - ((val / 10) * 10); + let c = lastDigit + 48; + if(val < 10) { + do string.appendChar(c); + return string; + } else { + do string.dispose(); + let string = String.int2String(val / 10); + do string.appendChar(c); + return string; + } + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var String temp; + var int i; + let length = 0; + if(val < 0) { + do appendChar(45); + } + let i = 0; + let temp = String.int2String(Math.abs(val)); + while(i < temp.length()) { + do appendChar(temp.charAt(i)); + let i = i + 1; + } + do temp.dispose(); + return; + } + + /** Returns the new line character. */ + function char newLine() { + return 128; + } + + /** Returns the backspace character. */ + function char backSpace() { + return 129; + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + return 34; + } +} diff --git a/projects/12/OutputTest/String.vm b/projects/12/OutputTest/String.vm new file mode 100644 index 0000000..5c65675 --- /dev/null +++ b/projects/12/OutputTest/String.vm @@ -0,0 +1,250 @@ +function String.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Array.new 1 +pop this 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 0 +label IF_END0 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +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 1 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +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 1 +push this 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +add +pop this 1 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +sub +push this 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +sub +pop this 1 +push constant 0 +return +function String.intValue 4 +push argument 0 +pop pointer 0 +push constant 0 +pop local 1 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +pop local 3 +push constant 1 +pop local 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 1 +push this 1 +lt +not +if-goto WHILE_END0 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 0 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +neg +return +label IF_FALSE1 +push local 0 +return +function String.int2String 3 +push constant 64 +call String.new 1 +pop local 0 +push argument 0 +push argument 0 +push constant 10 +call Math.divide 2 +push constant 10 +call Math.multiply 2 +sub +pop local 1 +push local 1 +push constant 48 +add +pop local 2 +push argument 0 +push constant 10 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +goto IF_END0 +label IF_FALSE0 +push local 0 +call String.dispose 1 +pop temp 0 +push argument 0 +push constant 10 +call Math.divide 2 +call String.int2String 1 +pop local 0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +label IF_END0 +function String.setInt 2 +push argument 0 +pop pointer 0 +push constant 0 +pop this 1 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push pointer 0 +push constant 45 +call String.appendChar 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +pop local 1 +push argument 1 +call Math.abs 1 +call String.int2String 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push local 0 +call String.length 1 +lt +not +if-goto WHILE_END0 +push pointer 0 +push local 0 +push local 1 +call String.charAt 2 +call String.appendChar 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +call String.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/projects/12/OutputTest/Sys.jack b/projects/12/OutputTest/Sys.jack new file mode 100644 index 0000000..3aea36b --- /dev/null +++ b/projects/12/OutputTest/Sys.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/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + do Memory.init(); + do Math.init(); + do Screen.init(); + do Output.init(); + do Keyboard.init(); + do Main.main(); + do Sys.halt(); + return; + } + + /** Halts the program execution. */ + function void halt() { + while(true){} + return; + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + let i = 10000; + while(i > 0) { + let i = i - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + do Output.printString("ERR"); + do Output.printInt(errorCode); + do Sys.halt(); + return; + } +} diff --git a/projects/12/OutputTest/Sys.vm b/projects/12/OutputTest/Sys.vm new file mode 100644 index 0000000..05b7a18 --- /dev/null +++ b/projects/12/OutputTest/Sys.vm @@ -0,0 +1,62 @@ +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 constant 10000 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 3 +call String.new 1 +push constant 69 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +call Output.printString 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/projects/12/Pong/Array.jack b/projects/12/Pong/Array.jack new file mode 100644 index 0000000..e949198 --- /dev/null +++ b/projects/12/Pong/Array.jack @@ -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/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) { + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/projects/12/Pong/Array.vm b/projects/12/Pong/Array.vm new file mode 100644 index 0000000..c0cd797 --- /dev/null +++ b/projects/12/Pong/Array.vm @@ -0,0 +1,12 @@ +function Array.new 0 +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/projects/12/Pong/Ball.jack b/projects/12/Pong/Ball.jack new file mode 100644 index 0000000..5e7c9a8 --- /dev/null +++ b/projects/12/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/projects/12/Pong/Ball.vm b/projects/12/Pong/Ball.vm new file mode 100644 index 0000000..8269c1c --- /dev/null +++ b/projects/12/Pong/Ball.vm @@ -0,0 +1,444 @@ +function Ball.new 0 +push constant 15 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 10 +push argument 3 +push constant 6 +sub +pop this 11 +push argument 4 +pop this 12 +push argument 5 +push constant 6 +sub +pop this 13 +push constant 0 +pop this 14 +push pointer 0 +call Ball.show 1 +pop temp 0 +push pointer 0 +return +function Ball.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function Ball.show 0 +push argument 0 +pop pointer 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Ball.draw 1 +pop temp 0 +push constant 0 +return +function Ball.hide 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Ball.draw 1 +pop temp 0 +push constant 0 +return +function Ball.draw 0 +push argument 0 +pop pointer 0 +push this 0 +push this 1 +push this 0 +push constant 5 +add +push this 1 +push constant 5 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Ball.getLeft 0 +push argument 0 +pop pointer 0 +push this 0 +return +function Ball.getRight 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 5 +add +return +function Ball.setDestination 3 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +sub +pop this 2 +push argument 2 +push this 1 +sub +pop this 3 +push this 2 +call Math.abs 1 +pop local 0 +push this 3 +call Math.abs 1 +pop local 1 +push local 0 +push local 1 +lt +pop this 7 +push this 7 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +pop local 2 +push local 1 +pop local 0 +push local 2 +pop local 1 +push this 1 +push argument 2 +lt +pop this 8 +push this 0 +push argument 1 +lt +pop this 9 +goto IF_END0 +label IF_FALSE0 +push this 0 +push argument 1 +lt +pop this 8 +push this 1 +push argument 2 +lt +pop this 9 +label IF_END0 +push constant 2 +push local 1 +call Math.multiply 2 +push local 0 +sub +pop this 4 +push constant 2 +push local 1 +call Math.multiply 2 +pop this 5 +push constant 2 +push local 1 +push local 0 +sub +call Math.multiply 2 +pop this 6 +push constant 0 +return +function Ball.move 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Ball.hide 1 +pop temp 0 +push this 4 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 4 +push this 5 +add +pop this 4 +goto IF_END0 +label IF_FALSE0 +push this 4 +push this 6 +add +pop this 4 +push this 9 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push this 7 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push this 0 +push constant 4 +add +pop this 0 +goto IF_END2 +label IF_FALSE2 +push this 1 +push constant 4 +add +pop this 1 +label IF_END2 +goto IF_END1 +label IF_FALSE1 +push this 7 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push this 0 +push constant 4 +sub +pop this 0 +goto IF_END3 +label IF_FALSE3 +push this 1 +push constant 4 +sub +pop this 1 +label IF_END3 +label IF_END1 +label IF_END0 +push this 8 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push this 7 +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push this 1 +push constant 4 +add +pop this 1 +goto IF_END5 +label IF_FALSE5 +push this 0 +push constant 4 +add +pop this 0 +label IF_END5 +goto IF_END4 +label IF_FALSE4 +push this 7 +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push this 1 +push constant 4 +sub +pop this 1 +goto IF_END6 +label IF_FALSE6 +push this 0 +push constant 4 +sub +pop this 0 +label IF_END6 +label IF_END4 +push this 0 +push this 10 +gt +not +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push constant 1 +pop this 14 +push this 10 +pop this 0 +label IF_FALSE7 +push this 0 +push this 11 +lt +not +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push constant 2 +pop this 14 +push this 11 +pop this 0 +label IF_FALSE8 +push this 1 +push this 12 +gt +not +if-goto IF_TRUE9 +goto IF_FALSE9 +label IF_TRUE9 +push constant 3 +pop this 14 +push this 12 +pop this 1 +label IF_FALSE9 +push this 1 +push this 13 +lt +not +if-goto IF_TRUE10 +goto IF_FALSE10 +label IF_TRUE10 +push constant 4 +pop this 14 +push this 13 +pop this 1 +label IF_FALSE10 +push pointer 0 +call Ball.show 1 +pop temp 0 +push this 14 +return +function Ball.bounce 5 +push argument 0 +pop pointer 0 +push this 2 +push constant 10 +call Math.divide 2 +pop local 2 +push this 3 +push constant 10 +call Math.divide 2 +pop local 3 +push argument 1 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 10 +pop local 4 +goto IF_END0 +label IF_FALSE0 +push this 2 +push constant 0 +lt +not +push argument 1 +push constant 1 +eq +and +push this 2 +push constant 0 +lt +push argument 1 +push constant 1 +neg +eq +and +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 20 +pop local 4 +goto IF_END1 +label IF_FALSE1 +push constant 5 +pop local 4 +label IF_END1 +label IF_END0 +push this 14 +push constant 1 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 506 +pop local 0 +push local 3 +push constant 50 +neg +call Math.multiply 2 +push local 2 +call Math.divide 2 +pop local 1 +push this 1 +push local 1 +push local 4 +call Math.multiply 2 +add +pop local 1 +goto IF_END2 +label IF_FALSE2 +push this 14 +push constant 2 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +pop local 0 +push local 3 +push constant 50 +call Math.multiply 2 +push local 2 +call Math.divide 2 +pop local 1 +push this 1 +push local 1 +push local 4 +call Math.multiply 2 +add +pop local 1 +goto IF_END3 +label IF_FALSE3 +push this 14 +push constant 3 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 250 +pop local 1 +push local 2 +push constant 25 +neg +call Math.multiply 2 +push local 3 +call Math.divide 2 +pop local 0 +push this 0 +push local 0 +push local 4 +call Math.multiply 2 +add +pop local 0 +goto IF_END4 +label IF_FALSE4 +push constant 0 +pop local 1 +push local 2 +push constant 25 +call Math.multiply 2 +push local 3 +call Math.divide 2 +pop local 0 +push this 0 +push local 0 +push local 4 +call Math.multiply 2 +add +pop local 0 +label IF_END4 +label IF_END3 +label IF_END2 +push pointer 0 +push local 0 +push local 1 +call Ball.setDestination 3 +pop temp 0 +push constant 0 +return diff --git a/projects/12/Pong/Ball.xml b/projects/12/Pong/Ball.xml new file mode 100644 index 0000000..be88e25 --- /dev/null +++ b/projects/12/Pong/Ball.xml @@ -0,0 +1,1758 @@ + + class + Ball + { + + field + int + x + , + y + ; + + + field + int + lengthx + , + lengthy + ; + + + field + int + d + , + straightD + , + diagonalD + ; + + + field + boolean + invert + , + positivex + , + positivey + ; + + + field + int + leftWall + , + rightWall + , + topWall + , + bottomWall + ; + + + field + int + wall + ; + + + 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 + + + ; + + + let + topWall + = + + + AtopWall + + + ; + + + let + bottomWall + = + + + AbottomWall + + - + + 6 + + + ; + + + let + wall + = + + + 0 + + + ; + + + do + show + ( + ) + ; + + + return + + + this + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + void + show + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + hide + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + draw + ( + + + ) + + { + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + int + getLeft + ( + + + ) + + { + + + return + + + x + + + ; + + + } + + + + int + getRight + ( + + + ) + + { + + + return + + + x + + + + + 5 + + + ; + + + } + + + + void + setDestination + ( + + int + destx + , + int + desty + + ) + + { + + var + int + dx + , + dy + , + temp + ; + + + + let + lengthx + = + + + destx + + - + + x + + + ; + + + let + lengthy + = + + + desty + + - + + y + + + ; + + + let + dx + = + + + Math + . + abs + ( + ) + + + ; + + + let + dy + = + + + Math + . + abs + ( + ) + + + ; + + + let + invert + = + + + ( + + + dx + + < + + dy + + + ) + + + ; + + + if + ( + + + invert + + + ) + { + + + let + temp + = + + + dx + + + ; + + + 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 + ; + + + } + + + + 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 + + + ; + + + } + + + + void + bounce + ( + + int + bouncingDirection + + ) + + { + + var + int + newx + , + newy + , + divLengthx + , + divLengthy + , + factor + ; + + + + 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 + + + ; + + + } + else + { + + + let + factor + = + + + 5 + + + ; + + + } + + + } + + + 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 + { + + + let + newy + = + + + 0 + + + ; + + + let + newx + = + + + ( + + + divLengthx + + * + + 25 + + + ) + + / + + divLengthy + + + ; + + + let + newx + = + + + x + + + + + ( + + + newx + + * + + factor + + + ) + + + ; + + + } + + + } + + + } + + + do + setDestination + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/12/Pong/BallT.xml b/projects/12/Pong/BallT.xml new file mode 100644 index 0000000..cabd2f8 --- /dev/null +++ b/projects/12/Pong/BallT.xml @@ -0,0 +1,881 @@ + + class + Ball + { + field + int + x + , + y + ; + field + int + lengthx + , + lengthy + ; + field + int + d + , + straightD + , + diagonalD + ; + field + boolean + invert + , + positivex + , + positivey + ; + field + int + leftWall + , + rightWall + , + topWall + , + bottomWall + ; + field + int + wall + ; + 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 + ; + let + topWall + = + AtopWall + ; + let + bottomWall + = + AbottomWall + - + 6 + ; + let + wall + = + 0 + ; + do + show + ( + ) + ; + return + this + ; + } + method + void + dispose + ( + ) + { + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + method + void + show + ( + ) + { + do + Screen + . + setColor + ( + true + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + hide + ( + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + draw + ( + ) + { + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + 5 + , + y + + + 5 + ) + ; + return + ; + } + method + int + getLeft + ( + ) + { + return + x + ; + } + method + int + getRight + ( + ) + { + return + x + + + 5 + ; + } + 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 + ; + 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 + ; + } + 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 + ; + } + method + void + bounce + ( + int + bouncingDirection + ) + { + var + int + newx + , + newy + , + divLengthx + , + divLengthy + , + factor + ; + 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 + ; + } + else + { + let + factor + = + 5 + ; + } + } + 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 + { + let + newy + = + 0 + ; + let + newx + = + ( + divLengthx + * + 25 + ) + / + divLengthy + ; + let + newx + = + x + + + ( + newx + * + factor + ) + ; + } + } + } + do + setDestination + ( + newx + , + newy + ) + ; + return + ; + } + } + diff --git a/projects/12/Pong/Bat.jack b/projects/12/Pong/Bat.jack new file mode 100644 index 0000000..25e67f4 --- /dev/null +++ b/projects/12/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/projects/12/Pong/Bat.vm b/projects/12/Pong/Bat.vm new file mode 100644 index 0000000..f158c82 --- /dev/null +++ b/projects/12/Pong/Bat.vm @@ -0,0 +1,207 @@ +function Bat.new 0 +push constant 5 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 2 +push argument 3 +pop this 3 +push constant 2 +pop this 4 +push pointer 0 +call Bat.show 1 +pop temp 0 +push pointer 0 +return +function Bat.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function Bat.show 0 +push argument 0 +pop pointer 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Bat.draw 1 +pop temp 0 +push constant 0 +return +function Bat.hide 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push pointer 0 +call Bat.draw 1 +pop temp 0 +push constant 0 +return +function Bat.draw 0 +push argument 0 +pop pointer 0 +push this 0 +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Bat.setDirection 0 +push argument 0 +pop pointer 0 +push argument 1 +pop this 4 +push constant 0 +return +function Bat.getLeft 0 +push argument 0 +pop pointer 0 +push this 0 +return +function Bat.getRight 0 +push argument 0 +pop pointer 0 +push this 0 +push this 2 +add +return +function Bat.setWidth 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Bat.hide 1 +pop temp 0 +push argument 1 +pop this 2 +push pointer 0 +call Bat.show 1 +pop temp 0 +push constant 0 +return +function Bat.move 0 +push argument 0 +pop pointer 0 +push this 4 +push constant 1 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 0 +push constant 4 +sub +pop this 0 +push this 0 +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop this 0 +label IF_FALSE1 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 2 +add +push constant 1 +add +push this 1 +push this 0 +push this 2 +add +push constant 4 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push constant 3 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push this 0 +push constant 4 +add +pop this 0 +push this 0 +push this 2 +add +push constant 511 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 511 +push this 2 +sub +pop this 0 +label IF_FALSE2 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push constant 4 +sub +push this 1 +push this 0 +push constant 1 +sub +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 2 +add +push constant 3 +sub +push this 1 +push this 0 +push this 2 +add +push this 1 +push this 3 +add +call Screen.drawRectangle 4 +pop temp 0 +label IF_END0 +push constant 0 +return diff --git a/projects/12/Pong/Bat.xml b/projects/12/Pong/Bat.xml new file mode 100644 index 0000000..1a56212 --- /dev/null +++ b/projects/12/Pong/Bat.xml @@ -0,0 +1,587 @@ + + class + Bat + { + + field + int + x + , + y + ; + + + field + int + width + , + height + ; + + + field + int + direction + ; + + + 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 + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + void + show + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + hide + ( + + + ) + + { + + + do + Screen + . + setColor + ( + ) + ; + + + do + draw + ( + ) + ; + + + return + ; + + + } + + + + void + draw + ( + + + ) + + { + + + do + Screen + . + drawRectangle + ( + ) + ; + + + return + ; + + + } + + + + void + setDirection + ( + + int + Adirection + + ) + + { + + + let + direction + = + + + Adirection + + + ; + + + return + ; + + + } + + + + int + getLeft + ( + + + ) + + { + + + return + + + x + + + ; + + + } + + + + int + getRight + ( + + + ) + + { + + + return + + + x + + + + + width + + + ; + + + } + + + + void + setWidth + ( + + int + Awidth + + ) + + { + + + do + hide + ( + ) + ; + + + let + width + = + + + Awidth + + + ; + + + do + show + ( + ) + ; + + + return + ; + + + } + + + + void + move + ( + + + ) + + { + + + if + ( + + + direction + + = + + 1 + + + ) + { + + + let + x + = + + + x + + - + + 4 + + + ; + + + if + ( + + + x + + < + + 0 + + + ) + { + + + let + x + = + + + 0 + + + ; + + + } + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + else + { + + + let + x + = + + + x + + + + + 4 + + + ; + + + if + ( + + + ( + + + x + + + + + width + + + ) + + > + + 511 + + + ) + { + + + let + x + = + + + 511 + + - + + width + + + ; + + + } + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + do + Screen + . + setColor + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/12/Pong/BatT.xml b/projects/12/Pong/BatT.xml new file mode 100644 index 0000000..574a551 --- /dev/null +++ b/projects/12/Pong/BatT.xml @@ -0,0 +1,413 @@ + + class + Bat + { + field + int + x + , + y + ; + field + int + width + , + height + ; + field + int + direction + ; + 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 + ; + } + method + void + dispose + ( + ) + { + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + method + void + show + ( + ) + { + do + Screen + . + setColor + ( + true + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + hide + ( + ) + { + do + Screen + . + setColor + ( + false + ) + ; + do + draw + ( + ) + ; + return + ; + } + method + void + draw + ( + ) + { + do + Screen + . + drawRectangle + ( + x + , + y + , + x + + + width + , + y + + + height + ) + ; + return + ; + } + method + void + setDirection + ( + int + Adirection + ) + { + let + direction + = + Adirection + ; + return + ; + } + method + int + getLeft + ( + ) + { + return + x + ; + } + method + int + getRight + ( + ) + { + return + x + + + width + ; + } + method + void + setWidth + ( + int + Awidth + ) + { + do + hide + ( + ) + ; + let + width + = + Awidth + ; + do + show + ( + ) + ; + return + ; + } + 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/projects/12/Pong/Keyboard.jack b/projects/12/Pong/Keyboard.jack new file mode 100644 index 0000000..d0e4022 --- /dev/null +++ b/projects/12/Pong/Keyboard.jack @@ -0,0 +1,92 @@ +// 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 { + + static Array kbd; + + /** Initializes the keyboard. */ + function void init() { + let kbd = 24576; + return; + } + + /** + * 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() { + return kbd[0]; + } + + /** + * 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() { + var char key; + while(kbd[0] = 0) {} + let key = kbd[0]; + do Output.printChar(key); + while(kbd[0] = key) {} + return key; + } + + /** + * 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) { + var String str; + var char chr; + let str = String.new(32); + do Output.printString(message); + while (true) { + let chr = Keyboard.readChar(); + if(chr = 128) { + return str; + } + if(chr = 129) { + do str.eraseLastChar(); + } else { + let str = str.appendChar(chr); + } + } + return str; + } + + /** + * 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) { + var String str; + let str = Keyboard.readLine(message); + return str.intValue(); + } +} diff --git a/projects/12/Pong/Keyboard.vm b/projects/12/Pong/Keyboard.vm new file mode 100644 index 0000000..91da157 --- /dev/null +++ b/projects/12/Pong/Keyboard.vm @@ -0,0 +1,98 @@ +function Keyboard.init 0 +push constant 24576 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 1 +label WHILE_EXP0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP1 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +eq +not +if-goto WHILE_END1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +return +function Keyboard.readLine 2 +push constant 32 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 1 +push local 1 +push constant 128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +return +label IF_FALSE0 +push local 1 +push constant 129 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 1 +call String.appendChar 2 +pop local 0 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Keyboard.readInt 1 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +return diff --git a/projects/12/Pong/Main.jack b/projects/12/Pong/Main.jack new file mode 100644 index 0000000..56e9a83 --- /dev/null +++ b/projects/12/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/projects/12/Pong/Main.vm b/projects/12/Pong/Main.vm new file mode 100644 index 0000000..94d76d7 --- /dev/null +++ b/projects/12/Pong/Main.vm @@ -0,0 +1,13 @@ +function Main.main 1 +call PongGame.newInstance 0 +pop temp 0 +call PongGame.getInstance 0 +pop local 0 +push local 0 +call PongGame.run 1 +pop temp 0 +push local 0 +call PongGame.dispose 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/Pong/Main.xml b/projects/12/Pong/Main.xml new file mode 100644 index 0000000..310f4f3 --- /dev/null +++ b/projects/12/Pong/Main.xml @@ -0,0 +1,72 @@ + + class + Main + { + + void + main + ( + + + ) + + { + + var + PongGame + game + ; + + + + do + PongGame + . + newInstance + ( + ) + ; + + + let + game + = + + + PongGame + . + getInstance + ( + ) + + + ; + + + do + game + . + run + ( + ) + ; + + + do + game + . + dispose + ( + ) + ; + + + return + ; + + + } + + + } + diff --git a/projects/12/Pong/MainT.xml b/projects/12/Pong/MainT.xml new file mode 100644 index 0000000..7dcfbe6 --- /dev/null +++ b/projects/12/Pong/MainT.xml @@ -0,0 +1,49 @@ + + class + Main + { + function + void + main + ( + ) + { + var + PongGame + game + ; + do + PongGame + . + newInstance + ( + ) + ; + let + game + = + PongGame + . + getInstance + ( + ) + ; + do + game + . + run + ( + ) + ; + do + game + . + dispose + ( + ) + ; + return + ; + } + } + diff --git a/projects/12/Pong/Math.jack b/projects/12/Pong/Math.jack new file mode 100644 index 0000000..ed50f54 --- /dev/null +++ b/projects/12/Pong/Math.jack @@ -0,0 +1,142 @@ +// 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 { + + static Array twoToThe; + + /** Initializes the library. */ + function void init() { + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x < 0) { + return -x; + } else { + return 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) { + var int sum, shiftedX, i; + let sum = 0; + let shiftedX = x; + let i = 0; + while (i < 16) { + if(Math.bit(y, i)) { + let sum = sum + shiftedX; + } + let shiftedX = shiftedX + shiftedX; + let i = i + 1; + } + return sum; + } + + /** 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) { + var int q, tres; + if(x < 0 & y < 0) { + return Math.divide(Math.abs(x), Math.abs(y)); + } + if(x < 0 | y < 0) { + return -Math.divide(Math.abs(x), Math.abs(y)); + } + if(y > x) { + return 0; + } + if(y < 0) { + return 0; + } + let q = Math.divide(x, 2 * y); + if((x - (2 * q * y)) < y) { + return 2 * q; + } else { + return 2 * q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int y, j; + let y = 0; + let j = 7; + while(j > -1) { + if (~((Math.pow((y + Math.pow(2, j)), 2) > x)) & (Math.pow((y + Math.pow(2, j)), 2) > 0)) { + let y = y + Math.pow(2, j); + } + let j = j - 1; + } + return y; + } + + function int pow(int x, int p) { + var int r, i; + let i = 0; + let r = 1; + while (i < p) { + let r = r * x; + let i = i + 1; + } + return r; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if(a > b) { + return a; + } else { + return b; + } + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if(a > b) { + return b; + } else { + return a; + } + } +} diff --git a/projects/12/Pong/Math.vm b/projects/12/Pong/Math.vm new file mode 100644 index 0000000..e03fd3e --- /dev/null +++ b/projects/12/Pong/Math.vm @@ -0,0 +1,394 @@ +function Math.init 0 +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Math.bit 0 +push argument 0 +push argument 1 +push static 0 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 +function Math.multiply 3 +push constant 0 +pop local 0 +push argument 0 +pop local 1 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 16 +lt +not +if-goto WHILE_END0 +push argument 1 +push local 2 +call Math.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 1 +add +pop local 0 +label IF_FALSE0 +push local 1 +push local 1 +add +pop local 1 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.divide 2 +push argument 0 +push constant 0 +lt +push argument 1 +and +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +return +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +or +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +neg +return +label IF_FALSE1 +push argument 1 +push argument 0 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +return +label IF_FALSE3 +push argument 0 +push constant 2 +push argument 1 +call Math.multiply 2 +call Math.divide 2 +pop local 0 +push argument 0 +push constant 2 +push local 0 +call Math.multiply 2 +push argument 1 +call Math.multiply 2 +sub +push argument 1 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 2 +push local 0 +call Math.multiply 2 +return +goto IF_END4 +label IF_FALSE4 +push constant 2 +push local 0 +call Math.multiply 2 +push constant 1 +add +return +label IF_END4 +function Math.sqrt 2 +push constant 0 +pop local 0 +push constant 7 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push argument 0 +gt +not +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push constant 0 +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +pop local 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.pow 2 +push constant 0 +pop local 1 +push constant 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push argument 1 +lt +not +if-goto WHILE_END0 +push local 0 +push argument 0 +call Math.multiply 2 +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +return +label IF_END0 +function Math.min 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 diff --git a/projects/12/Pong/Memory.jack b/projects/12/Pong/Memory.jack new file mode 100644 index 0000000..7edeee6 --- /dev/null +++ b/projects/12/Pong/Memory.jack @@ -0,0 +1,73 @@ +// 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 { + + static Array memory; + static Array heap; + static Array freeList; + + /** Initializes the class. */ + function void init() { + let memory = 0; + let heap = 2048; + let freeList = 2048; + let heap[0] = 0; + let heap[1] = 14335; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return memory[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let memory[address] = value; + return; + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + var Array curList, found; + let curList = freeList; + while (curList > 0) { + if (curList[1] > (size + 1)) { + do Memory.poke(8010, 1); + let found = curList + curList[1] - size; + let curList[1] = curList[1] - size - 2; + let found[0] = 0; + let found[1] = size; + return found; + } else { + let curList = curList[0]; + } + } + return 0; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array curList; + let curList = freeList; + if(curList = 0) { + let freeList = o; + return; + } + while (curList[0] > 0) { + let curList = curList[0]; + } + let curList = o; + return; + } +} diff --git a/projects/12/Pong/Memory.vm b/projects/12/Pong/Memory.vm new file mode 100644 index 0000000..8b513e9 --- /dev/null +++ b/projects/12/Pong/Memory.vm @@ -0,0 +1,161 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +pop static 1 +push constant 2048 +pop static 2 +push constant 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 1 +add +push constant 14335 +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 static 2 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 1 +add +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8010 +push constant 1 +call Memory.poke 2 +pop temp 0 +push local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +add +push argument 0 +sub +pop local 1 +push constant 1 +push local 0 +add +push constant 1 +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 0 +push local 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Memory.deAlloc 1 +push static 2 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop static 2 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push argument 0 +pop local 0 +push constant 0 +return diff --git a/projects/12/Pong/Output.jack b/projects/12/Pong/Output.jack new file mode 100644 index 0000000..21629b7 --- /dev/null +++ b/projects/12/Pong/Output.jack @@ -0,0 +1,288 @@ +// 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; + static int hPos, vPos; + static Array twoToThe; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + let hPos = 0; + let vPos = 0; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + do Output.initMap(); + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + // 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,12,30,51,51,51,63,51,51,51,0,0); // A + 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) { + let hPos = j; + let vPos = i; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array map; + var int i, j; + let i = 0; + let j = 0; + let map = Output.getMap(c); + while (i < 11) { + while (j < 8) { + if(Output.bit(map[i], j)) { + do Screen.setColor(true); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } else { + do Screen.setColor(false); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } + let j = j + 1; + } + let i = i + 1; + let j = 0; + } + let hPos = hPos + 1; + if(hPos > 63) { + let hPos = 0; + let vPos = vPos + 1; + } + if(vPos > 22) { + let vPos = 0; + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int l; + let l = 0; + while (l < s.length()) { + do Output.printChar(s.charAt(l)); + let l = l + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String intstr; + let intstr = String.new(6); + do intstr.setInt(i); + do Output.printString(intstr); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + let vPos = vPos + 1; + if(vPos > 22) { + let vPos = 0; + } + let hPos = 0; + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + let hPos = hPos - 1; + if (hPos < 0) { + let hPos = 0; + } + return; + } +} diff --git a/projects/12/Pong/Output.vm b/projects/12/Pong/Output.vm new file mode 100644 index 0000000..0b6f718 --- /dev/null +++ b/projects/12/Pong/Output.vm @@ -0,0 +1,1818 @@ +function Output.init 0 +push constant 0 +pop static 1 +push constant 0 +pop static 2 +push constant 16 +call Array.new 1 +pop static 3 +push constant 0 +push static 3 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 3 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 3 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 3 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 3 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 3 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 3 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 3 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 3 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 3 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 3 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 3 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 3 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 3 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 3 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 3 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +call Output.initMap 0 +pop temp 0 +push constant 0 +return +function Output.bit 0 +push argument 0 +push argument 1 +push static 3 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +function Output.initMap 1 +push constant 127 +call Array.new 1 +pop static 0 +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 51 +push constant 63 +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 0 +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.getMap 0 +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 argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Output.moveCursor 0 +push argument 1 +pop static 1 +push argument 0 +pop static 2 +push constant 0 +return +function Output.printChar 3 +push constant 0 +pop local 1 +push constant 0 +pop local 2 +push argument 0 +call Output.getMap 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 2 +push constant 8 +lt +not +if-goto WHILE_END1 +push local 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 2 +call Output.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push constant 1 +add +pop local 1 +push constant 0 +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push static 1 +push constant 1 +add +pop static 1 +push static 1 +push constant 63 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop static 1 +push static 2 +push constant 1 +add +pop static 2 +label IF_FALSE1 +push static 2 +push constant 22 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +pop static 2 +label IF_FALSE2 +push constant 0 +return +function Output.printString 1 +push constant 0 +pop local 0 +label WHILE_EXP0 +push local 0 +push argument 0 +call String.length 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 1 +push constant 6 +call String.new 1 +pop local 0 +push local 0 +push argument 0 +call String.setInt 2 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 2 +push constant 1 +add +pop static 2 +push static 2 +push constant 22 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 2 +label IF_FALSE0 +push constant 0 +pop static 1 +push constant 0 +return +function Output.backSpace 0 +push static 1 +push constant 1 +sub +pop static 1 +push static 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 1 +label IF_FALSE0 +push constant 0 +return diff --git a/projects/12/Pong/PongGame.jack b/projects/12/Pong/PongGame.jack new file mode 100644 index 0000000..20fe2d3 --- /dev/null +++ b/projects/12/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/projects/12/Pong/PongGame.vm b/projects/12/Pong/PongGame.vm new file mode 100644 index 0000000..5bb75ec --- /dev/null +++ b/projects/12/Pong/PongGame.vm @@ -0,0 +1,318 @@ +function PongGame.new 0 +push constant 7 +call Memory.alloc 1 +pop pointer 0 +call Screen.clearScreen 0 +pop temp 0 +push constant 50 +pop this 6 +push constant 230 +push constant 229 +push this 6 +push constant 7 +call Bat.new 4 +pop this 0 +push constant 253 +push constant 222 +push constant 0 +push constant 511 +push constant 0 +push constant 229 +call Ball.new 6 +pop this 1 +push this 1 +push constant 400 +push constant 0 +call Ball.setDestination 3 +pop temp 0 +push constant 0 +push constant 238 +push constant 511 +push constant 240 +call Screen.drawRectangle 4 +pop temp 0 +push constant 22 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 8 +call String.new 1 +push constant 83 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push constant 0 +pop this 3 +push constant 0 +pop this 4 +push constant 0 +pop this 2 +push constant 0 +pop this 5 +push pointer 0 +return +function PongGame.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +call Bat.dispose 1 +pop temp 0 +push this 1 +call Ball.dispose 1 +pop temp 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function PongGame.newInstance 0 +call PongGame.new 0 +pop static 0 +push constant 0 +return +function PongGame.getInstance 0 +push static 0 +return +function PongGame.run 1 +push argument 0 +pop pointer 0 +label WHILE_EXP0 +push this 3 +not +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +push this 3 +not +and +not +if-goto WHILE_END1 +call Keyboard.keyPressed 0 +pop local 0 +push this 0 +call Bat.move 1 +pop temp 0 +push pointer 0 +call PongGame.moveBall 1 +pop temp 0 +push constant 50 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +push constant 130 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 0 +push constant 1 +call Bat.setDirection 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push local 0 +push constant 132 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push this 0 +push constant 2 +call Bat.setDirection 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push constant 140 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +not +pop this 3 +label IF_FALSE2 +label IF_END1 +label IF_END0 +label WHILE_EXP2 +push local 0 +push constant 0 +eq +not +push this 3 +not +and +not +if-goto WHILE_END2 +call Keyboard.keyPressed 0 +pop local 0 +push this 0 +call Bat.move 1 +pop temp 0 +push pointer 0 +call PongGame.moveBall 1 +pop temp 0 +push constant 50 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP2 +label WHILE_END2 +goto WHILE_EXP0 +label WHILE_END0 +push this 3 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 10 +push constant 27 +call Output.moveCursor 2 +pop temp 0 +push constant 9 +call String.new 1 +push constant 71 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 79 +call String.appendChar 2 +push constant 118 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +label IF_FALSE3 +push constant 0 +return +function PongGame.moveBall 5 +push argument 0 +pop pointer 0 +push this 1 +call Ball.move 1 +pop this 2 +push this 2 +push constant 0 +gt +push this 2 +push this 5 +eq +not +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 2 +pop this 5 +push constant 0 +pop local 0 +push this 0 +call Bat.getLeft 1 +pop local 1 +push this 0 +call Bat.getRight 1 +pop local 2 +push this 1 +call Ball.getLeft 1 +pop local 3 +push this 1 +call Ball.getRight 1 +pop local 4 +push this 2 +push constant 4 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +push local 4 +gt +push local 2 +push local 3 +lt +or +pop this 3 +push this 3 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 4 +push local 1 +push constant 10 +add +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 1 +neg +pop local 0 +goto IF_END3 +label IF_FALSE3 +push local 3 +push local 2 +push constant 10 +sub +gt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 1 +pop local 0 +label IF_FALSE4 +label IF_END3 +push this 6 +push constant 2 +sub +pop this 6 +push this 0 +push this 6 +call Bat.setWidth 2 +pop temp 0 +push this 4 +push constant 1 +add +pop this 4 +push constant 22 +push constant 7 +call Output.moveCursor 2 +pop temp 0 +push this 4 +call Output.printInt 1 +pop temp 0 +label IF_FALSE2 +label IF_FALSE1 +push this 1 +push local 0 +call Ball.bounce 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +return diff --git a/projects/12/Pong/PongGame.xml b/projects/12/Pong/PongGame.xml new file mode 100644 index 0000000..da89d52 --- /dev/null +++ b/projects/12/Pong/PongGame.xml @@ -0,0 +1,1035 @@ + + class + PongGame + { + + static + PongGame + instance + ; + + + field + Bat + bat + ; + + + field + Ball + ball + ; + + + field + int + wall + ; + + + field + boolean + exit + ; + + + field + int + score + ; + + + field + int + lastWall + ; + + + field + int + batWidth + ; + + + PongGame + new + ( + + + ) + + { + + + do + Screen + . + clearScreen + ( + ) + ; + + + let + batWidth + = + + + 50 + + + ; + + + let + bat + = + + + Bat + . + new + ( + ) + + + ; + + + let + ball + = + + + Ball + . + new + ( + ) + + + ; + + + do + ball + . + setDestination + ( + ) + ; + + + do + Screen + . + drawRectangle + ( + ) + ; + + + do + Output + . + moveCursor + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + let + exit + = + + + false + + + ; + + + let + score + = + + + 0 + + + ; + + + let + wall + = + + + 0 + + + ; + + + let + lastWall + = + + + 0 + + + ; + + + return + + + this + + + ; + + + } + + + + void + dispose + ( + + + ) + + { + + + do + bat + . + dispose + ( + ) + ; + + + do + ball + . + dispose + ( + ) + ; + + + do + Memory + . + deAlloc + ( + ) + ; + + + return + ; + + + } + + + + void + newInstance + ( + + + ) + + { + + + let + instance + = + + + PongGame + . + new + ( + ) + + + ; + + + return + ; + + + } + + + + PongGame + getInstance + ( + + + ) + + { + + + return + + + instance + + + ; + + + } + + + + void + run + ( + + + ) + + { + + var + char + key + ; + + + + while + ( + + + ~ + + exit + + + + ) + { + + + while + ( + + + ( + + + key + + = + + 0 + + + ) + + & + + ( + + + ~ + + exit + + + + ) + + + ) + { + + + let + key + = + + + Keyboard + . + keyPressed + ( + ) + + + ; + + + do + bat + . + move + ( + ) + ; + + + do + moveBall + ( + ) + ; + + + do + Sys + . + wait + ( + ) + ; + + + } + + + if + ( + + + key + + = + + 130 + + + ) + { + + + do + bat + . + setDirection + ( + ) + ; + + + } + else + { + + + if + ( + + + key + + = + + 132 + + + ) + { + + + do + bat + . + setDirection + ( + ) + ; + + + } + else + { + + + if + ( + + + key + + = + + 140 + + + ) + { + + + let + exit + = + + + true + + + ; + + + } + + + } + + + } + + + while + ( + + + ( + + + ~ + + ( + + + key + + = + + 0 + + + ) + + + + ) + + & + + ( + + + ~ + + exit + + + + ) + + + ) + { + + + let + key + = + + + Keyboard + . + keyPressed + ( + ) + + + ; + + + do + bat + . + move + ( + ) + ; + + + do + moveBall + ( + ) + ; + + + do + Sys + . + wait + ( + ) + ; + + + } + + + } + + + if + ( + + + exit + + + ) + { + + + do + Output + . + moveCursor + ( + ) + ; + + + do + Output + . + printString + ( + ) + ; + + + } + + + return + ; + + + } + + + + 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 + ( + ) + ; + + + let + score + = + + + score + + + + + 1 + + + ; + + + do + Output + . + moveCursor + ( + ) + ; + + + do + Output + . + printInt + ( + ) + ; + + + } + + + } + + + do + ball + . + bounce + ( + ) + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/12/Pong/PongGameT.xml b/projects/12/Pong/PongGameT.xml new file mode 100644 index 0000000..4d0fdc9 --- /dev/null +++ b/projects/12/Pong/PongGameT.xml @@ -0,0 +1,614 @@ + + class + PongGame + { + static + PongGame + instance + ; + field + Bat + bat + ; + field + Ball + ball + ; + field + int + wall + ; + field + boolean + exit + ; + field + int + score + ; + field + int + lastWall + ; + field + int + batWidth + ; + constructor + PongGame + new + ( + ) + { + do + Screen + . + clearScreen + ( + ) + ; + let + batWidth + = + 50 + ; + 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 + ; + } + method + void + dispose + ( + ) + { + do + bat + . + dispose + ( + ) + ; + do + ball + . + dispose + ( + ) + ; + do + Memory + . + deAlloc + ( + this + ) + ; + return + ; + } + function + void + newInstance + ( + ) + { + let + instance + = + PongGame + . + new + ( + ) + ; + return + ; + } + function + PongGame + getInstance + ( + ) + { + return + instance + ; + } + method + void + run + ( + ) + { + var + char + key + ; + while + ( + ~ + exit + ) + { + 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 + ; + } + } + } + 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 + ; + } + 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 + ; + } + } + diff --git a/projects/12/Pong/Screen.jack b/projects/12/Pong/Screen.jack new file mode 100644 index 0000000..79e1ae2 --- /dev/null +++ b/projects/12/Pong/Screen.jack @@ -0,0 +1,162 @@ +// 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/Screen.jack + +/** + * A library of functions for displaying graphics on the screen. + * The Hack physical screen consists of 512 rows (indexed 0..511, top to bottom) + * of 256 pixels each (indexed 0..255, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + static Array twoToThe; + static boolean color; + + /** Initializes the Screen. */ + function void init() { + let color = true; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int x, y; + var boolean prevColor; + let x = 0; + let y = 0; + let prevColor = color; + let color = false; + while (x < 256) { + while (y < 512) { + do Screen.drawPixel(x, y); + let y = y + 1; + } + let x = x + 1; + } + let color = prevColor; + return; + } + + /** Sets the current color, to be used for all subsequent drawXXX commands. + * Black is represented by true, white by false. */ + function void setColor(boolean b) { + let color = b; + return; + } + + /** Draws the (x,y) pixel, using the current color. */ + function void drawPixel(int x, int y) { + var Array address, value; + let address = (32 * y) + (x/16); + let value = Memory.peek(16384 + address); + if(color) { + let value = value | twoToThe[x & 15]; + } else { + let value = value & (~(twoToThe[x & 15])); + } + do Memory.poke(16384 + address, value); + return; + } + + /** Draws a line from pixel (x1,y1) to pixel (x2,y2), using the current color. */ + function void drawLine(int x1, int y1, int x2, int y2) { + var int dx, dy, a, b, diff; + let dx = x2-x1; + let dy = y2-y1; + let a = 0; + let b = 0; + let diff = 0; + if(dx = 0) { + while(~(dy = 0)) { + do Screen.drawPixel(x1, y1 + dy); + if(dy > 0) { + let dy = dy - 1; + } else { + let dy = dy + 1; + } + } + return; + } + if(dy = 0) { + while(~(dx = 0)) { + do Screen.drawPixel(x1 + dx, y1); + if (dx > 0) { + let dx = dx - 1; + } else { + let dx = dx + 1; + } + } + return; + } + while((~(Math.abs(a) > Math.abs(dx))) & (~(Math.abs(b) > Math.abs(dy)))) { + do Screen.drawPixel(x1 + a, y1 + b); + if(diff < 0) { + if(dx > 0) { + let a = a + 1; + } + if(dx < 0) { + let a = a - 1; + } + let diff = diff + Math.abs(dy); + } else { + if(dy > 0) { + let b = b + 1; + } + if(dy < 0) { + let b = b - 1; + } + let diff = diff - Math.abs(dx); + } + } + return; + } + + /** Draws a filled rectangle whose top left corner is (x1, y1) + * and bottom right corner is (x2,y2), using the current color. */ + function void drawRectangle(int x1, int y1, int x2, int y2) { + var int dy; + let dy = y2 - y1; + while(~(Math.abs(dy) = 0)) { + if (dy > 0) { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy - 1; + } else { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy + 1; + } + } + return; + } + + /** Draws a filled circle of radius r<=181 around (x,y), using the current color. */ + function void drawCircle(int x, int y, int r) { + var int dy; + let dy = -r; + if (r > 181) { + return; + } + while(dy < (r + 1)) { + do Screen.drawLine(x-Math.sqrt((r*r)-(dy*dy)),y + dy,x+Math.sqrt((r*r)-(dy*dy)),y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/Pong/Screen.vm b/projects/12/Pong/Screen.vm new file mode 100644 index 0000000..a89b523 --- /dev/null +++ b/projects/12/Pong/Screen.vm @@ -0,0 +1,534 @@ +function Screen.init 0 +push constant 0 +not +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Screen.clearScreen 3 +push constant 0 +pop local 0 +push constant 0 +pop local 1 +push static 1 +pop local 2 +push constant 0 +pop static 1 +label WHILE_EXP0 +push local 0 +push constant 256 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 1 +push constant 512 +lt +not +if-goto WHILE_END1 +push local 0 +push local 1 +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 2 +pop static 1 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 1 +push constant 0 +return +function Screen.drawPixel 2 +push constant 32 +push argument 1 +call Math.multiply 2 +push argument 0 +push constant 16 +call Math.divide 2 +add +pop local 0 +push constant 16384 +push local 0 +add +call Memory.peek 1 +pop local 1 +push static 1 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +or +pop local 1 +goto IF_END0 +label IF_FALSE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +not +and +pop local 1 +label IF_END0 +push constant 16384 +push local 0 +add +push local 1 +call Memory.poke 2 +pop temp 0 +push constant 0 +return +function Screen.drawLine 5 +push argument 2 +push argument 0 +sub +pop local 0 +push argument 3 +push argument 1 +sub +pop local 1 +push constant 0 +pop local 2 +push constant 0 +pop local 3 +push constant 0 +pop local 4 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push argument 0 +push argument 1 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +push constant 1 +sub +pop local 1 +goto IF_END1 +label IF_FALSE1 +push local 1 +push constant 1 +add +pop local 1 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +label IF_FALSE0 +push local 1 +push constant 0 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +not +not +if-goto WHILE_END1 +push argument 0 +push local 0 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END3 +label IF_FALSE3 +push local 0 +push constant 1 +add +pop local 0 +label IF_END3 +goto WHILE_EXP1 +label WHILE_END1 +push constant 0 +return +label IF_FALSE2 +label WHILE_EXP2 +push local 2 +call Math.abs 1 +push local 0 +call Math.abs 1 +gt +not +push local 3 +call Math.abs 1 +push local 1 +call Math.abs 1 +gt +not +and +not +if-goto WHILE_END2 +push argument 0 +push local 2 +add +push argument 1 +push local 3 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 0 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 0 +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 2 +push constant 1 +add +pop local 2 +label IF_FALSE5 +push local 0 +push constant 0 +lt +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push local 2 +push constant 1 +sub +pop local 2 +label IF_FALSE6 +push local 4 +push local 1 +call Math.abs 1 +add +pop local 4 +goto IF_END4 +label IF_FALSE4 +push local 1 +push constant 0 +gt +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push local 3 +push constant 1 +add +pop local 3 +label IF_FALSE7 +push local 1 +push constant 0 +lt +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push local 3 +push constant 1 +sub +pop local 3 +label IF_FALSE8 +push local 4 +push local 0 +call Math.abs 1 +sub +pop local 4 +label IF_END4 +goto WHILE_EXP2 +label WHILE_END2 +push constant 0 +return +function Screen.drawRectangle 1 +push argument 3 +push argument 1 +sub +pop local 0 +label WHILE_EXP0 +push local 0 +call Math.abs 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawCircle 1 +push argument 2 +neg +pop local 0 +push argument 2 +push constant 181 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push local 0 +push argument 2 +push constant 1 +add +lt +not +if-goto WHILE_END0 +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +sub +push argument 1 +push local 0 +add +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +add +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/12/Pong/String.jack b/projects/12/Pong/String.jack new file mode 100644 index 0000000..6a1ab29 --- /dev/null +++ b/projects/12/Pong/String.jack @@ -0,0 +1,136 @@ +// 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 { + + field Array str; + field int length; + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + if(maxLength > 0) { + let str = Array.new(maxLength); + } else { + let str = 0; + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Returns the current length of this string. */ + method int length() { + return length; + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + let str[length - 1] = 0; + let length = length - 1; + return; + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + var int val, i, d; + var boolean neg; + let i = 0; + if(str[i] = 45) { + let neg = true; + let i = 1; + } + while(i < length) { + let d = str[i] - 48; + let val = val * 10 + d; + let i = i + 1; + } + if(neg) { + return -val; + } + return val; + } + + function String int2String(int val) { + var String string; + var int lastDigit, c; + let string = String.new(64); + let lastDigit = val - ((val / 10) * 10); + let c = lastDigit + 48; + if(val < 10) { + do string.appendChar(c); + return string; + } else { + do string.dispose(); + let string = String.int2String(val / 10); + do string.appendChar(c); + return string; + } + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var String temp; + var int i; + let length = 0; + if(val < 0) { + do appendChar(45); + } + let i = 0; + let temp = String.int2String(Math.abs(val)); + while(i < temp.length()) { + do appendChar(temp.charAt(i)); + let i = i + 1; + } + do temp.dispose(); + return; + } + + /** Returns the new line character. */ + function char newLine() { + return 128; + } + + /** Returns the backspace character. */ + function char backSpace() { + return 129; + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + return 34; + } +} diff --git a/projects/12/Pong/String.vm b/projects/12/Pong/String.vm new file mode 100644 index 0000000..5c65675 --- /dev/null +++ b/projects/12/Pong/String.vm @@ -0,0 +1,250 @@ +function String.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Array.new 1 +pop this 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 0 +label IF_END0 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +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 1 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +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 1 +push this 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +add +pop this 1 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +sub +push this 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +sub +pop this 1 +push constant 0 +return +function String.intValue 4 +push argument 0 +pop pointer 0 +push constant 0 +pop local 1 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +pop local 3 +push constant 1 +pop local 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 1 +push this 1 +lt +not +if-goto WHILE_END0 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 0 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +neg +return +label IF_FALSE1 +push local 0 +return +function String.int2String 3 +push constant 64 +call String.new 1 +pop local 0 +push argument 0 +push argument 0 +push constant 10 +call Math.divide 2 +push constant 10 +call Math.multiply 2 +sub +pop local 1 +push local 1 +push constant 48 +add +pop local 2 +push argument 0 +push constant 10 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +goto IF_END0 +label IF_FALSE0 +push local 0 +call String.dispose 1 +pop temp 0 +push argument 0 +push constant 10 +call Math.divide 2 +call String.int2String 1 +pop local 0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +label IF_END0 +function String.setInt 2 +push argument 0 +pop pointer 0 +push constant 0 +pop this 1 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push pointer 0 +push constant 45 +call String.appendChar 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +pop local 1 +push argument 1 +call Math.abs 1 +call String.int2String 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push local 0 +call String.length 1 +lt +not +if-goto WHILE_END0 +push pointer 0 +push local 0 +push local 1 +call String.charAt 2 +call String.appendChar 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +call String.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/projects/12/Pong/Sys.jack b/projects/12/Pong/Sys.jack new file mode 100644 index 0000000..3aea36b --- /dev/null +++ b/projects/12/Pong/Sys.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/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + do Memory.init(); + do Math.init(); + do Screen.init(); + do Output.init(); + do Keyboard.init(); + do Main.main(); + do Sys.halt(); + return; + } + + /** Halts the program execution. */ + function void halt() { + while(true){} + return; + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + let i = 10000; + while(i > 0) { + let i = i - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + do Output.printString("ERR"); + do Output.printInt(errorCode); + do Sys.halt(); + return; + } +} diff --git a/projects/12/Pong/Sys.vm b/projects/12/Pong/Sys.vm new file mode 100644 index 0000000..05b7a18 --- /dev/null +++ b/projects/12/Pong/Sys.vm @@ -0,0 +1,62 @@ +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 constant 10000 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 3 +call String.new 1 +push constant 69 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +call Output.printString 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/projects/12/Screen.jack b/projects/12/Screen.jack new file mode 100644 index 0000000..79e1ae2 --- /dev/null +++ b/projects/12/Screen.jack @@ -0,0 +1,162 @@ +// 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/Screen.jack + +/** + * A library of functions for displaying graphics on the screen. + * The Hack physical screen consists of 512 rows (indexed 0..511, top to bottom) + * of 256 pixels each (indexed 0..255, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + static Array twoToThe; + static boolean color; + + /** Initializes the Screen. */ + function void init() { + let color = true; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int x, y; + var boolean prevColor; + let x = 0; + let y = 0; + let prevColor = color; + let color = false; + while (x < 256) { + while (y < 512) { + do Screen.drawPixel(x, y); + let y = y + 1; + } + let x = x + 1; + } + let color = prevColor; + return; + } + + /** Sets the current color, to be used for all subsequent drawXXX commands. + * Black is represented by true, white by false. */ + function void setColor(boolean b) { + let color = b; + return; + } + + /** Draws the (x,y) pixel, using the current color. */ + function void drawPixel(int x, int y) { + var Array address, value; + let address = (32 * y) + (x/16); + let value = Memory.peek(16384 + address); + if(color) { + let value = value | twoToThe[x & 15]; + } else { + let value = value & (~(twoToThe[x & 15])); + } + do Memory.poke(16384 + address, value); + return; + } + + /** Draws a line from pixel (x1,y1) to pixel (x2,y2), using the current color. */ + function void drawLine(int x1, int y1, int x2, int y2) { + var int dx, dy, a, b, diff; + let dx = x2-x1; + let dy = y2-y1; + let a = 0; + let b = 0; + let diff = 0; + if(dx = 0) { + while(~(dy = 0)) { + do Screen.drawPixel(x1, y1 + dy); + if(dy > 0) { + let dy = dy - 1; + } else { + let dy = dy + 1; + } + } + return; + } + if(dy = 0) { + while(~(dx = 0)) { + do Screen.drawPixel(x1 + dx, y1); + if (dx > 0) { + let dx = dx - 1; + } else { + let dx = dx + 1; + } + } + return; + } + while((~(Math.abs(a) > Math.abs(dx))) & (~(Math.abs(b) > Math.abs(dy)))) { + do Screen.drawPixel(x1 + a, y1 + b); + if(diff < 0) { + if(dx > 0) { + let a = a + 1; + } + if(dx < 0) { + let a = a - 1; + } + let diff = diff + Math.abs(dy); + } else { + if(dy > 0) { + let b = b + 1; + } + if(dy < 0) { + let b = b - 1; + } + let diff = diff - Math.abs(dx); + } + } + return; + } + + /** Draws a filled rectangle whose top left corner is (x1, y1) + * and bottom right corner is (x2,y2), using the current color. */ + function void drawRectangle(int x1, int y1, int x2, int y2) { + var int dy; + let dy = y2 - y1; + while(~(Math.abs(dy) = 0)) { + if (dy > 0) { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy - 1; + } else { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy + 1; + } + } + return; + } + + /** Draws a filled circle of radius r<=181 around (x,y), using the current color. */ + function void drawCircle(int x, int y, int r) { + var int dy; + let dy = -r; + if (r > 181) { + return; + } + while(dy < (r + 1)) { + do Screen.drawLine(x-Math.sqrt((r*r)-(dy*dy)),y + dy,x+Math.sqrt((r*r)-(dy*dy)),y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/ScreenTest/Array.jack b/projects/12/ScreenTest/Array.jack new file mode 100644 index 0000000..e949198 --- /dev/null +++ b/projects/12/ScreenTest/Array.jack @@ -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/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) { + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/projects/12/ScreenTest/Array.vm b/projects/12/ScreenTest/Array.vm new file mode 100644 index 0000000..c0cd797 --- /dev/null +++ b/projects/12/ScreenTest/Array.vm @@ -0,0 +1,12 @@ +function Array.new 0 +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/projects/12/ScreenTest/Keyboard.jack b/projects/12/ScreenTest/Keyboard.jack new file mode 100644 index 0000000..d0e4022 --- /dev/null +++ b/projects/12/ScreenTest/Keyboard.jack @@ -0,0 +1,92 @@ +// 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 { + + static Array kbd; + + /** Initializes the keyboard. */ + function void init() { + let kbd = 24576; + return; + } + + /** + * 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() { + return kbd[0]; + } + + /** + * 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() { + var char key; + while(kbd[0] = 0) {} + let key = kbd[0]; + do Output.printChar(key); + while(kbd[0] = key) {} + return key; + } + + /** + * 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) { + var String str; + var char chr; + let str = String.new(32); + do Output.printString(message); + while (true) { + let chr = Keyboard.readChar(); + if(chr = 128) { + return str; + } + if(chr = 129) { + do str.eraseLastChar(); + } else { + let str = str.appendChar(chr); + } + } + return str; + } + + /** + * 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) { + var String str; + let str = Keyboard.readLine(message); + return str.intValue(); + } +} diff --git a/projects/12/ScreenTest/Keyboard.vm b/projects/12/ScreenTest/Keyboard.vm new file mode 100644 index 0000000..91da157 --- /dev/null +++ b/projects/12/ScreenTest/Keyboard.vm @@ -0,0 +1,98 @@ +function Keyboard.init 0 +push constant 24576 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 1 +label WHILE_EXP0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP1 +push constant 0 +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +eq +not +if-goto WHILE_END1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +return +function Keyboard.readLine 2 +push constant 32 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 1 +push local 1 +push constant 128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +return +label IF_FALSE0 +push local 1 +push constant 129 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 1 +call String.appendChar 2 +pop local 0 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Keyboard.readInt 1 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +return diff --git a/projects/12/ScreenTest/Main.jack b/projects/12/ScreenTest/Main.jack new file mode 100644 index 0000000..e17a0f3 --- /dev/null +++ b/projects/12/ScreenTest/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/12/ScreenTest/Main.jack + +/** Test program for the OS Screen class. */ +class Main { + + /** Draws a sample pictue on the screen using lines and circles. */ + function void main() { + + do Screen.drawLine(0,220,511,220); // base line + do Screen.drawRectangle(280,90,410,220); // house + + do Screen.setColor(false); + do Screen.drawRectangle(350,120,390,219); // door + do Screen.drawRectangle(292,120,332,150); // window + + do Screen.setColor(true); + do Screen.drawCircle(360,170,3); // door handle + do Screen.drawLine(280,90,345,35); // roof + do Screen.drawLine(345,35,410,90); // roof + + do Screen.drawCircle(140,60,30); // sun + do Screen.drawLine(140,26, 140, 6); + do Screen.drawLine(163,35,178,20); + do Screen.drawLine(174,60,194,60); + do Screen.drawLine(163,85,178,100); + do Screen.drawLine(140,94,140,114); + do Screen.drawLine(117,85,102,100); + do Screen.drawLine(106,60,86,60); + do Screen.drawLine(117,35,102,20); + + return; + } +} diff --git a/projects/12/ScreenTest/Main.vm b/projects/12/ScreenTest/Main.vm new file mode 100644 index 0000000..69e860f --- /dev/null +++ b/projects/12/ScreenTest/Main.vm @@ -0,0 +1,104 @@ +function Main.main 0 +push constant 0 +push constant 220 +push constant 511 +push constant 220 +call Screen.drawLine 4 +pop temp 0 +push constant 280 +push constant 90 +push constant 410 +push constant 220 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push constant 350 +push constant 120 +push constant 390 +push constant 219 +call Screen.drawRectangle 4 +pop temp 0 +push constant 292 +push constant 120 +push constant 332 +push constant 150 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push constant 360 +push constant 170 +push constant 3 +call Screen.drawCircle 3 +pop temp 0 +push constant 280 +push constant 90 +push constant 345 +push constant 35 +call Screen.drawLine 4 +pop temp 0 +push constant 345 +push constant 35 +push constant 410 +push constant 90 +call Screen.drawLine 4 +pop temp 0 +push constant 140 +push constant 60 +push constant 30 +call Screen.drawCircle 3 +pop temp 0 +push constant 140 +push constant 26 +push constant 140 +push constant 6 +call Screen.drawLine 4 +pop temp 0 +push constant 163 +push constant 35 +push constant 178 +push constant 20 +call Screen.drawLine 4 +pop temp 0 +push constant 174 +push constant 60 +push constant 194 +push constant 60 +call Screen.drawLine 4 +pop temp 0 +push constant 163 +push constant 85 +push constant 178 +push constant 100 +call Screen.drawLine 4 +pop temp 0 +push constant 140 +push constant 94 +push constant 140 +push constant 114 +call Screen.drawLine 4 +pop temp 0 +push constant 117 +push constant 85 +push constant 102 +push constant 100 +call Screen.drawLine 4 +pop temp 0 +push constant 106 +push constant 60 +push constant 86 +push constant 60 +call Screen.drawLine 4 +pop temp 0 +push constant 117 +push constant 35 +push constant 102 +push constant 20 +call Screen.drawLine 4 +pop temp 0 +push constant 0 +return diff --git a/projects/12/ScreenTest/Math.jack b/projects/12/ScreenTest/Math.jack new file mode 100644 index 0000000..ed50f54 --- /dev/null +++ b/projects/12/ScreenTest/Math.jack @@ -0,0 +1,142 @@ +// 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 { + + static Array twoToThe; + + /** Initializes the library. */ + function void init() { + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x < 0) { + return -x; + } else { + return 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) { + var int sum, shiftedX, i; + let sum = 0; + let shiftedX = x; + let i = 0; + while (i < 16) { + if(Math.bit(y, i)) { + let sum = sum + shiftedX; + } + let shiftedX = shiftedX + shiftedX; + let i = i + 1; + } + return sum; + } + + /** 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) { + var int q, tres; + if(x < 0 & y < 0) { + return Math.divide(Math.abs(x), Math.abs(y)); + } + if(x < 0 | y < 0) { + return -Math.divide(Math.abs(x), Math.abs(y)); + } + if(y > x) { + return 0; + } + if(y < 0) { + return 0; + } + let q = Math.divide(x, 2 * y); + if((x - (2 * q * y)) < y) { + return 2 * q; + } else { + return 2 * q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int y, j; + let y = 0; + let j = 7; + while(j > -1) { + if (~((Math.pow((y + Math.pow(2, j)), 2) > x)) & (Math.pow((y + Math.pow(2, j)), 2) > 0)) { + let y = y + Math.pow(2, j); + } + let j = j - 1; + } + return y; + } + + function int pow(int x, int p) { + var int r, i; + let i = 0; + let r = 1; + while (i < p) { + let r = r * x; + let i = i + 1; + } + return r; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if(a > b) { + return a; + } else { + return b; + } + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if(a > b) { + return b; + } else { + return a; + } + } +} diff --git a/projects/12/ScreenTest/Math.vm b/projects/12/ScreenTest/Math.vm new file mode 100644 index 0000000..e03fd3e --- /dev/null +++ b/projects/12/ScreenTest/Math.vm @@ -0,0 +1,394 @@ +function Math.init 0 +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Math.bit 0 +push argument 0 +push argument 1 +push static 0 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 +function Math.multiply 3 +push constant 0 +pop local 0 +push argument 0 +pop local 1 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 16 +lt +not +if-goto WHILE_END0 +push argument 1 +push local 2 +call Math.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 1 +add +pop local 0 +label IF_FALSE0 +push local 1 +push local 1 +add +pop local 1 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.divide 2 +push argument 0 +push constant 0 +lt +push argument 1 +and +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +return +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +or +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Math.abs 1 +push argument 1 +call Math.abs 1 +call Math.divide 2 +neg +return +label IF_FALSE1 +push argument 1 +push argument 0 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 0 +return +label IF_FALSE3 +push argument 0 +push constant 2 +push argument 1 +call Math.multiply 2 +call Math.divide 2 +pop local 0 +push argument 0 +push constant 2 +push local 0 +call Math.multiply 2 +push argument 1 +call Math.multiply 2 +sub +push argument 1 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 2 +push local 0 +call Math.multiply 2 +return +goto IF_END4 +label IF_FALSE4 +push constant 2 +push local 0 +call Math.multiply 2 +push constant 1 +add +return +label IF_END4 +function Math.sqrt 2 +push constant 0 +pop local 0 +push constant 7 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push argument 0 +gt +not +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +push constant 2 +call Math.pow 2 +push constant 0 +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push constant 2 +push local 1 +call Math.pow 2 +add +pop local 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +return +function Math.pow 2 +push constant 0 +pop local 1 +push constant 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push argument 1 +lt +not +if-goto WHILE_END0 +push local 0 +push argument 0 +call Math.multiply 2 +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +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 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +return +label IF_END0 +function Math.min 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +return +goto IF_END0 +label IF_FALSE0 +push argument 0 +return +label IF_END0 diff --git a/projects/12/ScreenTest/Memory.jack b/projects/12/ScreenTest/Memory.jack new file mode 100644 index 0000000..7edeee6 --- /dev/null +++ b/projects/12/ScreenTest/Memory.jack @@ -0,0 +1,73 @@ +// 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 { + + static Array memory; + static Array heap; + static Array freeList; + + /** Initializes the class. */ + function void init() { + let memory = 0; + let heap = 2048; + let freeList = 2048; + let heap[0] = 0; + let heap[1] = 14335; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return memory[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let memory[address] = value; + return; + } + + /** Finds an available RAM block of the given size and returns + * a reference to its base address. */ + function int alloc(int size) { + var Array curList, found; + let curList = freeList; + while (curList > 0) { + if (curList[1] > (size + 1)) { + do Memory.poke(8010, 1); + let found = curList + curList[1] - size; + let curList[1] = curList[1] - size - 2; + let found[0] = 0; + let found[1] = size; + return found; + } else { + let curList = curList[0]; + } + } + return 0; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array curList; + let curList = freeList; + if(curList = 0) { + let freeList = o; + return; + } + while (curList[0] > 0) { + let curList = curList[0]; + } + let curList = o; + return; + } +} diff --git a/projects/12/ScreenTest/Memory.vm b/projects/12/ScreenTest/Memory.vm new file mode 100644 index 0000000..8b513e9 --- /dev/null +++ b/projects/12/ScreenTest/Memory.vm @@ -0,0 +1,161 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +pop static 1 +push constant 2048 +pop static 2 +push constant 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 1 +add +push constant 14335 +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 static 2 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 1 +add +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8010 +push constant 1 +call Memory.poke 2 +pop temp 0 +push local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +add +push argument 0 +sub +pop local 1 +push constant 1 +push local 0 +add +push constant 1 +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 0 +push local 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 1 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Memory.deAlloc 1 +push static 2 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop static 2 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push argument 0 +pop local 0 +push constant 0 +return diff --git a/projects/12/ScreenTest/Output.jack b/projects/12/ScreenTest/Output.jack new file mode 100644 index 0000000..21629b7 --- /dev/null +++ b/projects/12/ScreenTest/Output.jack @@ -0,0 +1,288 @@ +// 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; + static int hPos, vPos; + static Array twoToThe; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + let hPos = 0; + let vPos = 0; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + do Output.initMap(); + return; + } + + function boolean bit (int x, int i) { + if (x & twoToThe[i] = 0) { + return false; + } else { + return true; + } + } + + // 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,12,30,51,51,51,63,51,51,51,0,0); // A + 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) { + let hPos = j; + let vPos = i; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array map; + var int i, j; + let i = 0; + let j = 0; + let map = Output.getMap(c); + while (i < 11) { + while (j < 8) { + if(Output.bit(map[i], j)) { + do Screen.setColor(true); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } else { + do Screen.setColor(false); + do Screen.drawPixel((hPos * 8) + j, (vPos * 11) + i); + } + let j = j + 1; + } + let i = i + 1; + let j = 0; + } + let hPos = hPos + 1; + if(hPos > 63) { + let hPos = 0; + let vPos = vPos + 1; + } + if(vPos > 22) { + let vPos = 0; + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int l; + let l = 0; + while (l < s.length()) { + do Output.printChar(s.charAt(l)); + let l = l + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String intstr; + let intstr = String.new(6); + do intstr.setInt(i); + do Output.printString(intstr); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + let vPos = vPos + 1; + if(vPos > 22) { + let vPos = 0; + } + let hPos = 0; + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + let hPos = hPos - 1; + if (hPos < 0) { + let hPos = 0; + } + return; + } +} diff --git a/projects/12/ScreenTest/Output.vm b/projects/12/ScreenTest/Output.vm new file mode 100644 index 0000000..0b6f718 --- /dev/null +++ b/projects/12/ScreenTest/Output.vm @@ -0,0 +1,1818 @@ +function Output.init 0 +push constant 0 +pop static 1 +push constant 0 +pop static 2 +push constant 16 +call Array.new 1 +pop static 3 +push constant 0 +push static 3 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push static 3 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 3 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 3 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 3 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 3 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 3 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 3 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 3 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 3 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 3 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 3 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 3 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 3 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 3 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 3 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +call Output.initMap 0 +pop temp 0 +push constant 0 +return +function Output.bit 0 +push argument 0 +push argument 1 +push static 3 +add +pop pointer 1 +push that 0 +and +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +return +label IF_END0 +function Output.initMap 1 +push constant 127 +call Array.new 1 +pop static 0 +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 51 +push constant 63 +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 0 +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.getMap 0 +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 argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Output.moveCursor 0 +push argument 1 +pop static 1 +push argument 0 +pop static 2 +push constant 0 +return +function Output.printChar 3 +push constant 0 +pop local 1 +push constant 0 +pop local 2 +push argument 0 +call Output.getMap 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 2 +push constant 8 +lt +not +if-goto WHILE_END1 +push local 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 2 +call Output.bit 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push static 1 +push constant 8 +call Math.multiply 2 +push local 2 +add +push static 2 +push constant 11 +call Math.multiply 2 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push constant 1 +add +pop local 1 +push constant 0 +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push static 1 +push constant 1 +add +pop static 1 +push static 1 +push constant 63 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop static 1 +push static 2 +push constant 1 +add +pop static 2 +label IF_FALSE1 +push static 2 +push constant 22 +gt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +pop static 2 +label IF_FALSE2 +push constant 0 +return +function Output.printString 1 +push constant 0 +pop local 0 +label WHILE_EXP0 +push local 0 +push argument 0 +call String.length 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 1 +push constant 6 +call String.new 1 +pop local 0 +push local 0 +push argument 0 +call String.setInt 2 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 2 +push constant 1 +add +pop static 2 +push static 2 +push constant 22 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 2 +label IF_FALSE0 +push constant 0 +pop static 1 +push constant 0 +return +function Output.backSpace 0 +push static 1 +push constant 1 +sub +pop static 1 +push static 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop static 1 +label IF_FALSE0 +push constant 0 +return diff --git a/projects/12/ScreenTest/Screen.jack b/projects/12/ScreenTest/Screen.jack new file mode 100644 index 0000000..79e1ae2 --- /dev/null +++ b/projects/12/ScreenTest/Screen.jack @@ -0,0 +1,162 @@ +// 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/Screen.jack + +/** + * A library of functions for displaying graphics on the screen. + * The Hack physical screen consists of 512 rows (indexed 0..511, top to bottom) + * of 256 pixels each (indexed 0..255, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + static Array twoToThe; + static boolean color; + + /** Initializes the Screen. */ + function void init() { + let color = true; + let twoToThe = Array.new(16); + let twoToThe[0] = 1; + let twoToThe[1] = 2; + let twoToThe[2] = 4; + let twoToThe[3] = 8; + let twoToThe[4] = 16; + let twoToThe[5] = 32; + let twoToThe[6] = 64; + let twoToThe[7] = 128; + let twoToThe[8] = 256; + let twoToThe[9] = 512; + let twoToThe[10] = 1024; + let twoToThe[11] = 2048; + let twoToThe[12] = 4096; + let twoToThe[13] = 8192; + let twoToThe[14] = 16384; + let twoToThe[15] = 16384 + 16384; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int x, y; + var boolean prevColor; + let x = 0; + let y = 0; + let prevColor = color; + let color = false; + while (x < 256) { + while (y < 512) { + do Screen.drawPixel(x, y); + let y = y + 1; + } + let x = x + 1; + } + let color = prevColor; + return; + } + + /** Sets the current color, to be used for all subsequent drawXXX commands. + * Black is represented by true, white by false. */ + function void setColor(boolean b) { + let color = b; + return; + } + + /** Draws the (x,y) pixel, using the current color. */ + function void drawPixel(int x, int y) { + var Array address, value; + let address = (32 * y) + (x/16); + let value = Memory.peek(16384 + address); + if(color) { + let value = value | twoToThe[x & 15]; + } else { + let value = value & (~(twoToThe[x & 15])); + } + do Memory.poke(16384 + address, value); + return; + } + + /** Draws a line from pixel (x1,y1) to pixel (x2,y2), using the current color. */ + function void drawLine(int x1, int y1, int x2, int y2) { + var int dx, dy, a, b, diff; + let dx = x2-x1; + let dy = y2-y1; + let a = 0; + let b = 0; + let diff = 0; + if(dx = 0) { + while(~(dy = 0)) { + do Screen.drawPixel(x1, y1 + dy); + if(dy > 0) { + let dy = dy - 1; + } else { + let dy = dy + 1; + } + } + return; + } + if(dy = 0) { + while(~(dx = 0)) { + do Screen.drawPixel(x1 + dx, y1); + if (dx > 0) { + let dx = dx - 1; + } else { + let dx = dx + 1; + } + } + return; + } + while((~(Math.abs(a) > Math.abs(dx))) & (~(Math.abs(b) > Math.abs(dy)))) { + do Screen.drawPixel(x1 + a, y1 + b); + if(diff < 0) { + if(dx > 0) { + let a = a + 1; + } + if(dx < 0) { + let a = a - 1; + } + let diff = diff + Math.abs(dy); + } else { + if(dy > 0) { + let b = b + 1; + } + if(dy < 0) { + let b = b - 1; + } + let diff = diff - Math.abs(dx); + } + } + return; + } + + /** Draws a filled rectangle whose top left corner is (x1, y1) + * and bottom right corner is (x2,y2), using the current color. */ + function void drawRectangle(int x1, int y1, int x2, int y2) { + var int dy; + let dy = y2 - y1; + while(~(Math.abs(dy) = 0)) { + if (dy > 0) { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy - 1; + } else { + do Screen.drawLine(x1, y1 + dy, x2, y1 + dy); + let dy = dy + 1; + } + } + return; + } + + /** Draws a filled circle of radius r<=181 around (x,y), using the current color. */ + function void drawCircle(int x, int y, int r) { + var int dy; + let dy = -r; + if (r > 181) { + return; + } + while(dy < (r + 1)) { + do Screen.drawLine(x-Math.sqrt((r*r)-(dy*dy)),y + dy,x+Math.sqrt((r*r)-(dy*dy)),y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/ScreenTest/Screen.vm b/projects/12/ScreenTest/Screen.vm new file mode 100644 index 0000000..a89b523 --- /dev/null +++ b/projects/12/ScreenTest/Screen.vm @@ -0,0 +1,534 @@ +function Screen.init 0 +push constant 0 +not +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 +push constant 1 +push static 0 +add +push constant 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push static 0 +add +push constant 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push static 0 +add +push constant 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push static 0 +add +push constant 16 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push static 0 +add +push constant 32 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push static 0 +add +push constant 64 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push static 0 +add +push constant 128 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push static 0 +add +push constant 256 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push static 0 +add +push constant 512 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push static 0 +add +push constant 1024 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 11 +push static 0 +add +push constant 2048 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 12 +push static 0 +add +push constant 4096 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 13 +push static 0 +add +push constant 8192 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 14 +push static 0 +add +push constant 16384 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 15 +push static 0 +add +push constant 16384 +push constant 16384 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Screen.clearScreen 3 +push constant 0 +pop local 0 +push constant 0 +pop local 1 +push static 1 +pop local 2 +push constant 0 +pop static 1 +label WHILE_EXP0 +push local 0 +push constant 256 +lt +not +if-goto WHILE_END0 +label WHILE_EXP1 +push local 1 +push constant 512 +lt +not +if-goto WHILE_END1 +push local 0 +push local 1 +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP1 +label WHILE_END1 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 2 +pop static 1 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 1 +push constant 0 +return +function Screen.drawPixel 2 +push constant 32 +push argument 1 +call Math.multiply 2 +push argument 0 +push constant 16 +call Math.divide 2 +add +pop local 0 +push constant 16384 +push local 0 +add +call Memory.peek 1 +pop local 1 +push static 1 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +or +pop local 1 +goto IF_END0 +label IF_FALSE0 +push local 1 +push argument 0 +push constant 15 +and +push static 0 +add +pop pointer 1 +push that 0 +not +and +pop local 1 +label IF_END0 +push constant 16384 +push local 0 +add +push local 1 +call Memory.poke 2 +pop temp 0 +push constant 0 +return +function Screen.drawLine 5 +push argument 2 +push argument 0 +sub +pop local 0 +push argument 3 +push argument 1 +sub +pop local 1 +push constant 0 +pop local 2 +push constant 0 +pop local 3 +push constant 0 +pop local 4 +push local 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push argument 0 +push argument 1 +push local 1 +add +call Screen.drawPixel 2 +pop temp 0 +push local 1 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +push constant 1 +sub +pop local 1 +goto IF_END1 +label IF_FALSE1 +push local 1 +push constant 1 +add +pop local 1 +label IF_END1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +label IF_FALSE0 +push local 1 +push constant 0 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +not +not +if-goto WHILE_END1 +push argument 0 +push local 0 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END3 +label IF_FALSE3 +push local 0 +push constant 1 +add +pop local 0 +label IF_END3 +goto WHILE_EXP1 +label WHILE_END1 +push constant 0 +return +label IF_FALSE2 +label WHILE_EXP2 +push local 2 +call Math.abs 1 +push local 0 +call Math.abs 1 +gt +not +push local 3 +call Math.abs 1 +push local 1 +call Math.abs 1 +gt +not +and +not +if-goto WHILE_END2 +push argument 0 +push local 2 +add +push argument 1 +push local 3 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 0 +lt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 0 +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 2 +push constant 1 +add +pop local 2 +label IF_FALSE5 +push local 0 +push constant 0 +lt +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push local 2 +push constant 1 +sub +pop local 2 +label IF_FALSE6 +push local 4 +push local 1 +call Math.abs 1 +add +pop local 4 +goto IF_END4 +label IF_FALSE4 +push local 1 +push constant 0 +gt +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push local 3 +push constant 1 +add +pop local 3 +label IF_FALSE7 +push local 1 +push constant 0 +lt +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push local 3 +push constant 1 +sub +pop local 3 +label IF_FALSE8 +push local 4 +push local 0 +call Math.abs 1 +sub +pop local 4 +label IF_END4 +goto WHILE_EXP2 +label WHILE_END2 +push constant 0 +return +function Screen.drawRectangle 1 +push argument 3 +push argument 1 +sub +pop local 0 +label WHILE_EXP0 +push local 0 +call Math.abs 1 +push constant 0 +eq +not +not +if-goto WHILE_END0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +push local 0 +add +push argument 2 +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawCircle 1 +push argument 2 +neg +pop local 0 +push argument 2 +push constant 181 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +label WHILE_EXP0 +push local 0 +push argument 2 +push constant 1 +add +lt +not +if-goto WHILE_END0 +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +sub +push argument 1 +push local 0 +add +push argument 0 +push argument 2 +push argument 2 +call Math.multiply 2 +push local 0 +push local 0 +call Math.multiply 2 +sub +call Math.sqrt 1 +add +push argument 1 +push local 0 +add +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/12/ScreenTest/ScreenTestOutput.gif b/projects/12/ScreenTest/ScreenTestOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1742cc1c2e1d0b118d0e00313c12255902eaf8e GIT binary patch literal 4563 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 M5UY8lAPF$~4}^9c-v9sr literal 0 HcmV?d00001 diff --git a/projects/12/ScreenTest/String.jack b/projects/12/ScreenTest/String.jack new file mode 100644 index 0000000..6a1ab29 --- /dev/null +++ b/projects/12/ScreenTest/String.jack @@ -0,0 +1,136 @@ +// 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 { + + field Array str; + field int length; + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + if(maxLength > 0) { + let str = Array.new(maxLength); + } else { + let str = 0; + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Returns the current length of this string. */ + method int length() { + return length; + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + let str[length - 1] = 0; + let length = length - 1; + return; + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + var int val, i, d; + var boolean neg; + let i = 0; + if(str[i] = 45) { + let neg = true; + let i = 1; + } + while(i < length) { + let d = str[i] - 48; + let val = val * 10 + d; + let i = i + 1; + } + if(neg) { + return -val; + } + return val; + } + + function String int2String(int val) { + var String string; + var int lastDigit, c; + let string = String.new(64); + let lastDigit = val - ((val / 10) * 10); + let c = lastDigit + 48; + if(val < 10) { + do string.appendChar(c); + return string; + } else { + do string.dispose(); + let string = String.int2String(val / 10); + do string.appendChar(c); + return string; + } + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var String temp; + var int i; + let length = 0; + if(val < 0) { + do appendChar(45); + } + let i = 0; + let temp = String.int2String(Math.abs(val)); + while(i < temp.length()) { + do appendChar(temp.charAt(i)); + let i = i + 1; + } + do temp.dispose(); + return; + } + + /** Returns the new line character. */ + function char newLine() { + return 128; + } + + /** Returns the backspace character. */ + function char backSpace() { + return 129; + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + return 34; + } +} diff --git a/projects/12/ScreenTest/String.vm b/projects/12/ScreenTest/String.vm new file mode 100644 index 0000000..5c65675 --- /dev/null +++ b/projects/12/ScreenTest/String.vm @@ -0,0 +1,250 @@ +function String.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Array.new 1 +pop this 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 0 +label IF_END0 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +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 1 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +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 1 +push this 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +add +pop this 1 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +sub +push this 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +sub +pop this 1 +push constant 0 +return +function String.intValue 4 +push argument 0 +pop pointer 0 +push constant 0 +pop local 1 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +pop local 3 +push constant 1 +pop local 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 1 +push this 1 +lt +not +if-goto WHILE_END0 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 0 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +neg +return +label IF_FALSE1 +push local 0 +return +function String.int2String 3 +push constant 64 +call String.new 1 +pop local 0 +push argument 0 +push argument 0 +push constant 10 +call Math.divide 2 +push constant 10 +call Math.multiply 2 +sub +pop local 1 +push local 1 +push constant 48 +add +pop local 2 +push argument 0 +push constant 10 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +goto IF_END0 +label IF_FALSE0 +push local 0 +call String.dispose 1 +pop temp 0 +push argument 0 +push constant 10 +call Math.divide 2 +call String.int2String 1 +pop local 0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +label IF_END0 +function String.setInt 2 +push argument 0 +pop pointer 0 +push constant 0 +pop this 1 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push pointer 0 +push constant 45 +call String.appendChar 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +pop local 1 +push argument 1 +call Math.abs 1 +call String.int2String 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push local 0 +call String.length 1 +lt +not +if-goto WHILE_END0 +push pointer 0 +push local 0 +push local 1 +call String.charAt 2 +call String.appendChar 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +call String.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/projects/12/ScreenTest/Sys.jack b/projects/12/ScreenTest/Sys.jack new file mode 100644 index 0000000..3aea36b --- /dev/null +++ b/projects/12/ScreenTest/Sys.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/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + do Memory.init(); + do Math.init(); + do Screen.init(); + do Output.init(); + do Keyboard.init(); + do Main.main(); + do Sys.halt(); + return; + } + + /** Halts the program execution. */ + function void halt() { + while(true){} + return; + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + let i = 10000; + while(i > 0) { + let i = i - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + do Output.printString("ERR"); + do Output.printInt(errorCode); + do Sys.halt(); + return; + } +} diff --git a/projects/12/ScreenTest/Sys.vm b/projects/12/ScreenTest/Sys.vm new file mode 100644 index 0000000..05b7a18 --- /dev/null +++ b/projects/12/ScreenTest/Sys.vm @@ -0,0 +1,62 @@ +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 constant 10000 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 3 +call String.new 1 +push constant 69 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +call Output.printString 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/projects/12/String.jack b/projects/12/String.jack new file mode 100644 index 0000000..6a1ab29 --- /dev/null +++ b/projects/12/String.jack @@ -0,0 +1,136 @@ +// 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 { + + field Array str; + field int length; + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + if(maxLength > 0) { + let str = Array.new(maxLength); + } else { + let str = 0; + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Returns the current length of this string. */ + method int length() { + return length; + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + let str[length - 1] = 0; + let length = length - 1; + return; + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + var int val, i, d; + var boolean neg; + let i = 0; + if(str[i] = 45) { + let neg = true; + let i = 1; + } + while(i < length) { + let d = str[i] - 48; + let val = val * 10 + d; + let i = i + 1; + } + if(neg) { + return -val; + } + return val; + } + + function String int2String(int val) { + var String string; + var int lastDigit, c; + let string = String.new(64); + let lastDigit = val - ((val / 10) * 10); + let c = lastDigit + 48; + if(val < 10) { + do string.appendChar(c); + return string; + } else { + do string.dispose(); + let string = String.int2String(val / 10); + do string.appendChar(c); + return string; + } + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var String temp; + var int i; + let length = 0; + if(val < 0) { + do appendChar(45); + } + let i = 0; + let temp = String.int2String(Math.abs(val)); + while(i < temp.length()) { + do appendChar(temp.charAt(i)); + let i = i + 1; + } + do temp.dispose(); + return; + } + + /** Returns the new line character. */ + function char newLine() { + return 128; + } + + /** Returns the backspace character. */ + function char backSpace() { + return 129; + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + return 34; + } +} diff --git a/projects/12/StringTest/Main.jack b/projects/12/StringTest/Main.jack new file mode 100644 index 0000000..26b5277 --- /dev/null +++ b/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/projects/12/StringTest/Main.vm b/projects/12/StringTest/Main.vm new file mode 100644 index 0000000..2c9fb9f --- /dev/null +++ b/projects/12/StringTest/Main.vm @@ -0,0 +1,469 @@ +function Main.main 2 +push constant 0 +call String.new 1 +pop local 0 +push local 0 +call String.dispose 1 +pop temp 0 +push constant 6 +call String.new 1 +pop local 0 +push local 0 +push constant 97 +call String.appendChar 2 +pop local 0 +push local 0 +push constant 98 +call String.appendChar 2 +pop local 0 +push local 0 +push constant 99 +call String.appendChar 2 +pop local 0 +push local 0 +push constant 100 +call String.appendChar 2 +pop local 0 +push local 0 +push constant 101 +call String.appendChar 2 +pop local 0 +push constant 16 +call String.new 1 +push constant 110 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 119 +call String.appendChar 2 +push constant 44 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 67 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 6 +call String.new 1 +pop local 1 +push local 1 +push constant 12345 +call String.setInt 2 +pop temp 0 +push constant 8 +call String.new 1 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 73 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 1 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push local 1 +push constant 32767 +neg +call String.setInt 2 +pop temp 0 +push constant 8 +call String.new 1 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 73 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 1 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 8 +call String.new 1 +push constant 108 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +call String.length 1 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 11 +call String.new 1 +push constant 99 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 65 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 91 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 93 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +push constant 2 +call String.charAt 2 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push local 0 +push constant 2 +push constant 45 +call String.setCharAt 3 +pop temp 0 +push constant 18 +call String.new 1 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 67 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 65 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 40 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 44 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 45 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 41 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +push constant 15 +call String.new 1 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 76 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 67 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 3 +call String.new 1 +push constant 52 +call String.appendChar 2 +push constant 53 +call String.appendChar 2 +push constant 54 +call String.appendChar 2 +pop local 0 +push constant 10 +call String.new 1 +push constant 105 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 86 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +call String.intValue 1 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 6 +call String.new 1 +push constant 45 +call String.appendChar 2 +push constant 51 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 49 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 51 +call String.appendChar 2 +pop local 0 +push constant 10 +call String.new 1 +push constant 105 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 86 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push local 0 +call String.intValue 1 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 11 +call String.new 1 +push constant 98 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 83 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call String.backSpace 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 13 +call String.new 1 +push constant 100 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 81 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call String.doubleQuote 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 9 +call String.new 1 +push constant 110 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 119 +call String.appendChar 2 +push constant 76 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call String.newLine 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push local 1 +call String.dispose 1 +pop temp 0 +push local 0 +call String.dispose 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/StringTest/String.jack b/projects/12/StringTest/String.jack new file mode 100644 index 0000000..6a1ab29 --- /dev/null +++ b/projects/12/StringTest/String.jack @@ -0,0 +1,136 @@ +// 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 { + + field Array str; + field int length; + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + if(maxLength > 0) { + let str = Array.new(maxLength); + } else { + let str = 0; + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** Returns the current length of this string. */ + method int length() { + return length; + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + let str[length - 1] = 0; + let length = length - 1; + return; + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + var int val, i, d; + var boolean neg; + let i = 0; + if(str[i] = 45) { + let neg = true; + let i = 1; + } + while(i < length) { + let d = str[i] - 48; + let val = val * 10 + d; + let i = i + 1; + } + if(neg) { + return -val; + } + return val; + } + + function String int2String(int val) { + var String string; + var int lastDigit, c; + let string = String.new(64); + let lastDigit = val - ((val / 10) * 10); + let c = lastDigit + 48; + if(val < 10) { + do string.appendChar(c); + return string; + } else { + do string.dispose(); + let string = String.int2String(val / 10); + do string.appendChar(c); + return string; + } + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var String temp; + var int i; + let length = 0; + if(val < 0) { + do appendChar(45); + } + let i = 0; + let temp = String.int2String(Math.abs(val)); + while(i < temp.length()) { + do appendChar(temp.charAt(i)); + let i = i + 1; + } + do temp.dispose(); + return; + } + + /** Returns the new line character. */ + function char newLine() { + return 128; + } + + /** Returns the backspace character. */ + function char backSpace() { + return 129; + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + return 34; + } +} diff --git a/projects/12/StringTest/String.vm b/projects/12/StringTest/String.vm new file mode 100644 index 0000000..5c65675 --- /dev/null +++ b/projects/12/StringTest/String.vm @@ -0,0 +1,250 @@ +function String.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +call Array.new 1 +pop this 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 0 +label IF_END0 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +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 1 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 0 +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 1 +push this 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +add +pop this 1 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +sub +push this 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 1 +push constant 1 +sub +pop this 1 +push constant 0 +return +function String.intValue 4 +push argument 0 +pop pointer 0 +push constant 0 +pop local 1 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +pop local 3 +push constant 1 +pop local 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 1 +push this 1 +lt +not +if-goto WHILE_END0 +push local 1 +push this 0 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 0 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +neg +return +label IF_FALSE1 +push local 0 +return +function String.int2String 3 +push constant 64 +call String.new 1 +pop local 0 +push argument 0 +push argument 0 +push constant 10 +call Math.divide 2 +push constant 10 +call Math.multiply 2 +sub +pop local 1 +push local 1 +push constant 48 +add +pop local 2 +push argument 0 +push constant 10 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +goto IF_END0 +label IF_FALSE0 +push local 0 +call String.dispose 1 +pop temp 0 +push argument 0 +push constant 10 +call Math.divide 2 +call String.int2String 1 +pop local 0 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +push local 0 +return +label IF_END0 +function String.setInt 2 +push argument 0 +pop pointer 0 +push constant 0 +pop this 1 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push pointer 0 +push constant 45 +call String.appendChar 2 +pop temp 0 +label IF_FALSE0 +push constant 0 +pop local 1 +push argument 1 +call Math.abs 1 +call String.int2String 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push local 0 +call String.length 1 +lt +not +if-goto WHILE_END0 +push pointer 0 +push local 0 +push local 1 +call String.charAt 2 +call String.appendChar 2 +pop temp 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +call String.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/projects/12/StringTest/StringTestOutput.gif b/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/projects/12/Sys.jack b/projects/12/Sys.jack new file mode 100644 index 0000000..3aea36b --- /dev/null +++ b/projects/12/Sys.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/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + do Memory.init(); + do Math.init(); + do Screen.init(); + do Output.init(); + do Keyboard.init(); + do Main.main(); + do Sys.halt(); + return; + } + + /** Halts the program execution. */ + function void halt() { + while(true){} + return; + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + let i = 10000; + while(i > 0) { + let i = i - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + do Output.printString("ERR"); + do Output.printInt(errorCode); + do Sys.halt(); + return; + } +} diff --git a/projects/12/SysTest/Main.jack b/projects/12/SysTest/Main.jack new file mode 100644 index 0000000..dc5d04b --- /dev/null +++ b/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/projects/12/SysTest/Main.vm b/projects/12/SysTest/Main.vm new file mode 100644 index 0000000..4890e2f --- /dev/null +++ b/projects/12/SysTest/Main.vm @@ -0,0 +1,281 @@ +function Main.main 1 +push constant 10 +call String.new 1 +push constant 87 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 64 +call String.new 1 +push constant 80 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 46 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 65 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 44 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 119 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +label WHILE_EXP0 +push local 0 +push constant 0 +eq +not +if-goto WHILE_END0 +call Keyboard.keyPressed 0 +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +label WHILE_EXP1 +push local 0 +push constant 0 +eq +not +not +if-goto WHILE_END1 +call Keyboard.keyPressed 0 +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push constant 2000 +call Sys.wait 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 45 +call String.new 1 +push constant 84 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 109 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 46 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 77 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 104 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 50 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 46 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/SysTest/Sys.jack b/projects/12/SysTest/Sys.jack new file mode 100644 index 0000000..3aea36b --- /dev/null +++ b/projects/12/SysTest/Sys.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/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + do Memory.init(); + do Math.init(); + do Screen.init(); + do Output.init(); + do Keyboard.init(); + do Main.main(); + do Sys.halt(); + return; + } + + /** Halts the program execution. */ + function void halt() { + while(true){} + return; + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + let i = 10000; + while(i > 0) { + let i = i - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + do Output.printString("ERR"); + do Output.printInt(errorCode); + do Sys.halt(); + return; + } +} diff --git a/projects/12/SysTest/Sys.vm b/projects/12/SysTest/Sys.vm new file mode 100644 index 0000000..d2c4d2f --- /dev/null +++ b/projects/12/SysTest/Sys.vm @@ -0,0 +1,62 @@ +function Sys.init 0 +call Math.init 0 +pop temp 0 +call Memory.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 constant 10000 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 3 +call String.new 1 +push constant 69 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +call Output.printString 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/projects/12/project12.zip b/projects/12/project12.zip new file mode 100644 index 0000000000000000000000000000000000000000..a3f4f4cc099a39635f0ddc42ee059fd75deef805 GIT binary patch literal 10292 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 literal 0 HcmV?d00001 diff --git a/projects/13/more fun to go.txt b/projects/13/more fun to go.txt new file mode 100644 index 0000000..259d1c6 --- /dev/null +++ b/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/projects/Arkanoid.zip b/projects/Arkanoid.zip new file mode 100644 index 0000000000000000000000000000000000000000..09738f4affc3c6cd38da74ffcaa439128cb421fd GIT binary patch literal 6223 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 508 & hspeed > 0) { + do invertHspeed(); + } + if (bTop < 2 & vspeed < 0) { + do invertVspeed(); + } + if (bBottom > 250 & vspeed > 0) { + do invertVspeed(); + } + + let x = x + hspeed; + let y = y + vspeed; + + do draw(); + + return; + } + + method void invertVspeed() { + let vspeed = -vspeed; + return; + } + + method void invertHspeed() { + let hspeed = -hspeed; + return; + } + + method int getLeft() { + return x - r; + } + + method int getRight() { + return x + r; + } + + method int getTop() { + return y - r; + } + + method int getBottom() { + return y + r; + } + + method int getVspeed() { + return vspeed; + } +} \ No newline at end of file diff --git a/projects/Arkanoid/source/Game.jack b/projects/Arkanoid/source/Game.jack new file mode 100644 index 0000000..812fe59 --- /dev/null +++ b/projects/Arkanoid/source/Game.jack @@ -0,0 +1,224 @@ +class Game { + field int hbricks, vbricks; + field int gameOver; + + field Rect paddle; + field Ball ball; + field Array bricks; + + constructor Game new() { + var int i, j; + var Rect curBrick; + + let gameOver = 0; + let hbricks = 8; + let vbricks = 3; + + let paddle = Rect.new(250,220,50,10); + let ball = Ball.new(250, 200, 6, 1, 1); + let bricks = Array.new(hbricks * vbricks); + + while (i < hbricks) { + while (j < vbricks) { + let bricks[i * 3 + j] = Rect.new(i * 60 + 20, j * 30 + 20, 50, 15); + let curBrick = bricks[i * 3 + j]; + do curBrick.draw(); + let j = j + 1; + } + let j = 0; + let i = i + 1; + } + + return this; + } + + method void loop() { + var int keyPressed; + + while(true) { + // Approximately 60 updates per second + do Sys.wait(16); + + if (gameOver = 0) { + do movePaddle(); + do ball.update(); + do chackBallPaddleCol(); + do checkBallBricksCol(); + + do checkGameOver(); + } else { + let keyPressed = Keyboard.keyPressed(); + if (keyPressed = 82) { + do resetGame(); + } + } + + } + return; + } + + method void resetGame() { + var int i, end; + var Rect brick; + + do Screen.clearScreen(); + + do paddle.setPos(250, 220); + do ball.setPos(250, 200); + do ball.setSpeed(1, 1); + + let end = hbricks * vbricks; + while (i < end) { + let brick = bricks[i]; + + do brick.setHidden(0); + do brick.draw(); + + let i = i + 1; + } + + let gameOver = 0; + + return; + } + + method void checkGameOver() { + var int bBottom; + + let bBottom = ball.getBottom(); + + if (bBottom > 240) { + let gameOver = 1; + + do Output.moveCursor(0,0); + do Output.println(); + do Output.printString("game over"); + do Output.println(); + do Output.printString("press r to restart"); + } + + return; + } + + method void movePaddle() { + var int keyPressed, paddleLeft, paddleRight; + + let keyPressed = Keyboard.keyPressed(); + let paddleLeft = paddle.getLeft(); + let paddleRight = paddle.getRight(); + // Move left + if((keyPressed = 130) & (paddleLeft > 0)) { + do paddle.moveLeft(2); + } + // Move right + if((keyPressed = 132) & (paddleRight < 510)) { + do paddle.moveRight(2); + } + do paddle.draw(); + + return; + } + + method void chackBallPaddleCol() { + var int paddleLeft, paddleRight, paddleTop, paddleBottom, paddleMiddle; + var int bLeft, bRight, bTop, bBottom, bMiddle, bVspeed; + + let paddleLeft = paddle.getLeft(); + let paddleRight = paddle.getRight(); + let paddleTop = paddle.getTop(); + let paddleBottom = paddle.getBottom(); + let paddleMiddle = (paddleRight + paddleLeft) / 2; + + let bLeft = ball.getLeft(); + let bRight = ball.getRight(); + let bTop = ball.getTop(); + let bBottom = ball.getBottom(); + let bMiddle = (bRight + bLeft) / 2; + let bVspeed = ball.getVspeed(); + + if((bLeft > paddleLeft) & (bRight < paddleRight)) { + if((bBottom > paddleTop) & (bVspeed > 0)) { + if (bMiddle > paddleMiddle) { + do ball.setSpeed(1, -1); + } else { + do ball.setSpeed(-1, -1); + } + } + } + + return; + } + + method void checkBallBricksCol() { + var int brLeft, brRight, brTop, brBottom, brHidden; + var int bLeft, bRight, bTop, bBottom, bVspeed; + var int overlapLeft, overlapRight, overlapTop, overlapBottom, fromLeft, fromTop; + var int minOverlapX, minOverlapY; + var int i, end; + var Rect brick; + + let bLeft = ball.getLeft(); + let bRight = ball.getRight(); + let bTop = ball.getTop(); + let bBottom = ball.getBottom(); + let bVspeed = ball.getVspeed(); + + let end = hbricks * vbricks; + while (i < end) { + let brick = bricks[i]; + + let brLeft = brick.getLeft(); + let brRight = brick.getRight(); + let brTop = brick.getTop(); + let brBottom = brick.getBottom(); + let brHidden = brick.getHidden(); + + if(brHidden < 1) { + do brick.draw(); + + // Check if there's intersection at all first + if((bLeft > brLeft) & (bRight < brRight)) { + if((bBottom > brTop) & (bTop < brBottom)) { + do brick.setHidden(1); + do brick.draw(); + + // Now calculate the collision side + // Algorithm basically copied from this video + // https://youtu.be/_4K3tsKa1Uc?t=1820 + + let overlapLeft = bRight - brLeft; + let overlapRight = brRight - bLeft; + let overlapTop = bBottom - brTop; + let overlapBottom = brBottom - bTop; + + if(Util.abs(overlapLeft) < Util.abs(overlapRight)) { + let fromLeft = 1; + let minOverlapX = overlapLeft; + } else { + let minOverlapX = overlapRight; + } + + if(Util.abs(overlapTop) < Util.abs(overlapBottom)) { + let fromTop = 1; + let minOverlapY = overlapTop; + } else { + let minOverlapY = overlapBottom; + } + + if(Util.abs(minOverlapX) < Util.abs(minOverlapY)) { + do ball.invertHspeed(); + } else { + do ball.invertVspeed(); + } + + } + } + } + + let i = i + 1; + } + + return; + } + +} \ No newline at end of file diff --git a/projects/Arkanoid/source/Main.jack b/projects/Arkanoid/source/Main.jack new file mode 100644 index 0000000..4769d72 --- /dev/null +++ b/projects/Arkanoid/source/Main.jack @@ -0,0 +1,8 @@ +class Main { + function void main() { + var Game game; + let game = Game.new(); + do game.loop(); + return; + } +} \ No newline at end of file diff --git a/projects/Arkanoid/source/Rect.jack b/projects/Arkanoid/source/Rect.jack new file mode 100644 index 0000000..3ff3ec5 --- /dev/null +++ b/projects/Arkanoid/source/Rect.jack @@ -0,0 +1,90 @@ +class Rect { + field int x, y, width, height, hidden; + + constructor Rect new(int xl, int yl, int widthl, int heightl) { + let x = xl; + let y = yl; + let width = widthl; + let height = heightl; + let hidden = 0; + + return this; + } + + method void setPos(int lx, int ly) { + do erase(); + let x = lx; + let y = ly; + + return; + } + + method void draw() { + if (hidden = 1) { + do erase(); + return; + } + do Screen.setColor(true); + do Screen.drawRectangle(x,y,x+width,y+height); + return; + } + + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x,y,x+width,y+height); + return; + } + + method void moveLeft(int dist) { + do erase(); + let x = x - dist; + do draw(); + return; + } + + method void moveRight(int dist) { + do erase(); + let x = x + dist; + do draw(); + return; + } + + method void moveUp(int dist) { + do erase(); + let y = y - dist; + do draw(); + return; + } + + method void moveDown(int dist) { + do erase(); + let y = y + dist; + do draw(); + return; + } + + method int getLeft() { + return x; + } + + method int getRight() { + return x + width; + } + + method int getTop() { + return y; + } + + method int getBottom() { + return y + height; + } + + method int getHidden() { + return hidden; + } + + method void setHidden(int lhidden) { + let hidden = lhidden; + return; + } +} \ No newline at end of file diff --git a/projects/Arkanoid/source/Util.jack b/projects/Arkanoid/source/Util.jack new file mode 100644 index 0000000..d87b42a --- /dev/null +++ b/projects/Arkanoid/source/Util.jack @@ -0,0 +1,9 @@ +class Util { + function int abs(int n) { + if (n < 0) { + return -n; + } else { + return n; + } + } +} \ No newline at end of file diff --git a/projects/JackAnalyzer/.gitattributes b/projects/JackAnalyzer/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/projects/JackAnalyzer/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/projects/JackAnalyzer/.gitignore b/projects/JackAnalyzer/.gitignore new file mode 100644 index 0000000..b37babb --- /dev/null +++ b/projects/JackAnalyzer/.gitignore @@ -0,0 +1,341 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb +/JackAnalyzer/Properties/launchSettings.json diff --git a/projects/JackAnalyzer/JackAnalyzer.sln b/projects/JackAnalyzer/JackAnalyzer.sln new file mode 100644 index 0000000..9d5c627 --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29411.108 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JackAnalyzer", "JackAnalyzer\JackAnalyzer.csproj", "{358F80E6-7CE3-4EE3-B15F-C1D2B1EB3D67}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JackAnalyzerTest", "SymbolTableTest\JackAnalyzerTest.csproj", "{54357789-1274-4FCB-8EEA-80C75EC656CE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {358F80E6-7CE3-4EE3-B15F-C1D2B1EB3D67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {358F80E6-7CE3-4EE3-B15F-C1D2B1EB3D67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {358F80E6-7CE3-4EE3-B15F-C1D2B1EB3D67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {358F80E6-7CE3-4EE3-B15F-C1D2B1EB3D67}.Release|Any CPU.Build.0 = Release|Any CPU + {54357789-1274-4FCB-8EEA-80C75EC656CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54357789-1274-4FCB-8EEA-80C75EC656CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54357789-1274-4FCB-8EEA-80C75EC656CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54357789-1274-4FCB-8EEA-80C75EC656CE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D5BD3FCB-D928-41AD-AD56-948B65966B3A} + EndGlobalSection +EndGlobal diff --git a/projects/JackAnalyzer/JackAnalyzer/Constants.cs b/projects/JackAnalyzer/JackAnalyzer/Constants.cs new file mode 100644 index 0000000..2183a9a --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/Constants.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JackAnalyzer +{ + class Constants + { + public const string inExt = ".jack"; + + public static readonly char[] symbols = { '{', '}', '(', ')', '[', ']', '.', ',', ';', '+', '-', '*', '/', '&', '|', '<', '>', '=', '~' }; + public static readonly string[] keywords = { "class", "constructor", "function", "method", "field", "static", "var", "int", "char", "boolean", "void", "true", "false", "null", "this", "let", "do", "if", "else", "while", "return" }; + public static readonly char[] op = { '+', '-', '*', '/', '&', '|', '<', '>', '=' }; + public static readonly char[] unaryOp = { '-', '~' }; + + public const int indentLevel = 2; + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/JackAnalyzer.csproj b/projects/JackAnalyzer/JackAnalyzer/JackAnalyzer.csproj new file mode 100644 index 0000000..c73e0d1 --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/JackAnalyzer.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/projects/JackAnalyzer/JackAnalyzer/MetaSymbolTable.cs b/projects/JackAnalyzer/JackAnalyzer/MetaSymbolTable.cs new file mode 100644 index 0000000..147c8db --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/MetaSymbolTable.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JackAnalyzer +{ + public class MetaSymbolTable + { + private SymbolTable ClassSymbolTable = new SymbolTable(); + private SymbolTable FunctionSymbolTable = new SymbolTable(); + + public MetaSymbolTable() + { + + } + + public void Define(string name, string type, SymbolKind kind) + { + if (kind == SymbolKind.Field || kind == SymbolKind.Static) + { + ClassSymbolTable.Define(name, type, kind); + } + else + { + FunctionSymbolTable.Define(name, type, kind); + } + } + + internal void ResetFieldTable() + { + ClassSymbolTable.ResetFields(); + } + + public int VarCount(SymbolKind kind) + { + if (kind == SymbolKind.Field || kind == SymbolKind.Static) + { + return ClassSymbolTable.VarCount(kind); + } + else + { + return FunctionSymbolTable.VarCount(kind); + } + } + + public SymbolKind KindOf(string name) + { + try + { + return FunctionSymbolTable.KindOf(name); + } + catch + { + return ClassSymbolTable.KindOf(name); + } + } + + public string TypeOf(string name) + { + try + { + return FunctionSymbolTable.TypeOf(name); + } + catch + { + return ClassSymbolTable.TypeOf(name); + } + } + + public int IndexOf(string name) + { + try + { + return FunctionSymbolTable.IndexOf(name); + } + catch + { + return ClassSymbolTable.IndexOf(name); + } + } + + public void ResetFunctionTable() + { + FunctionSymbolTable = new SymbolTable(); + } + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/Program.cs b/projects/JackAnalyzer/JackAnalyzer/Program.cs new file mode 100644 index 0000000..b323c11 --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/Program.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace JackAnalyzer +{ + class Program + { + + static int Main(string[] args) + { + if (args.Length < 1) + { + Console.WriteLine("Not enough arguments"); + return 1; + } + + string inPath = args[0]; + + List inFiles = new List(); + + if (Directory.Exists(inPath)) + { + string[] files = Directory.GetFiles(inPath); + foreach(string file in files) + { + if(Path.GetExtension(file) == Constants.inExt) + { + inFiles.Add(file); + } + } + } + else if (File.Exists(inPath)) + { + if (Path.GetExtension(inPath) == Constants.inExt) + { + inFiles.Add(inPath); + } + } + else + { + Console.WriteLine("No input files"); + return 2; + } + + foreach(string file in inFiles) + { + Tokenizer tokenizer = new Tokenizer(file); + tokenizer.WriteTokens(file); + var tokens = tokenizer.Tokens; + Writer writer = new Writer(file, tokens); + } + + return 0; + } + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/SymbolTable.cs b/projects/JackAnalyzer/JackAnalyzer/SymbolTable.cs new file mode 100644 index 0000000..454003b --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/SymbolTable.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace JackAnalyzer +{ + public enum SymbolKind + { + Static, + Field, + Arg, + Var, + None + } + public class SymbolTable + { + Dictionary> table = new Dictionary(); + Dictionary kindCounter = new Dictionary(); + + public SymbolTable() + { + } + + public void Define(string name, string type, SymbolKind kind) + { + int count; + kindCounter.TryGetValue(kind, out count); + kindCounter[kind] = count + 1; + + table.Add(name, (type, kind, count)); + } + + public int VarCount(SymbolKind kind) + { + try + { + return kindCounter[kind]; + } catch + { + return 0; + } + } + + public SymbolKind KindOf(string name) + { + return table[name].Item2; + } + + public string TypeOf(string name) + { + return table[name].Item1; + } + + public int IndexOf(string name) + { + return table[name].Item3; + } + + public void ResetFields() + { + kindCounter[SymbolKind.Field] = 0; + var itemsToRemove = table.Where(f => f.Value.Item2 == SymbolKind.Field).ToArray(); + foreach (var item in itemsToRemove) + { + table.Remove(item.Key); + } + } + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/Token.cs b/projects/JackAnalyzer/JackAnalyzer/Token.cs new file mode 100644 index 0000000..51ca32a --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/Token.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JackAnalyzer +{ + enum TokenType + { + keyword, + identifier, + symbol, + integerConstant, + stringConstant + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/Tokenizer.cs b/projects/JackAnalyzer/JackAnalyzer/Tokenizer.cs new file mode 100644 index 0000000..bcab942 --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/Tokenizer.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Linq; +using System.Security; + +namespace JackAnalyzer +{ + class Tokenizer + { + public List> Tokens { get; } + + public Tokenizer(string file) + { + Tokens = new List>(); + + string[] text = File.ReadAllLines(file); + + string word = ""; + + bool readingComment = false; + + foreach (string line in text) + { + // Ignore comments and empty lines + if (line.Length > 0) + { + bool readingString = false; + + // This is used for comment detection + char prevSymbol = '\0'; + + foreach (char c in line) + { + if (readingComment) + { + if (c == '/' && prevSymbol == '*') + { + readingComment = false; + continue; + } + else + { + prevSymbol = c; + continue; + } + } + if (c == '"') + { + if (readingString) + { + readingString = false; + + PutStringConst(word); + word = ""; + continue; + } + else + { + readingString = true; + continue; + } + } + + if (readingString) + { + word += c; + continue; + } + + if (Constants.symbols.Contains(c)) + { + // Detect comments + if (prevSymbol == '/' && c == '/') + { + // If we're looking at a comment, that means + // we need to remove the previous symbol and + // discard the rest of the string + if (Tokens.Count > 0) + { + Tokens.RemoveAt(Tokens.Count - 1); + } + break; + } + if (prevSymbol == '/' && c == '*') + { + // If we're looking at a multi-line, that means + // we need to remove the previous symbol and + // discard the rest of the comment + if (Tokens.Count > 0) + { + Tokens.RemoveAt(Tokens.Count - 1); + } + readingComment = true; + continue; + } + + prevSymbol = c; + + PutString(word); + PutString(char.ToString(c)); + word = ""; + continue; + } + + word += c; + + if (c == ' ') + { + PutString(word); + word = ""; + } + } + + } + + } + } + + public void WriteTokens(string path) + { + string filename = Path.GetDirectoryName(path) + '/' + Path.GetFileNameWithoutExtension(path) + "T.xml"; + using (StreamWriter file = new StreamWriter(filename)) + { + file.WriteLine(""); + foreach (var token in Tokens) + { + var name = Enum.GetName(typeof(TokenType), token.Key); + var value = token.Value; + file.WriteLine('<' + name + "> " + SecurityElement.Escape(value) + " '); + } + file.WriteLine(""); + } + } + + private void PutStringConst(string token) + { + var str = new KeyValuePair(TokenType.stringConstant, token); + Tokens.Add(str); + return; + } + + private void PutString(string token) + { + var trimmed = token.Trim(); + + if (trimmed.Length == 1 && Constants.symbols.Contains(trimmed[0])) + { + var symbol = new KeyValuePair(TokenType.symbol, trimmed); + Tokens.Add(symbol); + return; + } + + if (Constants.keywords.Contains(trimmed)) + { + var keyword = new KeyValuePair(TokenType.keyword, trimmed); + Tokens.Add(keyword); + return; + } + + if (int.TryParse(trimmed, out _)) + { + var integerConstant = new KeyValuePair(TokenType.integerConstant, trimmed); + Tokens.Add(integerConstant); + return; + } + + if (trimmed.Length > 0) + { + var identifier = new KeyValuePair(TokenType.identifier, trimmed); + Tokens.Add(identifier); + return; + } + + } + + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/VMWriter.cs b/projects/JackAnalyzer/JackAnalyzer/VMWriter.cs new file mode 100644 index 0000000..54290e0 --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/VMWriter.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace JackAnalyzer +{ + enum Segment + { + Constant, Argument, Local, Static, This, That, Pointer, Temp + } + + enum ArithmeticOp + { + Add, Sub, Neg, Eq, Gt, Lt, And, Or, Not + } + class VMWriter + { + StreamWriter file; + List cache = new List(); + int funcDef = 0; + + public VMWriter(string path) + { + string filename = Path.ChangeExtension(path, ".vm"); + file = new StreamWriter(filename); + file.AutoFlush = true; + } + + public void Dispose() + { + foreach (string l in cache) + { + file.WriteLine(l); + } + file.Close(); + file.Dispose(); + } + + public void WritePush(Segment segment, int index) + { + cache.Add($"push {Enum.GetName(typeof(Segment),segment).ToLower()} {index}"); + } + + public void WritePop(Segment segment, int index) + { + cache.Add($"pop {Enum.GetName(typeof(Segment), segment).ToLower()} {index}"); + } + + public void WriteArithmetic(ArithmeticOp op) + { + cache.Add(Enum.GetName(typeof(ArithmeticOp), op).ToLower()); + } + + public void WriteLabel(string label) + { + cache.Add($"label {label}"); + } + + public void WriteGoto(string label) + { + cache.Add($"goto {label}"); + } + + public void WriteIf(string label) + { + cache.Add($"if-goto {label}"); + } + + public void WriteCall(string name, int nargs) + { + cache.Add($"call {name} {nargs}"); + } + + public void WriteFunction(string name, int nlocal) + { + cache.Add($"function {name} {nlocal}"); + funcDef = cache.Count - 1; + } + + public void RewriteFunctionLocals(string name, int nlocal) + { + cache[funcDef]=($"function {name} {nlocal}"); + } + + public void WriteReturn() + { + cache.Add("return"); + } + + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/Writer.cs b/projects/JackAnalyzer/JackAnalyzer/Writer.cs new file mode 100644 index 0000000..294870f --- /dev/null +++ b/projects/JackAnalyzer/JackAnalyzer/Writer.cs @@ -0,0 +1,914 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Security; +using System.Linq; + +namespace JackAnalyzer +{ + class Writer + { + private Queue> tokenQueue; + private static MetaSymbolTable MetaSymbolTable; + VMWriter VMWriter; + string ClassName; + int LabelCounter = 0; + public Writer(string path, List> tokens) + { + if(MetaSymbolTable == null) + { + MetaSymbolTable = new MetaSymbolTable(); + } else + { + MetaSymbolTable.ResetFieldTable(); + } + VMWriter = new VMWriter(path); + string filename = Path.ChangeExtension(path, ".xml"); + ClassName = Path.GetFileNameWithoutExtension(filename); + tokenQueue = new Queue>(tokens); + using (StreamWriter file = new StreamWriter(filename)) + { + var token = tokenQueue.Peek(); + + if (token.Key == TokenType.keyword) + { + string keyword = token.Value; + if (keyword == "class") + { + string[] classLines = CompileClass(); + foreach (string line in classLines) + { + file.WriteLine(line); + } + } + } + } + VMWriter.Dispose(); + } + + // 'class' className '{' classVarDec* subroutineDec* '}' + private string[] CompileClass() + { + List output = new List(); + + output.Add(PutOpenTag(0, "class")); + + output.Add(PutToken(1)); + var token = tokenQueue.Dequeue(); + output.Add(PutLineTag(1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "class, defined")); + output.Add(PutToken(1)); + + // classVarDec* + token = tokenQueue.Peek(); + while (token.Value == "static" || token.Value == "field") + { + output.AddRange(CompileClassVarDec(1)); + token = tokenQueue.Peek(); + } + + // subroutineDec* + token = tokenQueue.Peek(); + while (token.Value == "function" || token.Value == "constructor" || token.Value == "method" || token.Value == "void") + { + output.AddRange(CompileSubroutine(1)); + token = tokenQueue.Peek(); + } + + // } + output.Add(PutToken(1)); + + output.Add(PutCloseTag(0, "class")); + + return output.ToArray(); + } + + // ('static' | 'field') type varName (',' varName)* ';' + private string[] CompileClassVarDec(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "classVarDec")); + + var token = tokenQueue.Dequeue(); + SymbolKind kind; + switch (token.Value) + { + case "field": + kind = SymbolKind.Field; + break; + case "static": + kind = SymbolKind.Static; + break; + default: + throw new ArgumentOutOfRangeException(); + } + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value)); + + token = tokenQueue.Dequeue(); + string type = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value)); + + token = tokenQueue.Dequeue(); + string name = token.Value; + MetaSymbolTable.Define(name, type, kind); + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + type + " " + "kind=" + Enum.GetName(typeof(SymbolKind), kind) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "declared")); + + + token = tokenQueue.Peek(); + while (token.Value == ",") + { + output.Add(PutToken(indent + 1)); + token = tokenQueue.Dequeue(); + name = token.Value; + MetaSymbolTable.Define(name, type, kind); + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + type + " " + "kind=" + Enum.GetName(typeof(SymbolKind), kind) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "declared")); + token = tokenQueue.Peek(); + } + + output.Add(PutToken(indent + 1)); + + output.Add(PutCloseTag(indent, "classVarDec")); + + return output.ToArray(); + } + + // ('constructor' | 'function' | 'method') + // ('void' | type) subroutineName '(' parameterList ')' subroutineBody + private string[] CompileSubroutine(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "subroutineDec")); + MetaSymbolTable.ResetFunctionTable(); + var token = tokenQueue.Dequeue(); + string type = token.Value; + output.Add(PutToken(indent + 1)); + token = tokenQueue.Dequeue(); + string name = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "subroutine, defined")); + output.Add(PutToken(indent + 1)); + + // parameterList + if(type == "method") + { + MetaSymbolTable.Define("this", ClassName, SymbolKind.Arg); + } + output.AddRange(CompileParameterList(indent + 1)); + VMWriter.WriteFunction(ClassName + "." + name, MetaSymbolTable.VarCount(SymbolKind.Var)); + output.Add(PutToken(indent + 1)); + switch(type) + { + case "constructor": + VMWriter.WritePush(Segment.Constant, MetaSymbolTable.VarCount(SymbolKind.Field)); + VMWriter.WriteCall("Memory.alloc", 1); + VMWriter.WritePop(Segment.Pointer, 0); + break; + case "function": + break; + case "method": + VMWriter.WritePush(Segment.Argument, 0); + VMWriter.WritePop(Segment.Pointer, 0); + break; + } + output.AddRange(CompileSubroutineBody(indent + 1)); + VMWriter.RewriteFunctionLocals(ClassName + "." + name, MetaSymbolTable.VarCount(SymbolKind.Var)); + output.Add(PutCloseTag(indent, "subroutineDec")); + + return output.ToArray(); + } + + // '{' varDec* statements '}' + private string[] CompileSubroutineBody(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "subroutineBody")); + + output.Add(PutToken(indent + 1)); + + // varDec* + var token = tokenQueue.Peek(); + while (token.Value == "var") + { + output.AddRange(CompileVarDec(indent + 1)); + token = tokenQueue.Peek(); + } + + output.AddRange(CompileStatements(indent + 1)); + + // } + output.Add(PutToken(indent + 1)); + + output.Add(PutCloseTag(indent, "subroutineBody")); + + return output.ToArray(); + } + + // statement* + private string[] CompileStatements(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "statements")); + + bool finished = false; + + var token = tokenQueue.Peek(); + + while (!finished) + { + switch (token.Value) + { + case "do": + output.AddRange(CompileDoStatement(indent + 1)); + break; + case "let": + output.AddRange(CompileLetStatement(indent + 1)); + break; + case "while": + output.AddRange(CompileWhileStatement(indent + 1)); + break; + case "return": + output.AddRange(CompileReturnStatement(indent + 1)); + break; + case "if": + output.AddRange(CompileIfStatement(indent + 1)); + break; + default: + finished = true; + break; + } + token = tokenQueue.Peek(); + } + + + output.Add(PutCloseTag(indent, "statements")); + + return output.ToArray(); + } + + // 'do' subroutineCall ';' + private string[] CompileDoStatement(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "doStatement")); + + output.Add(PutToken(indent + 1)); + + var queueEnumerator = tokenQueue.GetEnumerator(); + queueEnumerator.MoveNext(); + queueEnumerator.MoveNext(); + var nextToken = queueEnumerator.Current; + string name = ""; + + int ellen = 0; + + // subroutineName '(' expressionList ')' | (className | + // varName) '.' subroutineName '(' expressionList ')' + if (nextToken.Value == ".") + { + + var token = tokenQueue.Dequeue(); + string classname = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "class, used")); + output.Add(PutToken(indent + 1)); + token = tokenQueue.Dequeue(); + string fname = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "function, used")); + output.Add(PutToken(indent + 1)); + try + { + MetaSymbolTable.KindOf(classname); + Segment seg = Segment.Local; + switch (MetaSymbolTable.KindOf(classname)) + { + case SymbolKind.Static: + seg = Segment.Static; + break; + case SymbolKind.Field: + seg = Segment.This; + break; + case SymbolKind.Arg: + seg = Segment.Argument; + break; + case SymbolKind.Var: + seg = Segment.Local; + break; + case SymbolKind.None: + break; + default: + break; + } + VMWriter.WritePush(seg, MetaSymbolTable.IndexOf(classname)); + ellen += 1; + } + catch + { + + } + + ellen += CompileExpressionList(indent + 1); + output.Add(PutToken(indent + 1)); + + try + { + name = MetaSymbolTable.TypeOf(classname) + "." + fname; + + } catch + { + name = classname + "." + fname; + } + } + else if (nextToken.Value == "(") + { + VMWriter.WritePush(Segment.Pointer, 0); + var token = tokenQueue.Dequeue(); + name = ClassName + "." + token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "function, used")); + output.Add(PutToken(indent + 1)); + ellen += CompileExpressionList(indent + 1); + ellen += 1; + output.Add(PutToken(indent + 1)); + } + // ; + output.Add(PutToken(indent + 1)); + + VMWriter.WriteCall(name, ellen); + VMWriter.WritePop(Segment.Temp, 0); + output.Add(PutCloseTag(indent, "doStatement")); + + return output.ToArray(); + } + + // 'let' varName ('[' expression ']')? '=' expression ';' + private string[] CompileLetStatement(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "letStatement")); + + output.Add(PutToken(indent + 1)); + var token = tokenQueue.Dequeue(); + string name = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + MetaSymbolTable.TypeOf(name) + " " + "kind=" + Enum.GetName(typeof(SymbolKind), MetaSymbolTable.KindOf(name)) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "used")); + + token = tokenQueue.Peek(); + if (token.Value == "[") + { + output.Add(PutToken(indent + 1)); + Segment sega = Segment.Local; + switch (MetaSymbolTable.KindOf(name)) + { + case SymbolKind.Static: + sega = Segment.Static; + break; + case SymbolKind.Field: + sega = Segment.This; + break; + case SymbolKind.Arg: + sega = Segment.Argument; + break; + case SymbolKind.Var: + sega = Segment.Local; + break; + case SymbolKind.None: + break; + default: + break; + } + VMWriter.WritePush(sega, MetaSymbolTable.IndexOf(name)); + output.AddRange(CompileExpression(indent + 1)); + VMWriter.WriteArithmetic(ArithmeticOp.Add); + output.Add(PutToken(indent + 1)); + + output.Add(PutToken(indent + 1)); + output.AddRange(CompileExpression(indent + 1)); + output.Add(PutToken(indent + 1)); + + VMWriter.WritePop(Segment.Temp, 0); + VMWriter.WritePop(Segment.Pointer, 1); + VMWriter.WritePush(Segment.Temp, 0); + VMWriter.WritePop(Segment.That, 0); + + } + else + { + output.Add(PutToken(indent + 1)); + output.AddRange(CompileExpression(indent + 1)); + output.Add(PutToken(indent + 1)); + + Segment seg = Segment.Local; + switch (MetaSymbolTable.KindOf(name)) + { + case SymbolKind.Static: + seg = Segment.Static; + break; + case SymbolKind.Field: + seg = Segment.This; + break; + case SymbolKind.Arg: + seg = Segment.Argument; + break; + case SymbolKind.Var: + seg = Segment.Local; + break; + case SymbolKind.None: + break; + default: + break; + } + VMWriter.WritePop(seg, MetaSymbolTable.IndexOf(name)); + } + + output.Add(PutCloseTag(indent, "letStatement")); + + return output.ToArray(); + } + + // 'while' '(' expression ')' '{' statements '}' + private string[] CompileWhileStatement(int indent) + { + List output = new List(); + LabelCounter++; + int localcounter = LabelCounter; + output.Add(PutOpenTag(indent, "whileStatement")); + VMWriter.WriteLabel("WHILE" + localcounter + 0); + output.Add(PutToken(indent + 1)); + output.Add(PutToken(indent + 1)); + output.AddRange(CompileExpression(indent + 1)); + VMWriter.WriteArithmetic(ArithmeticOp.Not); + VMWriter.WriteIf("WHILE" + localcounter + 1); + output.Add(PutToken(indent + 1)); + output.Add(PutToken(indent + 1)); + output.AddRange(CompileStatements(indent + 1)); + VMWriter.WriteGoto("WHILE" + localcounter + 0); + output.Add(PutToken(indent + 1)); + VMWriter.WriteLabel("WHILE" + localcounter + 1); + + output.Add(PutCloseTag(indent, "whileStatement")); + + return output.ToArray(); + } + + // 'return' expression? ';' + private string[] CompileReturnStatement(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "returnStatement")); + + output.Add(PutToken(indent + 1)); + + var token = tokenQueue.Peek(); + if (token.Value != ";") + { + output.AddRange(CompileExpression(indent + 1)); + } else + { + VMWriter.WritePush(Segment.Constant, 0); + } + + output.Add(PutToken(indent + 1)); + + VMWriter.WriteReturn(); + output.Add(PutCloseTag(indent, "returnStatement")); + + return output.ToArray(); + } + + // 'if' '(' expression ')' '{' statements '}' ('else' '{' statements '}')? + private string[] CompileIfStatement(int indent) + { + List output = new List(); + LabelCounter++; + int localcounter = LabelCounter; + + output.Add(PutOpenTag(indent, "ifStatement")); + + output.Add(PutToken(indent + 1)); + output.Add(PutToken(indent + 1)); + output.AddRange(CompileExpression(indent + 1)); + VMWriter.WriteArithmetic(ArithmeticOp.Not); + VMWriter.WriteIf("IF" + localcounter + 0); + + output.Add(PutToken(indent + 1)); + output.Add(PutToken(indent + 1)); + output.AddRange(CompileStatements(indent + 1)); + output.Add(PutToken(indent + 1)); + VMWriter.WriteGoto("IF" + localcounter + 1); + VMWriter.WriteLabel("IF" + localcounter + 0); + var token = tokenQueue.Peek(); + if (token.Value == "else") + { + output.Add(PutToken(indent + 1)); + output.Add(PutToken(indent + 1)); + output.AddRange(CompileStatements(indent + 1)); + output.Add(PutToken(indent + 1)); + } + VMWriter.WriteLabel("IF" + localcounter + 1); + + output.Add(PutCloseTag(indent, "ifStatement")); + + return output.ToArray(); + } + + // 'var' type varName (',' varName)* ';' + private string[] CompileVarDec(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "varDec")); + + var token = tokenQueue.Dequeue(); + SymbolKind kind = SymbolKind.Var; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value)); + + token = tokenQueue.Dequeue(); + string type = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value)); + + token = tokenQueue.Dequeue(); + string name = token.Value; + MetaSymbolTable.Define(name, type, kind); + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + type + " " + "kind=" + Enum.GetName(typeof(SymbolKind), kind) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "declared")); + + token = tokenQueue.Peek(); + while (token.Value == ",") + { + output.Add(PutToken(indent + 1)); + + token = tokenQueue.Dequeue(); + name = token.Value; + MetaSymbolTable.Define(name, type, kind); + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + type + " " + "kind=" + Enum.GetName(typeof(SymbolKind), kind) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "declared")); + token = tokenQueue.Peek(); + } + + output.Add(PutToken(indent + 1)); + + output.Add(PutCloseTag(indent, "varDec")); + + return output.ToArray(); + } + + // ((type varName) (',' type varName)*)? + private string[] CompileParameterList(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "parameterList")); + + var token = tokenQueue.Peek(); + if (token.Key == TokenType.keyword || token.Key == TokenType.identifier) + { + token = tokenQueue.Dequeue(); + string type = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value)); + + token = tokenQueue.Dequeue(); + string name = token.Value; + SymbolKind kind = SymbolKind.Arg; + MetaSymbolTable.Define(name, type, kind); + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + type + " " + "kind=" + Enum.GetName(typeof(SymbolKind), kind) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "declared")); + + token = tokenQueue.Peek(); + while (token.Value == ",") + { + output.Add(PutToken(indent + 1)); + token = tokenQueue.Dequeue(); + type = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value)); + + token = tokenQueue.Dequeue(); + name = token.Value; + kind = SymbolKind.Arg; + MetaSymbolTable.Define(name, type, kind); + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + type + " " + "kind=" + Enum.GetName(typeof(SymbolKind), kind) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "declared")); + token = tokenQueue.Peek(); + } + } + + output.Add(PutCloseTag(indent, "parameterList")); + + return output.ToArray(); + } + + // term (op term)* + private string[] CompileExpression(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "expression")); + + output.AddRange(CompileTerm(indent + 1)); + + var token = tokenQueue.Peek(); + while (Constants.op.Contains(token.Value[0])) + { + string op = token.Value; + output.Add(PutToken(indent + 1)); + output.AddRange(CompileTerm(indent + 1)); + switch (op) + { + case "+": + VMWriter.WriteArithmetic(ArithmeticOp.Add); + break; + case "-": + VMWriter.WriteArithmetic(ArithmeticOp.Sub); + break; + case "*": + VMWriter.WriteCall("Math.multiply", 2); + break; + case "/": + VMWriter.WriteCall("Math.divide", 2); + break; + case "&": + VMWriter.WriteArithmetic(ArithmeticOp.And); + break; + case "|": + VMWriter.WriteArithmetic(ArithmeticOp.Or); + break; + case "<": + VMWriter.WriteArithmetic(ArithmeticOp.Lt); + break; + case ">": + VMWriter.WriteArithmetic(ArithmeticOp.Gt); + break; + case "=": + VMWriter.WriteArithmetic(ArithmeticOp.Eq); + break; + default: + break; + } + token = tokenQueue.Peek(); + } + + output.Add(PutCloseTag(indent, "expression")); + + return output.ToArray(); + } + + // integerConstant | stringConstant | keywordConstant | + // varName | varName '[' expression ']' | subroutineCall | + // '(' expression ')' | unaryOp term + private string[] CompileTerm(int indent) + { + List output = new List(); + + output.Add(PutOpenTag(indent, "term")); + + var token = tokenQueue.Peek(); + + var queueEnumerator = tokenQueue.GetEnumerator(); + + queueEnumerator.MoveNext(); + queueEnumerator.MoveNext(); + + var nextToken = queueEnumerator.Current; + + if (Constants.unaryOp.Contains(token.Value[0])) + { + string unaryOp = token.Value; + output.Add(PutToken(indent + 1)); + output.AddRange(CompileTerm(indent + 1)); + switch (unaryOp) + { + case "-": + VMWriter.WriteArithmetic(ArithmeticOp.Neg); + break; + case "~": + VMWriter.WriteArithmetic(ArithmeticOp.Not); + break; + default: + break; + } + } + else if (token.Key == TokenType.identifier && nextToken.Value == ".") + { + // subroutineName '(' expressionList ')' | (className | + // varName) '.' subroutineName '(' expressionList ')' + + token = tokenQueue.Dequeue(); + string classname = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "class, used")); + output.Add(PutToken(indent + 1)); + token = tokenQueue.Dequeue(); + string funcname = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "function, used")); + output.Add(PutToken(indent + 1)); + int ellen = CompileExpressionList(indent + 1); + try + { + MetaSymbolTable.KindOf(classname); + Segment seg = Segment.Local; + switch (MetaSymbolTable.KindOf(classname)) + { + case SymbolKind.Static: + seg = Segment.Static; + break; + case SymbolKind.Field: + seg = Segment.This; + break; + case SymbolKind.Arg: + seg = Segment.Argument; + break; + case SymbolKind.Var: + seg = Segment.Local; + break; + case SymbolKind.None: + break; + default: + break; + } + VMWriter.WritePush(seg, MetaSymbolTable.IndexOf(classname)); + ellen += 1; + } + catch + { + + } + try + { + VMWriter.WriteCall(MetaSymbolTable.TypeOf(classname) + "." + funcname, ellen); + } catch + { + VMWriter.WriteCall(classname + "." + funcname, ellen); + } + output.Add(PutToken(indent + 1)); + } + else if (token.Key == TokenType.identifier && nextToken.Value == "(") + { + token = tokenQueue.Dequeue(); + string funcname = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "function, used")); + output.Add(PutToken(indent + 1)); + int ellen = CompileExpressionList(indent + 1); + VMWriter.WritePush(Segment.Pointer, 0); + VMWriter.WriteCall(ClassName + "." + funcname, ellen + 1); + output.Add(PutToken(indent + 1)); + } + else if (nextToken.Value == "[") + { + token = tokenQueue.Dequeue(); + string name = token.Value; + + Segment sega = Segment.Local; + switch (MetaSymbolTable.KindOf(name)) + { + case SymbolKind.Static: + sega = Segment.Static; + break; + case SymbolKind.Field: + sega = Segment.This; + break; + case SymbolKind.Arg: + sega = Segment.Argument; + break; + case SymbolKind.Var: + sega = Segment.Local; + break; + case SymbolKind.None: + break; + default: + break; + } + VMWriter.WritePush(sega, MetaSymbolTable.IndexOf(name)); + output.Add(PutToken(indent + 1)); + output.AddRange(CompileExpression(indent + 1)); + VMWriter.WriteArithmetic(ArithmeticOp.Add); + output.Add(PutToken(indent + 1)); + + VMWriter.WritePop(Segment.Pointer, 1); + VMWriter.WritePush(Segment.That, 0); + } + else if (token.Value == "(") + { + output.Add(PutToken(indent + 1)); + output.AddRange(CompileExpression(indent + 1)); + output.Add(PutToken(indent + 1)); + } + else if (token.Key == TokenType.identifier) + { + token = tokenQueue.Dequeue(); + string name = token.Value; + output.Add(PutLineTag(indent + 1, Enum.GetName(typeof(TokenType), token.Key), token.Value, "name=" + name + " " + "type=" + MetaSymbolTable.TypeOf(name) + " " + "kind=" + Enum.GetName(typeof(SymbolKind), MetaSymbolTable.KindOf(name)) + " " + "index=" + MetaSymbolTable.IndexOf(name) + " " + "used")); + Segment seg = Segment.Local; + switch (MetaSymbolTable.KindOf(name)) + { + case SymbolKind.Static: + seg = Segment.Static; + break; + case SymbolKind.Field: + seg = Segment.This; + break; + case SymbolKind.Arg: + seg = Segment.Argument; + break; + case SymbolKind.Var: + seg = Segment.Local; + break; + case SymbolKind.None: + break; + default: + break; + } + VMWriter.WritePush(seg, MetaSymbolTable.IndexOf(name)); + } + else + { + switch (token.Key) + { + case TokenType.keyword: + switch(token.Value) + { + case "this": + VMWriter.WritePush(Segment.Pointer, 0); + break; + case "false": + case "null": + VMWriter.WritePush(Segment.Constant, 0); + break; + case "true": + VMWriter.WritePush(Segment.Constant, 0); + VMWriter.WriteArithmetic(ArithmeticOp.Not); + break; + } + break; + case TokenType.symbol: + break; + case TokenType.integerConstant: + VMWriter.WritePush(Segment.Constant, int.Parse(token.Value)); + break; + case TokenType.stringConstant: + string str = token.Value; + VMWriter.WritePush(Segment.Constant, str.Length); + VMWriter.WriteCall("String.new", 1); + foreach(char c in str) + { + VMWriter.WritePush(Segment.Constant, c); + VMWriter.WriteCall("String.appendChar", 2); + } + break; + default: + break; + } + output.Add(PutToken(indent + 1)); + } + + output.Add(PutCloseTag(indent, "term")); + + return output.ToArray(); + } + + // (expression (',' expression)* )? + private int CompileExpressionList(int indent) + { + List output = new List(); + + int ExpressionListLength = 0; + output.Add(PutOpenTag(indent, "expressionList")); + + var token = tokenQueue.Peek(); + if (token.Value != ")") + { + ExpressionListLength = 1; + output.AddRange(CompileExpression(indent + 1)); + token = tokenQueue.Peek(); + while (token.Value == ",") + { + ExpressionListLength++; + output.Add(PutToken(indent + 1)); + output.AddRange(CompileExpression(indent + 1)); + token = tokenQueue.Peek(); + } + } + + output.Add(PutCloseTag(indent, "expressionList")); + + return ExpressionListLength; + } + + private string PutToken(int indent) + { + var token = tokenQueue.Dequeue(); + return PutLineTag(indent, Enum.GetName(typeof(TokenType), token.Key), token.Value); + } + + private string PutOpenTag(int indent, string name) + { + return new string(' ', indent * Constants.indentLevel) + '<' + name + '>'; + } + + private string PutCloseTag(int indent, string name) + { + return new string(' ', indent * Constants.indentLevel) + "'; + } + + private string PutLineTag(int indent, string name, string value, string add = "") + { + return new string(' ', indent * Constants.indentLevel) + '<' + name + " " + add + "> " + SecurityElement.Escape(value) + " '; + } + } +} diff --git a/projects/JackAnalyzer/JackAnalyzer/project10.zip b/projects/JackAnalyzer/JackAnalyzer/project10.zip new file mode 100644 index 0000000000000000000000000000000000000000..2dd93c071458213311de78ab798e6dc4217de0e3 GIT binary patch literal 4935 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 C+I3I> literal 0 HcmV?d00001 diff --git a/projects/JackAnalyzer/SymbolTableTest/JackAnalyzerTest.csproj b/projects/JackAnalyzer/SymbolTableTest/JackAnalyzerTest.csproj new file mode 100644 index 0000000..82be9df --- /dev/null +++ b/projects/JackAnalyzer/SymbolTableTest/JackAnalyzerTest.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + + false + + + + + + + + + + + + + + diff --git a/projects/JackAnalyzer/SymbolTableTest/MetaSymbolTableTest.cs b/projects/JackAnalyzer/SymbolTableTest/MetaSymbolTableTest.cs new file mode 100644 index 0000000..a034aea --- /dev/null +++ b/projects/JackAnalyzer/SymbolTableTest/MetaSymbolTableTest.cs @@ -0,0 +1,43 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using JackAnalyzer; + +namespace MetaSymbolTableTest +{ + [TestClass] + public class MetaSymbolTableTest + { + [TestMethod] + public void CounterTest() + { + MetaSymbolTable st = new MetaSymbolTable(); + + st.Define("x", "int", SymbolKind.Var); + Assert.AreEqual(1, st.VarCount(SymbolKind.Var)); + Assert.AreEqual(0, st.IndexOf("x")); + + st.Define("y", "String", SymbolKind.Var); + Assert.AreEqual(2, st.VarCount(SymbolKind.Var)); + Assert.AreEqual(1, st.IndexOf("y")); + + st.Define("z", "String", SymbolKind.Field); + Assert.AreEqual(1, st.VarCount(SymbolKind.Field)); + Assert.AreEqual(0, st.IndexOf("z")); + } + + public void ResetTest() + { + MetaSymbolTable st = new MetaSymbolTable(); + + st.Define("x", "int", SymbolKind.Var); + Assert.AreEqual(1, st.VarCount(SymbolKind.Var)); + Assert.AreEqual(0, st.IndexOf("x")); + + st.ResetFunctionTable(); + try + { + st.IndexOf("x"); + Assert.Fail(); + } catch { } + } + } +} diff --git a/projects/JackAnalyzer/SymbolTableTest/SymbolTableTest.cs b/projects/JackAnalyzer/SymbolTableTest/SymbolTableTest.cs new file mode 100644 index 0000000..df42939 --- /dev/null +++ b/projects/JackAnalyzer/SymbolTableTest/SymbolTableTest.cs @@ -0,0 +1,29 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using JackAnalyzer; + +namespace SymbolTableTest +{ + [TestClass] + public class SymbolTableTest + { + [TestMethod] + public void CounterTest() + { + SymbolTable st = new SymbolTable(); + + st.Define("x", "int", SymbolKind.Var); + Assert.AreEqual(1, st.VarCount(SymbolKind.Var)); + Assert.AreEqual(0, st.IndexOf("x")); + + st.Define("y", "String", SymbolKind.Var); + Assert.AreEqual(2, st.VarCount(SymbolKind.Var)); + Assert.AreEqual(1, st.IndexOf("y")); + + st.Define("z", "String", SymbolKind.Field); + Assert.AreEqual(1, st.VarCount(SymbolKind.Field)); + Assert.AreEqual(0, st.IndexOf("z")); + + Assert.AreEqual(0, st.VarCount(SymbolKind.Static)); + } + } +} diff --git a/projects/Tables/Cell.jack b/projects/Tables/Cell.jack new file mode 100644 index 0000000..e87f543 --- /dev/null +++ b/projects/Tables/Cell.jack @@ -0,0 +1,23 @@ +class Cell { + field int x, y, width, num, charWidth, charHeight; + + constructor Cell new(int xl, int yl, int widthl, int numl) { + let x = xl; + let y = yl; + let width = widthl; + let num = numl; + + let charWidth = 8; + let charHeight = 11; + + return this; + } + + method void draw() { + do Output.moveCursor(y + 1, (x + 1) * width); + do Output.printInt(num); + + do Screen.drawLine(charWidth * x, y * charHeight, charWidth * (x + width), y * charHeight); + return; + } +} \ No newline at end of file diff --git a/projects/Tables/Cell.vm b/projects/Tables/Cell.vm new file mode 100644 index 0000000..c69c220 --- /dev/null +++ b/projects/Tables/Cell.vm @@ -0,0 +1,52 @@ +function Cell.new 0 +push constant 6 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +pop this 0 +push argument 1 +pop this 1 +push argument 2 +pop this 2 +push argument 3 +pop this 3 +push constant 8 +pop this 4 +push constant 11 +pop this 5 +push pointer 0 +return +function Cell.draw 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +add +push this 0 +push constant 1 +add +push this 2 +call Math.multiply 2 +call Output.moveCursor 2 +pop temp 0 +push this 3 +call Output.printInt 1 +pop temp 0 +push this 4 +push this 0 +call Math.multiply 2 +push this 1 +push this 5 +call Math.multiply 2 +push this 4 +push this 0 +push this 2 +add +call Math.multiply 2 +push this 1 +push this 5 +call Math.multiply 2 +call Screen.drawLine 4 +pop temp 0 +push constant 0 +return diff --git a/projects/Tables/Main.jack b/projects/Tables/Main.jack new file mode 100644 index 0000000..25c68a8 --- /dev/null +++ b/projects/Tables/Main.jack @@ -0,0 +1,8 @@ +class Main { + function void main() { + var Table table; + let table = Table.new(); + + return; + } +} \ No newline at end of file diff --git a/projects/Tables/Main.vm b/projects/Tables/Main.vm new file mode 100644 index 0000000..dd5765d --- /dev/null +++ b/projects/Tables/Main.vm @@ -0,0 +1,5 @@ +function Main.main 1 +call Table.new 0 +pop local 0 +push constant 0 +return diff --git a/projects/Tables/Table.jack b/projects/Tables/Table.jack new file mode 100644 index 0000000..ad79eed --- /dev/null +++ b/projects/Tables/Table.jack @@ -0,0 +1,96 @@ +class Table { + field int selX, selY, cellChars, charHeight, charWidth, horCells, verCells, cellWidth, numCells; + field Array cellsArr; + field String alphabet; + + constructor Table new() { + var int i, x, y; + var bool stopX, stopY; + + var Cell cell; + let cellChars = 5; + let charWidth = 8; + let charHeight = 11; + let horCells = 11; + let verCells = 22; + let cellWidth = (charWidth * cellChars); + + let numCells = horCells * verCells; + + let cellsArr = Array.new(numCells); + + let stopX = false; + let x = 0; + let y = 0; + + while (~stopX) { + if(y < verCells) { + let i = (x * verCells) + y; + + let cellsArr[i] = Cell.new(x, y, cellChars, i); + let cell = cellsArr[i]; + do cell.draw(); + + let y = y + 1; + } + + if(y = verCells) { + let y = 0; + let x = x + 1; + } + + if (x = horCells) { + let stopX = true; + } + } + + + let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + //do drawTable(); + do printHeader(); + + return this; + } + + method void drawTable() { + var int i; + + let i = 1; + while(i < (horCells + 1)) { + do Screen.drawLine((i * cellWidth) - 2, 0, (i * cellWidth) - 2, 255); + let i = i + 1; + } + + let i = 1; + while(i < (verCells + 1)) { + do Screen.drawLine(0, (i * charHeight) - 1, 511, (i * charHeight) - 1); + let i = i + 1; + } + + do Screen.drawLine(39, 0, 39, 255); + do Screen.drawLine(0, 11, 511, 11); + + return; + } + + method void printHeader() { + var int i; + + let i = 0; + while(i < verCells) { + do Output.moveCursor(i + 1, 1); + do Output.printInt(i); + let i = i + 1; + } + + let i = 0; + while(i < horCells) { + do Output.moveCursor(0, (cellChars * (i + 1)) + 2); + do Output.printChar(alphabet.charAt(i)); + let i = i + 1; + } + + return; + } +} \ No newline at end of file diff --git a/projects/Tables/Table.vm b/projects/Tables/Table.vm new file mode 100644 index 0000000..44e990e --- /dev/null +++ b/projects/Tables/Table.vm @@ -0,0 +1,293 @@ +function Table.new 6 +push constant 11 +call Memory.alloc 1 +pop pointer 0 +push constant 5 +pop this 2 +push constant 8 +pop this 4 +push constant 11 +pop this 3 +push constant 11 +pop this 5 +push constant 22 +pop this 6 +push this 4 +push this 2 +call Math.multiply 2 +pop this 7 +push this 5 +push this 6 +call Math.multiply 2 +pop this 8 +push this 8 +call Array.new 1 +pop this 9 +push constant 0 +pop local 3 +push constant 0 +pop local 1 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 3 +not +not +if-goto WHILE_END0 +push local 2 +push this 6 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 1 +push this 6 +call Math.multiply 2 +push local 2 +add +pop local 0 +push local 0 +push this 9 +add +push local 1 +push local 2 +push this 2 +push local 0 +call Cell.new 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push this 9 +add +pop pointer 1 +push that 0 +pop local 5 +push local 5 +call Cell.draw 1 +pop temp 0 +push local 2 +push constant 1 +add +pop local 2 +label IF_FALSE0 +push local 2 +push this 6 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +pop local 2 +push local 1 +push constant 1 +add +pop local 1 +label IF_FALSE1 +push local 1 +push this 5 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +not +pop local 3 +label IF_FALSE2 +goto WHILE_EXP0 +label WHILE_END0 +push constant 26 +call String.new 1 +push constant 65 +call String.appendChar 2 +push constant 66 +call String.appendChar 2 +push constant 67 +call String.appendChar 2 +push constant 68 +call String.appendChar 2 +push constant 69 +call String.appendChar 2 +push constant 70 +call String.appendChar 2 +push constant 71 +call String.appendChar 2 +push constant 72 +call String.appendChar 2 +push constant 73 +call String.appendChar 2 +push constant 74 +call String.appendChar 2 +push constant 75 +call String.appendChar 2 +push constant 76 +call String.appendChar 2 +push constant 77 +call String.appendChar 2 +push constant 78 +call String.appendChar 2 +push constant 79 +call String.appendChar 2 +push constant 80 +call String.appendChar 2 +push constant 81 +call String.appendChar 2 +push constant 82 +call String.appendChar 2 +push constant 83 +call String.appendChar 2 +push constant 84 +call String.appendChar 2 +push constant 85 +call String.appendChar 2 +push constant 86 +call String.appendChar 2 +push constant 87 +call String.appendChar 2 +push constant 88 +call String.appendChar 2 +push constant 89 +call String.appendChar 2 +push constant 90 +call String.appendChar 2 +pop this 10 +push pointer 0 +call Table.printHeader 1 +pop temp 0 +push pointer 0 +return +function Table.drawTable 1 +push argument 0 +pop pointer 0 +push constant 1 +pop local 0 +label WHILE_EXP0 +push local 0 +push this 5 +push constant 1 +add +lt +not +if-goto WHILE_END0 +push local 0 +push this 7 +call Math.multiply 2 +push constant 2 +sub +push constant 0 +push local 0 +push this 7 +call Math.multiply 2 +push constant 2 +sub +push constant 255 +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 1 +pop local 0 +label WHILE_EXP1 +push local 0 +push this 6 +push constant 1 +add +lt +not +if-goto WHILE_END1 +push constant 0 +push local 0 +push this 3 +call Math.multiply 2 +push constant 1 +sub +push constant 511 +push local 0 +push this 3 +call Math.multiply 2 +push constant 1 +sub +call Screen.drawLine 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push constant 39 +push constant 0 +push constant 39 +push constant 255 +call Screen.drawLine 4 +pop temp 0 +push constant 0 +push constant 11 +push constant 511 +push constant 11 +call Screen.drawLine 4 +pop temp 0 +push constant 0 +return +function Table.printHeader 1 +push argument 0 +pop pointer 0 +push constant 0 +pop local 0 +label WHILE_EXP0 +push local 0 +push this 6 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +push constant 1 +call Output.moveCursor 2 +pop temp 0 +push local 0 +call Output.printInt 1 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +pop local 0 +label WHILE_EXP1 +push local 0 +push this 5 +lt +not +if-goto WHILE_END1 +push constant 0 +push this 2 +push local 0 +push constant 1 +add +call Math.multiply 2 +push constant 2 +add +call Output.moveCursor 2 +pop temp 0 +push this 10 +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_EXP1 +label WHILE_END1 +push constant 0 +return diff --git a/projects/Tables/Utils.jack b/projects/Tables/Utils.jack new file mode 100644 index 0000000..09e36e7 --- /dev/null +++ b/projects/Tables/Utils.jack @@ -0,0 +1,7 @@ +class Utils { + function int mod(int a, int b) { + var int div; + let div = Math.divide(a,b); + return a - (b*div); + } +} \ No newline at end of file diff --git a/projects/Tables/Utils.vm b/projects/Tables/Utils.vm new file mode 100644 index 0000000..3a16204 --- /dev/null +++ b/projects/Tables/Utils.vm @@ -0,0 +1,11 @@ +function Utils.mod 1 +push argument 0 +push argument 1 +call Math.divide 2 +pop local 0 +push argument 0 +push argument 1 +push local 0 +call Math.multiply 2 +sub +return diff --git a/projects/VMTranslator/.asm b/projects/VMTranslator/.asm new file mode 100644 index 0000000..e69de29 diff --git a/projects/VMTranslator/.clang-format b/projects/VMTranslator/.clang-format new file mode 100644 index 0000000..635c58f --- /dev/null +++ b/projects/VMTranslator/.clang-format @@ -0,0 +1,6 @@ +--- +Language: Cpp +BasedOnStyle: Google +IndentWidth: 4 +... + diff --git a/projects/VMTranslator/.gitignore b/projects/VMTranslator/.gitignore new file mode 100644 index 0000000..360e7d4 --- /dev/null +++ b/projects/VMTranslator/.gitignore @@ -0,0 +1,4 @@ +build/ +*.kdev4 +.kdev4/ +.history \ No newline at end of file diff --git a/projects/VMTranslator/.vscode/c_cpp_properties.json b/projects/VMTranslator/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..b86d1de --- /dev/null +++ b/projects/VMTranslator/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/usr/include/c++/9/**", + "/usr/include/**" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "${default}" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/projects/VMTranslator/.vscode/settings.json b/projects/VMTranslator/.vscode/settings.json new file mode 100644 index 0000000..0ebd73a --- /dev/null +++ b/projects/VMTranslator/.vscode/settings.json @@ -0,0 +1,45 @@ +{ + "files.associations": { + "array": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "optional": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "type_traits": "cpp", + "tuple": "cpp", + "typeinfo": "cpp", + "utility": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "ctime": "cpp", + "deque": "cpp", + "functional": "cpp", + "iomanip": "cpp", + "ratio": "cpp", + "filesystem": "cpp" + } +} \ No newline at end of file diff --git a/projects/VMTranslator/CMakeLists.txt b/projects/VMTranslator/CMakeLists.txt new file mode 100644 index 0000000..8077c06 --- /dev/null +++ b/projects/VMTranslator/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.0) + +project(VMTranslator) +add_executable(VMTranslator main.cpp Parser.cpp Writer.cpp Commands.cpp) + +set_property(TARGET VMTranslator PROPERTY CXX_STANDARD 14) +install(TARGETS VMTranslator RUNTIME DESTINATION bin) +target_link_libraries(${PROJECT_NAME} stdc++fs) diff --git a/projects/VMTranslator/Commands.cpp b/projects/VMTranslator/Commands.cpp new file mode 100644 index 0000000..50ae425 --- /dev/null +++ b/projects/VMTranslator/Commands.cpp @@ -0,0 +1,35 @@ +#include "Commands.h" + +std::unordered_map CommandTypeDict = { + {"", CommandType::Empty}, + {"push", CommandType::Push}, + {"pop", CommandType::Pop}, + {"add", CommandType::Add}, + {"sub", CommandType::Sub}, + {"neg", CommandType::Neg}, + {"eq", CommandType::Eq}, + {"gt", CommandType::Gt}, + {"lt", CommandType::Lt}, + {"and", CommandType::And}, + {"or", CommandType::Or}, + {"not", CommandType::Not}, + {"label", CommandType::Label}, + {"if-goto", CommandType::IfGoto}, + {"goto", CommandType::Goto}, + {"call", CommandType::Call}, + {"function", CommandType::Function}, + {"return", CommandType::Return}, +}; + +std::unordered_map TypeCommandDict = []() { + std::unordered_map rev; + for (auto &cmd : CommandTypeDict) { + rev[cmd.second] = cmd.first; + } + return rev; +}(); + +std::ostream &operator<<(std::ostream &os, const Command &cmd) { + os << TypeCommandDict[cmd.type] << " " << cmd.arg1 << " " << cmd.arg2; + return os; +} diff --git a/projects/VMTranslator/Commands.h b/projects/VMTranslator/Commands.h new file mode 100644 index 0000000..efe9b75 --- /dev/null +++ b/projects/VMTranslator/Commands.h @@ -0,0 +1,49 @@ +#ifndef COMMANDS_H +#define COMMANDS_H + +#include +#include +#include + +enum class CommandType { + Add, + Sub, + Neg, + Eq, + Gt, + Lt, + And, + Or, + Not, + Push, + Pop, + Label, + IfGoto, + Goto, + If, + Function, + Call, + Return, + All, + Empty +}; + +extern std::unordered_map CommandTypeDict; +extern std::unordered_map TypeCommandDict; + +struct Command { + CommandType type = CommandType::Empty; + std::string arg1 = ""; + int arg2 = 0; + + Command() {} + Command(CommandType type) : type(type) {} + Command(CommandType type, std::string arg1, int arg2 = 0) + : type(type), arg1(arg1), arg2(arg2) {} + + inline bool isEmpty() { return type == CommandType::Empty; } + + friend std::ostream &operator<<(std::ostream &os, const Command &cmd); +}; + +#endif // COMMANDS_H diff --git a/projects/VMTranslator/Parser.cpp b/projects/VMTranslator/Parser.cpp new file mode 100644 index 0000000..63031b7 --- /dev/null +++ b/projects/VMTranslator/Parser.cpp @@ -0,0 +1,54 @@ +#include "Parser.h" + +Parser::Parser(std::string file) { + infile.open(file); + if (!infile.is_open()) { + throw std::invalid_argument("Input file doesn't exist"); + } +} + +void Parser::close() { infile.close(); } + +bool Parser::more() { return infile.good(); } + +Command Parser::next() { + std::string line; + std::getline(infile, line); + + while ((line.substr(0, 2) == "//" || line.empty() || + (line[line.length() - 1] == '\r' && line.length() <= 1)) && + infile.good()) { + std::getline(infile, line); + } + + if (line.length() > 1 && line[line.length() - 1] == '\r') { + line = line.substr(0, line.length() - 1); + } + + if (line.length() == 0) { + return Command(CommandType::Empty); + } + + std::istringstream ss(line); + std::string word; + Command cmd; + int n = 0; + + while (ss >> word) { + if(word == "//") { + break; + } + if (n == 0) { + cmd.type = CommandTypeDict[word]; + } else if (n == 1) { + cmd.arg1 = word; + } else if (n == 2) { + cmd.arg2 = std::stoi(word); + } else { + break; + } + n++; + } + + return cmd; +} diff --git a/projects/VMTranslator/Parser.h b/projects/VMTranslator/Parser.h new file mode 100644 index 0000000..6c81766 --- /dev/null +++ b/projects/VMTranslator/Parser.h @@ -0,0 +1,23 @@ +#ifndef PARSER_H +#define PARSER_H + +#include +#include +#include +#include +#include + +#include "Commands.h" + +class Parser { + private: + std::ifstream infile; + + public: + Parser(std::string file); + void close(); + bool more(); + Command next(); +}; + +#endif // PARSER_H diff --git a/projects/VMTranslator/VMTranslator b/projects/VMTranslator/VMTranslator new file mode 100644 index 0000000000000000000000000000000000000000..fa9ab219429870e0ceef14079f1e2c2e89fe0e7a GIT binary patch literal 369568 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�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φ|j)ICX4DuRMAE#juq6IW;Lj9Tj-YHDEe;JlL6XS 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≶L&81EuW$ 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 +#include +#include +#include +#include + +#include "Commands.h" +class Writer { + private: + std::ofstream outfile; + void writeArith(Command cmd); + void writePushPop(Command cmd); + void writeBranch(Command cmd); + void writeCall(Command cmd); + void writeFunction(Command cmd); + void writeReturn(Command cmd); + + std::string getFileName(std::string path); + std::string getClassName(std::string filename); + std::string filename; + std::string classname; + + std::string functionName; + int retCounter = 0; + + public: + Writer(std::string file); + void setFile(std::string filename); + void close(); + void writeCmd(Command cmd); + void writeInit(); +}; + +#endif // WRITER_H diff --git a/projects/VMTranslator/lang.txt b/projects/VMTranslator/lang.txt new file mode 100644 index 0000000..d287cd3 --- /dev/null +++ b/projects/VMTranslator/lang.txt @@ -0,0 +1 @@ +debug diff --git a/projects/VMTranslator/main.cpp b/projects/VMTranslator/main.cpp new file mode 100644 index 0000000..1107673 --- /dev/null +++ b/projects/VMTranslator/main.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include + +#include "Parser.h" +#include "Writer.h" + +Parser *parser; +Writer *writer; + +int main(int argc, char **argv) { + if (argc != 2) { + std::cout << "Not enough arguments" << std::endl; + return 1; + } + + std::string inpath(argv[1]); + bool shouldWriteInit = false; + std::string indir; + std::vector infiles; + std::string outfile; + + if (std::experimental::filesystem::is_directory(inpath)) { + if (inpath[inpath.length()] == '/') { + inpath = inpath.substr(0, inpath.length() - 1); + } + int slashPos = inpath.rfind("/"); + indir = inpath.substr(slashPos + 1, inpath.length()); + outfile = inpath + "/" + indir + ".asm"; + + for (auto &f : + std::experimental::filesystem::directory_iterator(inpath)) { + if (std::experimental::filesystem::is_regular_file( + f.path().string())) { + if (f.path().extension() == ".vm") { + infiles.push_back(f.path().string()); + } + } + } + shouldWriteInit = true; + } else if (std::experimental::filesystem::is_regular_file(inpath)) { + int dotPos = inpath.rfind("."); + outfile = inpath.substr(0, dotPos); + outfile += ".asm"; + + infiles.push_back(inpath); + } else { + std::cout << "Input file doesn't exist" << std::endl; + } + + try { + writer = new Writer(outfile); + } catch (const std::invalid_argument &e) { + std::cout << e.what() << std::endl; + return 3; + } + + if (shouldWriteInit) { + writer->writeInit(); + } + + for (auto &f : infiles) { + parser = new Parser(f); + writer->setFile(f); + while (parser->more()) { + Command cmd; + cmd = parser->next(); + writer->writeCmd(cmd); + } + parser->close(); + delete parser; + } + + writer->close(); + + return 0; +} diff --git a/projects/VMTranslator/project7.zip b/projects/VMTranslator/project7.zip new file mode 100644 index 0000000000000000000000000000000000000000..f5be837e9a5bfc96d4667e5533f90cdbf7e937d7 GIT binary patch literal 4299 zcmb7I2UJtp77ZOS^w5{IrMo(>T)2tbZ~efez%4ESe(i2wi~fD@qR z?dfUj<=`)B@8e@+NC_ajwIpD9YJqpp0|UG@l60`CA^5f^+`$>twu#@Mj}E4$*&ZdN9R-gKF6J#8w#%~)afbG_^5s;$;{pJ0`IsrCo9|vYraP%`JKYU! zH}{k-$npgd@xf0%!zKxYp6%_%%u{APn;dXArpn57dIKR6Zlt!}2P8{>FL3CsVED-s%lWc1%xdFZ7bbxsZmXFew zblYrdY+YiHaH$lAr%Y7}bVIxK0wmxO&`f963`&^3Tc&`tMNP!+=S>KP07q#TLX|iK zODT@HGfKrG&nTt9<{UYeQV&}%XVHMW0e=x%jmpvO5eUEZqFvNgZa(1o1x5Q15S`w>h1=&!$_LK3z~wUNWJg3{cWUd zuBeZKs4vH^BmhL~HMB2Aw^0g*G+WI&Rx?bM{&v6`;k@%e$ddh2wv~2W4&|n%+Mj|# zX;!YyLP-%C$rj`rQ^D1!DJ#$`6QvHNP8ImwG^zYzs&+-xgH?uxyk78y#(9|jfM4HZ zZsO^ol{x+6C*B$}N-!ggJSv|WF2~mST_yh^Xq;5-rdcU#TYwrO)BJ%WC9^Bc?ebWXbyFFr6RQ zYaFT2n-Q|%*s#G-cSb6Hi4GzDyAtTx`uRKh{h;-6p60>i}v zSr|dfG+=IYhlGslRT8MU&zk^**Dd6Urv8Sm&2SiT3 zJ=u64Rn-w41mExHBq;r)OwypV(~(lx$f#nh-tjM#WJR8UUCe_e9>cGHZ!eJf{mtCN$l^@5x5$k6*hjeBm$z@FB}=SKEAuy)4HF zj6OmL_WigBP*S^hABc~u-C61iEYxMHBonMas>&X+XVb?#TUm+LwvRYoV0HO0;tKb_ z(Vs48{n8K>+eeXAV5+5f+fLt1zL58Ag0#$GGiZqYQ}KgHiiv3$9JYiWQ4FM=mDVOr zj&oim8;?(HEforCCT6mh;u?OhZh=zoS8BB;e*i68TbL`mPQgbN7|XgW`^JP&^_}4; z+|3@r?d>#lOCPTAcHu#J?r;;oR@P&k zHUSme(GwfiF3*TOy}c+pp>Z;0cKj`1_A=iS5qbrS&na}$wNj7M$VB41lh9e=cL=R| zkun4ug3Yw4qB*It)5k(Z0dcXD^tXZh(&%!r2C7sPMx2QBs~K_fT9BgyDFJ(eG;n-B zjmLJo?89?B8I^L%{1wLW6miM2_DFCLO!l%`|j?iqNPH^hQk8Y#R) zm~jZE%NZ~sk|9cm%%9u~?-J;BSr21D(qBRT`SQKol|67tU;5HKddw%N45S1plCoQB z?t1EMXrY_+;+5jXi>~i>9l{kMMfA=Zdih9*)=3xAjuPp}sRGwx5z4 zt*}JQ_%I_vd4}VtYdij)&J>3Xtd3|#H6^Gdr9wy7ekl0;jNKAf$H)sGR;p-npw!CU z>CpxWcEm03M;Rq0M+=HZ;HuQQP7uni$L8a?xhMU-&D$Bg><-(ja!JoW?r&FJ>lS~_ z$lPmSZ<=8uYMiYpfZ@Zd5%^0t*k1<@mRVI|!26X%eXf$aetuT0tK1-BlJKT--53V^YLgPS$63%)<_D>cqmCEF&EtZeT@F7Ke}xl7GXzUfGXqOqo;kM(syXMkROX8=9ZoJ z0yUv!7Lx*t4we^_+Or%UUZ)?EFtB5-;Q#)Y&T9A&f82^~mbkn>s|dCsXF3byhp0N<9@S$#F1eR55CdYaFoGK9$mtxz z-GX)z1J8~!dzI!h(DO+jv4a^%YE}k0>kvh3)LC*-)RJSCWPm!VcITLff1#P=qZ(AOhm$wvzQHCN!s12}D zEb6a{Xna(hZo_Zj|Mo#K36_grR&hV$;g!3xW6r02>}2MCGOjQ0A|L>ivR!s literal 0 HcmV?d00001 diff --git a/projects/VMTranslator/project8.zip b/projects/VMTranslator/project8.zip new file mode 100644 index 0000000000000000000000000000000000000000..4073328720327b3909cd20e66e4416e99cdbe9ea GIT binary patch literal 5674 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 CxIR4q literal 0 HcmV?d00001 diff --git a/tools/builtInChips/And.hdl b/tools/builtInChips/And.hdl new file mode 100644 index 0000000..09c30e6 --- /dev/null +++ b/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/tools/builtInChips/And16.hdl b/tools/builtInChips/And16.hdl new file mode 100644 index 0000000..96c5049 --- /dev/null +++ b/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/tools/builtInChips/Bit.class b/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/tools/builtInChips/Bit.hdl b/tools/builtInChips/Bit.hdl new file mode 100644 index 0000000..8db1664 --- /dev/null +++ b/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/tools/builtInChips/DFF.class b/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/tools/builtInChips/DMux.hdl b/tools/builtInChips/DMux.hdl new file mode 100644 index 0000000..4833a11 --- /dev/null +++ b/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/tools/builtInChips/DMux4Way.class b/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/tools/builtInChips/DMux8Way.hdl b/tools/builtInChips/DMux8Way.hdl new file mode 100644 index 0000000..614ad10 --- /dev/null +++ b/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/tools/builtInChips/DRegister.class b/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/tools/builtInChips/HalfAdder.hdl b/tools/builtInChips/HalfAdder.hdl new file mode 100644 index 0000000..ba9ad98 --- /dev/null +++ b/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/tools/builtInChips/Inc16.class b/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/tools/builtInChips/Keyboard.hdl b/tools/builtInChips/Keyboard.hdl new file mode 100644 index 0000000..c1bdd80 --- /dev/null +++ b/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/tools/builtInChips/Mux.class b/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/tools/builtInChips/Mux.hdl b/tools/builtInChips/Mux.hdl new file mode 100644 index 0000000..26fdd6b --- /dev/null +++ b/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/tools/builtInChips/Mux16.hdl b/tools/builtInChips/Mux16.hdl new file mode 100644 index 0000000..9504703 --- /dev/null +++ b/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/tools/builtInChips/Mux4Way16.class b/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/tools/builtInChips/Nand.hdl b/tools/builtInChips/Nand.hdl new file mode 100644 index 0000000..9019fd9 --- /dev/null +++ b/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/tools/builtInChips/Not.class b/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/tools/builtInChips/Not.hdl b/tools/builtInChips/Not.hdl new file mode 100644 index 0000000..4d16ea4 --- /dev/null +++ b/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/tools/builtInChips/Not16.class b/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/tools/builtInChips/Not16.hdl b/tools/builtInChips/Not16.hdl new file mode 100644 index 0000000..0ff22d2 --- /dev/null +++ b/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/tools/builtInChips/Or.class b/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/tools/builtInChips/Or8Way.hdl b/tools/builtInChips/Or8Way.hdl new file mode 100644 index 0000000..dccd61d --- /dev/null +++ b/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/tools/builtInChips/PC.class b/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/tools/builtInChips/PC.hdl b/tools/builtInChips/PC.hdl new file mode 100644 index 0000000..15a5f89 --- /dev/null +++ b/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/tools/builtInChips/RAM.class b/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/tools/builtInChips/RAM16K.class b/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/tools/builtInChips/RAM16K.hdl b/tools/builtInChips/RAM16K.hdl new file mode 100644 index 0000000..abe44b2 --- /dev/null +++ b/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/tools/builtInChips/RAM4K.class b/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/tools/builtInChips/RAM4K.hdl b/tools/builtInChips/RAM4K.hdl new file mode 100644 index 0000000..6c408ee --- /dev/null +++ b/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/tools/builtInChips/RAM512.class b/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/tools/builtInChips/RAM512.hdl b/tools/builtInChips/RAM512.hdl new file mode 100644 index 0000000..6b5287c --- /dev/null +++ b/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/tools/builtInChips/RAM64.class b/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/tools/builtInChips/RAM64.hdl b/tools/builtInChips/RAM64.hdl new file mode 100644 index 0000000..092e58b --- /dev/null +++ b/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/tools/builtInChips/RAM8.class b/tools/builtInChips/RAM8.class new file mode 100644 index 0000000000000000000000000000000000000000..88f106e2b625bb9699c2850f6b131f6542b2a24a GIT binary patch literal 306 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 Qh)-eto+P=F{bi2uAI7bI+W-In literal 0 HcmV?d00001 diff --git a/tools/builtInChips/ROM32K.hdl b/tools/builtInChips/ROM32K.hdl new file mode 100644 index 0000000..d42ef2e --- /dev/null +++ b/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/tools/builtInChips/Register.class b/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/tools/builtInChips/Register.hdl b/tools/builtInChips/Register.hdl new file mode 100644 index 0000000..99c7006 --- /dev/null +++ b/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/tools/builtInChips/RegisterWithGUI.class b/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/tools/builtInChips/Screen.class b/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/tools/builtInChips/Screen.hdl b/tools/builtInChips/Screen.hdl new file mode 100644 index 0000000..07c3d61 --- /dev/null +++ b/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/tools/builtInChips/Xor.class b/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/tools/builtInVMCode/JackOSClass.class b/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/tools/builtInVMCode/Keyboard.class b/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/tools/builtInVMCode/Math.class b/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/tools/builtInVMCode/Memory.class b/tools/builtInVMCode/Memory.class new file mode 100644 index 0000000000000000000000000000000000000000..e9bb7ad3ff815685aab0771a85044a2f062fc3e5 GIT binary patch literal 788 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 Z4AZPoRKsAstMg>m|MAfx@h^){Ow#}W literal 0 HcmV?d00001 diff --git a/tools/builtInVMCode/String.class b/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/tools/builtInVMCode/Sys.class b/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

+NestedCallStack.html shows the expected stack values at various points +during the test. + +