From 7894b48931aa6e4bfa0e7db53361ff5b1ac25a8c Mon Sep 17 00:00:00 2001 From: QkoSad Date: Wed, 16 Jul 2025 13:00:37 +0300 Subject: [PATCH] . --- README.md | 8 + projects/00/file.txt | 6 + projects/01/And.cmp | 5 + projects/01/And.hdl | 19 + projects/01/And.out | 5 + projects/01/And.tst | 29 + projects/01/And16.cmp | 7 + projects/01/And16.hdl | 35 + projects/01/And16.out | 7 + projects/01/And16.tst | 39 + projects/01/DMux.cmp | 5 + projects/01/DMux.hdl | 21 + projects/01/DMux.out | 5 + projects/01/DMux.tst | 27 + projects/01/DMux4Way.cmp | 9 + projects/01/DMux4Way.hdl | 32 + projects/01/DMux4Way.out | 9 + projects/01/DMux4Way.tst | 43 + projects/01/DMux8Way.cmp | 17 + projects/01/DMux8Way.hdl | 47 + projects/01/DMux8Way.out | 17 + projects/01/DMux8Way.tst | 75 + projects/01/Mux.cmp | 9 + projects/01/Mux.hdl | 17 + projects/01/Mux.out | 9 + projects/01/Mux.tst | 49 + projects/01/Mux16.cmp | 9 + projects/01/Mux16.hdl | 34 + projects/01/Mux16.out | 9 + projects/01/Mux16.tst | 49 + projects/01/Mux4Way.hdl | 21 + projects/01/Mux4Way16.cmp | 9 + projects/01/Mux4Way16.hdl | 38 + projects/01/Mux4Way16.out | 9 + projects/01/Mux4Way16.tst | 49 + projects/01/Mux8Way.hdl | 41 + projects/01/Mux8Way16.cmp | 17 + projects/01/Mux8Way16.hdl | 38 + projects/01/Mux8Way16.tst | 89 + projects/01/Not.cmp | 3 + projects/01/Not.hdl | 17 + projects/01/Not.out | 3 + projects/01/Not.tst | 17 + projects/01/Not16.cmp | 6 + projects/01/Not16.hdl | 33 + projects/01/Not16.out | 6 + projects/01/Not16.tst | 29 + projects/01/Or.cmp | 5 + projects/01/Or.hdl | 9 + projects/01/Or.out | 0 projects/01/Or.tst | 29 + projects/01/Or16.cmp | 7 + projects/01/Or16.hdl | 33 + projects/01/Or16.out | 7 + projects/01/Or16.tst | 39 + projects/01/Or8Way.cmp | 6 + projects/01/Or8Way.hdl | 25 + projects/01/Or8Way.out | 6 + projects/01/Or8Way.tst | 29 + projects/01/Xor.cmp | 5 + projects/01/Xor.hdl | 11 + projects/01/Xor.out | 5 + projects/01/Xor.tst | 14 + projects/02/ALU-nostat.cmp | 37 + projects/02/ALU-nostat.out | 37 + projects/02/ALU-nostat.tst | 353 + projects/02/ALU.cmp | 37 + projects/02/ALU.hdl | 66 + projects/02/ALU.out | 37 + projects/02/ALU.tst | 377 + projects/02/Add16.cmp | 7 + projects/02/Add16.hdl | 35 + projects/02/Add16.out | 7 + projects/02/Add16.tst | 39 + projects/02/FullAdder.cmp | 9 + projects/02/FullAdder.hdl | 20 + projects/02/FullAdder.out | 9 + projects/02/FullAdder.tst | 47 + projects/02/HalfAdder.cmp | 5 + projects/02/HalfAdder.hdl | 18 + projects/02/HalfAdder.out | 5 + projects/02/HalfAdder.tst | 29 + projects/02/Inc16.cmp | 5 + projects/02/Inc16.hdl | 18 + projects/02/Inc16.out | 5 + projects/02/Inc16.tst | 25 + projects/03/a/Bit.cmp | 215 + projects/03/a/Bit.hdl | 19 + projects/03/a/Bit.out | 215 + projects/03/a/Bit.tst | 865 + projects/03/a/DMux8Way16.hdl | 22 + projects/03/a/PC.cmp | 31 + projects/03/a/PC.hdl | 44 + projects/03/a/PC.out | 0 projects/03/a/PC.tst | 125 + projects/03/a/RAM64.cmp | 320 + projects/03/a/RAM64.hdl | 28 + projects/03/a/RAM64.out | 320 + projects/03/a/RAM64.tst | 1026 + projects/03/a/RAM8.cmp | 173 + projects/03/a/RAM8.hdl | 29 + projects/03/a/RAM8.out | 173 + projects/03/a/RAM8.tst | 560 + projects/03/a/Register.cmp | 149 + projects/03/a/Register.hdl | 34 + projects/03/a/Register.out | 149 + projects/03/a/Register.tst | 569 + projects/03/b/RAM16K.cmp | 320 + projects/03/b/RAM16K.hdl | 24 + projects/03/b/RAM16K.out | 320 + projects/03/b/RAM16K.tst | 1026 + projects/03/b/RAM4K.cmp | 320 + projects/03/b/RAM4K.hdl | 28 + projects/03/b/RAM4K.out | 320 + projects/03/b/RAM4K.tst | 1026 + projects/03/b/RAM512.cmp | 320 + projects/03/b/RAM512.hdl | 28 + projects/03/b/RAM512.out | 320 + projects/03/b/RAM512.tst | 1027 + projects/04/Fill.asm | 97 + projects/04/Mult.asm | 24 + projects/04/fill/Fill.asm | 97 + projects/04/fill/Fill.tst | 11 + projects/04/fill/FillAutomatic.cmp | 4 + projects/04/fill/FillAutomatic.tst | 37 + projects/04/mult/Mult.asm | 24 + projects/04/mult/Mult.cmp | 7 + projects/04/mult/Mult.out | 0 projects/04/mult/Mult.tst | 74 + projects/05/Add.hack | 6 + projects/05/CPU-external.cmp | 93 + projects/05/CPU-external.out | 93 + projects/05/CPU-external.tst | 150 + projects/05/CPU.cmp | 93 + projects/05/CPU.hdl | 115 + projects/05/CPU.out | 93 + projects/05/CPU.tst | 150 + projects/05/Computer.hdl | 25 + projects/05/ComputerAdd-external.cmp | 15 + projects/05/ComputerAdd-external.out | 15 + projects/05/ComputerAdd-external.tst | 32 + projects/05/ComputerAdd.cmp | 15 + projects/05/ComputerAdd.out | 15 + projects/05/ComputerAdd.tst | 32 + projects/05/ComputerMax-external.cmp | 28 + projects/05/ComputerMax-external.out | 28 + projects/05/ComputerMax-external.tst | 38 + projects/05/ComputerMax.cmp | 28 + projects/05/ComputerMax.out | 28 + projects/05/ComputerMax.tst | 39 + projects/05/ComputerRect-external.cmp | 65 + projects/05/ComputerRect-external.out | 65 + projects/05/ComputerRect-external.tst | 26 + projects/05/ComputerRect.cmp | 65 + projects/05/ComputerRect.out | 65 + projects/05/ComputerRect.tst | 26 + projects/05/Max.hack | 16 + projects/05/Memory.cmp | 54 + projects/05/Memory.hdl | 36 + projects/05/Memory.out | 54 + projects/05/Memory.tst | 163 + projects/05/Rect.hack | 25 + projects/06/add/Add.asm | 13 + projects/06/assembler_final_not_refined.py | 230 + projects/06/max/Max.asm | 26 + projects/06/max/Max.hack | 16 + projects/06/max/MaxL.asm | 23 + projects/06/pong/Pong.asm | 28375 ++++++++++++++++ projects/06/pong/Pong.hack | 27483 +++++++++++++++ projects/06/pong/PongL.asm | 27490 +++++++++++++++ projects/06/rect/Rect.asm | 35 + projects/06/rect/Rect.hack | 25 + projects/06/rect/RectL.asm | 32 + .../07/MemoryAccess/BasicTest/BasicTest.asm | 232 + .../07/MemoryAccess/BasicTest/BasicTest.cmp | 2 + .../07/MemoryAccess/BasicTest/BasicTest.out | 2 + .../07/MemoryAccess/BasicTest/BasicTest.tst | 25 + .../07/MemoryAccess/BasicTest/BasicTest.vm | 31 + .../MemoryAccess/BasicTest/BasicTestVME.tst | 25 + .../MemoryAccess/PointerTest/PointerTest.asm | 122 + .../MemoryAccess/PointerTest/PointerTest.cmp | 2 + .../MemoryAccess/PointerTest/PointerTest.tst | 20 + .../MemoryAccess/PointerTest/PointerTest.vm | 22 + .../PointerTest/PointerTestVME.tst | 20 + .../07/MemoryAccess/StaticTest/StaticTest.asm | 72 + .../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 | 20 + .../StackArithmetic/SimpleAdd/SimpleAdd.cmp | 2 + .../StackArithmetic/SimpleAdd/SimpleAdd.tst | 17 + .../07/StackArithmetic/SimpleAdd/SimpleAdd.vm | 9 + .../SimpleAdd/SimpleAddVME.tst | 17 + .../StackArithmetic/StackTest/StackTest.asm | 373 + .../StackArithmetic/StackTest/StackTest.cmp | 4 + .../StackArithmetic/StackTest/StackTest.tst | 22 + .../07/StackArithmetic/StackTest/StackTest.vm | 45 + .../StackTest/StackTestVME.tst | 22 + projects/07/VMTranslator.py | 160 + projects/07/lang.txt | 1 + .../FibonacciElement/FibonacciElement.asm | 447 + .../FibonacciElement/FibonacciElement.cmp | 2 + .../FibonacciElement/FibonacciElement.out | 2 + .../FibonacciElement/FibonacciElement.tst | 18 + .../FibonacciElement/FibonacciElementVME.tst | 17 + .../08/FunctionCalls/FibonacciElement/Main.vm | 30 + .../08/FunctionCalls/FibonacciElement/Sys.vm | 15 + .../FunctionCalls/NestedCall/NestedCall.asm | 598 + .../FunctionCalls/NestedCall/NestedCall.cmp | 2 + .../FunctionCalls/NestedCall/NestedCall.html | 196 + .../FunctionCalls/NestedCall/NestedCall.out | 2 + .../FunctionCalls/NestedCall/NestedCall.tst | 65 + .../NestedCall/NestedCallStack.html | 306 + .../NestedCall/NestedCallVME.tst | 70 + .../NestedCall/NestedCall_NoBoot.asm | 543 + projects/08/FunctionCalls/NestedCall/Sys.vm | 63 + .../SimpleFunction/SimpleFunction.asm | 137 + .../SimpleFunction/SimpleFunction.cmp | 2 + .../SimpleFunction/SimpleFunction.out | 2 + .../SimpleFunction/SimpleFunction.tst | 29 + .../SimpleFunction/SimpleFunction.vm | 16 + .../SimpleFunction/SimpleFunctionVME.tst | 29 + .../08/FunctionCalls/StaticsTest/Class1.vm | 20 + .../08/FunctionCalls/StaticsTest/Class2.vm | 20 + .../FunctionCalls/StaticsTest/StaticsTest.asm | 649 + .../FunctionCalls/StaticsTest/StaticsTest.cmp | 2 + .../FunctionCalls/StaticsTest/StaticsTest.out | 2 + .../FunctionCalls/StaticsTest/StaticsTest.tst | 17 + .../StaticsTest/StaticsTestVME.tst | 17 + projects/08/FunctionCalls/StaticsTest/Sys.vm | 20 + .../08/ProgramFlow/BasicLoop/BasicLoop.asm | 142 + .../08/ProgramFlow/BasicLoop/BasicLoop.cmp | 2 + .../08/ProgramFlow/BasicLoop/BasicLoop.hack | 127 + .../08/ProgramFlow/BasicLoop/BasicLoop.out | 2 + .../08/ProgramFlow/BasicLoop/BasicLoop.tst | 20 + .../08/ProgramFlow/BasicLoop/BasicLoop.vm | 22 + .../08/ProgramFlow/BasicLoop/BasicLoopVME.tst | 20 + .../FibonacciSeries/FibonacciSeries.asm | 255 + .../FibonacciSeries/FibonacciSeries.cmp | 2 + .../FibonacciSeries/FibonacciSeries.out | 2 + .../FibonacciSeries/FibonacciSeries.tst | 22 + .../FibonacciSeries/FibonacciSeries.vm | 49 + .../FibonacciSeries/FibonacciSeriesVME.tst | 22 + projects/08/VMTranslator.py | 246 + projects/08/Vmtraslotor_old.py | 253 + projects/08/lang.txt | 2 + 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/New folder/Tetris.zip | Bin 0 -> 10840 bytes projects/09/New folder/Tetris/Main.vm | 147 + projects/09/New folder/Tetris/Piece.vm | 2219 ++ projects/09/New folder/Tetris/Tetris.vm | 999 + .../09/New folder/Tetris/source/Main.jack | 19 + .../09/New folder/Tetris/source/Piece.jack | 473 + .../09/New folder/Tetris/source/Tetris.jack | 203 + projects/09/Square/Main.jack | 15 + projects/09/Square/Square.jack | 108 + projects/09/Square/SquareGame.jack | 79 + projects/09/Tetris/Assembler.bat | 27 + projects/09/Tetris/Assembler.sh | 32 + projects/09/Tetris/CPUEmulator.bat | 29 + projects/09/Tetris/CPUEmulator.sh | 33 + projects/09/Tetris/HardwareSimulator.bat | 30 + projects/09/Tetris/HardwareSimulator.sh | 34 + projects/09/Tetris/JackCompiler.bat | 26 + projects/09/Tetris/JackCompiler.py | 350 + projects/09/Tetris/JackCompiler.sh | 35 + projects/09/Tetris/Main.jack | 19 + projects/09/Tetris/Main.vm | 147 + projects/09/Tetris/OS/Array.vm | 23 + projects/09/Tetris/OS/Keyboard.vm | 102 + projects/09/Tetris/OS/Math.vm | 408 + projects/09/Tetris/OS/Memory.vm | 376 + projects/09/Tetris/OS/Output.vm | 1852 + projects/09/Tetris/OS/Screen.vm | 806 + projects/09/Tetris/OS/String.vm | 393 + projects/09/Tetris/OS/Sys.vm | 83 + projects/09/Tetris/Piece.jack | 473 + projects/09/Tetris/Piece.vm | 2219 ++ projects/09/Tetris/Tetris.jack | 203 + projects/09/Tetris/Tetris.vm | 999 + projects/09/Tetris/TextComparer.bat | 29 + projects/09/Tetris/TextComparer.sh | 36 + projects/09/Tetris/VMEmulator.bat | 29 + projects/09/Tetris/VMEmulator.sh | 33 + .../__pycache__/symbol_table.cpython-39.pyc | Bin 0 -> 2289 bytes .../__pycache__/tokenizer.cpython-39.pyc | Bin 0 -> 2118 bytes .../__pycache__/vmwriter.cpython-39.pyc | Bin 0 -> 2635 bytes projects/09/Tetris/bin/Assembler.dat | 1 + projects/09/Tetris/bin/CPU Emulator.dat | 1 + projects/09/Tetris/bin/Hardware Simulator.dat | 1 + .../Tetris/bin/Virtual Machine Emulator.dat | 1 + .../Tetris/bin/classes/CPUEmulatorMain.class | Bin 0 -> 1084 bytes .../bin/classes/HackAssemblerMain.class | Bin 0 -> 1098 bytes .../bin/classes/HardwareSimulatorMain.class | Bin 0 -> 1182 bytes .../09/Tetris/bin/classes/TextComparer.class | Bin 0 -> 1739 bytes .../Tetris/bin/classes/VMEmulatorMain.class | Bin 0 -> 1073 bytes projects/09/Tetris/bin/help/asmAbout.html | 96 + projects/09/Tetris/bin/help/asmUsage.html | 115 + projects/09/Tetris/bin/help/compiler.txt | 9 + projects/09/Tetris/bin/help/cpuAbout.html | 96 + projects/09/Tetris/bin/help/cpuUsage.html | 115 + projects/09/Tetris/bin/help/hwAbout.html | 96 + projects/09/Tetris/bin/help/hwUsage.html | 115 + projects/09/Tetris/bin/help/vmAbout.html | 110 + projects/09/Tetris/bin/help/vmUsage.html | 115 + projects/09/Tetris/bin/images/arrow2.gif | Bin 0 -> 1073 bytes projects/09/Tetris/bin/images/calculator2.gif | Bin 0 -> 302 bytes projects/09/Tetris/bin/images/cancel.gif | Bin 0 -> 1133 bytes projects/09/Tetris/bin/images/chip.gif | Bin 0 -> 1078 bytes projects/09/Tetris/bin/images/clock2.gif | Bin 0 -> 1138 bytes projects/09/Tetris/bin/images/equal.gif | Bin 0 -> 1042 bytes projects/09/Tetris/bin/images/find.gif | Bin 0 -> 1014 bytes projects/09/Tetris/bin/images/hex.gif | Bin 0 -> 1422 bytes projects/09/Tetris/bin/images/keyboard.gif | Bin 0 -> 1017 bytes projects/09/Tetris/bin/images/ok.gif | Bin 0 -> 988 bytes projects/09/Tetris/bin/images/ok2.gif | Bin 0 -> 920 bytes projects/09/Tetris/bin/images/open.gif | Bin 0 -> 930 bytes projects/09/Tetris/bin/images/open2.gif | Bin 0 -> 969 bytes projects/09/Tetris/bin/images/opendoc.gif | Bin 0 -> 1094 bytes projects/09/Tetris/bin/images/redflag.gif | Bin 0 -> 1100 bytes projects/09/Tetris/bin/images/save.gif | Bin 0 -> 1257 bytes projects/09/Tetris/bin/images/scroll.gif | Bin 0 -> 949 bytes projects/09/Tetris/bin/images/smallcancel.gif | Bin 0 -> 946 bytes projects/09/Tetris/bin/images/smallequal.gif | Bin 0 -> 898 bytes projects/09/Tetris/bin/images/smallminus.gif | Bin 0 -> 863 bytes projects/09/Tetris/bin/images/smallnew.gif | Bin 0 -> 1000 bytes projects/09/Tetris/bin/images/smallok.gif | Bin 0 -> 925 bytes projects/09/Tetris/bin/images/smallplus.gif | Bin 0 -> 873 bytes .../09/Tetris/bin/images/vcrfastforward.gif | Bin 0 -> 1122 bytes projects/09/Tetris/bin/images/vcrforward.gif | Bin 0 -> 1021 bytes projects/09/Tetris/bin/images/vcrrewind.gif | Bin 0 -> 1122 bytes projects/09/Tetris/bin/images/vcrstop.gif | Bin 0 -> 972 bytes projects/09/Tetris/bin/lib/AssemblerGUI.jar | Bin 0 -> 4470 bytes projects/09/Tetris/bin/lib/Compilers.jar | Bin 0 -> 27094 bytes projects/09/Tetris/bin/lib/Hack.jar | Bin 0 -> 59364 bytes projects/09/Tetris/bin/lib/HackGUI.jar | Bin 0 -> 96666 bytes projects/09/Tetris/bin/lib/Simulators.jar | Bin 0 -> 81810 bytes projects/09/Tetris/bin/lib/SimulatorsGUI.jar | Bin 0 -> 68492 bytes projects/09/Tetris/bin/lib/TranslatorsGUI.jar | Bin 0 -> 13643 bytes projects/09/Tetris/bin/scripts/defaultCPU.txt | 3 + projects/09/Tetris/bin/scripts/defaultHW.txt | 4 + projects/09/Tetris/bin/scripts/defaultVM.txt | 3 + projects/09/Tetris/builtInChips/ALU.class | Bin 0 -> 1754 bytes projects/09/Tetris/builtInChips/ALU.hdl | 55 + .../09/Tetris/builtInChips/ARegister.class | Bin 0 -> 337 bytes projects/09/Tetris/builtInChips/ARegister.hdl | 24 + projects/09/Tetris/builtInChips/Add16.class | Bin 0 -> 343 bytes projects/09/Tetris/builtInChips/Add16.hdl | 18 + projects/09/Tetris/builtInChips/And.class | Bin 0 -> 341 bytes projects/09/Tetris/builtInChips/And.hdl | 16 + projects/09/Tetris/builtInChips/And16.hdl | 17 + projects/09/Tetris/builtInChips/Bit.class | Bin 0 -> 416 bytes projects/09/Tetris/builtInChips/Bit.hdl | 19 + projects/09/Tetris/builtInChips/DFF.class | Bin 0 -> 401 bytes projects/09/Tetris/builtInChips/DFF.hdl | 18 + projects/09/Tetris/builtInChips/DMux.class | Bin 0 -> 365 bytes projects/09/Tetris/builtInChips/DMux.hdl | 20 + .../09/Tetris/builtInChips/DMux4Way.class | Bin 0 -> 408 bytes projects/09/Tetris/builtInChips/DMux4Way.hdl | 22 + .../09/Tetris/builtInChips/DMux8Way.class | Bin 0 -> 488 bytes projects/09/Tetris/builtInChips/DMux8Way.hdl | 22 + .../09/Tetris/builtInChips/DRegister.class | Bin 0 -> 339 bytes projects/09/Tetris/builtInChips/DRegister.hdl | 24 + .../09/Tetris/builtInChips/FullAdder.class | Bin 0 -> 380 bytes projects/09/Tetris/builtInChips/FullAdder.hdl | 19 + .../09/Tetris/builtInChips/HalfAdder.class | Bin 0 -> 360 bytes projects/09/Tetris/builtInChips/HalfAdder.hdl | 18 + projects/09/Tetris/builtInChips/Inc16.class | Bin 0 -> 333 bytes projects/09/Tetris/builtInChips/Inc16.hdl | 18 + .../09/Tetris/builtInChips/Keyboard.class | Bin 0 -> 1709 bytes projects/09/Tetris/builtInChips/Keyboard.hdl | 23 + projects/09/Tetris/builtInChips/Mux.class | Bin 0 -> 356 bytes projects/09/Tetris/builtInChips/Mux.hdl | 16 + projects/09/Tetris/builtInChips/Mux16.hdl | 16 + .../09/Tetris/builtInChips/Mux4Way16.class | Bin 0 -> 435 bytes projects/09/Tetris/builtInChips/Mux4Way16.hdl | 21 + .../09/Tetris/builtInChips/Mux8Way16.class | Bin 0 -> 527 bytes projects/09/Tetris/builtInChips/Mux8Way16.hdl | 24 + projects/09/Tetris/builtInChips/Nand.class | Bin 0 -> 344 bytes projects/09/Tetris/builtInChips/Nand.hdl | 16 + projects/09/Tetris/builtInChips/Not.class | Bin 0 -> 331 bytes projects/09/Tetris/builtInChips/Not.hdl | 16 + projects/09/Tetris/builtInChips/Not16.class | Bin 0 -> 327 bytes projects/09/Tetris/builtInChips/Not16.hdl | 16 + projects/09/Tetris/builtInChips/Or.class | Bin 0 -> 340 bytes projects/09/Tetris/builtInChips/Or.hdl | 16 + projects/09/Tetris/builtInChips/Or16.hdl | 16 + projects/09/Tetris/builtInChips/Or8Way.class | Bin 0 -> 340 bytes projects/09/Tetris/builtInChips/Or8Way.hdl | 16 + projects/09/Tetris/builtInChips/PC.class | Bin 0 -> 1899 bytes projects/09/Tetris/builtInChips/PC.hdl | 22 + projects/09/Tetris/builtInChips/RAM.class | Bin 0 -> 1928 bytes projects/09/Tetris/builtInChips/RAM16K.class | Bin 0 -> 390 bytes projects/09/Tetris/builtInChips/RAM16K.hdl | 24 + projects/09/Tetris/builtInChips/RAM4K.class | Bin 0 -> 309 bytes projects/09/Tetris/builtInChips/RAM4K.hdl | 24 + projects/09/Tetris/builtInChips/RAM512.class | Bin 0 -> 311 bytes projects/09/Tetris/builtInChips/RAM512.hdl | 24 + projects/09/Tetris/builtInChips/RAM64.class | Bin 0 -> 308 bytes projects/09/Tetris/builtInChips/RAM64.hdl | 24 + projects/09/Tetris/builtInChips/RAM8.class | Bin 0 -> 306 bytes projects/09/Tetris/builtInChips/RAM8.hdl | 24 + projects/09/Tetris/builtInChips/ROM32K.class | Bin 0 -> 3469 bytes projects/09/Tetris/builtInChips/ROM32K.hdl | 30 + .../09/Tetris/builtInChips/Register.class | Bin 0 -> 423 bytes projects/09/Tetris/builtInChips/Register.hdl | 19 + .../Tetris/builtInChips/RegisterWithGUI.class | Bin 0 -> 1769 bytes projects/09/Tetris/builtInChips/Screen.class | Bin 0 -> 1322 bytes projects/09/Tetris/builtInChips/Screen.hdl | 35 + projects/09/Tetris/builtInChips/Xor.class | Bin 0 -> 341 bytes projects/09/Tetris/builtInChips/Xor.hdl | 16 + projects/09/Tetris/builtInVMCode/Array.class | Bin 0 -> 436 bytes .../09/Tetris/builtInVMCode/JackOSClass.class | Bin 0 -> 1782 bytes .../09/Tetris/builtInVMCode/Keyboard.class | Bin 0 -> 1362 bytes projects/09/Tetris/builtInVMCode/Math.class | Bin 0 -> 650 bytes projects/09/Tetris/builtInVMCode/Memory.class | Bin 0 -> 788 bytes projects/09/Tetris/builtInVMCode/Output.class | Bin 0 -> 4264 bytes projects/09/Tetris/builtInVMCode/Screen.class | Bin 0 -> 1921 bytes projects/09/Tetris/builtInVMCode/String.class | Bin 0 -> 1630 bytes projects/09/Tetris/builtInVMCode/Sys.class | Bin 0 -> 1885 bytes projects/09/Tetris/symbol_table.py | 62 + projects/09/Tetris/tokenizer.py | 78 + projects/09/Tetris/vmwriter.py | 75 + projects/10/ArrayTest/Main.jack | 38 + projects/10/ArrayTest/Main.xml | 286 + projects/10/ArrayTest/MainT.xml | 142 + projects/10/ExpressionLessSquare/Main.jack | 28 + projects/10/ExpressionLessSquare/Main.xml | 114 + projects/10/ExpressionLessSquare/MainT.xml | 64 + 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/JackAnalyzer.py | 410 + 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/10/lang.txt | 2 + projects/11/Average/Main.jack | 29 + projects/11/Average/Main.vm | 149 + projects/11/ComplexArrays/Main.jack | 70 + projects/11/ComplexArrays/Main.vm | 703 + projects/11/ConvertToBin/Main.jack | 82 + projects/11/ConvertToBin/Main.vm | 106 + projects/11/JackCompiler.py | 350 + projects/11/Pong/Ball.jack | 203 + projects/11/Pong/Ball.vm | 435 + projects/11/Pong/Bat.jack | 103 + projects/11/Pong/Bat.vm | 208 + projects/11/Pong/Main.jack | 20 + projects/11/Pong/Main.vm | 13 + projects/11/Pong/PongGame.jack | 137 + projects/11/Pong/PongGame.vm | 321 + projects/11/Seven/Main.jack | 17 + projects/11/Seven/Main.vm | 10 + projects/11/Square/Main.jack | 17 + projects/11/Square/Main.vm | 11 + projects/11/Square/Square.jack | 110 + projects/11/Square/Square.vm | 310 + projects/11/Square/SquareGame.jack | 81 + projects/11/Square/SquareGame.vm | 190 + .../__pycache__/symbol_table.cpython-39.pyc | Bin 0 -> 2282 bytes .../11/__pycache__/tokenizer.cpython-39.pyc | Bin 0 -> 2111 bytes .../11/__pycache__/vmwriter.cpython-39.pyc | Bin 0 -> 2952 bytes projects/11/lang.txt | 2 + projects/11/symbol_table.py | 62 + projects/11/tokenizer.py | 78 + projects/11/vmwriter.py | 75 + projects/12/Array.jack | 29 + projects/12/ArrayTest/Array.jack | 29 + projects/12/ArrayTest/Array.vm | 23 + projects/12/ArrayTest/ArrayTest.cmp | 2 + projects/12/ArrayTest/ArrayTest.out | 0 projects/12/ArrayTest/ArrayTest.tst | 15 + projects/12/ArrayTest/Main.jack | 40 + projects/12/ArrayTest/Main.vm | 131 + projects/12/Keyboard.jack | 102 + projects/12/KeyboardTest/Keyboard.jack | 101 + projects/12/KeyboardTest/Keyboard.vm | 156 + .../12/KeyboardTest/KeyboardTestOutput.gif | Bin 0 -> 12048 bytes projects/12/KeyboardTest/Main.jack | 93 + projects/12/KeyboardTest/Main.vm | 954 + projects/12/Math.jack | 143 + projects/12/MathTest/Array.vm | 23 + projects/12/MathTest/Keyboard.vm | 102 + projects/12/MathTest/Main.jack | 35 + projects/12/MathTest/Main.vm | 162 + projects/12/MathTest/Math.jack | 143 + projects/12/MathTest/Math.vm | 388 + projects/12/MathTest/MathTest.cmp | 2 + projects/12/MathTest/MathTest.out | 0 projects/12/MathTest/MathTest.tst | 15 + projects/12/MathTest/Memory.vm | 376 + projects/12/MathTest/Output.vm | 1852 + projects/12/MathTest/Screen.vm | 806 + projects/12/MathTest/String.vm | 393 + projects/12/MathTest/Sys.vm | 83 + projects/12/Memory.jack | 63 + projects/12/MemoryTest/Array.vm | 23 + projects/12/MemoryTest/Keyboard.vm | 102 + projects/12/MemoryTest/Main.jack | 53 + projects/12/MemoryTest/Main.vm | 180 + projects/12/MemoryTest/Math.vm | 408 + projects/12/MemoryTest/Memory.jack | 63 + projects/12/MemoryTest/Memory.vm | 147 + projects/12/MemoryTest/MemoryDiag/Main.jack | 183 + projects/12/MemoryTest/MemoryDiag/Main.vm | 467 + .../12/MemoryTest/MemoryDiag/MemoryDiag.cmp | 2 + .../12/MemoryTest/MemoryDiag/MemoryDiag.tst | 18 + projects/12/MemoryTest/MemoryDiag/README.html | 55 + projects/12/MemoryTest/MemoryTest.cmp | 2 + projects/12/MemoryTest/MemoryTest.out | 2 + projects/12/MemoryTest/MemoryTest.tst | 15 + projects/12/MemoryTest/Output.vm | 1852 + projects/12/MemoryTest/README.txt | 9 + projects/12/MemoryTest/Screen.vm | 806 + projects/12/MemoryTest/String.vm | 393 + projects/12/MemoryTest/Sys.vm | 83 + .../__pycache__/symbol_table.cpython-39.pyc | Bin 0 -> 2293 bytes .../__pycache__/tokenizer.cpython-39.pyc | Bin 0 -> 2122 bytes .../__pycache__/vmwriter.cpython-39.pyc | Bin 0 -> 2963 bytes projects/12/Output.jack | 301 + projects/12/OutputTest/Main.jack | 42 + projects/12/OutputTest/OutputTestOutput.gif | Bin 0 -> 6184 bytes .../__pycache__/symbol_table.cpython-39.pyc | Bin 0 -> 2293 bytes .../__pycache__/tokenizer.cpython-39.pyc | Bin 0 -> 2122 bytes .../__pycache__/vmwriter.cpython-39.pyc | Bin 0 -> 2963 bytes projects/12/Screen.jack | 206 + projects/12/ScreenTest/Main.jack | 36 + projects/12/ScreenTest/Main.vm | 104 + projects/12/ScreenTest/Screen.jack | 206 + projects/12/ScreenTest/Screen.vm | 656 + projects/12/ScreenTest/ScreenTestOutput.gif | Bin 0 -> 4563 bytes projects/12/String.jack | 148 + projects/12/StringTest/JackCompiler.py | 350 + projects/12/StringTest/Main.jack | 83 + projects/12/StringTest/Main.vm | 447 + projects/12/StringTest/String.jack | 147 + projects/12/StringTest/String.vm | 295 + projects/12/StringTest/StringTestOutput.gif | Bin 0 -> 8126 bytes .../__pycache__/symbol_table.cpython-39.pyc | Bin 0 -> 2293 bytes .../__pycache__/tokenizer.cpython-39.pyc | Bin 0 -> 2122 bytes .../__pycache__/vmwriter.cpython-39.pyc | Bin 0 -> 2963 bytes projects/12/StringTest/symbol_table.py | 62 + projects/12/StringTest/tokenizer.py | 78 + projects/12/StringTest/vmwriter.py | 75 + projects/12/Sys.jack | 53 + projects/12/SysTest/Main.jack | 31 + projects/12/SysTest/Main.vm | 281 + projects/12/SysTest/Sys.jack | 51 + projects/12/SysTest/Sys.vm | 75 + projects/12/archive/Main.jack | 132 + .../12/archive/Main_math_memory_screen.jack | 341 + projects/12/archive/Main_output.jack | 280 + projects/12/archive/String.jack | 148 + projects/12/test/Array.jack | 29 + projects/12/test/Array.vm | 23 + projects/12/test/JackCompiler.py | 350 + projects/12/test/Keyboard.jack | 102 + projects/12/test/Keyboard.vm | 103 + projects/12/test/Main.jack | 83 + projects/12/test/Main.vm | 447 + projects/12/test/Math.jack | 143 + projects/12/test/Math.vm | 388 + projects/12/test/Memory.jack | 63 + projects/12/test/Memory.vm | 147 + projects/12/test/Output.jack | 299 + projects/12/test/Output.vm | 1793 + projects/12/test/Screen.jack | 206 + projects/12/test/Screen.vm | 656 + projects/12/test/String.jack | 154 + projects/12/test/String.vm | 348 + projects/12/test/Sys.jack | 53 + projects/12/test/Sys.vm | 79 + .../__pycache__/symbol_table.cpython-39.pyc | Bin 0 -> 2287 bytes .../test/__pycache__/tokenizer.cpython-39.pyc | Bin 0 -> 2116 bytes .../test/__pycache__/vmwriter.cpython-39.pyc | Bin 0 -> 2957 bytes projects/12/test/project12.zip | Bin 0 -> 11271 bytes projects/12/test/symbol_table.py | 62 + projects/12/test/tokenizer.py | 78 + projects/12/test/vmwriter.py | 75 + projects/13/more fun to go.txt | 9 + solutions_only/project 01/And16.hdl | 35 + solutions_only/project 01/DMux.hdl | 21 + solutions_only/project 01/DMux4Way.hdl | 32 + solutions_only/project 01/DMux8Way.hdl | 47 + solutions_only/project 01/Mux.hdl | 17 + solutions_only/project 01/Mux16.hdl | 34 + solutions_only/project 01/Mux4Way.hdl | 21 + solutions_only/project 01/Mux4Way16.hdl | 38 + solutions_only/project 01/Mux8Way.hdl | 41 + solutions_only/project 01/Mux8Way16.hdl | 38 + solutions_only/project 01/Not.hdl | 17 + solutions_only/project 01/Not16.hdl | 33 + solutions_only/project 01/Or.hdl | 9 + solutions_only/project 01/Or16.hdl | 33 + solutions_only/project 01/Or8Way.hdl | 25 + solutions_only/project 02/ALU.hdl | 66 + solutions_only/project 02/Add16.hdl | 35 + solutions_only/project 02/FullAdder.hdl | 20 + solutions_only/project 02/HalfAdder.hdl | 18 + solutions_only/project 02/Inc16.hdl | 18 + solutions_only/project 03/Bit.hdl | 19 + solutions_only/project 03/DMux8Way16.hdl | 22 + solutions_only/project 03/PC.hdl | 44 + solutions_only/project 03/RAM16K.hdl | 24 + solutions_only/project 03/RAM4K.hdl | 28 + solutions_only/project 03/RAM512.hdl | 28 + solutions_only/project 03/RAM64.hdl | 28 + solutions_only/project 03/RAM8.hdl | 29 + solutions_only/project 03/Register.hdl | 34 + solutions_only/project 04/Fill.asm | 97 + solutions_only/project 04/Mult.asm | 24 + solutions_only/project 05/CPU.hdl | 115 + solutions_only/project 05/Computer.hdl | 25 + solutions_only/project 05/Memory.hdl | 36 + solutions_only/project 06/assembler.py | 230 + solutions_only/project 07/VMTranslator.py | 160 + solutions_only/project 08/VMTranslator.py | 246 + solutions_only/project 09/Tetris/Main.jack | 19 + solutions_only/project 09/Tetris/Piece.jack | 473 + solutions_only/project 09/Tetris/Tetris.jack | 203 + solutions_only/project 10/JackAnalyzer.py | 410 + solutions_only/project 11/JackCompiler.py | 350 + solutions_only/project 11/symbol_table.py | 62 + solutions_only/project 11/tokenizer.py | 78 + solutions_only/project 11/vmwriter.py | 75 + solutions_only/project 12/Array.jack | 29 + solutions_only/project 12/Keyboard.jack | 102 + solutions_only/project 12/Main.jack | 83 + solutions_only/project 12/Math.jack | 143 + solutions_only/project 12/Memory.jack | 63 + solutions_only/project 12/Output.jack | 299 + solutions_only/project 12/Screen.jack | 206 + solutions_only/project 12/String.jack | 154 + solutions_only/project 12/Sys.jack | 53 + 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 | 376 + tools/OS/Output.vm | 1852 + tools/OS/Screen.vm | 806 + tools/OS/String.vm | 393 + tools/OS/Sys.vm | 83 + tools/TextComparer.bat | 29 + tools/TextComparer.sh | 36 + tools/VMEmulator.bat | 29 + tools/VMEmulator.sh | 33 + tools/bin/Assembler.dat | 1 + tools/bin/CPU Emulator.dat | 1 + tools/bin/Hardware Simulator.dat | 1 + tools/bin/Virtual Machine Emulator.dat | 1 + tools/bin/classes/CPUEmulatorMain.class | Bin 0 -> 1084 bytes tools/bin/classes/HackAssemblerMain.class | Bin 0 -> 1098 bytes tools/bin/classes/HardwareSimulatorMain.class | Bin 0 -> 1182 bytes tools/bin/classes/TextComparer.class | Bin 0 -> 1739 bytes tools/bin/classes/VMEmulatorMain.class | Bin 0 -> 1073 bytes tools/bin/help/asmAbout.html | 96 + tools/bin/help/asmUsage.html | 115 + tools/bin/help/compiler.txt | 9 + tools/bin/help/cpuAbout.html | 96 + tools/bin/help/cpuUsage.html | 115 + tools/bin/help/hwAbout.html | 96 + tools/bin/help/hwUsage.html | 115 + tools/bin/help/vmAbout.html | 110 + tools/bin/help/vmUsage.html | 115 + tools/bin/images/arrow2.gif | Bin 0 -> 1073 bytes tools/bin/images/calculator2.gif | Bin 0 -> 302 bytes tools/bin/images/cancel.gif | Bin 0 -> 1133 bytes tools/bin/images/chip.gif | Bin 0 -> 1078 bytes tools/bin/images/clock2.gif | Bin 0 -> 1138 bytes tools/bin/images/equal.gif | Bin 0 -> 1042 bytes tools/bin/images/find.gif | Bin 0 -> 1014 bytes tools/bin/images/hex.gif | Bin 0 -> 1422 bytes tools/bin/images/keyboard.gif | Bin 0 -> 1017 bytes tools/bin/images/ok.gif | Bin 0 -> 988 bytes tools/bin/images/ok2.gif | Bin 0 -> 920 bytes tools/bin/images/open.gif | Bin 0 -> 930 bytes tools/bin/images/open2.gif | Bin 0 -> 969 bytes tools/bin/images/opendoc.gif | Bin 0 -> 1094 bytes tools/bin/images/redflag.gif | Bin 0 -> 1100 bytes tools/bin/images/save.gif | Bin 0 -> 1257 bytes tools/bin/images/scroll.gif | Bin 0 -> 949 bytes tools/bin/images/smallcancel.gif | Bin 0 -> 946 bytes tools/bin/images/smallequal.gif | Bin 0 -> 898 bytes tools/bin/images/smallminus.gif | Bin 0 -> 863 bytes tools/bin/images/smallnew.gif | Bin 0 -> 1000 bytes tools/bin/images/smallok.gif | Bin 0 -> 925 bytes tools/bin/images/smallplus.gif | Bin 0 -> 873 bytes tools/bin/images/vcrfastforward.gif | Bin 0 -> 1122 bytes tools/bin/images/vcrforward.gif | Bin 0 -> 1021 bytes tools/bin/images/vcrrewind.gif | Bin 0 -> 1122 bytes tools/bin/images/vcrstop.gif | Bin 0 -> 972 bytes tools/bin/lib/AssemblerGUI.jar | Bin 0 -> 4470 bytes tools/bin/lib/Compilers.jar | Bin 0 -> 27094 bytes tools/bin/lib/Hack.jar | Bin 0 -> 59364 bytes tools/bin/lib/HackGUI.jar | Bin 0 -> 96666 bytes tools/bin/lib/Simulators.jar | Bin 0 -> 81810 bytes tools/bin/lib/SimulatorsGUI.jar | Bin 0 -> 68492 bytes tools/bin/lib/TranslatorsGUI.jar | Bin 0 -> 13643 bytes tools/bin/scripts/defaultCPU.txt | 3 + tools/bin/scripts/defaultHW.txt | 4 + tools/bin/scripts/defaultVM.txt | 3 + tools/builtInChips/ALU.class | Bin 0 -> 1754 bytes 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 806 files changed, 162532 insertions(+) create mode 100755 README.md create mode 100755 projects/00/file.txt create mode 100755 projects/01/And.cmp create mode 100755 projects/01/And.hdl create mode 100755 projects/01/And.out create mode 100755 projects/01/And.tst create mode 100755 projects/01/And16.cmp create mode 100755 projects/01/And16.hdl create mode 100755 projects/01/And16.out create mode 100755 projects/01/And16.tst create mode 100755 projects/01/DMux.cmp create mode 100755 projects/01/DMux.hdl create mode 100755 projects/01/DMux.out create mode 100755 projects/01/DMux.tst create mode 100755 projects/01/DMux4Way.cmp create mode 100755 projects/01/DMux4Way.hdl create mode 100755 projects/01/DMux4Way.out create mode 100755 projects/01/DMux4Way.tst create mode 100755 projects/01/DMux8Way.cmp create mode 100755 projects/01/DMux8Way.hdl create mode 100755 projects/01/DMux8Way.out create mode 100755 projects/01/DMux8Way.tst create mode 100755 projects/01/Mux.cmp create mode 100755 projects/01/Mux.hdl create mode 100755 projects/01/Mux.out create mode 100755 projects/01/Mux.tst create mode 100755 projects/01/Mux16.cmp create mode 100755 projects/01/Mux16.hdl create mode 100755 projects/01/Mux16.out create mode 100755 projects/01/Mux16.tst create mode 100755 projects/01/Mux4Way.hdl create mode 100755 projects/01/Mux4Way16.cmp create mode 100755 projects/01/Mux4Way16.hdl create mode 100755 projects/01/Mux4Way16.out create mode 100755 projects/01/Mux4Way16.tst create mode 100755 projects/01/Mux8Way.hdl create mode 100755 projects/01/Mux8Way16.cmp create mode 100755 projects/01/Mux8Way16.hdl create mode 100755 projects/01/Mux8Way16.tst create mode 100755 projects/01/Not.cmp create mode 100755 projects/01/Not.hdl create mode 100755 projects/01/Not.out create mode 100755 projects/01/Not.tst create mode 100755 projects/01/Not16.cmp create mode 100755 projects/01/Not16.hdl create mode 100755 projects/01/Not16.out create mode 100755 projects/01/Not16.tst create mode 100755 projects/01/Or.cmp create mode 100755 projects/01/Or.hdl create mode 100755 projects/01/Or.out create mode 100755 projects/01/Or.tst create mode 100755 projects/01/Or16.cmp create mode 100755 projects/01/Or16.hdl create mode 100755 projects/01/Or16.out create mode 100755 projects/01/Or16.tst create mode 100755 projects/01/Or8Way.cmp create mode 100755 projects/01/Or8Way.hdl create mode 100755 projects/01/Or8Way.out create mode 100755 projects/01/Or8Way.tst create mode 100755 projects/01/Xor.cmp create mode 100755 projects/01/Xor.hdl create mode 100755 projects/01/Xor.out create mode 100755 projects/01/Xor.tst create mode 100755 projects/02/ALU-nostat.cmp create mode 100755 projects/02/ALU-nostat.out create mode 100755 projects/02/ALU-nostat.tst create mode 100755 projects/02/ALU.cmp create mode 100755 projects/02/ALU.hdl create mode 100755 projects/02/ALU.out create mode 100755 projects/02/ALU.tst create mode 100755 projects/02/Add16.cmp create mode 100755 projects/02/Add16.hdl create mode 100755 projects/02/Add16.out create mode 100755 projects/02/Add16.tst create mode 100755 projects/02/FullAdder.cmp create mode 100755 projects/02/FullAdder.hdl create mode 100755 projects/02/FullAdder.out create mode 100755 projects/02/FullAdder.tst create mode 100755 projects/02/HalfAdder.cmp create mode 100755 projects/02/HalfAdder.hdl create mode 100755 projects/02/HalfAdder.out create mode 100755 projects/02/HalfAdder.tst create mode 100755 projects/02/Inc16.cmp create mode 100755 projects/02/Inc16.hdl create mode 100755 projects/02/Inc16.out create mode 100755 projects/02/Inc16.tst create mode 100755 projects/03/a/Bit.cmp create mode 100755 projects/03/a/Bit.hdl create mode 100755 projects/03/a/Bit.out create mode 100755 projects/03/a/Bit.tst create mode 100755 projects/03/a/DMux8Way16.hdl create mode 100755 projects/03/a/PC.cmp create mode 100755 projects/03/a/PC.hdl create mode 100755 projects/03/a/PC.out create mode 100755 projects/03/a/PC.tst create mode 100755 projects/03/a/RAM64.cmp create mode 100755 projects/03/a/RAM64.hdl create mode 100755 projects/03/a/RAM64.out create mode 100755 projects/03/a/RAM64.tst create mode 100755 projects/03/a/RAM8.cmp create mode 100755 projects/03/a/RAM8.hdl create mode 100755 projects/03/a/RAM8.out create mode 100755 projects/03/a/RAM8.tst create mode 100755 projects/03/a/Register.cmp create mode 100755 projects/03/a/Register.hdl create mode 100755 projects/03/a/Register.out create mode 100755 projects/03/a/Register.tst create mode 100755 projects/03/b/RAM16K.cmp create mode 100755 projects/03/b/RAM16K.hdl create mode 100755 projects/03/b/RAM16K.out create mode 100755 projects/03/b/RAM16K.tst create mode 100755 projects/03/b/RAM4K.cmp create mode 100755 projects/03/b/RAM4K.hdl create mode 100755 projects/03/b/RAM4K.out create mode 100755 projects/03/b/RAM4K.tst create mode 100755 projects/03/b/RAM512.cmp create mode 100755 projects/03/b/RAM512.hdl create mode 100755 projects/03/b/RAM512.out create mode 100755 projects/03/b/RAM512.tst create mode 100755 projects/04/Fill.asm create mode 100755 projects/04/Mult.asm create mode 100755 projects/04/fill/Fill.asm create mode 100755 projects/04/fill/Fill.tst create mode 100755 projects/04/fill/FillAutomatic.cmp create mode 100755 projects/04/fill/FillAutomatic.tst create mode 100755 projects/04/mult/Mult.asm create mode 100755 projects/04/mult/Mult.cmp create mode 100755 projects/04/mult/Mult.out create mode 100755 projects/04/mult/Mult.tst create mode 100755 projects/05/Add.hack create mode 100755 projects/05/CPU-external.cmp create mode 100755 projects/05/CPU-external.out create mode 100755 projects/05/CPU-external.tst create mode 100755 projects/05/CPU.cmp create mode 100755 projects/05/CPU.hdl create mode 100755 projects/05/CPU.out create mode 100755 projects/05/CPU.tst create mode 100755 projects/05/Computer.hdl create mode 100755 projects/05/ComputerAdd-external.cmp create mode 100755 projects/05/ComputerAdd-external.out create mode 100755 projects/05/ComputerAdd-external.tst create mode 100755 projects/05/ComputerAdd.cmp create mode 100755 projects/05/ComputerAdd.out create mode 100755 projects/05/ComputerAdd.tst create mode 100755 projects/05/ComputerMax-external.cmp create mode 100755 projects/05/ComputerMax-external.out create mode 100755 projects/05/ComputerMax-external.tst create mode 100755 projects/05/ComputerMax.cmp create mode 100755 projects/05/ComputerMax.out create mode 100755 projects/05/ComputerMax.tst create mode 100755 projects/05/ComputerRect-external.cmp create mode 100755 projects/05/ComputerRect-external.out create mode 100755 projects/05/ComputerRect-external.tst create mode 100755 projects/05/ComputerRect.cmp create mode 100755 projects/05/ComputerRect.out create mode 100755 projects/05/ComputerRect.tst create mode 100755 projects/05/Max.hack create mode 100755 projects/05/Memory.cmp create mode 100755 projects/05/Memory.hdl create mode 100755 projects/05/Memory.out create mode 100755 projects/05/Memory.tst create mode 100755 projects/05/Rect.hack create mode 100755 projects/06/add/Add.asm create mode 100755 projects/06/assembler_final_not_refined.py create mode 100755 projects/06/max/Max.asm create mode 100755 projects/06/max/Max.hack create mode 100755 projects/06/max/MaxL.asm create mode 100755 projects/06/pong/Pong.asm create mode 100755 projects/06/pong/Pong.hack create mode 100755 projects/06/pong/PongL.asm create mode 100755 projects/06/rect/Rect.asm create mode 100755 projects/06/rect/Rect.hack create mode 100755 projects/06/rect/RectL.asm create mode 100755 projects/07/MemoryAccess/BasicTest/BasicTest.asm create mode 100755 projects/07/MemoryAccess/BasicTest/BasicTest.cmp create mode 100755 projects/07/MemoryAccess/BasicTest/BasicTest.out create mode 100755 projects/07/MemoryAccess/BasicTest/BasicTest.tst create mode 100755 projects/07/MemoryAccess/BasicTest/BasicTest.vm create mode 100755 projects/07/MemoryAccess/BasicTest/BasicTestVME.tst create mode 100755 projects/07/MemoryAccess/PointerTest/PointerTest.asm create mode 100755 projects/07/MemoryAccess/PointerTest/PointerTest.cmp create mode 100755 projects/07/MemoryAccess/PointerTest/PointerTest.tst create mode 100755 projects/07/MemoryAccess/PointerTest/PointerTest.vm create mode 100755 projects/07/MemoryAccess/PointerTest/PointerTestVME.tst create mode 100755 projects/07/MemoryAccess/StaticTest/StaticTest.asm create mode 100755 projects/07/MemoryAccess/StaticTest/StaticTest.cmp create mode 100755 projects/07/MemoryAccess/StaticTest/StaticTest.tst create mode 100755 projects/07/MemoryAccess/StaticTest/StaticTest.vm create mode 100755 projects/07/MemoryAccess/StaticTest/StaticTestVME.tst create mode 100755 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.asm create mode 100755 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp create mode 100755 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.tst create mode 100755 projects/07/StackArithmetic/SimpleAdd/SimpleAdd.vm create mode 100755 projects/07/StackArithmetic/SimpleAdd/SimpleAddVME.tst create mode 100755 projects/07/StackArithmetic/StackTest/StackTest.asm create mode 100755 projects/07/StackArithmetic/StackTest/StackTest.cmp create mode 100755 projects/07/StackArithmetic/StackTest/StackTest.tst create mode 100755 projects/07/StackArithmetic/StackTest/StackTest.vm create mode 100755 projects/07/StackArithmetic/StackTest/StackTestVME.tst create mode 100755 projects/07/VMTranslator.py create mode 100755 projects/07/lang.txt create mode 100755 projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm create mode 100755 projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp create mode 100755 projects/08/FunctionCalls/FibonacciElement/FibonacciElement.out create mode 100755 projects/08/FunctionCalls/FibonacciElement/FibonacciElement.tst create mode 100755 projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst create mode 100755 projects/08/FunctionCalls/FibonacciElement/Main.vm create mode 100755 projects/08/FunctionCalls/FibonacciElement/Sys.vm create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCall.asm create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCall.cmp create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCall.html create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCall.out create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCall.tst create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCallStack.html create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCallVME.tst create mode 100755 projects/08/FunctionCalls/NestedCall/NestedCall_NoBoot.asm create mode 100755 projects/08/FunctionCalls/NestedCall/Sys.vm create mode 100755 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.asm create mode 100755 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp create mode 100755 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.out create mode 100755 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.tst create mode 100755 projects/08/FunctionCalls/SimpleFunction/SimpleFunction.vm create mode 100755 projects/08/FunctionCalls/SimpleFunction/SimpleFunctionVME.tst create mode 100755 projects/08/FunctionCalls/StaticsTest/Class1.vm create mode 100755 projects/08/FunctionCalls/StaticsTest/Class2.vm create mode 100755 projects/08/FunctionCalls/StaticsTest/StaticsTest.asm create mode 100755 projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp create mode 100755 projects/08/FunctionCalls/StaticsTest/StaticsTest.out create mode 100755 projects/08/FunctionCalls/StaticsTest/StaticsTest.tst create mode 100755 projects/08/FunctionCalls/StaticsTest/StaticsTestVME.tst create mode 100755 projects/08/FunctionCalls/StaticsTest/Sys.vm create mode 100755 projects/08/ProgramFlow/BasicLoop/BasicLoop.asm create mode 100755 projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp create mode 100755 projects/08/ProgramFlow/BasicLoop/BasicLoop.hack create mode 100755 projects/08/ProgramFlow/BasicLoop/BasicLoop.out create mode 100755 projects/08/ProgramFlow/BasicLoop/BasicLoop.tst create mode 100755 projects/08/ProgramFlow/BasicLoop/BasicLoop.vm create mode 100755 projects/08/ProgramFlow/BasicLoop/BasicLoopVME.tst create mode 100755 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm create mode 100755 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp create mode 100755 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.out create mode 100755 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.tst create mode 100755 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.vm create mode 100755 projects/08/ProgramFlow/FibonacciSeries/FibonacciSeriesVME.tst create mode 100755 projects/08/VMTranslator.py create mode 100755 projects/08/Vmtraslotor_old.py create mode 100755 projects/08/lang.txt create mode 100755 projects/09/Average/Main.jack create mode 100755 projects/09/BitmapEditor/BitmapEditor.html create mode 100755 projects/09/BitmapEditor/BitmapEditor.iml create mode 100755 projects/09/Fraction/Fraction.jack create mode 100755 projects/09/Fraction/Main.jack create mode 100755 projects/09/HelloWorld/Main.jack create mode 100755 projects/09/Jack OS API.pdf create mode 100755 projects/09/List/List.jack create mode 100755 projects/09/List/Main.jack create mode 100755 projects/09/New folder/Tetris.zip create mode 100755 projects/09/New folder/Tetris/Main.vm create mode 100755 projects/09/New folder/Tetris/Piece.vm create mode 100755 projects/09/New folder/Tetris/Tetris.vm create mode 100755 projects/09/New folder/Tetris/source/Main.jack create mode 100755 projects/09/New folder/Tetris/source/Piece.jack create mode 100755 projects/09/New folder/Tetris/source/Tetris.jack create mode 100755 projects/09/Square/Main.jack create mode 100755 projects/09/Square/Square.jack create mode 100755 projects/09/Square/SquareGame.jack create mode 100755 projects/09/Tetris/Assembler.bat create mode 100755 projects/09/Tetris/Assembler.sh create mode 100755 projects/09/Tetris/CPUEmulator.bat create mode 100755 projects/09/Tetris/CPUEmulator.sh create mode 100755 projects/09/Tetris/HardwareSimulator.bat create mode 100755 projects/09/Tetris/HardwareSimulator.sh create mode 100755 projects/09/Tetris/JackCompiler.bat create mode 100755 projects/09/Tetris/JackCompiler.py create mode 100755 projects/09/Tetris/JackCompiler.sh create mode 100755 projects/09/Tetris/Main.jack create mode 100755 projects/09/Tetris/Main.vm create mode 100755 projects/09/Tetris/OS/Array.vm create mode 100755 projects/09/Tetris/OS/Keyboard.vm create mode 100755 projects/09/Tetris/OS/Math.vm create mode 100755 projects/09/Tetris/OS/Memory.vm create mode 100755 projects/09/Tetris/OS/Output.vm create mode 100755 projects/09/Tetris/OS/Screen.vm create mode 100755 projects/09/Tetris/OS/String.vm create mode 100755 projects/09/Tetris/OS/Sys.vm create mode 100755 projects/09/Tetris/Piece.jack create mode 100755 projects/09/Tetris/Piece.vm create mode 100755 projects/09/Tetris/Tetris.jack create mode 100755 projects/09/Tetris/Tetris.vm create mode 100755 projects/09/Tetris/TextComparer.bat create mode 100755 projects/09/Tetris/TextComparer.sh create mode 100755 projects/09/Tetris/VMEmulator.bat create mode 100755 projects/09/Tetris/VMEmulator.sh create mode 100755 projects/09/Tetris/__pycache__/symbol_table.cpython-39.pyc create mode 100755 projects/09/Tetris/__pycache__/tokenizer.cpython-39.pyc create mode 100755 projects/09/Tetris/__pycache__/vmwriter.cpython-39.pyc create mode 100755 projects/09/Tetris/bin/Assembler.dat create mode 100755 projects/09/Tetris/bin/CPU Emulator.dat create mode 100755 projects/09/Tetris/bin/Hardware Simulator.dat create mode 100755 projects/09/Tetris/bin/Virtual Machine Emulator.dat create mode 100755 projects/09/Tetris/bin/classes/CPUEmulatorMain.class create mode 100755 projects/09/Tetris/bin/classes/HackAssemblerMain.class create mode 100755 projects/09/Tetris/bin/classes/HardwareSimulatorMain.class create mode 100755 projects/09/Tetris/bin/classes/TextComparer.class create mode 100755 projects/09/Tetris/bin/classes/VMEmulatorMain.class create mode 100755 projects/09/Tetris/bin/help/asmAbout.html create mode 100755 projects/09/Tetris/bin/help/asmUsage.html create mode 100755 projects/09/Tetris/bin/help/compiler.txt create mode 100755 projects/09/Tetris/bin/help/cpuAbout.html create mode 100755 projects/09/Tetris/bin/help/cpuUsage.html create mode 100755 projects/09/Tetris/bin/help/hwAbout.html create mode 100755 projects/09/Tetris/bin/help/hwUsage.html create mode 100755 projects/09/Tetris/bin/help/vmAbout.html create mode 100755 projects/09/Tetris/bin/help/vmUsage.html create mode 100755 projects/09/Tetris/bin/images/arrow2.gif create mode 100755 projects/09/Tetris/bin/images/calculator2.gif create mode 100755 projects/09/Tetris/bin/images/cancel.gif create mode 100755 projects/09/Tetris/bin/images/chip.gif create mode 100755 projects/09/Tetris/bin/images/clock2.gif create mode 100755 projects/09/Tetris/bin/images/equal.gif create mode 100755 projects/09/Tetris/bin/images/find.gif create mode 100755 projects/09/Tetris/bin/images/hex.gif create mode 100755 projects/09/Tetris/bin/images/keyboard.gif create mode 100755 projects/09/Tetris/bin/images/ok.gif create mode 100755 projects/09/Tetris/bin/images/ok2.gif create mode 100755 projects/09/Tetris/bin/images/open.gif create mode 100755 projects/09/Tetris/bin/images/open2.gif create mode 100755 projects/09/Tetris/bin/images/opendoc.gif create mode 100755 projects/09/Tetris/bin/images/redflag.gif create mode 100755 projects/09/Tetris/bin/images/save.gif create mode 100755 projects/09/Tetris/bin/images/scroll.gif create mode 100755 projects/09/Tetris/bin/images/smallcancel.gif create mode 100755 projects/09/Tetris/bin/images/smallequal.gif create mode 100755 projects/09/Tetris/bin/images/smallminus.gif create mode 100755 projects/09/Tetris/bin/images/smallnew.gif create mode 100755 projects/09/Tetris/bin/images/smallok.gif create mode 100755 projects/09/Tetris/bin/images/smallplus.gif create mode 100755 projects/09/Tetris/bin/images/vcrfastforward.gif create mode 100755 projects/09/Tetris/bin/images/vcrforward.gif create mode 100755 projects/09/Tetris/bin/images/vcrrewind.gif create mode 100755 projects/09/Tetris/bin/images/vcrstop.gif create mode 100755 projects/09/Tetris/bin/lib/AssemblerGUI.jar create mode 100755 projects/09/Tetris/bin/lib/Compilers.jar create mode 100755 projects/09/Tetris/bin/lib/Hack.jar create mode 100755 projects/09/Tetris/bin/lib/HackGUI.jar create mode 100755 projects/09/Tetris/bin/lib/Simulators.jar create mode 100755 projects/09/Tetris/bin/lib/SimulatorsGUI.jar create mode 100755 projects/09/Tetris/bin/lib/TranslatorsGUI.jar create mode 100755 projects/09/Tetris/bin/scripts/defaultCPU.txt create mode 100755 projects/09/Tetris/bin/scripts/defaultHW.txt create mode 100755 projects/09/Tetris/bin/scripts/defaultVM.txt create mode 100755 projects/09/Tetris/builtInChips/ALU.class create mode 100755 projects/09/Tetris/builtInChips/ALU.hdl create mode 100755 projects/09/Tetris/builtInChips/ARegister.class create mode 100755 projects/09/Tetris/builtInChips/ARegister.hdl create mode 100755 projects/09/Tetris/builtInChips/Add16.class create mode 100755 projects/09/Tetris/builtInChips/Add16.hdl create mode 100755 projects/09/Tetris/builtInChips/And.class create mode 100755 projects/09/Tetris/builtInChips/And.hdl create mode 100755 projects/09/Tetris/builtInChips/And16.hdl create mode 100755 projects/09/Tetris/builtInChips/Bit.class create mode 100755 projects/09/Tetris/builtInChips/Bit.hdl create mode 100755 projects/09/Tetris/builtInChips/DFF.class create mode 100755 projects/09/Tetris/builtInChips/DFF.hdl create mode 100755 projects/09/Tetris/builtInChips/DMux.class create mode 100755 projects/09/Tetris/builtInChips/DMux.hdl create mode 100755 projects/09/Tetris/builtInChips/DMux4Way.class create mode 100755 projects/09/Tetris/builtInChips/DMux4Way.hdl create mode 100755 projects/09/Tetris/builtInChips/DMux8Way.class create mode 100755 projects/09/Tetris/builtInChips/DMux8Way.hdl create mode 100755 projects/09/Tetris/builtInChips/DRegister.class create mode 100755 projects/09/Tetris/builtInChips/DRegister.hdl create mode 100755 projects/09/Tetris/builtInChips/FullAdder.class create mode 100755 projects/09/Tetris/builtInChips/FullAdder.hdl create mode 100755 projects/09/Tetris/builtInChips/HalfAdder.class create mode 100755 projects/09/Tetris/builtInChips/HalfAdder.hdl create mode 100755 projects/09/Tetris/builtInChips/Inc16.class create mode 100755 projects/09/Tetris/builtInChips/Inc16.hdl create mode 100755 projects/09/Tetris/builtInChips/Keyboard.class create mode 100755 projects/09/Tetris/builtInChips/Keyboard.hdl create mode 100755 projects/09/Tetris/builtInChips/Mux.class create mode 100755 projects/09/Tetris/builtInChips/Mux.hdl create mode 100755 projects/09/Tetris/builtInChips/Mux16.hdl create mode 100755 projects/09/Tetris/builtInChips/Mux4Way16.class create mode 100755 projects/09/Tetris/builtInChips/Mux4Way16.hdl create mode 100755 projects/09/Tetris/builtInChips/Mux8Way16.class create mode 100755 projects/09/Tetris/builtInChips/Mux8Way16.hdl create mode 100755 projects/09/Tetris/builtInChips/Nand.class create mode 100755 projects/09/Tetris/builtInChips/Nand.hdl create mode 100755 projects/09/Tetris/builtInChips/Not.class create mode 100755 projects/09/Tetris/builtInChips/Not.hdl create mode 100755 projects/09/Tetris/builtInChips/Not16.class create mode 100755 projects/09/Tetris/builtInChips/Not16.hdl create mode 100755 projects/09/Tetris/builtInChips/Or.class create mode 100755 projects/09/Tetris/builtInChips/Or.hdl create mode 100755 projects/09/Tetris/builtInChips/Or16.hdl create mode 100755 projects/09/Tetris/builtInChips/Or8Way.class create mode 100755 projects/09/Tetris/builtInChips/Or8Way.hdl create mode 100755 projects/09/Tetris/builtInChips/PC.class create mode 100755 projects/09/Tetris/builtInChips/PC.hdl create mode 100755 projects/09/Tetris/builtInChips/RAM.class create mode 100755 projects/09/Tetris/builtInChips/RAM16K.class create mode 100755 projects/09/Tetris/builtInChips/RAM16K.hdl create mode 100755 projects/09/Tetris/builtInChips/RAM4K.class create mode 100755 projects/09/Tetris/builtInChips/RAM4K.hdl create mode 100755 projects/09/Tetris/builtInChips/RAM512.class create mode 100755 projects/09/Tetris/builtInChips/RAM512.hdl create mode 100755 projects/09/Tetris/builtInChips/RAM64.class create mode 100755 projects/09/Tetris/builtInChips/RAM64.hdl create mode 100755 projects/09/Tetris/builtInChips/RAM8.class create mode 100755 projects/09/Tetris/builtInChips/RAM8.hdl create mode 100755 projects/09/Tetris/builtInChips/ROM32K.class create mode 100755 projects/09/Tetris/builtInChips/ROM32K.hdl create mode 100755 projects/09/Tetris/builtInChips/Register.class create mode 100755 projects/09/Tetris/builtInChips/Register.hdl create mode 100755 projects/09/Tetris/builtInChips/RegisterWithGUI.class create mode 100755 projects/09/Tetris/builtInChips/Screen.class create mode 100755 projects/09/Tetris/builtInChips/Screen.hdl create mode 100755 projects/09/Tetris/builtInChips/Xor.class create mode 100755 projects/09/Tetris/builtInChips/Xor.hdl create mode 100755 projects/09/Tetris/builtInVMCode/Array.class create mode 100755 projects/09/Tetris/builtInVMCode/JackOSClass.class create mode 100755 projects/09/Tetris/builtInVMCode/Keyboard.class create mode 100755 projects/09/Tetris/builtInVMCode/Math.class create mode 100755 projects/09/Tetris/builtInVMCode/Memory.class create mode 100755 projects/09/Tetris/builtInVMCode/Output.class create mode 100755 projects/09/Tetris/builtInVMCode/Screen.class create mode 100755 projects/09/Tetris/builtInVMCode/String.class create mode 100755 projects/09/Tetris/builtInVMCode/Sys.class create mode 100755 projects/09/Tetris/symbol_table.py create mode 100755 projects/09/Tetris/tokenizer.py create mode 100755 projects/09/Tetris/vmwriter.py create mode 100755 projects/10/ArrayTest/Main.jack create mode 100755 projects/10/ArrayTest/Main.xml create mode 100755 projects/10/ArrayTest/MainT.xml create mode 100755 projects/10/ExpressionLessSquare/Main.jack create mode 100755 projects/10/ExpressionLessSquare/Main.xml create mode 100755 projects/10/ExpressionLessSquare/MainT.xml create mode 100755 projects/10/ExpressionLessSquare/Square.jack create mode 100755 projects/10/ExpressionLessSquare/Square.xml create mode 100755 projects/10/ExpressionLessSquare/SquareGame.jack create mode 100755 projects/10/ExpressionLessSquare/SquareGame.xml create mode 100755 projects/10/ExpressionLessSquare/SquareGameT.xml create mode 100755 projects/10/ExpressionLessSquare/SquareT.xml create mode 100755 projects/10/JackAnalyzer.py create mode 100755 projects/10/Square/Main.jack create mode 100755 projects/10/Square/Main.xml create mode 100755 projects/10/Square/MainT.xml create mode 100755 projects/10/Square/Square.jack create mode 100755 projects/10/Square/Square.xml create mode 100755 projects/10/Square/SquareGame.jack create mode 100755 projects/10/Square/SquareGame.xml create mode 100755 projects/10/Square/SquareGameT.xml create mode 100755 projects/10/Square/SquareT.xml create mode 100755 projects/10/lang.txt create mode 100755 projects/11/Average/Main.jack create mode 100755 projects/11/Average/Main.vm create mode 100755 projects/11/ComplexArrays/Main.jack create mode 100755 projects/11/ComplexArrays/Main.vm create mode 100755 projects/11/ConvertToBin/Main.jack create mode 100755 projects/11/ConvertToBin/Main.vm create mode 100755 projects/11/JackCompiler.py create mode 100755 projects/11/Pong/Ball.jack create mode 100755 projects/11/Pong/Ball.vm create mode 100755 projects/11/Pong/Bat.jack create mode 100755 projects/11/Pong/Bat.vm create mode 100755 projects/11/Pong/Main.jack create mode 100755 projects/11/Pong/Main.vm create mode 100755 projects/11/Pong/PongGame.jack create mode 100755 projects/11/Pong/PongGame.vm create mode 100755 projects/11/Seven/Main.jack create mode 100755 projects/11/Seven/Main.vm create mode 100755 projects/11/Square/Main.jack create mode 100755 projects/11/Square/Main.vm create mode 100755 projects/11/Square/Square.jack create mode 100755 projects/11/Square/Square.vm create mode 100755 projects/11/Square/SquareGame.jack create mode 100755 projects/11/Square/SquareGame.vm create mode 100755 projects/11/__pycache__/symbol_table.cpython-39.pyc create mode 100755 projects/11/__pycache__/tokenizer.cpython-39.pyc create mode 100755 projects/11/__pycache__/vmwriter.cpython-39.pyc create mode 100755 projects/11/lang.txt create mode 100755 projects/11/symbol_table.py create mode 100755 projects/11/tokenizer.py create mode 100755 projects/11/vmwriter.py create mode 100755 projects/12/Array.jack create mode 100755 projects/12/ArrayTest/Array.jack create mode 100755 projects/12/ArrayTest/Array.vm create mode 100755 projects/12/ArrayTest/ArrayTest.cmp create mode 100755 projects/12/ArrayTest/ArrayTest.out create mode 100755 projects/12/ArrayTest/ArrayTest.tst create mode 100755 projects/12/ArrayTest/Main.jack create mode 100755 projects/12/ArrayTest/Main.vm create mode 100755 projects/12/Keyboard.jack create mode 100755 projects/12/KeyboardTest/Keyboard.jack create mode 100755 projects/12/KeyboardTest/Keyboard.vm create mode 100755 projects/12/KeyboardTest/KeyboardTestOutput.gif create mode 100755 projects/12/KeyboardTest/Main.jack create mode 100755 projects/12/KeyboardTest/Main.vm create mode 100755 projects/12/Math.jack create mode 100755 projects/12/MathTest/Array.vm create mode 100755 projects/12/MathTest/Keyboard.vm create mode 100755 projects/12/MathTest/Main.jack create mode 100755 projects/12/MathTest/Main.vm create mode 100755 projects/12/MathTest/Math.jack create mode 100755 projects/12/MathTest/Math.vm create mode 100755 projects/12/MathTest/MathTest.cmp create mode 100755 projects/12/MathTest/MathTest.out create mode 100755 projects/12/MathTest/MathTest.tst create mode 100755 projects/12/MathTest/Memory.vm create mode 100755 projects/12/MathTest/Output.vm create mode 100755 projects/12/MathTest/Screen.vm create mode 100755 projects/12/MathTest/String.vm create mode 100755 projects/12/MathTest/Sys.vm create mode 100755 projects/12/Memory.jack create mode 100755 projects/12/MemoryTest/Array.vm create mode 100755 projects/12/MemoryTest/Keyboard.vm create mode 100755 projects/12/MemoryTest/Main.jack create mode 100755 projects/12/MemoryTest/Main.vm create mode 100755 projects/12/MemoryTest/Math.vm create mode 100755 projects/12/MemoryTest/Memory.jack create mode 100755 projects/12/MemoryTest/Memory.vm create mode 100755 projects/12/MemoryTest/MemoryDiag/Main.jack create mode 100755 projects/12/MemoryTest/MemoryDiag/Main.vm create mode 100755 projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp create mode 100755 projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst create mode 100755 projects/12/MemoryTest/MemoryDiag/README.html create mode 100755 projects/12/MemoryTest/MemoryTest.cmp create mode 100755 projects/12/MemoryTest/MemoryTest.out create mode 100755 projects/12/MemoryTest/MemoryTest.tst create mode 100755 projects/12/MemoryTest/Output.vm create mode 100755 projects/12/MemoryTest/README.txt create mode 100755 projects/12/MemoryTest/Screen.vm create mode 100755 projects/12/MemoryTest/String.vm create mode 100755 projects/12/MemoryTest/Sys.vm create mode 100755 projects/12/MemoryTest/__pycache__/symbol_table.cpython-39.pyc create mode 100755 projects/12/MemoryTest/__pycache__/tokenizer.cpython-39.pyc create mode 100755 projects/12/MemoryTest/__pycache__/vmwriter.cpython-39.pyc create mode 100755 projects/12/Output.jack create mode 100755 projects/12/OutputTest/Main.jack create mode 100755 projects/12/OutputTest/OutputTestOutput.gif create mode 100755 projects/12/OutputTest/__pycache__/symbol_table.cpython-39.pyc create mode 100755 projects/12/OutputTest/__pycache__/tokenizer.cpython-39.pyc create mode 100755 projects/12/OutputTest/__pycache__/vmwriter.cpython-39.pyc create mode 100755 projects/12/Screen.jack create mode 100755 projects/12/ScreenTest/Main.jack create mode 100755 projects/12/ScreenTest/Main.vm create mode 100755 projects/12/ScreenTest/Screen.jack create mode 100755 projects/12/ScreenTest/Screen.vm create mode 100755 projects/12/ScreenTest/ScreenTestOutput.gif create mode 100755 projects/12/String.jack create mode 100755 projects/12/StringTest/JackCompiler.py create mode 100755 projects/12/StringTest/Main.jack create mode 100755 projects/12/StringTest/Main.vm create mode 100755 projects/12/StringTest/String.jack create mode 100755 projects/12/StringTest/String.vm create mode 100755 projects/12/StringTest/StringTestOutput.gif create mode 100755 projects/12/StringTest/__pycache__/symbol_table.cpython-39.pyc create mode 100755 projects/12/StringTest/__pycache__/tokenizer.cpython-39.pyc create mode 100755 projects/12/StringTest/__pycache__/vmwriter.cpython-39.pyc create mode 100755 projects/12/StringTest/symbol_table.py create mode 100755 projects/12/StringTest/tokenizer.py create mode 100755 projects/12/StringTest/vmwriter.py create mode 100755 projects/12/Sys.jack create mode 100755 projects/12/SysTest/Main.jack create mode 100755 projects/12/SysTest/Main.vm create mode 100755 projects/12/SysTest/Sys.jack create mode 100755 projects/12/SysTest/Sys.vm create mode 100755 projects/12/archive/Main.jack create mode 100755 projects/12/archive/Main_math_memory_screen.jack create mode 100755 projects/12/archive/Main_output.jack create mode 100755 projects/12/archive/String.jack create mode 100755 projects/12/test/Array.jack create mode 100755 projects/12/test/Array.vm create mode 100755 projects/12/test/JackCompiler.py create mode 100755 projects/12/test/Keyboard.jack create mode 100755 projects/12/test/Keyboard.vm create mode 100755 projects/12/test/Main.jack create mode 100755 projects/12/test/Main.vm create mode 100755 projects/12/test/Math.jack create mode 100755 projects/12/test/Math.vm create mode 100755 projects/12/test/Memory.jack create mode 100755 projects/12/test/Memory.vm create mode 100755 projects/12/test/Output.jack create mode 100755 projects/12/test/Output.vm create mode 100755 projects/12/test/Screen.jack create mode 100755 projects/12/test/Screen.vm create mode 100755 projects/12/test/String.jack create mode 100755 projects/12/test/String.vm create mode 100755 projects/12/test/Sys.jack create mode 100755 projects/12/test/Sys.vm create mode 100755 projects/12/test/__pycache__/symbol_table.cpython-39.pyc create mode 100755 projects/12/test/__pycache__/tokenizer.cpython-39.pyc create mode 100755 projects/12/test/__pycache__/vmwriter.cpython-39.pyc create mode 100755 projects/12/test/project12.zip create mode 100755 projects/12/test/symbol_table.py create mode 100755 projects/12/test/tokenizer.py create mode 100755 projects/12/test/vmwriter.py create mode 100755 projects/13/more fun to go.txt create mode 100755 solutions_only/project 01/And16.hdl create mode 100755 solutions_only/project 01/DMux.hdl create mode 100755 solutions_only/project 01/DMux4Way.hdl create mode 100755 solutions_only/project 01/DMux8Way.hdl create mode 100755 solutions_only/project 01/Mux.hdl create mode 100755 solutions_only/project 01/Mux16.hdl create mode 100755 solutions_only/project 01/Mux4Way.hdl create mode 100755 solutions_only/project 01/Mux4Way16.hdl create mode 100755 solutions_only/project 01/Mux8Way.hdl create mode 100755 solutions_only/project 01/Mux8Way16.hdl create mode 100755 solutions_only/project 01/Not.hdl create mode 100755 solutions_only/project 01/Not16.hdl create mode 100755 solutions_only/project 01/Or.hdl create mode 100755 solutions_only/project 01/Or16.hdl create mode 100755 solutions_only/project 01/Or8Way.hdl create mode 100755 solutions_only/project 02/ALU.hdl create mode 100755 solutions_only/project 02/Add16.hdl create mode 100755 solutions_only/project 02/FullAdder.hdl create mode 100755 solutions_only/project 02/HalfAdder.hdl create mode 100755 solutions_only/project 02/Inc16.hdl create mode 100755 solutions_only/project 03/Bit.hdl create mode 100755 solutions_only/project 03/DMux8Way16.hdl create mode 100755 solutions_only/project 03/PC.hdl create mode 100755 solutions_only/project 03/RAM16K.hdl create mode 100755 solutions_only/project 03/RAM4K.hdl create mode 100755 solutions_only/project 03/RAM512.hdl create mode 100755 solutions_only/project 03/RAM64.hdl create mode 100755 solutions_only/project 03/RAM8.hdl create mode 100755 solutions_only/project 03/Register.hdl create mode 100755 solutions_only/project 04/Fill.asm create mode 100755 solutions_only/project 04/Mult.asm create mode 100755 solutions_only/project 05/CPU.hdl create mode 100755 solutions_only/project 05/Computer.hdl create mode 100755 solutions_only/project 05/Memory.hdl create mode 100755 solutions_only/project 06/assembler.py create mode 100755 solutions_only/project 07/VMTranslator.py create mode 100755 solutions_only/project 08/VMTranslator.py create mode 100755 solutions_only/project 09/Tetris/Main.jack create mode 100755 solutions_only/project 09/Tetris/Piece.jack create mode 100755 solutions_only/project 09/Tetris/Tetris.jack create mode 100755 solutions_only/project 10/JackAnalyzer.py create mode 100755 solutions_only/project 11/JackCompiler.py create mode 100755 solutions_only/project 11/symbol_table.py create mode 100755 solutions_only/project 11/tokenizer.py create mode 100755 solutions_only/project 11/vmwriter.py create mode 100755 solutions_only/project 12/Array.jack create mode 100755 solutions_only/project 12/Keyboard.jack create mode 100755 solutions_only/project 12/Main.jack create mode 100755 solutions_only/project 12/Math.jack create mode 100755 solutions_only/project 12/Memory.jack create mode 100755 solutions_only/project 12/Output.jack create mode 100755 solutions_only/project 12/Screen.jack create mode 100755 solutions_only/project 12/String.jack create mode 100755 solutions_only/project 12/Sys.jack create mode 100755 tools/Assembler.bat create mode 100755 tools/Assembler.sh create mode 100755 tools/CPUEmulator.bat create mode 100755 tools/CPUEmulator.sh create mode 100755 tools/HardwareSimulator.bat create mode 100755 tools/HardwareSimulator.sh create mode 100755 tools/JackCompiler.bat create mode 100755 tools/JackCompiler.sh create mode 100755 tools/OS/Array.vm create mode 100755 tools/OS/Keyboard.vm create mode 100755 tools/OS/Math.vm create mode 100755 tools/OS/Memory.vm create mode 100755 tools/OS/Output.vm create mode 100755 tools/OS/Screen.vm create mode 100755 tools/OS/String.vm create mode 100755 tools/OS/Sys.vm create mode 100755 tools/TextComparer.bat create mode 100755 tools/TextComparer.sh create mode 100755 tools/VMEmulator.bat create mode 100755 tools/VMEmulator.sh create mode 100755 tools/bin/Assembler.dat create mode 100755 tools/bin/CPU Emulator.dat create mode 100755 tools/bin/Hardware Simulator.dat create mode 100755 tools/bin/Virtual Machine Emulator.dat create mode 100755 tools/bin/classes/CPUEmulatorMain.class create mode 100755 tools/bin/classes/HackAssemblerMain.class create mode 100755 tools/bin/classes/HardwareSimulatorMain.class create mode 100755 tools/bin/classes/TextComparer.class create mode 100755 tools/bin/classes/VMEmulatorMain.class create mode 100755 tools/bin/help/asmAbout.html create mode 100755 tools/bin/help/asmUsage.html create mode 100755 tools/bin/help/compiler.txt create mode 100755 tools/bin/help/cpuAbout.html create mode 100755 tools/bin/help/cpuUsage.html create mode 100755 tools/bin/help/hwAbout.html create mode 100755 tools/bin/help/hwUsage.html create mode 100755 tools/bin/help/vmAbout.html create mode 100755 tools/bin/help/vmUsage.html create mode 100755 tools/bin/images/arrow2.gif create mode 100755 tools/bin/images/calculator2.gif create mode 100755 tools/bin/images/cancel.gif create mode 100755 tools/bin/images/chip.gif create mode 100755 tools/bin/images/clock2.gif create mode 100755 tools/bin/images/equal.gif create mode 100755 tools/bin/images/find.gif create mode 100755 tools/bin/images/hex.gif create mode 100755 tools/bin/images/keyboard.gif create mode 100755 tools/bin/images/ok.gif create mode 100755 tools/bin/images/ok2.gif create mode 100755 tools/bin/images/open.gif create mode 100755 tools/bin/images/open2.gif create mode 100755 tools/bin/images/opendoc.gif create mode 100755 tools/bin/images/redflag.gif create mode 100755 tools/bin/images/save.gif create mode 100755 tools/bin/images/scroll.gif create mode 100755 tools/bin/images/smallcancel.gif create mode 100755 tools/bin/images/smallequal.gif create mode 100755 tools/bin/images/smallminus.gif create mode 100755 tools/bin/images/smallnew.gif create mode 100755 tools/bin/images/smallok.gif create mode 100755 tools/bin/images/smallplus.gif create mode 100755 tools/bin/images/vcrfastforward.gif create mode 100755 tools/bin/images/vcrforward.gif create mode 100755 tools/bin/images/vcrrewind.gif create mode 100755 tools/bin/images/vcrstop.gif create mode 100755 tools/bin/lib/AssemblerGUI.jar create mode 100755 tools/bin/lib/Compilers.jar create mode 100755 tools/bin/lib/Hack.jar create mode 100755 tools/bin/lib/HackGUI.jar create mode 100755 tools/bin/lib/Simulators.jar create mode 100755 tools/bin/lib/SimulatorsGUI.jar create mode 100755 tools/bin/lib/TranslatorsGUI.jar create mode 100755 tools/bin/scripts/defaultCPU.txt create mode 100755 tools/bin/scripts/defaultHW.txt create mode 100755 tools/bin/scripts/defaultVM.txt create mode 100755 tools/builtInChips/ALU.class create mode 100755 tools/builtInChips/ALU.hdl create mode 100755 tools/builtInChips/ARegister.class create mode 100755 tools/builtInChips/ARegister.hdl create mode 100755 tools/builtInChips/Add16.class create mode 100755 tools/builtInChips/Add16.hdl create mode 100755 tools/builtInChips/And.class create mode 100755 tools/builtInChips/And.hdl create mode 100755 tools/builtInChips/And16.hdl create mode 100755 tools/builtInChips/Bit.class create mode 100755 tools/builtInChips/Bit.hdl create mode 100755 tools/builtInChips/DFF.class create mode 100755 tools/builtInChips/DFF.hdl create mode 100755 tools/builtInChips/DMux.class create mode 100755 tools/builtInChips/DMux.hdl create mode 100755 tools/builtInChips/DMux4Way.class create mode 100755 tools/builtInChips/DMux4Way.hdl create mode 100755 tools/builtInChips/DMux8Way.class create mode 100755 tools/builtInChips/DMux8Way.hdl create mode 100755 tools/builtInChips/DRegister.class create mode 100755 tools/builtInChips/DRegister.hdl create mode 100755 tools/builtInChips/FullAdder.class create mode 100755 tools/builtInChips/FullAdder.hdl create mode 100755 tools/builtInChips/HalfAdder.class create mode 100755 tools/builtInChips/HalfAdder.hdl create mode 100755 tools/builtInChips/Inc16.class create mode 100755 tools/builtInChips/Inc16.hdl create mode 100755 tools/builtInChips/Keyboard.class create mode 100755 tools/builtInChips/Keyboard.hdl create mode 100755 tools/builtInChips/Mux.class create mode 100755 tools/builtInChips/Mux.hdl create mode 100755 tools/builtInChips/Mux16.hdl create mode 100755 tools/builtInChips/Mux4Way16.class create mode 100755 tools/builtInChips/Mux4Way16.hdl create mode 100755 tools/builtInChips/Mux8Way16.class create mode 100755 tools/builtInChips/Mux8Way16.hdl create mode 100755 tools/builtInChips/Nand.class create mode 100755 tools/builtInChips/Nand.hdl create mode 100755 tools/builtInChips/Not.class create mode 100755 tools/builtInChips/Not.hdl create mode 100755 tools/builtInChips/Not16.class create mode 100755 tools/builtInChips/Not16.hdl create mode 100755 tools/builtInChips/Or.class create mode 100755 tools/builtInChips/Or.hdl create mode 100755 tools/builtInChips/Or16.hdl create mode 100755 tools/builtInChips/Or8Way.class create mode 100755 tools/builtInChips/Or8Way.hdl create mode 100755 tools/builtInChips/PC.class create mode 100755 tools/builtInChips/PC.hdl create mode 100755 tools/builtInChips/RAM.class create mode 100755 tools/builtInChips/RAM16K.class create mode 100755 tools/builtInChips/RAM16K.hdl create mode 100755 tools/builtInChips/RAM4K.class create mode 100755 tools/builtInChips/RAM4K.hdl create mode 100755 tools/builtInChips/RAM512.class create mode 100755 tools/builtInChips/RAM512.hdl create mode 100755 tools/builtInChips/RAM64.class create mode 100755 tools/builtInChips/RAM64.hdl create mode 100755 tools/builtInChips/RAM8.class create mode 100755 tools/builtInChips/RAM8.hdl create mode 100755 tools/builtInChips/ROM32K.class create mode 100755 tools/builtInChips/ROM32K.hdl create mode 100755 tools/builtInChips/Register.class create mode 100755 tools/builtInChips/Register.hdl create mode 100755 tools/builtInChips/RegisterWithGUI.class create mode 100755 tools/builtInChips/Screen.class create mode 100755 tools/builtInChips/Screen.hdl create mode 100755 tools/builtInChips/Xor.class create mode 100755 tools/builtInChips/Xor.hdl create mode 100755 tools/builtInVMCode/Array.class create mode 100755 tools/builtInVMCode/JackOSClass.class create mode 100755 tools/builtInVMCode/Keyboard.class create mode 100755 tools/builtInVMCode/Math.class create mode 100755 tools/builtInVMCode/Memory.class create mode 100755 tools/builtInVMCode/Output.class create mode 100755 tools/builtInVMCode/Screen.class create mode 100755 tools/builtInVMCode/String.class create mode 100755 tools/builtInVMCode/Sys.class diff --git a/README.md b/README.md new file mode 100755 index 0000000..ec9e3f0 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Contents for the courses nand2tetris part one and part two. +Important things: +1. Project 06 cotaints an assemler which takes Assembly and translates it into machine code +2. Project 08 contains a VMtranslator which takes VM code and translates it into Assemly +3. Project 11 contains an language translator which takes JACK code and translates it into VM code +4. Project 09 contains a game written in the language developed before, a.k.a JACK + +Projects 06, 08, 11 have been writen in Python 3.9 diff --git a/projects/00/file.txt b/projects/00/file.txt new file mode 100755 index 0000000..ff654e3 --- /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/01/And.cmp b/projects/01/And.cmp new file mode 100755 index 0000000..75e709a --- /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 100755 index 0000000..4816b67 --- /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=out1); + Not(in=out1,out=out); +} diff --git a/projects/01/And.out b/projects/01/And.out new file mode 100755 index 0000000..75e709a --- /dev/null +++ b/projects/01/And.out @@ -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.tst b/projects/01/And.tst new file mode 100755 index 0000000..7ace19d --- /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 100755 index 0000000..32c8648 --- /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 100755 index 0000000..1fbcabe --- /dev/null +++ b/projects/01/And16.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: 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.out b/projects/01/And16.out new file mode 100755 index 0000000..32c8648 --- /dev/null +++ b/projects/01/And16.out @@ -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.tst b/projects/01/And16.tst new file mode 100755 index 0000000..c8921e7 --- /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 100755 index 0000000..6982094 --- /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 100755 index 0000000..ede6878 --- /dev/null +++ b/projects/01/DMux.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/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=in,b=notsel,out=a); + And(a=in,b=sel,out=b); + +} diff --git a/projects/01/DMux.out b/projects/01/DMux.out new file mode 100755 index 0000000..6982094 --- /dev/null +++ b/projects/01/DMux.out @@ -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.tst b/projects/01/DMux.tst new file mode 100755 index 0000000..4adbc43 --- /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 100755 index 0000000..eac35c4 --- /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 100755 index 0000000..7346e03 --- /dev/null +++ b/projects/01/DMux4Way.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/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[1],out=notsel1); + Not(in=sel[0],out=notsel0); + + And(a=notsel1,b=notsel0,out=out1); + And(a=notsel1,b=sel[0],out=out2); + And(a=sel[1],b=notsel0,out=out3); + And(a=sel[1],b=sel[0],out=out4); + + And(a=in,b=out1,out=a); + And(a=in,b=out2,out=b); + And(a=in,b=out3,out=c); + And(a=in,b=out4,out=d); + +} \ No newline at end of file diff --git a/projects/01/DMux4Way.out b/projects/01/DMux4Way.out new file mode 100755 index 0000000..eac35c4 --- /dev/null +++ b/projects/01/DMux4Way.out @@ -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.tst b/projects/01/DMux4Way.tst new file mode 100755 index 0000000..6fbbb56 --- /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 100755 index 0000000..375d44a --- /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 100755 index 0000000..04d82ca --- /dev/null +++ b/projects/01/DMux8Way.hdl @@ -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/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: + Not(in=sel[0],out=notsel0); + Not(in=sel[1],out=notsel1); + Not(in=sel[2],out=notsel2); + + And(a=notsel2,b=notsel1,out=out1); + And(a=out1,b=notsel0,out=outA); + And(a=out1,b=sel[0],out=outB); + + And(a=notsel2,b=sel[1],out=out2); + And(a=out2,b=notsel0,out=outC); + And(a=out2,b=sel[0],out=outD); + + And(a=sel[2],b=notsel1,out=out3); + And(a=out3,b=notsel0,out=outE); + And(a=out3,b=sel[0],out=outF); + + And(a=sel[2],b=sel[1],out=out4); + And(a=out4,b=notsel0,out=outG); + And(a=out4,b=sel[0],out=outH); + + And(a=in,b=outA,out=a); + And(a=in,b=outB,out=b); + And(a=in,b=outC,out=c); + And(a=in,b=outD,out=d); + And(a=in,b=outE,out=e); + And(a=in,b=outF,out=f); + And(a=in,b=outG,out=g); + And(a=in,b=outH,out=h); +} \ No newline at end of file diff --git a/projects/01/DMux8Way.out b/projects/01/DMux8Way.out new file mode 100755 index 0000000..375d44a --- /dev/null +++ b/projects/01/DMux8Way.out @@ -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.tst b/projects/01/DMux8Way.tst new file mode 100755 index 0000000..56d827e --- /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 100755 index 0000000..7a5cc5b --- /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 100755 index 0000000..1afeb7b --- /dev/null +++ b/projects/01/Mux.hdl @@ -0,0 +1,17 @@ + +/** + * Multiplexor: + * out = a if sel == 0 + * b otherwise + */ + +CHIP Mux { + IN a, b, sel; + OUT out; + + PARTS: + Not(in=sel,out=notsel); + And(a=a,b=notsel,out=out1); + And(a=b,b=sel,out=out2); + Or(a=out1,b=out2,out=out); +} \ No newline at end of file diff --git a/projects/01/Mux.out b/projects/01/Mux.out new file mode 100755 index 0000000..7a5cc5b --- /dev/null +++ b/projects/01/Mux.out @@ -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.tst b/projects/01/Mux.tst new file mode 100755 index 0000000..9b7afd9 --- /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 100755 index 0000000..661ee67 --- /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 100755 index 0000000..21b0184 --- /dev/null +++ b/projects/01/Mux16.hdl @@ -0,0 +1,34 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Mux16.hdl + +/** + * 16-bit multiplexor: + * for i = 1..15 out[i] = a[i] if sel == 1 + * b[i] if sel == 1 + */ + +CHIP Mux16 { + IN a[16], b[16], sel; + OUT out[16]; + + PARTS: + Mux(a=a[0],b=b[0],sel=sel,out=out[0]); + Mux(a=a[1],b=b[1],sel=sel,out=out[1]); + Mux(a=a[2],b=b[2],sel=sel,out=out[2]); + Mux(a=a[3],b=b[3],sel=sel,out=out[3]); + Mux(a=a[4],b=b[4],sel=sel,out=out[4]); + Mux(a=a[5],b=b[5],sel=sel,out=out[5]); + Mux(a=a[6],b=b[6],sel=sel,out=out[6]); + Mux(a=a[7],b=b[7],sel=sel,out=out[7]); + Mux(a=a[8],b=b[8],sel=sel,out=out[8]); + Mux(a=a[9],b=b[9],sel=sel,out=out[9]); + Mux(a=a[10],b=b[10],sel=sel,out=out[10]); + Mux(a=a[11],b=b[11],sel=sel,out=out[11]); + Mux(a=a[12],b=b[12],sel=sel,out=out[12]); + Mux(a=a[13],b=b[13],sel=sel,out=out[13]); + Mux(a=a[14],b=b[14],sel=sel,out=out[14]); + Mux(a=a[15],b=b[15],sel=sel,out=out[15]); + +} \ No newline at end of file diff --git a/projects/01/Mux16.out b/projects/01/Mux16.out new file mode 100755 index 0000000..661ee67 --- /dev/null +++ b/projects/01/Mux16.out @@ -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.tst b/projects/01/Mux16.tst new file mode 100755 index 0000000..cf34155 --- /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/Mux4Way.hdl b/projects/01/Mux4Way.hdl new file mode 100755 index 0000000..fca2c16 --- /dev/null +++ b/projects/01/Mux4Way.hdl @@ -0,0 +1,21 @@ +CHIP Mux4Way { + IN a, b, c, d, sel0, sel1; + OUT out; + + PARTS: + Not(in=sel0,out=notsel0); + Not(in=sel1,out=notsel1); + + And(a=notsel0,b=notsel1,out=outA); + And(a=sel0,b=notsel1,out=outB); + And(a=notsel0,b=sel1,out=outC); + And(a=sel0,b=sel1,out=outD); + + And(a=outA,b=a,out=outA1); + And(a=outB,b=b,out=outB1); + And(a=outC,b=c,out=outC1); + And(a=outD,b=d,out=outD1); + Or(a=outA1,b=outB1,out=out1); + Or(a=outC1,b=outD1,out=out2); + Or(a=out1,b=out2,out=out); +} \ No newline at end of file diff --git a/projects/01/Mux4Way16.cmp b/projects/01/Mux4Way16.cmp new file mode 100755 index 0000000..8704e79 --- /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 100755 index 0000000..64fbffc --- /dev/null +++ b/projects/01/Mux4Way16.hdl @@ -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/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: + + Mux4Way(a=a[0],b=b[0],c=c[0],d=d[0],sel0=sel[0],sel1=sel[1],out=out[0]); + Mux4Way(a=a[1],b=b[1],c=c[1],d=d[1],sel0=sel[0],sel1=sel[1],out=out[1]); + Mux4Way(a=a[2],b=b[2],c=c[2],d=d[2],sel0=sel[0],sel1=sel[1],out=out[2]); + Mux4Way(a=a[3],b=b[3],c=c[3],d=d[3],sel0=sel[0],sel1=sel[1],out=out[3]); + Mux4Way(a=a[4],b=b[4],c=c[4],d=d[4],sel0=sel[0],sel1=sel[1],out=out[4]); + Mux4Way(a=a[5],b=b[5],c=c[5],d=d[5],sel0=sel[0],sel1=sel[1],out=out[5]); + Mux4Way(a=a[6],b=b[6],c=c[6],d=d[6],sel0=sel[0],sel1=sel[1],out=out[6]); + Mux4Way(a=a[7],b=b[7],c=c[7],d=d[7],sel0=sel[0],sel1=sel[1],out=out[7]); + Mux4Way(a=a[8],b=b[8],c=c[8],d=d[8],sel0=sel[0],sel1=sel[1],out=out[8]); + Mux4Way(a=a[9],b=b[9],c=c[9],d=d[9],sel0=sel[0],sel1=sel[1],out=out[9]); + + Mux4Way(a=a[10],b=b[10],c=c[10],d=d[10],sel0=sel[0],sel1=sel[1],out=out[10]); + Mux4Way(a=a[11],b=b[11],c=c[11],d=d[11],sel0=sel[0],sel1=sel[1],out=out[11]); + Mux4Way(a=a[12],b=b[12],c=c[12],d=d[12],sel0=sel[0],sel1=sel[1],out=out[12]); + Mux4Way(a=a[13],b=b[13],c=c[13],d=d[13],sel0=sel[0],sel1=sel[1],out=out[13]); + Mux4Way(a=a[14],b=b[14],c=c[14],d=d[14],sel0=sel[0],sel1=sel[1],out=out[14]); + Mux4Way(a=a[15],b=b[15],c=c[15],d=d[15],sel0=sel[0],sel1=sel[1],out=out[15]); + +} \ No newline at end of file diff --git a/projects/01/Mux4Way16.out b/projects/01/Mux4Way16.out new file mode 100755 index 0000000..8704e79 --- /dev/null +++ b/projects/01/Mux4Way16.out @@ -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.tst b/projects/01/Mux4Way16.tst new file mode 100755 index 0000000..3f4efa3 --- /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/Mux8Way.hdl b/projects/01/Mux8Way.hdl new file mode 100755 index 0000000..00816be --- /dev/null +++ b/projects/01/Mux8Way.hdl @@ -0,0 +1,41 @@ +CHIP Mux8Way { + IN a, b, c, d, e, f, g, h, sel0, sel1, sel2; + OUT out; + + PARTS: + Not(in=sel0,out=notsel0); + Not(in=sel1,out=notsel1); + Not(in=sel2,out=notsel2); + + + And(a=notsel0,b=notsel1,out=outA); + And(a=notsel0,b=sel2,out=outC); + And(a=sel0,b=notsel1,out=outE); + And(a=sel0,b=sel1,out=outG); + + And(a=outA,b=notsel2,out=outA1); + And(a=outC,b=notsel2,out=outC1); + And(a=outE,b=notsel2,out=outE1); + And(a=outG,b=notsel2,out=outG1); + And(a=outA,b=sel2,out=outB1); + And(a=outG,b=sel2,out=outH1); + And(a=outC,b=sel2,out=outD1); + And(a=outE,b=sel2,out=outF1); + + And(a=outA1,b=a,out=outA2); + And(a=outB1,b=b,out=outB2); + And(a=outC1,b=c,out=outC2); + And(a=outD1,b=d,out=outD2); + And(a=outE1,b=e,out=outE2); + And(a=outF1,b=f,out=outF2); + And(a=outG1,b=g,out=outG2); + And(a=outH1,b=h,out=outH2); + + Or(a=outA2,b=outB2,out=out1); + Or(a=outC2,b=outD2,out=out2); + Or(a=outE2,b=outF2,out=out4); + Or(a=outG2,b=outH2,out=out5); + Or(a=out4,b=out5,out=out6); + Or(a=out1,b=out2,out=out3); + Or(a=out3,b=out6,out=out); +} diff --git a/projects/01/Mux8Way16.cmp b/projects/01/Mux8Way16.cmp new file mode 100755 index 0000000..1484e0a --- /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 100755 index 0000000..960aa7d --- /dev/null +++ b/projects/01/Mux8Way16.hdl @@ -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/01/Mux8Way16.hdl + +/** + * 8-way 16-bit multiplexor: + * out = a if sel == 000 + * b if sel == 001 + * etc. + * h if sel == 111 + */ + +CHIP Mux8Way16 { + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + OUT out[16]; + + PARTS: + Mux8Way(a=a[0],b=b[0],c=c[0],d=d[0],e=e[0],f=f[0],g=g[0],h=h[0],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[0]); + Mux8Way(a=a[1],b=b[1],c=c[1],d=d[1],e=e[1],f=f[1],g=g[1],h=h[1],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[1]); + Mux8Way(a=a[2],b=b[2],c=c[2],d=d[2],e=e[2],f=f[2],g=g[2],h=h[2],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[2]); + Mux8Way(a=a[3],b=b[3],c=c[3],d=d[3],e=e[3],f=f[3],g=g[3],h=h[3],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[3]); + Mux8Way(a=a[4],b=b[4],c=c[4],d=d[4],e=e[4],f=f[4],g=g[4],h=h[4],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[4]); + Mux8Way(a=a[5],b=b[5],c=c[5],d=d[5],e=e[5],f=f[5],g=g[5],h=h[5],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[5]); + Mux8Way(a=a[6],b=b[6],c=c[6],d=d[6],e=e[6],f=f[6],g=g[6],h=h[6],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[6]); + Mux8Way(a=a[7],b=b[7],c=c[7],d=d[7],e=e[7],f=f[7],g=g[7],h=h[7],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[7]); + Mux8Way(a=a[8],b=b[8],c=c[8],d=d[8],e=e[8],f=f[8],g=g[8],h=h[8],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[8]); + Mux8Way(a=a[9],b=b[9],c=c[9],d=d[9],e=e[9],f=f[9],g=g[9],h=h[9],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[9]); + + Mux8Way(a=a[11],b=b[11],c=c[11],d=d[11],e=e[11],f=f[11],g=g[11],h=h[11],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[11]); + Mux8Way(a=a[12],b=b[12],c=c[12],d=d[12],e=e[12],f=f[12],g=g[12],h=h[12],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[12]); + Mux8Way(a=a[14],b=b[14],c=c[14],d=d[14],e=e[14],f=f[14],g=g[14],h=h[14],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[14]); + Mux8Way(a=a[13],b=b[13],c=c[13],d=d[13],e=e[13],f=f[13],g=g[13],h=h[13],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[13]); + Mux8Way(a=a[15],b=b[15],c=c[15],d=d[15],e=e[15],f=f[15],g=g[15],h=h[15],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[15]); + Mux8Way(a=a[10],b=b[10],c=c[10],d=d[10],e=e[10],f=f[10],g=g[10],h=h[10],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[10]); +} \ No newline at end of file diff --git a/projects/01/Mux8Way16.tst b/projects/01/Mux8Way16.tst new file mode 100755 index 0000000..59bb41c --- /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 100755 index 0000000..e8c1191 --- /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 100755 index 0000000..5b75a10 --- /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.out b/projects/01/Not.out new file mode 100755 index 0000000..e8c1191 --- /dev/null +++ b/projects/01/Not.out @@ -0,0 +1,3 @@ +| in | out | +| 0 | 1 | +| 1 | 0 | diff --git a/projects/01/Not.tst b/projects/01/Not.tst new file mode 100755 index 0000000..1e3bbe7 --- /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 100755 index 0000000..68a5512 --- /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 100755 index 0000000..88fb6b6 --- /dev/null +++ b/projects/01/Not16.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/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.out b/projects/01/Not16.out new file mode 100755 index 0000000..68a5512 --- /dev/null +++ b/projects/01/Not16.out @@ -0,0 +1,6 @@ +| in | out | +| 0000000000000000 | 1111111111111111 | +| 1111111111111111 | 0000000000000000 | +| 1010101010101010 | 0101010101010101 | +| 0011110011000011 | 1100001100111100 | +| 0001001000110100 | 1110110111001011 | diff --git a/projects/01/Not16.tst b/projects/01/Not16.tst new file mode 100755 index 0000000..e7e2c3b --- /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 100755 index 0000000..dab924c --- /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 100755 index 0000000..283c7d5 --- /dev/null +++ b/projects/01/Or.hdl @@ -0,0 +1,9 @@ +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.out b/projects/01/Or.out new file mode 100755 index 0000000..e69de29 diff --git a/projects/01/Or.tst b/projects/01/Or.tst new file mode 100755 index 0000000..948b6b3 --- /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 100755 index 0000000..e2c3a30 --- /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 100755 index 0000000..7708c5b --- /dev/null +++ b/projects/01/Or16.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/11/Or16.hdl + +/** + * 16-bit bitwise Or: + * for i = 1..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.out b/projects/01/Or16.out new file mode 100755 index 0000000..e2c3a30 --- /dev/null +++ b/projects/01/Or16.out @@ -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.tst b/projects/01/Or16.tst new file mode 100755 index 0000000..ea7b944 --- /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 100755 index 0000000..3f9fd54 --- /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 100755 index 0000000..667b506 --- /dev/null +++ b/projects/01/Or8Way.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/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=out1); + Or(a=out1,b=in[2],out=out2); + Or(a=out2,b=in[3],out=out3); + Or(a=out3,b=in[4],out=out4); + Or(a=out4,b=in[5],out=out5); + Or(a=out5,b=in[6],out=out6); + Or(a=out6,b=in[7],out=out); + + +} \ No newline at end of file diff --git a/projects/01/Or8Way.out b/projects/01/Or8Way.out new file mode 100755 index 0000000..3f9fd54 --- /dev/null +++ b/projects/01/Or8Way.out @@ -0,0 +1,6 @@ +| in | out | +| 00000000 | 0 | +| 11111111 | 1 | +| 00010000 | 1 | +| 00000001 | 1 | +| 00100110 | 1 | diff --git a/projects/01/Or8Way.tst b/projects/01/Or8Way.tst new file mode 100755 index 0000000..e6fbba7 --- /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 100755 index 0000000..a1e07b2 --- /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 100755 index 0000000..af58d40 --- /dev/null +++ b/projects/01/Xor.hdl @@ -0,0 +1,11 @@ +CHIP Xor { + IN a, b; + OUT out; + + PARTS: + Not(in=a,out=nota); + Not(in=b,out=notb); + And(a=a,b=notb,out=aAndnotb); + And(a=nota,b=b,out=notaAndb); + Or(a=aAndnotb,b=notaAndb,out=out); +} \ No newline at end of file diff --git a/projects/01/Xor.out b/projects/01/Xor.out new file mode 100755 index 0000000..a1e07b2 --- /dev/null +++ b/projects/01/Xor.out @@ -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.tst b/projects/01/Xor.tst new file mode 100755 index 0000000..cd93be4 --- /dev/null +++ b/projects/01/Xor.tst @@ -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/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/02/ALU-nostat.cmp b/projects/02/ALU-nostat.cmp new file mode 100755 index 0000000..976ab78 --- /dev/null +++ b/projects/02/ALU-nostat.cmp @@ -0,0 +1,37 @@ +| x | y |zx |nx |zy |ny | f |no | out | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 0 | 0101101110100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 0 | 0001111011010010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 1 | 1010010001011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 1 | 1110000100101101 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 1 | 1010010001100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 1 | 1110000100101110 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 1 | 1 | 1 | 1 | 0101101110100001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 1 | 1 | 1 | 0001111011010011 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 0 | 0101101110011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 0 | 0001111011010001 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 1 | 0 | 0111101001110010 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 0 | 1 | 1 | 0011110011001110 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 1 | 1 | 1 | 1100001100110010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 0 | 0 | 0001101010000000 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 1 | 0 | 1 | 0101111111110010 | diff --git a/projects/02/ALU-nostat.out b/projects/02/ALU-nostat.out new file mode 100755 index 0000000..976ab78 --- /dev/null +++ b/projects/02/ALU-nostat.out @@ -0,0 +1,37 @@ +| x | y |zx |nx |zy |ny | f |no | out | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 0 | 0101101110100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 0 | 0001111011010010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 0 | 1 | 1010010001011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 0 | 1 | 1110000100101101 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 1 | 1010010001100000 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 1 | 1110000100101110 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 1 | 1 | 1 | 1 | 0101101110100001 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 1 | 1 | 1 | 0001111011010011 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 1 | 1 | 1 | 0 | 0101101110011111 | +| 0101101110100000 | 0001111011010010 | 1 | 1 | 0 | 0 | 1 | 0 | 0001111011010001 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 1 | 0 | 0111101001110010 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 0 | 1 | 1 | 0011110011001110 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 1 | 1 | 1 | 1100001100110010 | +| 0101101110100000 | 0001111011010010 | 0 | 0 | 0 | 0 | 0 | 0 | 0001101010000000 | +| 0101101110100000 | 0001111011010010 | 0 | 1 | 0 | 1 | 0 | 1 | 0101111111110010 | diff --git a/projects/02/ALU-nostat.tst b/projects/02/ALU-nostat.tst new file mode 100755 index 0000000..fa3e448 --- /dev/null +++ b/projects/02/ALU-nostat.tst @@ -0,0 +1,353 @@ +// This file is part of the materials accompanying the book +// "The Elements of Computing Systems" by Nisan and Schocken, +// MIT Press. Book site: www.idc.ac.il/tecs +// File name: projects/02/ALU-nostat.tst + +// ALU-nostat.tst provides a partial test of the ALU chip. +// It IS NOT a replacement for ALU.tst. + +// ALU-nostat.tst tests only the computation part of the ALU. +// The 'zr' and 'ng' status outputs are ignored. + +// This test lets you concentrate on getting the ALU computation right without the +// additional task of handling the status outputs. + +// Once your ALU passes ALU-nostat.tst you need to test it with ALU.tst. +// This way, any comparison failures during ALU.tst will be caused by errors in +// the handling of the 'zr' and 'ng' status outputs. + +load ALU.hdl, +output-file ALU-nostat.out, +compare-to ALU-nostat.cmp, +output-list x%B1.16.1 y%B1.16.1 zx%B1.1.1 nx%B1.1.1 zy%B1.1.1 + ny%B1.1.1 f%B1.1.1 no%B1.1.1 out%B1.16.1; + +set x %B0000000000000000, +set y %B1111111111111111, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set x %B101101110100000, +set y %B001111011010010, + +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; diff --git a/projects/02/ALU.cmp b/projects/02/ALU.cmp new file mode 100755 index 0000000..2ec3a55 --- /dev/null +++ b/projects/02/ALU.cmp @@ -0,0 +1,37 @@ +| x | y |zx |nx |zy |ny | f |no | out |zr |ng | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000010010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 0 | 0000000000010000 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 0 | 0000000000000010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 1 | 0 | 0000000000010100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000001110 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111110010 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 1 | 0 | 1 | 0000000000010011 | 0 | 0 | diff --git a/projects/02/ALU.hdl b/projects/02/ALU.hdl new file mode 100755 index 0000000..856ebf4 --- /dev/null +++ b/projects/02/ALU.hdl @@ -0,0 +1,66 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/ALU.hdl + +/** + * The ALU (Arithmetic Logic Unit). + * Computes one of the following functions: + * x+y, x-y, y-x, 0, 1, -1, x, y, -x, -y, !x, !y, + * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs, + * according to 6 input bits denoted zx,nx,zy,ny,f,no. + * In addition, the ALU computes two 1-bit outputs: + * if the ALU output == 0, zr is set to 1; otherwise zr is set to 0; + * if the ALU output < 0, ng is set to 1; otherwise ng is set to 0. + */ + +// Implementation: the ALU logic manipulates the x and y inputs +// and operates on the resulting values, as follows: +// if (zx == 1) set x = 0 // 16-bit constant +// if (nx == 1) set x = !x // bitwise not +// if (zy == 1) set y = 0 // 16-bit constant +// if (ny == 1) set y = !y // bitwise not +// if (f == 1) set out = x + y // integer 2's complement addition +// if (f == 0) set out = x & y // bitwise and +// if (no == 1) set out = !out // bitwise not +// if (out == 0) set zr = 1 +// if (out < 0) set ng = 1 + +CHIP ALU { + IN + x[16], y[16], // 16-bit inputs + zx, // zero the x input? + nx, // negate the x input? + zy, // zero the y input? + ny, // negate the y input? + f, // compute out = x + y (if 1) or x & y (if 0) + no; // negate the out output? + + OUT + out[16], // 16-bit output + zr, // 1 if (out == 0), 0 otherwise + ng; // 1 if (out < 0), 0 otherwise + + PARTS: + Mux16(a=x,b[0..15]=false,sel=zx,out=outZx);//zx + + Mux16(a=y,b[0..15]=false,sel=zy,out=outZy);//zy + + + Not16(in=outZx,out=outNx1);//nx1 + Not16(in=outZy,out=outNy1);//ny1 + Mux16(a=outZx,b=outNx1,sel=nx,out=outNx);//nx + + Mux16(a=outZy,b=outNy1,sel=ny,out=outNy);//ny + + + Add16(a=outNx,b=outNy,out=outF1);//f1 + + And16(a=outNy,b=outNx,out=outF0);//f0 + + Mux16(a=outF0,b=outF1,sel=f,out=outF);//f + + Not16(in=outF,out=outNo1);//no + + Mux16(a=outF, b=outNo1, sel=no, out=out, out[15]=ng, out[0..7]=zr1, out[8..15]=zr2); + + + Or8Way(in=zr1,out=out2); + Or8Way(in=zr2,out=out3); + Not(in=out2,out=out4); + Not(in=out3,out=out5); + And(a=out4,b=out5,out=zr); + +} \ No newline at end of file diff --git a/projects/02/ALU.out b/projects/02/ALU.out new file mode 100755 index 0000000..2ec3a55 --- /dev/null +++ b/projects/02/ALU.out @@ -0,0 +1,37 @@ +| x | y |zx |nx |zy |ny | f |no | out |zr |ng | +| 0000000000000000 | 1111111111111111 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 0 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 1 | 1 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 1 | 1 | 0 | 0 | 1 | 0 | 1111111111111110 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000000000 | 1111111111111111 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000000000 | 1111111111111111 | 0 | 1 | 0 | 1 | 0 | 1 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 0 | 1 | 0 | 1 | 0 | 0000000000000000 | 1 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 1 | 1 | 1 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 1 | 0 | 1 | 0 | 1111111111111111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 0 | 0000000000010001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 0 | 0000000000000011 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 0 | 1 | 1111111111101110 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 0 | 1 | 1111111111111100 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 1 | 1111111111101111 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 1 | 1111111111111101 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 1 | 1 | 1 | 1 | 0000000000010010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 1 | 1 | 1 | 0000000000000100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 1 | 1 | 1 | 0 | 0000000000010000 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 1 | 1 | 0 | 0 | 1 | 0 | 0000000000000010 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 1 | 0 | 0000000000010100 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 0 | 1 | 1 | 0000000000001110 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 1 | 1 | 1 | 1111111111110010 | 0 | 1 | +| 0000000000010001 | 0000000000000011 | 0 | 0 | 0 | 0 | 0 | 0 | 0000000000000001 | 0 | 0 | +| 0000000000010001 | 0000000000000011 | 0 | 1 | 0 | 1 | 0 | 1 | 0000000000010011 | 0 | 0 | diff --git a/projects/02/ALU.tst b/projects/02/ALU.tst new file mode 100755 index 0000000..9e665b0 --- /dev/null +++ b/projects/02/ALU.tst @@ -0,0 +1,377 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/ALU.tst + +load ALU.hdl, +output-file ALU.out, +compare-to ALU.cmp, +output-list x%B1.16.1 y%B1.16.1 zx%B1.1.1 nx%B1.1.1 zy%B1.1.1 + ny%B1.1.1 f%B1.1.1 no%B1.1.1 out%B1.16.1 zr%B1.1.1 + ng%B1.1.1; + +set x %B0000000000000000, // x = 0 +set y %B1111111111111111; // y = -1 + +// Compute 0 +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute 1 +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -1 +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +// Compute y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute !x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +// Compute !y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +// Compute -x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute x + 1 +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute y + 1 +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x - 1 +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +// Compute y - 1 +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x + y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x - y +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute y - x +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x & y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute x | y +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; + +set x %B000000000010001, // x = 17 +set y %B000000000000011; // y = 3 + +// Compute 0 +set zx 1, +set nx 0, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute 1 +set zx 1, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -1 +set zx 1, +set nx 1, +set zy 1, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 0, +eval, +output; + +// Compute y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute !x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 0, +set no 1, +eval, +output; + +// Compute !y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 0, +set no 1, +eval, +output; + +// Compute -x +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute -y +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute x + 1 +set zx 0, +set nx 1, +set zy 1, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute y + 1 +set zx 1, +set nx 1, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x - 1 +set zx 0, +set nx 0, +set zy 1, +set ny 1, +set f 1, +set no 0, +eval, +output; + +// Compute y - 1 +set zx 1, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x + y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 1, +set no 0, +eval, +output; + +// Compute x - y +set zx 0, +set nx 1, +set zy 0, +set ny 0, +set f 1, +set no 1, +eval, +output; + +// Compute y - x +set zx 0, +set nx 0, +set zy 0, +set ny 1, +set f 1, +set no 1, +eval, +output; + +// Compute x & y +set zx 0, +set nx 0, +set zy 0, +set ny 0, +set f 0, +set no 0, +eval, +output; + +// Compute x | y +set zx 0, +set nx 1, +set zy 0, +set ny 1, +set f 0, +set no 1, +eval, +output; diff --git a/projects/02/Add16.cmp b/projects/02/Add16.cmp new file mode 100755 index 0000000..76d069c --- /dev/null +++ b/projects/02/Add16.cmp @@ -0,0 +1,7 @@ +| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1111111111111111 | +| 1111111111111111 | 1111111111111111 | 1111111111111110 | +| 1010101010101010 | 0101010101010101 | 1111111111111111 | +| 0011110011000011 | 0000111111110000 | 0100110010110011 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | diff --git a/projects/02/Add16.hdl b/projects/02/Add16.hdl new file mode 100755 index 0000000..a33305e --- /dev/null +++ b/projects/02/Add16.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: projects/02/Adder16.hdl + +/** + * Adds two 16-bit values. + * The most significant carry bit is ignored. + */ + +CHIP Add16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + HalfAdder(a=a[0], b=b[0], sum=out[0], carry=carry1); + FullAdder(a=a[1], b=b[1], c=carry1, sum=out[1], carry=carry2); + FullAdder(a=a[2], b=b[2], c=carry2, sum=out[2], carry=carry3); + FullAdder(a=a[3], b=b[3], c=carry3, sum=out[3], carry=carry4); + FullAdder(a=a[4], b=b[4], c=carry4, sum=out[4], carry=carry5); + FullAdder(a=a[5], b=b[5], c=carry5, sum=out[5], carry=carry6); + FullAdder(a=a[6], b=b[6], c=carry6, sum=out[6], carry=carry7); + FullAdder(a=a[7], b=b[7], c=carry7, sum=out[7], carry=carry8); + FullAdder(a=a[8], b=b[8], c=carry8, sum=out[8], carry=carry9); + FullAdder(a=a[9], b=b[9], c=carry9, sum=out[9], carry=carry10); + + FullAdder(a=a[10],b=b[10],c=carry10,sum=out[10],carry=carry11); + FullAdder(a=a[11],b=b[11],c=carry11,sum=out[11],carry=carry12); + FullAdder(a=a[12],b=b[12],c=carry12,sum=out[12],carry=carry13); + FullAdder(a=a[13],b=b[13],c=carry13,sum=out[13],carry=carry14); + FullAdder(a=a[14],b=b[14],c=carry14,sum=out[14],carry=carry15); + FullAdder(a=a[15],b=b[15],c=carry15,sum=out[15],carry=carry16); + + +} \ No newline at end of file diff --git a/projects/02/Add16.out b/projects/02/Add16.out new file mode 100755 index 0000000..76d069c --- /dev/null +++ b/projects/02/Add16.out @@ -0,0 +1,7 @@ +| a | b | out | +| 0000000000000000 | 0000000000000000 | 0000000000000000 | +| 0000000000000000 | 1111111111111111 | 1111111111111111 | +| 1111111111111111 | 1111111111111111 | 1111111111111110 | +| 1010101010101010 | 0101010101010101 | 1111111111111111 | +| 0011110011000011 | 0000111111110000 | 0100110010110011 | +| 0001001000110100 | 1001100001110110 | 1010101010101010 | diff --git a/projects/02/Add16.tst b/projects/02/Add16.tst new file mode 100755 index 0000000..85e1be1 --- /dev/null +++ b/projects/02/Add16.tst @@ -0,0 +1,39 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/Add16.tst + +load Add16.hdl, +output-file Add16.out, +compare-to Add16.cmp, +output-list a%B1.16.1 b%B1.16.1 out%B1.16.1; + +set a %B0000000000000000, +set b %B0000000000000000, +eval, +output; + +set a %B0000000000000000, +set b %B1111111111111111, +eval, +output; + +set a %B1111111111111111, +set b %B1111111111111111, +eval, +output; + +set a %B1010101010101010, +set b %B0101010101010101, +eval, +output; + +set a %B0011110011000011, +set b %B0000111111110000, +eval, +output; + +set a %B0001001000110100, +set b %B1001100001110110, +eval, +output; diff --git a/projects/02/FullAdder.cmp b/projects/02/FullAdder.cmp new file mode 100755 index 0000000..84551aa --- /dev/null +++ b/projects/02/FullAdder.cmp @@ -0,0 +1,9 @@ +| a | b | c | sum | carry | +| 0 | 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 1 | 0 | +| 0 | 1 | 0 | 1 | 0 | +| 0 | 1 | 1 | 0 | 1 | +| 1 | 0 | 0 | 1 | 0 | +| 1 | 0 | 1 | 0 | 1 | +| 1 | 1 | 0 | 0 | 1 | +| 1 | 1 | 1 | 1 | 1 | diff --git a/projects/02/FullAdder.hdl b/projects/02/FullAdder.hdl new file mode 100755 index 0000000..e87e8a7 --- /dev/null +++ b/projects/02/FullAdder.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/02/FullAdder.hdl + +/** + * Computes the sum of three bits. + */ + +CHIP FullAdder { + IN a, b, c; // 1-bit inputs + OUT sum, // Right bit of a + b + c + carry; // Left bit of a + b + c + + PARTS: + HalfAdder(a=b,b=c,sum=sum1,carry=carry1); + HalfAdder(a=a,b=sum1,sum=sum,carry=carry2); + Or(a=carry1,b=carry2,out=carry); + +} \ No newline at end of file diff --git a/projects/02/FullAdder.out b/projects/02/FullAdder.out new file mode 100755 index 0000000..84551aa --- /dev/null +++ b/projects/02/FullAdder.out @@ -0,0 +1,9 @@ +| a | b | c | sum | carry | +| 0 | 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 1 | 0 | +| 0 | 1 | 0 | 1 | 0 | +| 0 | 1 | 1 | 0 | 1 | +| 1 | 0 | 0 | 1 | 0 | +| 1 | 0 | 1 | 0 | 1 | +| 1 | 1 | 0 | 0 | 1 | +| 1 | 1 | 1 | 1 | 1 | diff --git a/projects/02/FullAdder.tst b/projects/02/FullAdder.tst new file mode 100755 index 0000000..5125cee --- /dev/null +++ b/projects/02/FullAdder.tst @@ -0,0 +1,47 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/FullAdder.tst + +load FullAdder.hdl, +output-file FullAdder.out, +compare-to FullAdder.cmp, +output-list a%B3.1.3 b%B3.1.3 c%B3.1.3 sum%B3.1.3 carry%B3.1.3; + +set a 0, +set b 0, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set b 1, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set a 1, +set b 0, +set c 0, +eval, +output; + +set c 1, +eval, +output; + +set b 1, +set c 0, +eval, +output; + +set c 1, +eval, +output; diff --git a/projects/02/HalfAdder.cmp b/projects/02/HalfAdder.cmp new file mode 100755 index 0000000..911c770 --- /dev/null +++ b/projects/02/HalfAdder.cmp @@ -0,0 +1,5 @@ +| a | b | sum | carry | +| 0 | 0 | 0 | 0 | +| 0 | 1 | 1 | 0 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 | diff --git a/projects/02/HalfAdder.hdl b/projects/02/HalfAdder.hdl new file mode 100755 index 0000000..27ada40 --- /dev/null +++ b/projects/02/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: projects/02/HalfAdder.hdl + +/** + * Computes the sum of two bits. + */ + +CHIP HalfAdder { + IN a, b; // 1-bit inputs + OUT sum, // Right bit of a + b + carry; // Left bit of a + b + + PARTS: + Xor(a=a,b=b,out=sum); + And(a=a,b=b,out=carry); +} diff --git a/projects/02/HalfAdder.out b/projects/02/HalfAdder.out new file mode 100755 index 0000000..911c770 --- /dev/null +++ b/projects/02/HalfAdder.out @@ -0,0 +1,5 @@ +| a | b | sum | carry | +| 0 | 0 | 0 | 0 | +| 0 | 1 | 1 | 0 | +| 1 | 0 | 1 | 0 | +| 1 | 1 | 0 | 1 | diff --git a/projects/02/HalfAdder.tst b/projects/02/HalfAdder.tst new file mode 100755 index 0000000..069b8ea --- /dev/null +++ b/projects/02/HalfAdder.tst @@ -0,0 +1,29 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/HalfAdder.tst + +load HalfAdder.hdl, +output-file HalfAdder.out, +compare-to HalfAdder.cmp, +output-list a%B3.1.3 b%B3.1.3 sum%B3.1.3 carry%B3.1.3; + +set a 0, +set b 0, +eval, +output; + +set a 0, +set b 1, +eval, +output; + +set a 1, +set b 0, +eval, +output; + +set a 1, +set b 1, +eval, +output; diff --git a/projects/02/Inc16.cmp b/projects/02/Inc16.cmp new file mode 100755 index 0000000..451f563 --- /dev/null +++ b/projects/02/Inc16.cmp @@ -0,0 +1,5 @@ +| in | out | +| 0000000000000000 | 0000000000000001 | +| 1111111111111111 | 0000000000000000 | +| 0000000000000101 | 0000000000000110 | +| 1111111111111011 | 1111111111111100 | diff --git a/projects/02/Inc16.hdl b/projects/02/Inc16.hdl new file mode 100755 index 0000000..23c872e --- /dev/null +++ b/projects/02/Inc16.hdl @@ -0,0 +1,18 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/Inc16.hdl + +/** + * 16-bit incrementer: + * out = in + 1 (arithmetic addition) + */ + +CHIP Inc16 { + IN in[16]; + OUT out[16]; + + PARTS: + Add16(a=in, b[1..15]=false, b[0]=true , out=out); + +} \ No newline at end of file diff --git a/projects/02/Inc16.out b/projects/02/Inc16.out new file mode 100755 index 0000000..451f563 --- /dev/null +++ b/projects/02/Inc16.out @@ -0,0 +1,5 @@ +| in | out | +| 0000000000000000 | 0000000000000001 | +| 1111111111111111 | 0000000000000000 | +| 0000000000000101 | 0000000000000110 | +| 1111111111111011 | 1111111111111100 | diff --git a/projects/02/Inc16.tst b/projects/02/Inc16.tst new file mode 100755 index 0000000..8537d86 --- /dev/null +++ b/projects/02/Inc16.tst @@ -0,0 +1,25 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/Inc16.tst + +load Inc16.hdl, +output-file Inc16.out, +compare-to Inc16.cmp, +output-list in%B1.16.1 out%B1.16.1; + +set in %B0000000000000000, // in = 0 +eval, +output; + +set in %B1111111111111111, // in = -1 +eval, +output; + +set in %B0000000000000101, // in = 5 +eval, +output; + +set in %B1111111111111011, // in = -5 +eval, +output; diff --git a/projects/03/a/Bit.cmp b/projects/03/a/Bit.cmp new file mode 100755 index 0000000..e900ec7 --- /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 100755 index 0000000..a85e716 --- /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=out2,b=in,sel=load,out=out1); + DFF(in=out1,out=out2,out=out); +} diff --git a/projects/03/a/Bit.out b/projects/03/a/Bit.out new file mode 100755 index 0000000..e900ec7 --- /dev/null +++ b/projects/03/a/Bit.out @@ -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.tst b/projects/03/a/Bit.tst new file mode 100755 index 0000000..c6bf523 --- /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/DMux8Way16.hdl b/projects/03/a/DMux8Way16.hdl new file mode 100755 index 0000000..1029f09 --- /dev/null +++ b/projects/03/a/DMux8Way16.hdl @@ -0,0 +1,22 @@ +CHIP DMux8Way16 { + IN in[16], sel[3]; + OUT a[16], b[16], c[16], d[16], e[16], f[16], g[16], h[16]; + + PARTS: + DMux8Way(a=a[0],b=b[0],c=c[0],d=d[0],e=e[0],f=f[0],g=g[0],h=h[0],sel=sel,in=in[0]); + DMux8Way(a=a[1],b=b[1],c=c[1],d=d[1],e=e[1],f=f[1],g=g[1],h=h[1],sel=sel,in=in[1]); + DMux8Way(a=a[2],b=b[2],c=c[2],d=d[2],e=e[2],f=f[2],g=g[2],h=h[2],sel=sel,in=in[2]); + DMux8Way(a=a[3],b=b[3],c=c[3],d=d[3],e=e[3],f=f[3],g=g[3],h=h[3],sel=sel,in=in[3]); + DMux8Way(a=a[4],b=b[4],c=c[4],d=d[4],e=e[4],f=f[4],g=g[4],h=h[4],sel=sel,in=in[4]); + DMux8Way(a=a[5],b=b[5],c=c[5],d=d[5],e=e[5],f=f[5],g=g[5],h=h[5],sel=sel,in=in[5]); + DMux8Way(a=a[6],b=b[6],c=c[6],d=d[6],e=e[6],f=f[6],g=g[6],h=h[6],sel=sel,in=in[6]); + DMux8Way(a=a[7],b=b[7],c=c[7],d=d[7],e=e[7],f=f[7],g=g[7],h=h[7],sel=sel,in=in[7]); + DMux8Way(a=a[8],b=b[8],c=c[8],d=d[8],e=e[8],f=f[8],g=g[8],h=h[8],sel=sel,in=in[8]); + DMux8Way(a=a[9],b=b[9],c=c[9],d=d[9],e=e[9],f=f[9],g=g[9],h=h[9],sel=sel,in=in[9]); + DMux8Way(a=a[10],b=b[10],c=c[10],d=d[10],e=e[10],f=f[10],g=g[10],h=h[10],sel=sel,in=in[10]); + DMux8Way(a=a[11],b=b[11],c=c[11],d=d[11],e=e[11],f=f[11],g=g[11],h=h[11],sel=sel,in=in[11]); + DMux8Way(a=a[12],b=b[12],c=c[12],d=d[12],e=e[12],f=f[12],g=g[12],h=h[12],sel=sel,in=in[12]); + DMux8Way(a=a[13],b=b[13],c=c[13],d=d[13],e=e[13],f=f[13],g=g[13],h=h[13],sel=sel,in=in[13]); + DMux8Way(a=a[14],b=b[14],c=c[14],d=d[14],e=e[14],f=f[14],g=g[14],h=h[14],sel=sel,in=in[14]); + DMux8Way(a=a[15],b=b[15],c=c[15],d=d[15],e=e[15],f=f[15],g=g[15],h=h[15],sel=sel,in=in[15]); +} \ No newline at end of file diff --git a/projects/03/a/PC.cmp b/projects/03/a/PC.cmp new file mode 100755 index 0000000..6a050d9 --- /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 100755 index 0000000..448e6c2 --- /dev/null +++ b/projects/03/a/PC.hdl @@ -0,0 +1,44 @@ +// This 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: + DMux8Way(in=true,sel[0]=reset,sel[1]=load,sel[2]=inc,a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + + DFF(in=inc,out=inct); + And(a=inc,b=inct,out=out1); + Mux16(a=in,b=out4,sel=out1,out=out2); + Inc16(in=out2,out=out3); + Register(in=out3,load=load,out=out4,out=out); + + Not(in=a,out=notа); + Register(in=in,load=notа,out=outA); + + And16(a[0..15]=false,b[0..15]=false,out=outB); + + Register(in=in,load=c,out=outC); + + And16(a[0..15]=false,b[0..15]=false,out=outD); + + + And16(a[0..15]=false,b[0..15]=false,out=outF); + + Register(in=in,load=g,out=outG); + + And16(a[0..15]=false,b[0..15]=false,out=outH); + And16(a[0..15]=false,b[0..15]=false,out=outE); + Mux8Way16(a=outA,b=outB,c=outC,d=outD,e=outE,f=outF,g=outG,h=outH,sel[0]=reset,sel[1]=load,sel[2]=inc,out=out67); + } \ No newline at end of file diff --git a/projects/03/a/PC.out b/projects/03/a/PC.out new file mode 100755 index 0000000..e69de29 diff --git a/projects/03/a/PC.tst b/projects/03/a/PC.tst new file mode 100755 index 0000000..7f4f3cd --- /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 100755 index 0000000..fdb7745 --- /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 100755 index 0000000..44d11bf --- /dev/null +++ b/projects/03/a/RAM64.hdl @@ -0,0 +1,28 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/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: + DMux8Way(in=load,sel=address[0..2],a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + RAM8(in=in,load=a,address=address[3..5],out=outa); + RAM8(in=in,load=b,address=address[3..5],out=outb); + RAM8(in=in,load=c,address=address[3..5],out=outc); + RAM8(in=in,load=d,address=address[3..5],out=outd); + RAM8(in=in,load=e,address=address[3..5],out=oute); + RAM8(in=in,load=f,address=address[3..5],out=outf); + RAM8(in=in,load=g,address=address[3..5],out=outg); + RAM8(in=in,load=h,address=address[3..5],out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address[0..2],out=out); +} \ No newline at end of file diff --git a/projects/03/a/RAM64.out b/projects/03/a/RAM64.out new file mode 100755 index 0000000..fdb7745 --- /dev/null +++ b/projects/03/a/RAM64.out @@ -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.tst b/projects/03/a/RAM64.tst new file mode 100755 index 0000000..e1a1409 --- /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 100755 index 0000000..536c6ef --- /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 100755 index 0000000..9562736 --- /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: + DMux8Way(in=load,sel=address,a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + + Register(in=in,load=a,out=outa); + Register(in=in,load=b,out=outb); + Register(in=in,load=c,out=outc); + Register(in=in,load=d,out=outd); + Register(in=in,load=e,out=oute); + Register(in=in,load=f,out=outf); + Register(in=in,load=g,out=outg); + Register(in=in,load=h,out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address,out=out); +} \ No newline at end of file diff --git a/projects/03/a/RAM8.out b/projects/03/a/RAM8.out new file mode 100755 index 0000000..536c6ef --- /dev/null +++ b/projects/03/a/RAM8.out @@ -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.tst b/projects/03/a/RAM8.tst new file mode 100755 index 0000000..9b6069c --- /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 100755 index 0000000..a899f27 --- /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 100755 index 0000000..257c7a0 --- /dev/null +++ b/projects/03/a/Register.hdl @@ -0,0 +1,34 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/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.out b/projects/03/a/Register.out new file mode 100755 index 0000000..a899f27 --- /dev/null +++ b/projects/03/a/Register.out @@ -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.tst b/projects/03/a/Register.tst new file mode 100755 index 0000000..aeec166 --- /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 100755 index 0000000..a1ad9db --- /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 100755 index 0000000..31127b0 --- /dev/null +++ b/projects/03/b/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: 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: + DMux4Way(in=load,sel=address[0..1],a=a,b=b,c=c,d=d); + RAM4K(in=in,load=a,address=address[2..13],out=outa); + RAM4K(in=in,load=b,address=address[2..13],out=outb); + RAM4K(in=in,load=c,address=address[2..13],out=outc); + RAM4K(in=in,load=d,address=address[2..13],out=outd); + Mux4Way16(a=outa,b=outb,c=outc,d=outd,sel=address[0..1],out=out); +} \ No newline at end of file diff --git a/projects/03/b/RAM16K.out b/projects/03/b/RAM16K.out new file mode 100755 index 0000000..a1ad9db --- /dev/null +++ b/projects/03/b/RAM16K.out @@ -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.tst b/projects/03/b/RAM16K.tst new file mode 100755 index 0000000..e556ad4 --- /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 100755 index 0000000..a614796 --- /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 100755 index 0000000..1f969ef --- /dev/null +++ b/projects/03/b/RAM4K.hdl @@ -0,0 +1,28 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/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: + DMux8Way(in=load,sel=address[0..2],a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + RAM512(in=in,load=a,address=address[3..11],out=outa); + RAM512(in=in,load=b,address=address[3..11],out=outb); + RAM512(in=in,load=c,address=address[3..11],out=outc); + RAM512(in=in,load=d,address=address[3..11],out=outd); + RAM512(in=in,load=e,address=address[3..11],out=oute); + RAM512(in=in,load=f,address=address[3..11],out=outf); + RAM512(in=in,load=g,address=address[3..11],out=outg); + RAM512(in=in,load=h,address=address[3..11],out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address[0..2],out=out); +} \ No newline at end of file diff --git a/projects/03/b/RAM4K.out b/projects/03/b/RAM4K.out new file mode 100755 index 0000000..a614796 --- /dev/null +++ b/projects/03/b/RAM4K.out @@ -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.tst b/projects/03/b/RAM4K.tst new file mode 100755 index 0000000..7a5aa12 --- /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 100755 index 0000000..6f756ca --- /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 100755 index 0000000..e62e717 --- /dev/null +++ b/projects/03/b/RAM512.hdl @@ -0,0 +1,28 @@ +// 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: + DMux8Way(in=load,sel=address[0..2],a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + RAM64(in=in,load=a,address=address[3..8],out=outa); + RAM64(in=in,load=b,address=address[3..8],out=outb); + RAM64(in=in,load=c,address=address[3..8],out=outc); + RAM64(in=in,load=d,address=address[3..8],out=outd); + RAM64(in=in,load=e,address=address[3..8],out=oute); + RAM64(in=in,load=f,address=address[3..8],out=outf); + RAM64(in=in,load=g,address=address[3..8],out=outg); + RAM64(in=in,load=h,address=address[3..8],out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address[0..2],out=out); +} \ No newline at end of file diff --git a/projects/03/b/RAM512.out b/projects/03/b/RAM512.out new file mode 100755 index 0000000..6f756ca --- /dev/null +++ b/projects/03/b/RAM512.out @@ -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.tst b/projects/03/b/RAM512.tst new file mode 100755 index 0000000..4ec6fc2 --- /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 100755 index 0000000..c96edc6 --- /dev/null +++ b/projects/04/Fill.asm @@ -0,0 +1,97 @@ +@END //check if button is pressed +0;JMP + +(BLACK) +//start= 16384 the start of the screen memory +@SCREEN +D=A +@start +M=D + +//n=8,192 this is the memory for the display =addreass of the keyboard - address of the screen +@8192 +D=A +@n +M=D + +//i=0 this is the index for each group of pixels +@i +M=0 + +(LOOP1) +//if i==n goto end +@i +D=M +@n +D=D-M +@END +D;JEQ + +//start+1=-1 set each group of pixels to -1 which is = 111111111111 +@start +D=M +@i +A=D+M +M=-1 + +// increment i by 1 +@i +M=M+1 + +// go back to the start of the loop +@LOOP1 +0;JMP + +(WHITE) +//start= 16384 the start of the screen memory +@SCREEN +D=A +@start +M=D + +//n=8,192 this is the memory for the display =addreass of the keyboard - address of the screen +@8192 +D=A +@n +M=D + +//i=0 this is the index for each group of pixels +@i +M=0 + +(LOOP2) +//if i==n goto end +@i +D=M +@n +D=D-M +@END +D;JEQ + +//start+1=-1 set each group of pixels to 0 which is = 00000000 +@start +D=M +@i +A=D+M +M=0 + +// increment i by 1 +@i +M=M+1 + +// go back to the start of the loop +@LOOP2 +0;JMP + +//check if button is pressed +(END) +@KBD +D=M +@WHITE +D;JEQ +@KBD +D=M +@BLACK +D;JNE +@END +0;JMP \ No newline at end of file diff --git a/projects/04/Mult.asm b/projects/04/Mult.asm new file mode 100755 index 0000000..59bb1ac --- /dev/null +++ b/projects/04/Mult.asm @@ -0,0 +1,24 @@ +@R2 +M=0 +@sum +M=0 +(LOOP) +@1 +D=M +@END +D;JEQ // if R1==0 goto end +@R0 +D=M // D=R0 +@sum +M=M+D // sum=sum+R0 +@R1 +M=M-1 //R1=R1-1 +@sum +D=M +@R2 +M=D +@LOOP +0;JMP +(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 100755 index 0000000..c96edc6 --- /dev/null +++ b/projects/04/fill/Fill.asm @@ -0,0 +1,97 @@ +@END //check if button is pressed +0;JMP + +(BLACK) +//start= 16384 the start of the screen memory +@SCREEN +D=A +@start +M=D + +//n=8,192 this is the memory for the display =addreass of the keyboard - address of the screen +@8192 +D=A +@n +M=D + +//i=0 this is the index for each group of pixels +@i +M=0 + +(LOOP1) +//if i==n goto end +@i +D=M +@n +D=D-M +@END +D;JEQ + +//start+1=-1 set each group of pixels to -1 which is = 111111111111 +@start +D=M +@i +A=D+M +M=-1 + +// increment i by 1 +@i +M=M+1 + +// go back to the start of the loop +@LOOP1 +0;JMP + +(WHITE) +//start= 16384 the start of the screen memory +@SCREEN +D=A +@start +M=D + +//n=8,192 this is the memory for the display =addreass of the keyboard - address of the screen +@8192 +D=A +@n +M=D + +//i=0 this is the index for each group of pixels +@i +M=0 + +(LOOP2) +//if i==n goto end +@i +D=M +@n +D=D-M +@END +D;JEQ + +//start+1=-1 set each group of pixels to 0 which is = 00000000 +@start +D=M +@i +A=D+M +M=0 + +// increment i by 1 +@i +M=M+1 + +// go back to the start of the loop +@LOOP2 +0;JMP + +//check if button is pressed +(END) +@KBD +D=M +@WHITE +D;JEQ +@KBD +D=M +@BLACK +D;JNE +@END +0;JMP \ No newline at end of file diff --git a/projects/04/fill/Fill.tst b/projects/04/fill/Fill.tst new file mode 100755 index 0000000..e8bb385 --- /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 100755 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 100755 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 100755 index 0000000..59bb1ac --- /dev/null +++ b/projects/04/mult/Mult.asm @@ -0,0 +1,24 @@ +@R2 +M=0 +@sum +M=0 +(LOOP) +@1 +D=M +@END +D;JEQ // if R1==0 goto end +@R0 +D=M // D=R0 +@sum +M=M+D // sum=sum+R0 +@R1 +M=M-1 //R1=R1-1 +@sum +D=M +@R2 +M=D +@LOOP +0;JMP +(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 100755 index 0000000..296b5fb --- /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.out b/projects/04/mult/Mult.out new file mode 100755 index 0000000..e69de29 diff --git a/projects/04/mult/Mult.tst b/projects/04/mult/Mult.tst new file mode 100755 index 0000000..9bf4fa8 --- /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/05/Add.hack b/projects/05/Add.hack new file mode 100755 index 0000000..fe5969d --- /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 100755 index 0000000..58f43bd --- /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.out b/projects/05/CPU-external.out new file mode 100755 index 0000000..89c74c3 --- /dev/null +++ b/projects/05/CPU-external.out @@ -0,0 +1,93 @@ +|time| inM | instruction |reset| outM |writeM |addre| pc | +|0+ | 0|0011000000111001| 0 | 0| 0 | 0| 0| +|1 | 0|0011000000111001| 0 | 0| 0 |12345| 1| +|1+ | 0|1110110000010000| 0 | 12345| 0 |12345| 1| +|2 | 0|1110110000010000| 0 | 12345| 0 |12345| 2| +|2+ | 0|0101101110100000| 0 | -1| 0 |12345| 2| +|3 | 0|0101101110100000| 0 | -1| 0 |23456| 3| +|3+ | 0|1110000111010000| 0 | 11111| 0 |23456| 3| +|4 | 0|1110000111010000| 0 | 12345| 0 |23456| 4| +|4+ | 0|0000001111101000| 0 | -11111| 0 |23456| 4| +|5 | 0|0000001111101000| 0 | -11111| 0 | 1000| 5| +|5+ | 0|1110001100001000| 0 | 11111| 1 | 1000| 5| +|6 | 0|1110001100001000| 0 | 11111| 1 | 1000| 6| +|6+ | 0|0000001111101001| 0 | -11111| 0 | 1000| 6| +|7 | 0|0000001111101001| 0 | -11111| 0 | 1001| 7| +|7+ | 0|1110001110011000| 0 | 11110| 1 | 1001| 7| +|8 | 0|1110001110011000| 0 | 11109| 1 | 1001| 8| +|8+ | 0|0000001111101000| 0 | -11110| 0 | 1001| 8| +|9 | 0|0000001111101000| 0 | -11110| 0 | 1000| 9| +|9+ | 11111|1111010011010000| 0 | -1| 0 | 1000| 9| +|10 | 11111|1111010011010000| 0 | -11112| 0 | 1000| 10| +|10+ | 11111|0000000000001110| 0 | 1000| 0 | 1000| 10| +|11 | 11111|0000000000001110| 0 | 14| 0 | 14| 11| +|11+ | 11111|1110001100000100| 0 | -1| 0 | 14| 11| +|12 | 11111|1110001100000100| 0 | -1| 0 | 14| 14| +|12+ | 11111|0000001111100111| 0 | 1| 0 | 14| 14| +|13 | 11111|0000001111100111| 0 | 1| 0 | 999| 15| +|13+ | 11111|1110110111100000| 0 | 1000| 0 | 999| 15| +|14 | 11111|1110110111100000| 0 | 1001| 0 | 1000| 16| +|14+ | 11111|1110001100001000| 0 | -1| 1 | 1000| 16| +|15 | 11111|1110001100001000| 0 | -1| 1 | 1000| 17| +|15+ | 11111|0000000000010101| 0 | 1000| 0 | 1000| 17| +|16 | 11111|0000000000010101| 0 | 21| 0 | 21| 18| +|16+ | 11111|1110011111000010| 0 | 0| 0 | 21| 18| +|17 | 11111|1110011111000010| 0 | 0| 0 | 21| 21| +|17+ | 11111|0000000000000010| 0 | 21| 0 | 21| 21| +|18 | 11111|0000000000000010| 0 | 2| 0 | 2| 22| +|18+ | 11111|1110000010010000| 0 | 1| 0 | 2| 22| +|19 | 11111|1110000010010000| 0 | 3| 0 | 2| 23| +|19+ | 11111|0000001111101000| 0 | -1| 0 | 2| 23| +|20 | 11111|0000001111101000| 0 | -1| 0 | 1000| 24| +|20+ | 11111|1110111010010000| 0 | -1| 0 | 1000| 24| +|21 | 11111|1110111010010000| 0 | -1| 0 | 1000| 25| +|21+ | 11111|1110001100000001| 0 | -1| 0 | 1000| 25| +|22 | 11111|1110001100000001| 0 | -1| 0 | 1000| 26| +|22+ | 11111|1110001100000010| 0 | -1| 0 | 1000| 26| +|23 | 11111|1110001100000010| 0 | -1| 0 | 1000| 27| +|23+ | 11111|1110001100000011| 0 | -1| 0 | 1000| 27| +|24 | 11111|1110001100000011| 0 | -1| 0 | 1000| 28| +|24+ | 11111|1110001100000100| 0 | -1| 0 | 1000| 28| +|25 | 11111|1110001100000100| 0 | -1| 0 | 1000| 1000| +|25+ | 11111|1110001100000101| 0 | -1| 0 | 1000| 1000| +|26 | 11111|1110001100000101| 0 | -1| 0 | 1000| 1000| +|26+ | 11111|1110001100000110| 0 | -1| 0 | 1000| 1000| +|27 | 11111|1110001100000110| 0 | -1| 0 | 1000| 1000| +|27+ | 11111|1110001100000111| 0 | -1| 0 | 1000| 1000| +|28 | 11111|1110001100000111| 0 | -1| 0 | 1000| 1000| +|28+ | 11111|1110101010010000| 0 | 0| 0 | 1000| 1000| +|29 | 11111|1110101010010000| 0 | 0| 0 | 1000| 1001| +|29+ | 11111|1110001100000001| 0 | 0| 0 | 1000| 1001| +|30 | 11111|1110001100000001| 0 | 0| 0 | 1000| 1002| +|30+ | 11111|1110001100000010| 0 | 0| 0 | 1000| 1002| +|31 | 11111|1110001100000010| 0 | 0| 0 | 1000| 1000| +|31+ | 11111|1110001100000011| 0 | 0| 0 | 1000| 1000| +|32 | 11111|1110001100000011| 0 | 0| 0 | 1000| 1000| +|32+ | 11111|1110001100000100| 0 | 0| 0 | 1000| 1000| +|33 | 11111|1110001100000100| 0 | 0| 0 | 1000| 1001| +|33+ | 11111|1110001100000101| 0 | 0| 0 | 1000| 1001| +|34 | 11111|1110001100000101| 0 | 0| 0 | 1000| 1002| +|34+ | 11111|1110001100000110| 0 | 0| 0 | 1000| 1002| +|35 | 11111|1110001100000110| 0 | 0| 0 | 1000| 1000| +|35+ | 11111|1110001100000111| 0 | 0| 0 | 1000| 1000| +|36 | 11111|1110001100000111| 0 | 0| 0 | 1000| 1000| +|36+ | 11111|1110111111010000| 0 | 1| 0 | 1000| 1000| +|37 | 11111|1110111111010000| 0 | 1| 0 | 1000| 1001| +|37+ | 11111|1110001100000001| 0 | 1| 0 | 1000| 1001| +|38 | 11111|1110001100000001| 0 | 1| 0 | 1000| 1000| +|38+ | 11111|1110001100000010| 0 | 1| 0 | 1000| 1000| +|39 | 11111|1110001100000010| 0 | 1| 0 | 1000| 1001| +|39+ | 11111|1110001100000011| 0 | 1| 0 | 1000| 1001| +|40 | 11111|1110001100000011| 0 | 1| 0 | 1000| 1000| +|40+ | 11111|1110001100000100| 0 | 1| 0 | 1000| 1000| +|41 | 11111|1110001100000100| 0 | 1| 0 | 1000| 1001| +|41+ | 11111|1110001100000101| 0 | 1| 0 | 1000| 1001| +|42 | 11111|1110001100000101| 0 | 1| 0 | 1000| 1000| +|42+ | 11111|1110001100000110| 0 | 1| 0 | 1000| 1000| +|43 | 11111|1110001100000110| 0 | 1| 0 | 1000| 1001| +|43+ | 11111|1110001100000111| 0 | 1| 0 | 1000| 1001| +|44 | 11111|1110001100000111| 0 | 1| 0 | 1000| 1000| +|44+ | 11111|1110001100000111| 1 | 1| 0 | 1000| 1000| +|45 | 11111|1110001100000111| 1 | 1| 0 | 1000| 0| +|45+ | 11111|0111111111111111| 0 | 1| 0 | 1000| 0| +|46 | 11111|0111111111111111| 0 | 1| 0 |32767| 1| diff --git a/projects/05/CPU-external.tst b/projects/05/CPU-external.tst new file mode 100755 index 0000000..5aa0295 --- /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 100755 index 0000000..345674c --- /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 100755 index 0000000..1b03712 --- /dev/null +++ b/projects/05/CPU.hdl @@ -0,0 +1,115 @@ +// This 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: + Mux16(a=instruction ,b=ALUout ,sel=instruction[15] ,out=outToAreg ); + ARegister(in=outToAreg ,load=loadAreg ,out=outAreg,out[0..14]=addressM ); + DRegister(in=ALUout ,load=loadDreg ,out=outDreg ); + Mux16(a=outAreg ,b=inM ,sel=instruction[12] ,out=outToALU ); + ALU(x=outDreg ,y=outToALU ,zx=instruction[11] ,nx=instruction[10] ,zy=instruction[9] ,ny=instruction[8] ,f=instruction[7] ,no=instruction[6] ,out=ALUout,out=outM ,zr=zr ,ng=ng ); + And(a=instruction[3],b=instruction[15],out=writeM); + + //when to load A reg + Not(in=instruction[5],out=notd5); + Nand(a=instruction[15],b=notd5,out=loadAreg); + Not(in=ng,out=notNg); + Not(in=zr,out=notZr); + + //when to load D reg + And(a=instruction[4],b=instruction[15],out=loadDreg); + + //checking if instruction is a or c before jump decision is made + And(a=instruction[2],b=instruction[15],out=J1); + And(a=instruction[1],b=instruction[15],out=J2); + And(a=instruction[0],b=instruction[15],out=J3); + + //NULL + Nand(a=J1,b=J2,out=NandJ1J2); + Nand(a=NandJ1J2,b=J3,out=NoJump); + //JGT + And(a=J3,b=J3,out=AndJ3J3); + Or(a=zr,b=ng,out=orZrNg); + Not(in=orZrNg,out=NorZrNg); + And(a=AndJ3J3,b=NorZrNg,out=JGT); + + //JEQ + And(a=J2,b=J2,out=AndJ2J2); + And(a=zr,b=zr,out=AndZrZr); + And(a=AndZrZr,b=AndJ2J2,out=JEQ); + + //JGE + And(a=J3,b=J2,out=AndJ3J2); + Or(a=zr,b=notNg,out=AndZrNotNg); + And(a=AndZrNotNg,b=AndJ3J2,out=JGE); + + //JLT + And(a=J1,b=J1,out=AndJ1J1); + And(a=ng,b=ng,out=AndNgNg); + And(a=AndJ1J1,b=AndNgNg,out=JLT); + + //JNE + And(a=J3,b=J1,out=AndJ3J1); + And(a=notZr,b=notZr,out=AndNotZrNotZr); + And(a=AndNotZrNotZr,b=AndJ3J1,out=JNE); + + //JLE + And(a=J2,b=J1,out=AndJ2J1); + And(a=AndJ2J1,b=orZrNg,out=JLE); + + //JMP + And(a=AndJ3J1,b=J2,out=JMP); + + Not(in=outToLoad,out=outToLoad1); // once needted to know when to increes but also needed to not it so it dosent load the reg when J1J2J3=000 + + //4wayMux one + Mux(a=JMP,b=JGT,sel=instruction[0] ,out=out1); + Mux(a=JEQ,b=JGE,sel=instruction[0] ,out=out2); + Mux(a=out1,b=out2, sel=instruction[1] ,out=out5); + + //4wayMux two + Mux(a=JLT,b=JNE,sel=instruction[0] ,out=out3); + Mux(a=JLE,b=JMP,sel=instruction[0] ,out=out4); + Mux(a=out3,b=out4,sel=instruction[1] ,out=out6); + + //2wayMux + Mux(a=out5,b=out6,sel= instruction[2],out=outToLoad); + + PC(in=outAreg ,load=outToLoad ,inc=outToLoad1 ,reset=reset ,out[0..14]=pc); +} \ No newline at end of file diff --git a/projects/05/CPU.out b/projects/05/CPU.out new file mode 100755 index 0000000..2d5391a --- /dev/null +++ b/projects/05/CPU.out @@ -0,0 +1,93 @@ +|time| inM | instruction |reset| outM |writeM |addre| pc |DRegiste| +|0+ | 0|0011000000111001| 0 | 0| 0 | 0| 0| 0 | +|1 | 0|0011000000111001| 0 | 0| 0 |12345| 1| 0 | +|1+ | 0|1110110000010000| 0 | 12345| 0 |12345| 1| 12345 | +|2 | 0|1110110000010000| 0 | 12345| 0 |12345| 2| 12345 | +|2+ | 0|0101101110100000| 0 | -1| 0 |12345| 2| 12345 | +|3 | 0|0101101110100000| 0 | -1| 0 |23456| 3| 12345 | +|3+ | 0|1110000111010000| 0 | 11111| 0 |23456| 3| 11111 | +|4 | 0|1110000111010000| 0 | 12345| 0 |23456| 4| 11111 | +|4+ | 0|0000001111101000| 0 | -11111| 0 |23456| 4| 11111 | +|5 | 0|0000001111101000| 0 | -11111| 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 | -11111| 0 | 1000| 6| 11111 | +|7 | 0|0000001111101001| 0 | -11111| 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 | -11110| 0 | 1001| 8| 11110 | +|9 | 0|0000001111101000| 0 | -11110| 0 | 1000| 9| 11110 | +|9+ | 11111|1111010011010000| 0 | -1| 0 | 1000| 9| -1 | +|10 | 11111|1111010011010000| 0 | -11112| 0 | 1000| 10| -1 | +|10+ | 11111|0000000000001110| 0 | 1000| 0 | 1000| 10| -1 | +|11 | 11111|0000000000001110| 0 | 14| 0 | 14| 11| -1 | +|11+ | 11111|1110001100000100| 0 | -1| 0 | 14| 11| -1 | +|12 | 11111|1110001100000100| 0 | -1| 0 | 14| 14| -1 | +|12+ | 11111|0000001111100111| 0 | 1| 0 | 14| 14| -1 | +|13 | 11111|0000001111100111| 0 | 1| 0 | 999| 15| -1 | +|13+ | 11111|1110110111100000| 0 | 1000| 0 | 999| 15| -1 | +|14 | 11111|1110110111100000| 0 | 1001| 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 | 1000| 0 | 1000| 17| -1 | +|16 | 11111|0000000000010101| 0 | 21| 0 | 21| 18| -1 | +|16+ | 11111|1110011111000010| 0 | 0| 0 | 21| 18| -1 | +|17 | 11111|1110011111000010| 0 | 0| 0 | 21| 21| -1 | +|17+ | 11111|0000000000000010| 0 | 21| 0 | 21| 21| -1 | +|18 | 11111|0000000000000010| 0 | 2| 0 | 2| 22| -1 | +|18+ | 11111|1110000010010000| 0 | 1| 0 | 2| 22| 1 | +|19 | 11111|1110000010010000| 0 | 3| 0 | 2| 23| 1 | +|19+ | 11111|0000001111101000| 0 | -1| 0 | 2| 23| 1 | +|20 | 11111|0000001111101000| 0 | -1| 0 | 1000| 24| 1 | +|20+ | 11111|1110111010010000| 0 | -1| 0 | 1000| 24| -1 | +|21 | 11111|1110111010010000| 0 | -1| 0 | 1000| 25| -1 | +|21+ | 11111|1110001100000001| 0 | -1| 0 | 1000| 25| -1 | +|22 | 11111|1110001100000001| 0 | -1| 0 | 1000| 26| -1 | +|22+ | 11111|1110001100000010| 0 | -1| 0 | 1000| 26| -1 | +|23 | 11111|1110001100000010| 0 | -1| 0 | 1000| 27| -1 | +|23+ | 11111|1110001100000011| 0 | -1| 0 | 1000| 27| -1 | +|24 | 11111|1110001100000011| 0 | -1| 0 | 1000| 28| -1 | +|24+ | 11111|1110001100000100| 0 | -1| 0 | 1000| 28| -1 | +|25 | 11111|1110001100000100| 0 | -1| 0 | 1000| 1000| -1 | +|25+ | 11111|1110001100000101| 0 | -1| 0 | 1000| 1000| -1 | +|26 | 11111|1110001100000101| 0 | -1| 0 | 1000| 1000| -1 | +|26+ | 11111|1110001100000110| 0 | -1| 0 | 1000| 1000| -1 | +|27 | 11111|1110001100000110| 0 | -1| 0 | 1000| 1000| -1 | +|27+ | 11111|1110001100000111| 0 | -1| 0 | 1000| 1000| -1 | +|28 | 11111|1110001100000111| 0 | -1| 0 | 1000| 1000| -1 | +|28+ | 11111|1110101010010000| 0 | 0| 0 | 1000| 1000| 0 | +|29 | 11111|1110101010010000| 0 | 0| 0 | 1000| 1001| 0 | +|29+ | 11111|1110001100000001| 0 | 0| 0 | 1000| 1001| 0 | +|30 | 11111|1110001100000001| 0 | 0| 0 | 1000| 1002| 0 | +|30+ | 11111|1110001100000010| 0 | 0| 0 | 1000| 1002| 0 | +|31 | 11111|1110001100000010| 0 | 0| 0 | 1000| 1000| 0 | +|31+ | 11111|1110001100000011| 0 | 0| 0 | 1000| 1000| 0 | +|32 | 11111|1110001100000011| 0 | 0| 0 | 1000| 1000| 0 | +|32+ | 11111|1110001100000100| 0 | 0| 0 | 1000| 1000| 0 | +|33 | 11111|1110001100000100| 0 | 0| 0 | 1000| 1001| 0 | +|33+ | 11111|1110001100000101| 0 | 0| 0 | 1000| 1001| 0 | +|34 | 11111|1110001100000101| 0 | 0| 0 | 1000| 1002| 0 | +|34+ | 11111|1110001100000110| 0 | 0| 0 | 1000| 1002| 0 | +|35 | 11111|1110001100000110| 0 | 0| 0 | 1000| 1000| 0 | +|35+ | 11111|1110001100000111| 0 | 0| 0 | 1000| 1000| 0 | +|36 | 11111|1110001100000111| 0 | 0| 0 | 1000| 1000| 0 | +|36+ | 11111|1110111111010000| 0 | 1| 0 | 1000| 1000| 1 | +|37 | 11111|1110111111010000| 0 | 1| 0 | 1000| 1001| 1 | +|37+ | 11111|1110001100000001| 0 | 1| 0 | 1000| 1001| 1 | +|38 | 11111|1110001100000001| 0 | 1| 0 | 1000| 1000| 1 | +|38+ | 11111|1110001100000010| 0 | 1| 0 | 1000| 1000| 1 | +|39 | 11111|1110001100000010| 0 | 1| 0 | 1000| 1001| 1 | +|39+ | 11111|1110001100000011| 0 | 1| 0 | 1000| 1001| 1 | +|40 | 11111|1110001100000011| 0 | 1| 0 | 1000| 1000| 1 | +|40+ | 11111|1110001100000100| 0 | 1| 0 | 1000| 1000| 1 | +|41 | 11111|1110001100000100| 0 | 1| 0 | 1000| 1001| 1 | +|41+ | 11111|1110001100000101| 0 | 1| 0 | 1000| 1001| 1 | +|42 | 11111|1110001100000101| 0 | 1| 0 | 1000| 1000| 1 | +|42+ | 11111|1110001100000110| 0 | 1| 0 | 1000| 1000| 1 | +|43 | 11111|1110001100000110| 0 | 1| 0 | 1000| 1001| 1 | +|43+ | 11111|1110001100000111| 0 | 1| 0 | 1000| 1001| 1 | +|44 | 11111|1110001100000111| 0 | 1| 0 | 1000| 1000| 1 | +|44+ | 11111|1110001100000111| 1 | 1| 0 | 1000| 1000| 1 | +|45 | 11111|1110001100000111| 1 | 1| 0 | 1000| 0| 1 | +|45+ | 11111|0111111111111111| 0 | 1| 0 | 1000| 0| 1 | +|46 | 11111|0111111111111111| 0 | 1| 0 |32767| 1| 1 | diff --git a/projects/05/CPU.tst b/projects/05/CPU.tst new file mode 100755 index 0000000..98eee1c --- /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 100755 index 0000000..ea198e4 --- /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: + CPU(inM=inM ,instruction=inst ,reset=reset ,outM=outM ,writeM=writeM ,addressM=addressM ,pc=pc ); + Memory(in=outM ,load=writeM ,address= addressM,out=inM ); + ROM32K(address=pc ,out=inst ); +} diff --git a/projects/05/ComputerAdd-external.cmp b/projects/05/ComputerAdd-external.cmp new file mode 100755 index 0000000..a3a8eaf --- /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.out b/projects/05/ComputerAdd-external.out new file mode 100755 index 0000000..a3a8eaf --- /dev/null +++ b/projects/05/ComputerAdd-external.out @@ -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 100755 index 0000000..09cc1a7 --- /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 100755 index 0000000..f295464 --- /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.out b/projects/05/ComputerAdd.out new file mode 100755 index 0000000..f295464 --- /dev/null +++ b/projects/05/ComputerAdd.out @@ -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 100755 index 0000000..27f4411 --- /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 100755 index 0000000..f864733 --- /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.out b/projects/05/ComputerMax-external.out new file mode 100755 index 0000000..f864733 --- /dev/null +++ b/projects/05/ComputerMax-external.out @@ -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 100755 index 0000000..52b6bef --- /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 100755 index 0000000..42276cd --- /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.out b/projects/05/ComputerMax.out new file mode 100755 index 0000000..42276cd --- /dev/null +++ b/projects/05/ComputerMax.out @@ -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 100755 index 0000000..e090754 --- /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 100755 index 0000000..f276922 --- /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.out b/projects/05/ComputerRect-external.out new file mode 100755 index 0000000..f276922 --- /dev/null +++ b/projects/05/ComputerRect-external.out @@ -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 100755 index 0000000..f9102f7 --- /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 100755 index 0000000..a6b5cc9 --- /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.out b/projects/05/ComputerRect.out new file mode 100755 index 0000000..a6b5cc9 --- /dev/null +++ b/projects/05/ComputerRect.out @@ -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 100755 index 0000000..b1e2126 --- /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 100755 index 0000000..2e04a8d --- /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 100755 index 0000000..613d171 --- /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 100755 index 0000000..6aff3c3 --- /dev/null +++ b/projects/05/Memory.hdl @@ -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/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: + DMux4Way(in=load,sel[0]=address[13],sel[1]=address[14] ,a=ram16k ,b=ram16k2,c=ramScreen); + Or(a=ram16k ,b=ram16k2 ,out=ram16end); + RAM16K(in=in ,load=ram16end ,address=address[0..13] ,out=out1); + Screen(in=in ,load=ramScreen ,address=address[0..12] ,out=out2); + Keyboard(out=outKey); + Mux4Way16(a=out1 ,b=out1 ,c=out2 ,d=outKey ,sel[0]=address[13],sel[1]=address[14] ,out=out); +} \ No newline at end of file diff --git a/projects/05/Memory.out b/projects/05/Memory.out new file mode 100755 index 0000000..613d171 --- /dev/null +++ b/projects/05/Memory.out @@ -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.tst b/projects/05/Memory.tst new file mode 100755 index 0000000..f712a48 --- /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 100755 index 0000000..ee017ab --- /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/add/Add.asm b/projects/06/add/Add.asm new file mode 100755 index 0000000..fbd1688 --- /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/assembler_final_not_refined.py b/projects/06/assembler_final_not_refined.py new file mode 100755 index 0000000..22765fd --- /dev/null +++ b/projects/06/assembler_final_not_refined.py @@ -0,0 +1,230 @@ +def a_instruct(string): # covert the A instruction to bits + string = string.strip('@\n') + x = "{0:b}".format(int(string)) # convert the number to binary, problem if the number is too big + while len(x) < 16: # need to be 16 bits and 1 for \n + x = "0" + x + return x # return th 16 bit value + + +def c_instruct(string): # priema edna liniq koeto e edna instrukciq i q prevryshta v bit kod + string = string + "\n" + flag1, flag2, p = 0, 0, 0 + dest_s = '' + comp_s = '' + jump_s = '' + for c in range(len(string)): + if string[c] == '=': # ako ima ravno znachi predi nego ima destination + i = 0 + flag1 = 1 # diga flag za destination + while i < c: + p = c + dest_s += string[i] + i += 1 + dest_s = destDic.get(dest_s) # convert t to Destination + if string[c] == ';': # ako ima ; znachi predi nego ima computation + flag2 = 1 # diga flag za Jump + if flag1 == 0: # ako flaga za destination ne e dignat zapochvame ot nachaloto na liniqta + p = 0 + else: # ako e zapochvame ot kydeto e ravnoto koeto se pazi vyv var i + p = i + while p < c: + comp_s += string[p] + p += 1 + comp_s = compDic.get(comp_s) # convert t1 to Computation + + if string[c] == '\n': + if flag2 == 1: # ako ima flag za jump to vzimame stoinosta na jumpa + j = p + 1 + while j < c: + jump_s += string[j] + j += 1 + jump_s = jumpDic.get(jump_s) + else: # ako nqma togava vzima stoinosta na computationa + j = i + 1 + while j < c: + comp_s += string[j] + j += 1 + comp_s = compDic.get(comp_s) + final_result = '111' + comp_s # dobavqme 111 koeto e standart za C instrukt i computation bez koeto nqma instrukciq + if dest_s != '': # ako e imalo dest go dobavqme + final_result = final_result + dest_s + else: # inache dobavqme 3 nuli + final_result = final_result + '000' + if jump_s != '': # ako e imalo jump go dobavqme + final_result = final_result + jump_s + else: # inache dobavqme 3 nuli + final_result = final_result + '000' + return final_result + + +def check_a_or_c(temp_string): + line = '' + temp_string1 = '' + for j in temp_string: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + for index in range(len(line)): # proverqva vseki simvol ot liniqta + if line[index] == "@": # ako liniqta zapochva s @ znachi e a instrukciq + temp_string1 += a_instruct(line) + '\n' + line = '' + break + else: # ako ne zapochva s @ znachi e C instrukciq + temp_string1 += c_instruct(line) + '\n' + line = '' + break + return temp_string1 + + +def clear_file(temp_string_cf): # clears the empty lines, comments and spaces and writes them in a string + for line in asmfile: + f = 0 + if line == '\n': # removes empty lines + continue + for index in range(len(line)): + if line[index] == "/" and line[index + 1] == '/': # checks if it is comment + if f == 1: # maybe a problem if the last element of a line is / since it will stay + temp_string_cf += '\n' + break + if line[index] != ' ': # removes all of the whitespaces except newlines + temp_string_cf += line[index] + f = 1 + return temp_string_cf + + +def label(temp_string): # removes the labels and adds them to the dictionary writes all in a string + line = '' + temp_string_l = '' + global rowasm + for j in temp_string: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + f = 0 + for index in range(len(line)): # loops through the lines char by char + if line[index] == "(": + # checks if it is a label, will be a problem if there is only "(" and no closing bracket alse need to check label syntax + if bool(labelDic.get(line.strip('()'))) == False: # check if label is already in the Dictionary + labelDic[line.strip("()")] = str(rowasm) # adds the label to the dictionary + rowasm -= 1 # need to pay attention to the counting cause im not sure + f = 1 + break # brake so i don't write this line in the string since it needs to be removed + if f != 1: + temp_string_l += line + temp_string_l += '\n' + rowasm += 1 + line = '' + return temp_string_l + + +def variable(temp_string): # replaces the variables with the correct address + global variableCount + line = '' + temp_string_v = '' + for j in temp_string: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + for index in range(len(line)): + if line[index] == '@' and numbers.find(line[index + 1]) < 0: # checks if the line holds a variable + if bool(labelDic.get(line.strip('@'))): # check if variable is already in the Dictionary + line = '@' + labelDic[line.strip('@')] # replaces the variable with address i hope + else: + labelDic[line.strip('@')] = str(variableCount) # if isn't it adds it + line = '@' + str(variableCount) # replaces the variable with address i hope + variableCount += 1 # increases the variable counter so i don't write them all in address 16 + break + temp_string_v += line + '\n' # appends the line to the string + line = '' + return temp_string_v + + +destDic = {'None': '000', + 'M': '001', + 'D': '010', + 'MD': '011', + 'A': '100', + 'AM': '101', + 'AD': '110', + 'AMD': '111', } # contains all destinations and their bit equivalent +jumpDic = {'None': '000', + 'JGT': '001', + 'JQE': '010', + 'JGE': '011', + 'JLT': '100', + 'JNE': '101', + 'JLE': '110', + 'JMP': '111', } # contains all jumps and their bit equivalent +compDic = {'0': '0101010', + '1': '0111111', + '-1': '0111010', + 'D': '0001100', + 'A': '0110000', + '!D': '0001101', + '!A': '0110001', + '-D': '0001111', + '-A': '0110011', + 'D+1': '0011111', + 'A+1': '0110111', + 'D-1': '0001110', + 'A-1': '0110010', + 'D+A': '0000010', + 'D-A': '0010011', + 'A-D': '0000111', + 'D&A': '0000000', + 'D|A': '0010101', + 'M': '1110000', + '!M': '1110001', + '-M': '1110011', + 'M+1': '1110111', + 'M-1': '1110010', + 'D+M': '1000010', + 'D-M': '1010011', + 'M-D': '1000111', + 'D&M': '1000000', + 'D|M': '1010101', + } # contains all computations and their bit equivalent +tempString = '' # create empty string +rowasm = 0 +numbers = '0123456789' # used to check if given instruction calls to variable +variableCount = 16 # keeps count of the variable address + +labelDic = {'SP': '0', + 'LCL': '1', + 'ARG': '2', + 'THIS': '3', + 'THAT': '4', + 'SCREEN': '16384', + 'KBD': '24576', + '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', + } # dictionary containing Labels and Variables in format: AddressNumber : LabelName/ VariableName +with open("C:/Users/AGrudev/Desktop/n2t/nand2tetris/projects/06/pong/Pong.asm", "r+") as asmfile: + tempString = clear_file(tempString) +print(tempString + '----------') + +tempString = label(tempString) +print(tempString + '----------') + +tempString = variable(tempString) +print(tempString + '----------') + +tempString = check_a_or_c(tempString) +print(tempString + '----------') + +with open("C:/Users/AGrudev/Desktop/n2t/nand2tetris/projects/06/pong/Pong.hack", "w+") as destfile: + destfile.write(tempString) diff --git a/projects/06/max/Max.asm b/projects/06/max/Max.asm new file mode 100755 index 0000000..b62c138 --- /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 100755 index 0000000..2e04a8d --- /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 100755 index 0000000..fc3ccbf --- /dev/null +++ b/projects/06/max/MaxL.asm @@ -0,0 +1,23 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/06/max/MaxL.asm + +// Symbol-less version of the Max.asm program. + +@0 +D=M +@1 +D=D-M +@10 +D;JGT +@1 +D=M +@12 +0;JMP +@0 +D=M +@2 +M=D +@14 +0;JMP diff --git a/projects/06/pong/Pong.asm b/projects/06/pong/Pong.asm new file mode 100755 index 0000000..79691f0 --- /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 100755 index 0000000..3a83e2b --- /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 100755 index 0000000..17c1044 --- /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/rect/Rect.asm b/projects/06/rect/Rect.asm new file mode 100755 index 0000000..6cbbaeb --- /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 100755 index 0000000..ee017ab --- /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 100755 index 0000000..e97c09b --- /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 100755 index 0000000..b2ce277 --- /dev/null +++ b/projects/07/MemoryAccess/BasicTest/BasicTest.asm @@ -0,0 +1,232 @@ +@10 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@0 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@0 +D=A +@LCL +M=M-D +@21 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@22 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@2 +D=A +@ARG +M=M+D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@2 +D=A +@ARG +M=M-D +@1 +D=A +@ARG +M=M+D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@1 +D=A +@ARG +M=M-D +@36 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@6 +D=A +@THIS +M=M+D +@SP +M=M-1 +A=M +D=M +@THIS +A=M +M=D +@6 +D=A +@THIS +M=M-D +@42 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@45 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@5 +D=A +@THAT +M=M+D +@SP +M=M-1 +A=M +D=M +@THAT +A=M +M=D +@5 +D=A +@THAT +M=M-D +@2 +D=A +@THAT +M=M+D +@SP +M=M-1 +A=M +D=M +@THAT +A=M +M=D +@2 +D=A +@THAT +M=M-D +@510 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +@11 +M=D +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +@5 +D=A +@THAT +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +@6 +D=A +@THIS +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +@6 +D=A +@THIS +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +@11 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D diff --git a/projects/07/MemoryAccess/BasicTest/BasicTest.cmp b/projects/07/MemoryAccess/BasicTest/BasicTest.cmp new file mode 100755 index 0000000..538454b --- /dev/null +++ b/projects/07/MemoryAccess/BasicTest/BasicTest.cmp @@ -0,0 +1,2 @@ +|RAM[256]|RAM[300]|RAM[401]|RAM[402]|RAM[3006|RAM[3012|RAM[3015|RAM[11] | +| 472 | 10 | 21 | 22 | 36 | 42 | 45 | 510 | diff --git a/projects/07/MemoryAccess/BasicTest/BasicTest.out b/projects/07/MemoryAccess/BasicTest/BasicTest.out new file mode 100755 index 0000000..538454b --- /dev/null +++ b/projects/07/MemoryAccess/BasicTest/BasicTest.out @@ -0,0 +1,2 @@ +|RAM[256]|RAM[300]|RAM[401]|RAM[402]|RAM[3006|RAM[3012|RAM[3015|RAM[11] | +| 472 | 10 | 21 | 22 | 36 | 42 | 45 | 510 | diff --git a/projects/07/MemoryAccess/BasicTest/BasicTest.tst b/projects/07/MemoryAccess/BasicTest/BasicTest.tst new file mode 100755 index 0000000..fa6d9a6 --- /dev/null +++ b/projects/07/MemoryAccess/BasicTest/BasicTest.tst @@ -0,0 +1,25 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/07/MemoryAccess/BasicTest/BasicTest.tst + +load BasicTest.asm, +output-file BasicTest.out, +compare-to BasicTest.cmp, +output-list RAM[256]%D1.6.1 RAM[300]%D1.6.1 RAM[401]%D1.6.1 + RAM[402]%D1.6.1 RAM[3006]%D1.6.1 RAM[3012]%D1.6.1 + RAM[3015]%D1.6.1 RAM[11]%D1.6.1; + +set RAM[0] 256, // stack pointer +set RAM[1] 300, // base address of the local segment +set RAM[2] 400, // base address of the argument segment +set RAM[3] 3000, // base address of the this segment +set RAM[4] 3010, // base address of the that segment + +repeat 600 { // enough cycles to complete the execution + ticktock; +} + +// Outputs the stack base and some values +// from the tested memory segments +output; diff --git a/projects/07/MemoryAccess/BasicTest/BasicTest.vm b/projects/07/MemoryAccess/BasicTest/BasicTest.vm new file mode 100755 index 0000000..b2f9343 --- /dev/null +++ b/projects/07/MemoryAccess/BasicTest/BasicTest.vm @@ -0,0 +1,31 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/07/MemoryAccess/BasicTest/BasicTest.vm + +// Executes pop and push commands using the virtual memory segments. +push constant 10 +pop local 0 +push constant 21 +push constant 22 +pop argument 2 +pop argument 1 +push constant 36 +pop this 6 +push constant 42 +push constant 45 +pop that 5 +pop that 2 +push constant 510 +pop temp 6 +push local 0 +push that 5 +add +push argument 1 +sub +push this 6 +push this 6 +add +sub +push temp 6 +add diff --git a/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst b/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst new file mode 100755 index 0000000..24e9090 --- /dev/null +++ b/projects/07/MemoryAccess/BasicTest/BasicTestVME.tst @@ -0,0 +1,25 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/07/MemoryAccess/BasicTest/BasicTestVME.tst + +load BasicTest.vm, +output-file BasicTest.out, +compare-to BasicTest.cmp, +output-list RAM[256]%D1.6.1 RAM[300]%D1.6.1 RAM[401]%D1.6.1 + RAM[402]%D1.6.1 RAM[3006]%D1.6.1 RAM[3012]%D1.6.1 + RAM[3015]%D1.6.1 RAM[11]%D1.6.1; + +set sp 256, // stack pointer +set local 300, // base address of the local segment +set argument 400, // base address of the argument segment +set this 3000, // base address of the this segment +set that 3010, // base address of the that segment + +repeat 25 { // BasicTest.vm has 25 instructions + vmstep; +} + +// Outputs the stack base and some values +// from the tested memory segments +output; diff --git a/projects/07/MemoryAccess/PointerTest/PointerTest.asm b/projects/07/MemoryAccess/PointerTest/PointerTest.asm new file mode 100755 index 0000000..597ce79 --- /dev/null +++ b/projects/07/MemoryAccess/PointerTest/PointerTest.asm @@ -0,0 +1,122 @@ +@3030 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +@3 +M=D +@3040 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +@4 +M=D +@32 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@2 +D=A +@THIS +M=M+D +@SP +M=M-1 +A=M +D=M +@THIS +A=M +M=D +@2 +D=A +@THIS +M=M-D +@46 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@6 +D=A +@THAT +M=M+D +@SP +M=M-1 +A=M +D=M +@THAT +A=M +M=D +@6 +D=A +@THAT +M=M-D +@3 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@4 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +@2 +D=A +@THIS +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +@6 +D=A +@THAT +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D diff --git a/projects/07/MemoryAccess/PointerTest/PointerTest.cmp b/projects/07/MemoryAccess/PointerTest/PointerTest.cmp new file mode 100755 index 0000000..b59fa97 --- /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 100755 index 0000000..cd5515d --- /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 100755 index 0000000..5b0a109 --- /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 100755 index 0000000..1b395c2 --- /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 100755 index 0000000..4c667e6 --- /dev/null +++ b/projects/07/MemoryAccess/StaticTest/StaticTest.asm @@ -0,0 +1,72 @@ +@111 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@333 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@888 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +@StaticTest.vm.8 +M=D +@SP +M=M-1 +A=M +D=M +@StaticTest.vm.3 +M=D +@SP +M=M-1 +A=M +D=M +@StaticTest.vm.1 +M=D +@StaticTest.vm.3 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@StaticTest.vm.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +@StaticTest.vm.8 +D=M +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D diff --git a/projects/07/MemoryAccess/StaticTest/StaticTest.cmp b/projects/07/MemoryAccess/StaticTest/StaticTest.cmp new file mode 100755 index 0000000..29f4bf0 --- /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 100755 index 0000000..1f23d66 --- /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 100755 index 0000000..65b4f6f --- /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 100755 index 0000000..52882a4 --- /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 100755 index 0000000..09e0b11 --- /dev/null +++ b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.asm @@ -0,0 +1,20 @@ +@7 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@8 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D diff --git a/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp b/projects/07/StackArithmetic/SimpleAdd/SimpleAdd.cmp new file mode 100755 index 0000000..7a3585b --- /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 100755 index 0000000..02dece3 --- /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 100755 index 0000000..cfd4ee9 --- /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 100755 index 0000000..5010f4f --- /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 100755 index 0000000..4449f2a --- /dev/null +++ b/projects/07/StackArithmetic/StackTest/StackTest.asm @@ -0,0 +1,373 @@ +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE0 +D;JEQ +@SP +A=M +A=A-1 +M=0 +@FALSE0 +0;JMP +(TRUE0) +@SP +A=M +A=A-1 +M=-1 +(FALSE0) +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@16 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE1 +D;JEQ +@SP +A=M +A=A-1 +M=0 +@FALSE1 +0;JMP +(TRUE1) +@SP +A=M +A=A-1 +M=-1 +(FALSE1) +@16 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@17 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE2 +D;JEQ +@SP +A=M +A=A-1 +M=0 +@FALSE2 +0;JMP +(TRUE2) +@SP +A=M +A=A-1 +M=-1 +(FALSE2) +@892 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE3 +D;JLT +@SP +A=M +A=A-1 +M=0 +@FALSE3 +0;JMP +(TRUE3) +@SP +A=M +A=A-1 +M=-1 +(FALSE3) +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@892 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE4 +D;JLT +@SP +A=M +A=A-1 +M=0 +@FALSE4 +0;JMP +(TRUE4) +@SP +A=M +A=A-1 +M=-1 +(FALSE4) +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@891 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE5 +D;JLT +@SP +A=M +A=A-1 +M=0 +@FALSE5 +0;JMP +(TRUE5) +@SP +A=M +A=A-1 +M=-1 +(FALSE5) +@32767 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE6 +D;JGT +@SP +A=M +A=A-1 +M=0 +@FALSE6 +0;JMP +(TRUE6) +@SP +A=M +A=A-1 +M=-1 +(FALSE6) +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@32767 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE7 +D;JGT +@SP +A=M +A=A-1 +M=0 +@FALSE7 +0;JMP +(TRUE7) +@SP +A=M +A=A-1 +M=-1 +(FALSE7) +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@32766 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE8 +D;JGT +@SP +A=M +A=A-1 +M=0 +@FALSE8 +0;JMP +(TRUE8) +@SP +A=M +A=A-1 +M=-1 +(FALSE8) +@57 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@31 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@53 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +@112 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +@SP +A=M +A=A-1 +M=-M +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M&D +@82 +D=A +@SP +A=M +M=D +@SP +M=M+1 +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M|D +@SP +A=M +A=A-1 +M=!M diff --git a/projects/07/StackArithmetic/StackTest/StackTest.cmp b/projects/07/StackArithmetic/StackTest/StackTest.cmp new file mode 100755 index 0000000..f90fa1b --- /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 100755 index 0000000..f9c5396 --- /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 100755 index 0000000..bfe78e0 --- /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 100755 index 0000000..b66bd05 --- /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/07/VMTranslator.py b/projects/07/VMTranslator.py new file mode 100755 index 0000000..9afbca4 --- /dev/null +++ b/projects/07/VMTranslator.py @@ -0,0 +1,160 @@ +import os +import sys +from pathlib import Path + +trueCounter = 0 +falseCounter = 0 +staticCounter = 16 + + +def clear_file(temp_string_cf, asmfile): # clears the empty lines, comments and spaces and writes them in a string + for line in asmfile: + f = 0 + if line == '\n': # removes empty lines + continue + for index in range(len(line)): + if line[index] == "/" and line[index + 1] == '/': # checks if it is comment + if f == 1: # maybe a problem if the last element of a line is / since it will stay + temp_string_cf += '\n' + break + if line[index] != ' ': # removes all of the whitespaces except newlines + temp_string_cf += line[index] + f = 1 + return temp_string_cf + + +def push(line): + global tempString1 + if line[4:8] == 'this': + number = int(line[8:]) + line = '@' + str(number) + '\nD=A\n@THIS\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:8] == 'that': + number = int(line[8:]) + line = '@' + str(number) + '\nD=A\n@THAT\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:8] == 'temp': + number = int(line[8:]) + number += 5 + line = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:9] == 'local': + number = int(line[9:]) + line = '@' + str(number) + '\nD=A\n@LCL\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:10] == 'static': + number = int(line[10:]) + line = '@' + name1 + '.' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:11] == 'pointer': + number = int(line[11:]) + number += 3 + line = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:12] == 'argument': + number = int(line[12:]) + line = '@' + str(number) + '\nD=A\n@ARG\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:12] == 'constant': + number = line[12:] + line = '@' + str(number) + '\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + tempString1 += line + + +def pop(line): + global SP + global tempString1 + if line[3:7] == 'this': + number = int(line[7:]) + line = '@' + str(number) + '\nD=A\n@THIS\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THIS\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THIS\nM=M-D\n' + elif line[3:7] == 'that': + number = int(line[7:]) + line = '@' + str(number) + '\nD=A\n@THAT\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THAT\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THAT\nM=M-D\n' + elif line[3:7] == 'temp': + number = int(line[7:]) + number = number + 5 + line = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n' + elif line[3:8] == 'local': + number = int(line[8:]) + line = '@' + str(number) + '\nD=A\n@LCL\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@LCL\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@LCL\nM=M-D\n' + elif line[3:9] == 'static': + number = int(line[9:]) + line = '@SP\nM=M-1\nA=M\nD=M\n@' + name1 + '.' + str(number) + '\nM=D\n' + elif line[3:10] == 'pointer': + number = int(line[10:]) + number = number + 3 + line = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n' + elif line[3:11] == 'argument': + number = int(line[11:]) + line = '@' + str(number) + '\nD=A\n@ARG\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@ARG\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@ARG\nM=M-D\n' + tempString1 += line + + +def aritmetic(line): + global trueCounter + global falseCounter + global tempString1 + if line == 'add': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M+D\n" + elif line == 'sub': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M-D\n" + elif line == 'neg': + line = "@SP\nA=M\nA=A-1\nM=-M\n" + elif line == 'eq': + line = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JEQ\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n' + trueCounter += 1 + falseCounter += 1 + elif line == 'gt': + line = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JGT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n' + trueCounter += 1 + falseCounter += 1 + elif line == 'lt': + line = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JLT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n' + trueCounter += 1 + falseCounter += 1 + elif line == 'and': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M&D\n" + elif line == 'or': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M|D\n" + elif line == 'not': + line = "@SP\nA=M\nA=A-1\nM=!M\n" + tempString1 += line + + +name1 = None +line, tempString = '', '' +tempString1 = '' +aritmeticList3 = ['add', 'sub', 'neg', 'and', 'not'] +aritmeticList2 = ['or', 'gt', 'lt', 'eq'] +yourpath = os.getcwd() +for root, dirs, files in os.walk(yourpath, topdown=False): + nam1 = '' + for name in files: + if name[-3:] == '.vm': + name1 = name + tempString1 = '' + tempString = '' + with open(Path(root, name), "r+") as vmfile: + tempString = clear_file(tempString, vmfile) + for j in tempString: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + if line[:4] == 'push': + push(line) + line = '' + elif line[:3] == 'pop': + pop(line) + line = '' + elif line[:2] in aritmeticList2 or line[:3] in aritmeticList3: + aritmetic(line) + line = '' + if name1 == name: + with open(Path(root, f'{name1[:-3]}.asm'), 'w+') as newfile: + newfile.write(tempString1) diff --git a/projects/07/lang.txt b/projects/07/lang.txt new file mode 100755 index 0000000..0d636da --- /dev/null +++ b/projects/07/lang.txt @@ -0,0 +1 @@ +python3 debug \ No newline at end of file diff --git a/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm new file mode 100755 index 0000000..55ae771 --- /dev/null +++ b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.asm @@ -0,0 +1,447 @@ +@256 +D=A +@SP +M=D +@MainLoopXYZRA +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 +@0 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.init +0;JMP +(MainLoopXYZRARA) +//CALLFUNC +(Sys.init) +@4 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@Main.fibonacci2RA +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 +@1 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Main.fibonacci +0;JMP +(Main.fibonacci2RA) +//CALLFUNC +(Sys.init$WHILE) +//LABEL +@Sys.init$WHILE +0;JMP +//GOTO +(Main.fibonacci) +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@2 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +D=M-D +@TRUE0 +D;JLT +@SP +A=M +A=A-1 +M=0 +@FALSE0 +0;JMP +(TRUE0) +@SP +A=M +A=A-1 +M=-1 +(FALSE0) +//LT +@SP +M=M-1 +A=M +D=M +@Main.fibonacci$IF_TRUE +D;JNE +//IFGOTO +@Main.fibonacci$IF_FALSE +0;JMP +//GOTO +(Main.fibonacci$IF_TRUE) +//LABEL +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN +(Main.fibonacci$IF_FALSE) +//LABEL +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@2 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@Main.fibonacci0RA +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 +@1 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Main.fibonacci +0;JMP +(Main.fibonacci0RA) +//CALLFUNC +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@Main.fibonacci1RA +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 +@1 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Main.fibonacci +0;JMP +(Main.fibonacci1RA) +//CALLFUNC +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN diff --git a/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.cmp new file mode 100755 index 0000000..d667834 --- /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.out b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.out new file mode 100755 index 0000000..d667834 --- /dev/null +++ b/projects/08/FunctionCalls/FibonacciElement/FibonacciElement.out @@ -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 100755 index 0000000..1f907b1 --- /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 6000 { + ticktock; +} + +output; diff --git a/projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst b/projects/08/FunctionCalls/FibonacciElement/FibonacciElementVME.tst new file mode 100755 index 0000000..87c0920 --- /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 100755 index 0000000..55e5ad2 --- /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 100755 index 0000000..f3965c9 --- /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/NestedCall.asm b/projects/08/FunctionCalls/NestedCall/NestedCall.asm new file mode 100755 index 0000000..eae43b1 --- /dev/null +++ b/projects/08/FunctionCalls/NestedCall/NestedCall.asm @@ -0,0 +1,598 @@ +@256 +D=A +@SP +M=D +@MainLoopXYZRA +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 +@0 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.init +0;JMP +(MainLoopXYZRARA) +//CALLFUNC +(Sys.init) +@4000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@3 +M=D +//pop POINTER +@5000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@Sys.main3RA +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 +@0 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.main +0;JMP +(Sys.main3RA) +//CALLFUNC +@SP +M=M-1 +A=M +D=M +@6 +M=D +//pop TMP +(Sys.init$LOOP) +//LABEL +@Sys.init$LOOP +0;JMP +//GOTO +(Sys.main) +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@4001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@3 +M=D +//pop POINTER +@5001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@200 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@1 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@1 +D=A +@LCL +M=M-D +//pop LOCAL +@40 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@2 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@2 +D=A +@LCL +M=M-D +//pop LOCAL +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@3 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@3 +D=A +@LCL +M=M-D +//pop LOCAL +@123 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@Sys.add124RA +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 +@1 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.add12 +0;JMP +(Sys.add124RA) +//CALLFUNC +@SP +M=M-1 +A=M +D=M +@5 +M=D +//pop TMP +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@1 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@2 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@3 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@4 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN +(Sys.add12) +@4002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@3 +M=D +//pop POINTER +@5002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@12 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN diff --git a/projects/08/FunctionCalls/NestedCall/NestedCall.cmp b/projects/08/FunctionCalls/NestedCall/NestedCall.cmp new file mode 100755 index 0000000..9200202 --- /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 100755 index 0000000..0d8534d --- /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 NestedCall.asm, sets up the stack to simulate the bootstrap's call to Sys.init(), then +begins execution at the beginning of NestedCall.asm. If the bootstrap is not present, the program begins +running with Sys.init() since it is the first function in Sys.vm. +

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

+The test setup also initializes the LCL, ARG, THIS and THAT pointers to -1, -2, -3 and -4. + +

Sys.init()

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

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

Sys.main()

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

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

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

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

Sys.add12()

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

+Returns argument 0 plus 12. + + +

Test Coverage

+ +

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

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

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

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

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

Debugging

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

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

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

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

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

Debugging with breakpoints

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

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

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

Finding ROM address in your ASM code

+It is not easy to find the ROM locations where you want to set breakpoints, because there is no +one-to-one correspondence between the ASM file line numbers and the ROM addresses. This is made even more +difficult because the supplied CPU Emulator does not display the (LABELS) in its ROM panel. +

+There are two things that you can do to make this easier. +

+

Modify your assembler to generate a listing file.
+A listing file shows all the ASM source lines, including comments, as well as the ROM addresses and +the values of the labels and the instructions. For example, here is a snippet of a listing file generated by an assembler written by Mark Armbrust: +
+   20    16      @i      // i -= 1
+   21  FC88      M=M-1
+             
+   22  FC10      D=M     // if i > 0
+   23     6      @LOOP
+   24  E301      D;JGT   //      goto LOOP
+             
+   25        (STOP)
+   25    25      @STOP
+   26  EA87      0;JMP
+
+Data Symbols
+
+   16 D  i
+
+Code Symbols
+
+    6 C  LOOP
+   17 C  SKIP
+   25 C  STOP
+
+For the Nand2Tetris environment, it is most useful to list the ROM addresses and A-instruction +values in decimal. In the above snippet, the C-instruction values are +listed in hexadecimal. +

+The list file is generated during pass 2 of the Assembler, parallel to generating the .hack file. To +make it easier to handle blank and comment only lines, Mark has Parser.commandType() return +NO_COMMAND for source lines with no command. Mark also added Parser.sourceLine() that returns the +unmodified source line. +

+

Have your VM Translator write the VM source lines as comments in the ASM output.
+For example: +
+    // label LOOP
+(Sys.init$LOOP)
+    // goto LOOP
+@Sys.init$LOOP
+0;JMP
+    //
+    // // Sys.main()
+    // 
+    // // Sets locals 1, 2 and 3, leaving locals 0 and 4 unchanged to test
+    // // default local initialization to 0.  (RAM set to -1 by test setup.)
+    // // Calls Sys.add12(123) and stores return value (135) in temp 0.
+    // // Returns local 0 + local 1 + local 2 + local 3 + local 4 (456) to confirm
+    // // that locals were not mangled by function call.
+    // 
+    // function Sys.main 5
+(Sys.main)
+@5
+D=-A
+($3)
+@SP
+
+Note that comments in the VM source become double comments. Looking ahead, in Project 11 you will be asked to write a compiler for the Jack language. If your compiler will write the Jack source lines as comments in the +generated VM files, this convention will be quite useful. + + + \ No newline at end of file diff --git a/projects/08/FunctionCalls/NestedCall/NestedCall.out b/projects/08/FunctionCalls/NestedCall/NestedCall.out new file mode 100755 index 0000000..9200202 --- /dev/null +++ b/projects/08/FunctionCalls/NestedCall/NestedCall.out @@ -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.tst b/projects/08/FunctionCalls/NestedCall/NestedCall.tst new file mode 100755 index 0000000..70e5523 --- /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 100755 index 0000000..70582b6 --- /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 100755 index 0000000..2c689b8 --- /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/NestedCall_NoBoot.asm b/projects/08/FunctionCalls/NestedCall/NestedCall_NoBoot.asm new file mode 100755 index 0000000..1bd1561 --- /dev/null +++ b/projects/08/FunctionCalls/NestedCall/NestedCall_NoBoot.asm @@ -0,0 +1,543 @@ +(Sys.init) +@4000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@3 +M=D +//pop POINTER +@5000 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@Sys.main3RA +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 +@0 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.main +0;JMP +(Sys.main3RA) +//CALLFUNC +@SP +M=M-1 +A=M +D=M +@6 +M=D +//pop TMP +(Sys.init$LOOP) +//LABEL +@Sys.init$LOOP +0;JMP +//GOTO +(Sys.main) +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@4001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@3 +M=D +//pop POINTER +@5001 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@200 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@1 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@1 +D=A +@LCL +M=M-D +//pop LOCAL +@40 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@2 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@2 +D=A +@LCL +M=M-D +//pop LOCAL +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@3 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@3 +D=A +@LCL +M=M-D +//pop LOCAL +@123 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@Sys.add124RA +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 +@1 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.add12 +0;JMP +(Sys.add124RA) +//CALLFUNC +@SP +M=M-1 +A=M +D=M +@5 +M=D +//pop TMP +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@1 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@2 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@3 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@4 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN +(Sys.add12) +@4002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@3 +M=D +//pop POINTER +@5002 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@12 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN diff --git a/projects/08/FunctionCalls/NestedCall/Sys.vm b/projects/08/FunctionCalls/NestedCall/Sys.vm new file mode 100755 index 0000000..8b0b003 --- /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/SimpleFunction.asm b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.asm new file mode 100755 index 0000000..c6c39b1 --- /dev/null +++ b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.asm @@ -0,0 +1,137 @@ +(SimpleFunction.test) +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//DEFINEFUNC +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@1 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +A=M +A=A-1 +M=!M +//NOT +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN diff --git a/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.cmp new file mode 100755 index 0000000..c3ea911 --- /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.out b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.out new file mode 100755 index 0000000..c3ea911 --- /dev/null +++ b/projects/08/FunctionCalls/SimpleFunction/SimpleFunction.out @@ -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 100755 index 0000000..c7b5905 --- /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 100755 index 0000000..d64a34f --- /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 100755 index 0000000..c9267ee --- /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/Class1.vm b/projects/08/FunctionCalls/StaticsTest/Class1.vm new file mode 100755 index 0000000..c463537 --- /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 100755 index 0000000..94f2946 --- /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 100755 index 0000000..bffee0e --- /dev/null +++ b/projects/08/FunctionCalls/StaticsTest/StaticsTest.asm @@ -0,0 +1,649 @@ +@256 +D=A +@SP +M=D +@MainLoopXYZRA +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 +@0 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Sys.init +0;JMP +(MainLoopXYZRARA) +//CALLFUNC +(Sys.init) +@6 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@8 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@Class1.set5RA +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 +@2 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class1.set +0;JMP +(Class1.set5RA) +//CALLFUNC +@SP +M=M-1 +A=M +D=M +@5 +M=D +//pop TMP +@23 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@15 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@Class2.set6RA +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 +@2 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class2.set +0;JMP +(Class2.set6RA) +//CALLFUNC +@SP +M=M-1 +A=M +D=M +@5 +M=D +//pop TMP +@Class1.get7RA +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 +@0 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class1.get +0;JMP +(Class1.get7RA) +//CALLFUNC +@Class2.get8RA +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 +@0 +D=D-A +@5 +D=D-A +@ARG +M=D +@SP +D=M +@LCL +M=D +@Class2.get +0;JMP +(Class2.get8RA) +//CALLFUNC +(Sys.init$WHILE) +//LABEL +@Sys.init$WHILE +0;JMP +//GOTO +(Class1.set) +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +@Class1.0 +M=D +//pop STATIC +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +@Class1.1 +M=D +//pop STATIC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN +(Class1.get) +@Class1.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push STATIC +@Class1.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push STATIC +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN +(Class2.set) +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +@Class2.0 +M=D +//pop STATIC +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +@Class2.1 +M=D +//pop STATIC +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN +(Class2.get) +@Class2.0 +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push STATIC +@Class2.1 +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push STATIC +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@LCL +D=M +@R13 +M=D +@5 +D=A +@R13 +D=M-D +A=D +D=M +@R14 +M=D +@SP +A=M-1 +D=M +@ARG +A=M +M=D +@ARG +D=M+1 +@SP +M=D +@R13 +M=M-1 +A=M +D=M +@THAT +M=D +@R13 +M=M-1 +A=M +D=M +@THIS +M=D +@R13 +M=M-1 +A=M +D=M +@ARG +M=D +@R13 +M=M-1 +A=M +D=M +@LCL +M=D +@R14 +A=M +0;JMP +//RETURN diff --git a/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp b/projects/08/FunctionCalls/StaticsTest/StaticsTest.cmp new file mode 100755 index 0000000..5589f1e --- /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.out b/projects/08/FunctionCalls/StaticsTest/StaticsTest.out new file mode 100755 index 0000000..5589f1e --- /dev/null +++ b/projects/08/FunctionCalls/StaticsTest/StaticsTest.out @@ -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 100755 index 0000000..1b9194e --- /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 100755 index 0000000..130ba66 --- /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.vm b/projects/08/FunctionCalls/StaticsTest/Sys.vm new file mode 100755 index 0000000..3708322 --- /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/BasicLoop.asm b/projects/08/ProgramFlow/BasicLoop/BasicLoop.asm new file mode 100755 index 0000000..8443dcd --- /dev/null +++ b/projects/08/ProgramFlow/BasicLoop/BasicLoop.asm @@ -0,0 +1,142 @@ +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@0 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@0 +D=A +@LCL +M=M-D +//pop LOCAL +(Sys.init$LOOP_START) +//LABEL +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@0 +D=A +@LCL +M=M+D +@SP +M=M-1 +A=M +D=M +@LCL +A=M +M=D +@0 +D=A +@LCL +M=M-D +//pop LOCAL +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@0 +D=A +@ARG +M=M+D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@0 +D=A +@ARG +M=M-D +//pop ARG +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +@Sys.init$LOOP_START +D;JNE +//IFGOTO +@0 +D=A +@LCL +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push LOCAL diff --git a/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp b/projects/08/ProgramFlow/BasicLoop/BasicLoop.cmp new file mode 100755 index 0000000..00d35d2 --- /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.hack b/projects/08/ProgramFlow/BasicLoop/BasicLoop.hack new file mode 100755 index 0000000..763a9aa --- /dev/null +++ b/projects/08/ProgramFlow/BasicLoop/BasicLoop.hack @@ -0,0 +1,127 @@ +0000000000000000 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +0000000000000000 +1110110000010000 +0000000000000001 +1111000010001000 +0000000000000000 +1111110010001000 +1111110000100000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000000001 +1111000111001000 +0000000000000000 +1110110000010000 +0000000000000010 +1111000010100000 +1111110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +0000000000000000 +1110110000010000 +0000000000000001 +1111000010100000 +1111110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +0000000000000000 +1111110010001000 +1111110000100000 +1111110000010000 +1110110010100000 +1111000010001000 +0000000000000000 +1110110000010000 +0000000000000001 +1111000010001000 +0000000000000000 +1111110010001000 +1111110000100000 +1111110000010000 +0000000000000001 +1111110000100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000000001 +1111000111001000 +0000000000000000 +1110110000010000 +0000000000000010 +1111000010100000 +1111110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +0000000000000001 +1110110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +0000000000000000 +1111110010001000 +1111110000100000 +1111110000010000 +1110110010100000 +1111000111001000 +0000000000000000 +1110110000010000 +0000000000000010 +1111000010001000 +0000000000000000 +1111110010001000 +1111110000100000 +1111110000010000 +0000000000000010 +1111110000100000 +1110001100001000 +0000000000000000 +1110110000010000 +0000000000000010 +1111000111001000 +0000000000000000 +1110110000010000 +0000000000000010 +1111000010100000 +1111110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 +0000000000000000 +1111110010001000 +1111110000100000 +1111110000010000 +0000000000010110 +1110001100000101 +0000000000000000 +1110110000010000 +0000000000000001 +1111000010100000 +1111110000010000 +0000000000000000 +1111110000100000 +1110001100001000 +0000000000000000 +1111110111001000 diff --git a/projects/08/ProgramFlow/BasicLoop/BasicLoop.out b/projects/08/ProgramFlow/BasicLoop/BasicLoop.out new file mode 100755 index 0000000..a1c3d0c --- /dev/null +++ b/projects/08/ProgramFlow/BasicLoop/BasicLoop.out @@ -0,0 +1,2 @@ +| RAM[0] |RAM[256]| +| 256 | 1 | diff --git a/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst b/projects/08/ProgramFlow/BasicLoop/BasicLoop.tst new file mode 100755 index 0000000..50ca118 --- /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 100755 index 0000000..dc5a92f --- /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 100755 index 0000000..237fdff --- /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 100755 index 0000000..1384c97 --- /dev/null +++ b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.asm @@ -0,0 +1,255 @@ +@1 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@0 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@0 +D=A +@THAT +M=M+D +@SP +M=M-1 +A=M +D=M +@THAT +A=M +M=D +@0 +D=A +@THAT +M=M-D +//pop THAT +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@1 +D=A +@THAT +M=M+D +@SP +M=M-1 +A=M +D=M +@THAT +A=M +M=D +@1 +D=A +@THAT +M=M-D +//pop THAT +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@2 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@0 +D=A +@ARG +M=M+D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@0 +D=A +@ARG +M=M-D +//pop ARG +(Sys.init$MAIN_LOOP_START) +//LABEL +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@SP +M=M-1 +A=M +D=M +@Sys.init$COMPUTE_ELEMENT +D;JNE +//IFGOTO +@Sys.init$END_PROGRAM +0;JMP +//GOTO +(Sys.init$COMPUTE_ELEMENT) +//LABEL +@0 +D=A +@THAT +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push THAT +@1 +D=A +@THAT +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push THAT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@2 +D=A +@THAT +M=M+D +@SP +M=M-1 +A=M +D=M +@THAT +A=M +M=D +@2 +D=A +@THAT +M=M-D +//pop THAT +@4 +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push POINTER +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M+D +//ADD +@SP +M=M-1 +A=M +D=M +@4 +M=D +//pop POINTER +@0 +D=A +@ARG +A=M+D +D=M +@SP +A=M +M=D +@SP +M=M+1 +//push ARGUMENT +@1 +D=A +@SP +A=M +M=D +@SP +M=M+1 +//push CONSTANT +@SP +M=M-1 +A=M +D=M +A=A-1 +M=M-D +//SUB +@0 +D=A +@ARG +M=M+D +@SP +M=M-1 +A=M +D=M +@ARG +A=M +M=D +@0 +D=A +@ARG +M=M-D +//pop ARG +@Sys.init$MAIN_LOOP_START +0;JMP +//GOTO +(Sys.init$END_PROGRAM) +//LABEL diff --git a/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.cmp new file mode 100755 index 0000000..c262a4b --- /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.out b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.out new file mode 100755 index 0000000..c262a4b --- /dev/null +++ b/projects/08/ProgramFlow/FibonacciSeries/FibonacciSeries.out @@ -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 100755 index 0000000..07df2b9 --- /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 100755 index 0000000..6a643b6 --- /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 100755 index 0000000..243f31b --- /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/08/VMTranslator.py b/projects/08/VMTranslator.py new file mode 100755 index 0000000..46f68e4 --- /dev/null +++ b/projects/08/VMTranslator.py @@ -0,0 +1,246 @@ +import os +from pathlib import Path + + +def clear_file(clearfile): + temp_string_cf = '' # clears the empty lines, comments and spaces and writes them in a string + for vmline in clearfile: + flag = 0 + if vmline == '\n': + continue + for index in range(len(vmline)): + if vmline[index:index + 2] == '//': + if flag == 1: + temp_string_cf += '\n' + break + if flag == 1 and vmline[index:index + 2] == ' ': + temp_string_cf += '\n' + break + temp_string_cf += vmline[index] + flag = 1 + return temp_string_cf + + +def push(pushline, funcname): + if 'this' in pushline: + number = int(pushline[10:]) + pushline = '@' + str(number) + '\nD=A\n@THIS\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push THIS\n' + elif 'that' in pushline: + number = int(pushline[10:]) + pushline = '@' + str(number) + '\nD=A\n@THAT\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push THAT\n' + elif 'temp' in pushline: + number = int(pushline[10:]) + number += 5 + pushline = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push TMP\n' + elif 'local' in pushline: + number = int(pushline[11:]) + pushline = '@' + str(number) + '\nD=A\n@LCL\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push LOCAL\n' + elif 'static' in pushline: + number = int(pushline[12:]) + pushline = '@' + funcname + '.' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push STATIC\n' + elif 'pointer' in pushline: + number = int(pushline[13:]) + number += 3 + pushline = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push POINTER\n' + elif 'argument' in pushline: + number = int(pushline[14:]) + pushline = '@' + str(number) + '\nD=A\n@ARG\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push ARGUMENT\n' + elif 'constant' in pushline: + number = pushline[14:] + pushline = '@' + str(number) + '\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push CONSTANT\n' + return pushline + + +def pop(popline, funcname): + if 'this' in popline: + number = int(popline[9:]) + popline = '@' + str(number) + '\nD=A\n@THIS\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THIS\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THIS\nM=M-D\n//pop THIS\n' + elif 'that' in popline: + number = int(popline[9:]) + popline = '@' + str(number) + '\nD=A\n@THAT\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THAT\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THAT\nM=M-D\n//pop THAT\n' + elif 'temp' in popline: + number = int(popline[9:]) + number = number + 5 + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n//pop TMP\n' + elif 'local' in popline: + number = int(popline[10:]) + popline = '@' + str(number) + '\nD=A\n@LCL\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@LCL\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@LCL\nM=M-D\n//pop LOCAL\n' + elif 'static' in popline: + number = int(popline[11:]) + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + funcname + '.' + str(number) + '\nM=D\n//pop STATIC\n' + elif 'pointer' in popline: + number = int(popline[12:]) + number = number + 3 + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n//pop POINTER\n' + elif 'argument' in popline: + number = int(popline[13:]) + popline = '@' + str(number) + '\nD=A\n@ARG\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@ARG\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@ARG\nM=M-D\n//pop ARG\n' + return popline + + +def aritmetic(armline): + global trueCounter + global falseCounter + if armline == 'add': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M+D\n//ADD\n" + elif armline == 'sub': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M-D\n//SUB\n" + elif armline == 'neg': + armline = "@SP\nA=M\nA=A-1\nM=-M\n//NEG\n" + elif armline == 'eq': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JEQ\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//EQ\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'gt': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JGT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//GT\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'lt': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JLT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//LT\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'and': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M&D\n//AND\n" + elif armline == 'or': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M|D\n//OR\n" + elif armline == 'not': + armline = "@SP\nA=M\nA=A-1\nM=!M\n//NOT\n" + return armline + + +def label(labelline): + labelline = '(' + func_label_name + '$' + labelline[6:] + ')\n//LABEL\n' + return labelline + + +def goto(gotoline): + gotoline = '@' + func_label_name + '$' + gotoline[5:] + '\n0;JMP\n//GOTO\n' + return gotoline + + +def if_goto(ifline): + ifline = '@SP\nM=M-1\nA=M\nD=M\n@' + func_label_name + '$' + ifline[8:] + '\nD;JNE\n//IFGOTO\n' + return ifline + + +def define_func(funcline): + global func_label_name + def_func_list = funcline.rsplit(' ') + func_label_name = def_func_list[1] + funcline = '(' + def_func_list[1] + ')\n' + for ind in range(int(def_func_list[2])): + funcline += '@0\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//DEFINEFUNC\n' + return funcline + + +def call_func(callline): + global f + call_func_list = callline.rsplit(' ') + callline = '@' + call_func_list[1] + str(f) + 'RA\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@LCL\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@ARG\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@THIS\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@THAT\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@SP\nD=M\n@' + call_func_list[2] + '\nD=D-A\n@5\nD=D-A\n@ARG\nM=D\n' + callline += '@SP\nD=M\n@LCL\nM=D\n' + callline += '@' + call_func_list[1] + '\n0;JMP\n' + callline += '(' + call_func_list[1] + str(f) + 'RA)\n//CALLFUNC\n' + f += 1 + return callline + + +def return_func(returnline): + returnline = '@LCL\nD=M\n@R13\nM=D\n' + returnline += '@5\nD=A\n@R13\nD=M-D\nA=D\nD=M\n@R14\nM=D\n' + returnline += '@SP\nA=M-1\nD=M\n@ARG\nA=M\nM=D\n' + returnline += '@ARG\nD=M+1\n@SP\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@THAT\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@THIS\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@ARG\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@LCL\nM=D\n' + returnline += '@R14\nA=M\n0;JMP\n//RETURN\n' + return returnline + + +def iterate(name_iterate, yourpath_iterate): + line = '' + new_string = '' + with open(Path(yourpath_iterate, name_iterate + '.vm'), "r+") as vmfile: + string_iterate = clear_file(vmfile) + for j in string_iterate: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + if line[:4] == 'push': + new_string += push(line, name_iterate) + line = '' + elif line[:3] == 'pop': + new_string += pop(line, name_iterate) + line = '' + elif line[:2] in aritmeticList2 or line[:3] in aritmeticList3: + new_string += aritmetic(line) + line = '' + elif line[:5] == 'label': + new_string += label(line) + line = '' + elif line[:4] == 'goto': + new_string += goto(line) + line = '' + elif line[:7] == 'if-goto': + new_string += if_goto(line) + line = '' + elif line[:8] == 'function': + new_string += define_func(line) + line = '' + elif line[:4] == 'call': + new_string += call_func(line) + line = '' + elif line[:6] == 'return': + new_string += return_func(line) + line = '' + return new_string + + +trueCounter = falseCounter = f = 0 +staticCounter = 16 +func_label_name = '' +aritmeticList3 = ['add', 'sub', 'neg', 'and', 'not'] +aritmeticList2 = ['or', 'gt', 'lt', 'eq'] +yourpath = os.getcwd() + +bootstrap = '''@256\nD=A\n@SP\nM=D\n@MainLoopXYZRA\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n@LCL\nD=M\n@SP\nA=M\nM=D\n@SP +M=M+1\n@ARG\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n@THIS\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n@THAT\nD=M\n@SP\nA=M\nM=D\n@SP +M=M+1\n@SP\nD=M\n@0\nD=D-A\n@5\nD=D-A\n@ARG\nM=D\n@SP\nD=M\n@LCL\nM=D\n@Sys.init\n0;JMP\n(MainLoopXYZRARA) +//CALLFUNC\n''' + +for root, dirs, files in os.walk(yourpath, topdown=False): + nameslist = [] + sysstring, functstring = '', '' + for name in files: + tempString = '' + if name[-3:] == '.vm': + nameslist += [name[:-3]] + for i in nameslist: + if i == 'Sys': + sysstring = bootstrap + sysstring += iterate(i, root) + + else: + functstring += iterate(i, root) + if nameslist: + with open(Path(root, f'{os.path.split(root)[1]}.asm'), 'w+') as newfile: + newfile.write(sysstring + functstring) + diff --git a/projects/08/Vmtraslotor_old.py b/projects/08/Vmtraslotor_old.py new file mode 100755 index 0000000..ecbbd02 --- /dev/null +++ b/projects/08/Vmtraslotor_old.py @@ -0,0 +1,253 @@ +import os + + +def clear_file(clearfile): + temp_string_cf = '' # clears the empty lines, comments and spaces and writes them in a string + for vmline in clearfile: + flag = 0 + if vmline == '\n': + continue + for index in range(len(vmline)): + if vmline[index:index + 2] == '//': + if flag == 1: + temp_string_cf += '\n' + break + if flag == 1 and vmline[index:index + 2] == ' ': + temp_string_cf += '\n' + break + temp_string_cf += vmline[index] + flag = 1 + return temp_string_cf + + +def push(pushline, funcname): + if 'this' in pushline: + number = int(pushline[10:]) + pushline = '@' + str(number) + '\nD=A\n@THIS\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push THIS\n' + elif 'that' in pushline: + number = int(pushline[10:]) + pushline = '@' + str(number) + '\nD=A\n@THAT\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push THAT\n' + elif 'temp' in pushline: + number = int(pushline[10:]) + number += 5 + pushline = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push TMP\n' + elif 'local' in pushline: + number = int(pushline[11:]) + pushline = '@' + str(number) + '\nD=A\n@LCL\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push LOCAL\n' + elif 'static' in pushline: + breakpoint() + number = int(pushline[12:]) + pushline = '@' + funcname + '.' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push STATIC\n' + elif 'pointer' in pushline: + number = int(pushline[13:]) + number += 3 + pushline = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push POINTER\n' + elif 'argument' in pushline: + number = int(pushline[14:]) + pushline = '@' + str(number) + '\nD=A\n@ARG\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push ARGUMENT\n' + elif 'constant' in pushline: + number = pushline[14:] + pushline = '@' + str(number) + '\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push CONSTANT\n' + return pushline + + +def pop(popline, funcname): + if 'this' in popline: + number = int(popline[9:]) + popline = '@' + str(number) + '\nD=A\n@THIS\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THIS\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THIS\nM=M-D\n//pop THIS\n' + elif 'that' in popline: + number = int(popline[9:]) + popline = '@' + str(number) + '\nD=A\n@THAT\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THAT\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THAT\nM=M-D\n//pop THAT\n' + elif 'temp' in popline: + number = int(popline[9:]) + number = number + 5 + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n//pop TMP\n' + elif 'local' in popline: + number = int(popline[10:]) + popline = '@' + str(number) + '\nD=A\n@LCL\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@LCL\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@LCL\nM=M-D\n//pop LOCAL\n' + elif 'static' in popline: + breakpoint() + number = int(popline[11:]) + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + funcname + '.' + str(number) + '\nM=D\n//pop STATIC\n' + elif 'pointer' in popline: + number = int(popline[12:]) + number = number + 3 + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n//pop POINTER\n' + elif 'argument' in popline: + number = int(popline[13:]) + popline = '@' + str(number) + '\nD=A\n@ARG\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@ARG\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@ARG\nM=M-D\n//pop ARG\n' + return popline + + +def aritmetic(armline): + global trueCounter + global falseCounter + if armline == 'add': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M+D\n//ADD\n" + elif armline == 'sub': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M-D\n//SUB\n" + elif armline == 'neg': + armline = "@SP\nA=M\nA=A-1\nM=-M\n//NEG\n" + elif armline == 'eq': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JEQ\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//EQ\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'gt': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JGT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//GT\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'lt': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JLT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//LT\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'and': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M&D\n//AND\n" + elif armline == 'or': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M|D\n//OR\n" + elif armline == 'not': + armline = "@SP\nA=M\nA=A-1\nM=!M\n//NOT\n" + return armline + + +def label(labelline): + labelline = '(' + func_label_name + '$' + labelline[6:] + ')\n//LABEL\n' + return labelline + + +def goto(gotoline): + gotoline = '@' + func_label_name + '$' + gotoline[5:] + '\n0;JMP\n//GOTO\n' + return gotoline + + +def if_goto(ifline): + ifline = '@SP\nM=M-1\nA=M\nD=M\n@' + func_label_name + '$' + ifline[8:] + '\nD;JNE\n//IFGOTO\n' + return ifline + + +def define_func(funcline): + global func_label_name + def_func_list = funcline.rsplit(' ') + func_label_name = def_func_list[1] + funcline = '(' + def_func_list[1] + ')\n' + for ind in range(int(def_func_list[2])): + funcline += '@0\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//DEFINEFUNC\n' + return funcline + + +def call_func(callline): + global f + call_func_list = callline.rsplit(' ') + callline = '@' + call_func_list[1] + str(f) + 'RA\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@LCL\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@ARG\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@THIS\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@THAT\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@SP\nD=M\n@' + call_func_list[2] + '\nD=D-A\n@5\nD=D-A\n@ARG\nM=D\n' + callline += '@SP\nD=M\n@LCL\nM=D\n' + callline += '@' + call_func_list[1] + '\n0;JMP\n' + callline += '(' + call_func_list[1] + str(f) + 'RA)\n//CALLFUNC\n' + f += 1 + return callline + + +def return_func(returnline): + returnline = '@LCL\nD=M\n@R13\nM=D\n' + returnline += '@5\nD=A\n@R13\nD=M-D\nA=D\nD=M\n@R14\nM=D\n' + returnline += '@SP\nA=M-1\nD=M\n@ARG\nA=M\nM=D\n' + returnline += '@ARG\nD=M+1\n@SP\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@THAT\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@THIS\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@ARG\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@LCL\nM=D\n' + returnline += '@R14\nA=M\n0;JMP\n//RETURN\n' + return returnline + + +def iterate(name_iterate, yourpath_iterate): + line = '' + new_string = '' + with open(yourpath_iterate + '/' + name_iterate + '.vm', "r+") as vmfile: + string_iterate = clear_file(vmfile) + print(string_iterate) + for j in string_iterate: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + if line[:4] == 'push': + new_string += push(line, name_iterate) + line = '' + elif line[:3] == 'pop': + new_string += pop(line, name_iterate) + line = '' + elif line[:2] in aritmeticList2 or line[:3] in aritmeticList3: + new_string += aritmetic(line) + line = '' + elif line[:5] == 'label': + new_string += label(line) + line = '' + elif line[:4] == 'goto': + new_string += goto(line) + line = '' + elif line[:7] == 'if-goto': + new_string += if_goto(line) + line = '' + elif line[:8] == 'function': + new_string += define_func(line) + line = '' + elif line[:4] == 'call': + new_string += call_func(line) + line = '' + elif line[:6] == 'return': + new_string += return_func(line) + line = '' + return new_string + + +trueCounter = 0 +falseCounter = 0 +staticCounter = 16 +f = 0 +func_label_name = '' +aritmeticList3 = ['add', 'sub', 'neg', 'and', 'not'] +aritmeticList2 = ['or', 'gt', 'lt', 'eq'] +yourpath = 'C:/Users/SQA-AGrudev/Desktop/nand2tetris/projects/08/FunctionCalls/NestedCall' +folder_name = '' +for c in reversed(yourpath): + if c != '/': + folder_name += c + else: + break +folder_name = folder_name[::-1] + +nameslist = [] +for root, dirs, files in os.walk(yourpath, topdown=False): + for name in files: + tempString = '' + if name[-3:] == '.vm': + nameslist += [name[:-3]] + +sysstring, functstring = '', '' + +for i in nameslist: + if i == 'Sys': + sysstring = iterate(i, yourpath) + else: + functstring += iterate(i, yourpath) +tempString1 ='@256\nD=A\n@SP\nM=D\n@Sys.init\n0;JMP\n'+ sysstring + functstring +with open(yourpath + '/' + folder_name + '.asm', 'w+') as newfile: # tva tqbva da se kazva papkata ne faila + # TODO before i write the whole things i think i should write SP=256 call Sys.init in assembler pretty sure i should + newfile.write(tempString1) +# TODO make it run more than 1 file diff --git a/projects/08/lang.txt b/projects/08/lang.txt new file mode 100755 index 0000000..140ecda --- /dev/null +++ b/projects/08/lang.txt @@ -0,0 +1,2 @@ +python3 +debug \ No newline at end of file diff --git a/projects/09/Average/Main.jack b/projects/09/Average/Main.jack new file mode 100755 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 100755 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 100755 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 100755 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 100755 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 100755 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 100755 index 0000000000000000000000000000000000000000..e653e8609ec1daace1dfde510364cb49669efb9e GIT binary patch literal 108857 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

b3kwk*CLfPV{fzx#r;<9j!o* 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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 100755 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 100755 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/New folder/Tetris.zip b/projects/09/New folder/Tetris.zip new file mode 100755 index 0000000000000000000000000000000000000000..0ad7a0b999323240cbdcd84ba061b2f1ed3c700f GIT binary patch literal 10840 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 literal 0 HcmV?d00001 diff --git a/projects/09/New folder/Tetris/Main.vm b/projects/09/New folder/Tetris/Main.vm new file mode 100755 index 0000000..9931b90 --- /dev/null +++ b/projects/09/New folder/Tetris/Main.vm @@ -0,0 +1,147 @@ +function Main.main 1 +push constant 1 +neg +pop local 0 +push constant 0 +push constant 20 +call Output.moveCursor 2 +pop temp 0 +push constant 17 +call String.new 1 +push constant 87 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 108 +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 101 +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 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push constant 2000 +call Sys.wait 1 +pop temp 0 +call Output.println 0 +pop temp 0 +call Output.println 0 +pop temp 0 +call Output.println 0 +pop temp 0 +label WHILE_EXP0 +push local 0 +push constant 0 +lt +push local 0 +push constant 100 +gt +or +not +if-goto WHILE_END0 +push constant 33 +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 32 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 119 +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 32 +call String.appendChar 2 +push constant 48 +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 49 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Keyboard.readInt 1 +pop local 0 +call Screen.clearScreen 0 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 2000 +call Sys.wait 1 +pop temp 0 +push local 0 +call Tetris.tetris 1 +pop temp 0 +push constant 0 +return diff --git a/projects/09/New folder/Tetris/Piece.vm b/projects/09/New folder/Tetris/Piece.vm new file mode 100755 index 0000000..eb6061b --- /dev/null +++ b/projects/09/New folder/Tetris/Piece.vm @@ -0,0 +1,2219 @@ +function Piece.new 0 +push constant 11 +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 argument 5 +pop this 5 +push argument 6 +pop this 6 +push argument 7 +pop this 7 +push argument 8 +pop this 8 +push constant 0 +pop this 9 +push constant 0 +not +pop this 10 +push pointer 0 +return +function Piece.init 1 +push constant 0 +pop static 0 +push constant 511 +pop static 1 +push constant 0 +pop static 2 +push constant 255 +pop static 3 +push constant 16 +call Array.new 1 +pop static 5 +push constant 0 +push static 5 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 5 +add +push local 0 +push constant 1 +sub +push static 5 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 5 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Piece.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function Piece.draw 1 +push argument 0 +pop pointer 0 +push constant 0 +not +pop local 0 +push this 0 +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push this 3 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +return +label IF_FALSE0 +push constant 0 +return +function Piece.erase 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 3 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Piece.sample 4 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push constant 32 +push argument 1 +call Math.multiply 2 +push local 3 +add +push constant 16384 +add +pop local 1 +push local 1 +push constant 24576 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push local 1 +call Memory.peek 1 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +return +label IF_FALSE1 +push constant 0 +return +function Piece.getMove 0 +push argument 0 +pop pointer 0 +push this 10 +return +function Piece.fullSample 6 +push argument 0 +pop pointer 0 +push argument 1 +push constant 1 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 2 +push this 0 +sub +pop local 0 +push this 6 +push this 4 +sub +pop local 1 +push constant 0 +not +pop local 4 +label WHILE_EXP0 +push local 2 +push local 0 +lt +not +if-goto WHILE_END0 +push constant 0 +pop local 3 +push constant 0 +pop local 5 +label WHILE_EXP1 +push local 3 +push local 1 +lt +not +if-goto WHILE_END1 +push this 0 +push local 2 +add +push this 4 +push local 3 +add +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 5 +label IF_FALSE1 +push local 4 +push this 4 +push local 3 +add +push this 7 +push constant 1 +add +call Piece.sample 2 +and +pop local 4 +push local 3 +push constant 16 +add +pop local 3 +goto WHILE_EXP1 +label WHILE_END1 +push local 5 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 4 +push this 0 +push local 2 +add +push this 3 +push constant 1 +add +call Piece.sample 2 +and +pop local 4 +label IF_FALSE2 +push local 2 +push constant 16 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +push constant 2 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push this 3 +push this 1 +sub +pop local 0 +push this 7 +push this 5 +sub +pop local 1 +push constant 0 +not +pop local 4 +label WHILE_EXP2 +push local 2 +push local 0 +lt +not +if-goto WHILE_END2 +push constant 0 +pop local 3 +push constant 0 +pop local 5 +label WHILE_EXP3 +push local 3 +push local 1 +lt +not +if-goto WHILE_END3 +push this 1 +push local 2 +add +push this 5 +push local 3 +add +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 0 +not +pop local 5 +label IF_FALSE4 +push local 4 +push this 6 +push constant 1 +add +push this 5 +push local 3 +add +call Piece.sample 2 +and +pop local 4 +push local 3 +push constant 16 +add +pop local 3 +goto WHILE_EXP3 +label WHILE_END3 +push local 5 +not +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 4 +push this 2 +push constant 1 +add +push this 1 +push local 2 +add +call Piece.sample 2 +and +pop local 4 +label IF_FALSE5 +push local 2 +push constant 16 +add +pop local 2 +goto WHILE_EXP2 +label WHILE_END2 +push local 4 +return +goto IF_END3 +label IF_FALSE3 +push this 3 +push this 1 +sub +pop local 0 +push this 7 +push this 5 +sub +pop local 1 +push constant 0 +not +pop local 4 +label WHILE_EXP4 +push local 2 +push local 1 +lt +not +if-goto WHILE_END4 +push constant 0 +pop local 3 +push constant 0 +pop local 5 +label WHILE_EXP5 +push local 3 +push local 0 +lt +not +if-goto WHILE_END5 +push this 5 +push local 2 +add +push this 1 +push local 3 +add +eq +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push constant 0 +not +pop local 5 +label IF_FALSE6 +push local 4 +push this 0 +push constant 1 +sub +push this 1 +push local 3 +add +call Piece.sample 2 +and +pop local 4 +push local 3 +push constant 16 +add +pop local 3 +goto WHILE_EXP5 +label WHILE_END5 +push local 5 +not +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push local 4 +push this 4 +push constant 1 +sub +push this 5 +push local 2 +add +call Piece.sample 2 +and +pop local 4 +label IF_FALSE7 +push local 2 +push constant 16 +add +pop local 2 +goto WHILE_EXP4 +label WHILE_END4 +push local 4 +return +label IF_END3 +label IF_END0 +function Piece.moveDown 1 +push argument 0 +pop pointer 0 +push this 3 +push static 3 +lt +push this 7 +push static 3 +lt +and +push this 10 +and +push pointer 0 +push constant 1 +call Piece.fullSample 2 +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 1 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 5 +call Screen.drawRectangle 4 +pop temp 0 +push this 1 +push constant 1 +add +pop this 1 +push this 3 +push constant 1 +add +pop this 3 +push this 5 +push constant 1 +add +pop this 5 +push this 7 +push constant 1 +add +pop this 7 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 3 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 7 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +push constant 10 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 10 +label IF_END0 +push constant 0 +return +function Piece.moveLeft 1 +push argument 0 +pop pointer 0 +push this 0 +push constant 15 +add +push static 0 +gt +push this 10 +and +push this 4 +push constant 15 +add +push static 0 +gt +and +push pointer 0 +push constant 0 +call Piece.fullSample 2 +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 2 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 6 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push this 0 +push constant 1 +sub +pop this 0 +push this 2 +push constant 1 +sub +pop this 2 +push this 4 +push constant 1 +sub +pop this 4 +push this 6 +push constant 1 +sub +pop this 6 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +push constant 10 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +label IF_FALSE0 +push constant 0 +return +function Piece.moveRight 1 +push argument 0 +pop pointer 0 +push this 6 +push static 1 +lt +push this 10 +and +push this 2 +push static 1 +lt +and +push pointer 0 +push constant 2 +call Piece.fullSample 2 +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 4 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push this 0 +push constant 1 +add +pop this 0 +push this 2 +push constant 1 +add +pop this 2 +push this 4 +push constant 1 +add +pop this 4 +push this 6 +push constant 1 +add +pop this 6 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +push constant 10 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +label IF_FALSE0 +push constant 0 +return +function Piece.reDraw 1 +push argument 0 +pop pointer 0 +push argument 1 +push constant 175 +lt +push argument 5 +push constant 175 +lt +or +push argument 3 +push constant 336 +gt +or +push argument 7 +push constant 336 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push argument 4 +push constant 255 +gt +push argument 8 +push constant 255 +gt +or +push argument 2 +push constant 0 +lt +or +push argument 6 +push constant 0 +lt +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +return +label IF_FALSE1 +push argument 1 +push argument 3 +gt +push argument 5 +push argument 7 +gt +or +push argument 2 +push argument 4 +gt +or +push argument 6 +push argument 8 +gt +or +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push argument 1 +pop this 0 +push argument 2 +pop this 1 +push argument 3 +pop this 2 +push argument 4 +pop this 3 +push argument 5 +pop this 4 +push argument 6 +pop this 5 +push argument 7 +pop this 6 +push argument 8 +pop this 7 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Piece.rotate 1 +push argument 0 +pop pointer 0 +push constant 0 +not +pop local 0 +push this 9 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 8 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push this 6 +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 1 +push constant 1 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push pointer 0 +push this 0 +push this 1 +push this 2 +push this 3 +push this 6 +push constant 15 +sub +push this 7 +push constant 47 +sub +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE2 +label IF_FALSE1 +push this 8 +push constant 1 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push this 0 +push constant 16 +add +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +push this 6 +push constant 16 +sub +push this 7 +push this 6 +push constant 15 +sub +push this 1 +push constant 16 +sub +push this 6 +push this 1 +push constant 1 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE4 +label IF_FALSE3 +push this 8 +push constant 2 +eq +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push constant 16 +sub +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +push this 4 +push constant 32 +add +push this 5 +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE6 +label IF_FALSE5 +push this 8 +push constant 3 +eq +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push this 4 +push constant 16 +add +push this 5 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 7 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push this 2 +push this 3 +push constant 16 +add +push this 4 +push constant 16 +add +push this 5 +push constant 32 +sub +push this 6 +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE8 +label IF_FALSE7 +push this 8 +push constant 4 +eq +if-goto IF_TRUE9 +goto IF_FALSE9 +label IF_TRUE9 +push this 4 +push constant 32 +add +push this 5 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE10 +goto IF_FALSE10 +label IF_TRUE10 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +push this 4 +push constant 32 +add +push this 5 +push constant 32 +sub +push this 6 +push constant 16 +add +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE10 +label IF_FALSE9 +push this 8 +push constant 5 +eq +if-goto IF_TRUE11 +goto IF_FALSE11 +label IF_TRUE11 +push this 0 +push constant 32 +add +push this 1 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE12 +goto IF_FALSE12 +label IF_TRUE12 +push pointer 0 +push this 0 +push constant 32 +add +push this 1 +push constant 32 +sub +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push this 5 +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE12 +label IF_FALSE11 +goto IF_END0 +label IF_FALSE0 +push this 9 +push constant 1 +eq +if-goto IF_TRUE13 +goto IF_FALSE13 +label IF_TRUE13 +push this 8 +push constant 0 +eq +if-goto IF_TRUE14 +goto IF_FALSE14 +label IF_TRUE14 +push this 0 +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push constant 1 +sub +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE15 +goto IF_FALSE15 +label IF_TRUE15 +push pointer 0 +push this 0 +push constant 16 +sub +push this 5 +push this 6 +push this 5 +push constant 15 +add +push this 0 +push this 1 +push this 2 +push this 3 +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE15 +label IF_FALSE14 +push this 8 +push constant 1 +eq +if-goto IF_TRUE16 +goto IF_FALSE16 +label IF_TRUE16 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE17 +goto IF_FALSE17 +label IF_TRUE17 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +push this 6 +push this 7 +push constant 16 +add +push this 4 +push this 5 +push constant 32 +add +push this 6 +push this 3 +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE17 +label IF_FALSE16 +push this 8 +push constant 2 +eq +if-goto IF_TRUE18 +goto IF_FALSE18 +label IF_TRUE18 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 32 +sub +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE19 +goto IF_FALSE19 +label IF_TRUE19 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push constant 32 +sub +push this 5 +push this 6 +push constant 32 +sub +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE19 +label IF_FALSE18 +push this 8 +push constant 3 +eq +if-goto IF_TRUE20 +goto IF_FALSE20 +label IF_TRUE20 +push this 0 +push constant 16 +sub +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 7 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE21 +goto IF_FALSE21 +label IF_TRUE21 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push this 2 +push this 3 +push constant 16 +sub +push this 4 +push constant 16 +sub +push this 5 +push constant 32 +add +push this 6 +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE21 +label IF_FALSE20 +push this 8 +push constant 4 +eq +if-goto IF_TRUE22 +goto IF_FALSE22 +label IF_TRUE22 +push this 4 +push constant 32 +sub +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE23 +goto IF_FALSE23 +label IF_TRUE23 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push constant 32 +sub +push this 5 +push constant 32 +add +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE23 +label IF_FALSE22 +push this 8 +push constant 5 +eq +if-goto IF_TRUE24 +goto IF_FALSE24 +label IF_TRUE24 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +add +push this 5 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +add +push this 7 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE25 +goto IF_FALSE25 +label IF_TRUE25 +push pointer 0 +push this 0 +push constant 32 +sub +push this 1 +push constant 16 +add +push this 2 +push constant 16 +sub +push this 3 +push this 4 +push this 5 +push constant 16 +sub +push this 6 +push constant 16 +add +push this 7 +push constant 32 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE25 +label IF_FALSE24 +goto IF_END13 +label IF_FALSE13 +push this 9 +push constant 2 +eq +if-goto IF_TRUE26 +goto IF_FALSE26 +label IF_TRUE26 +push this 8 +push constant 0 +eq +if-goto IF_TRUE27 +goto IF_FALSE27 +label IF_TRUE27 +push this 0 +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push this 1 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE28 +goto IF_FALSE28 +label IF_TRUE28 +push pointer 0 +push this 0 +push this 1 +push this 0 +push constant 15 +add +push this 1 +push constant 47 +add +push this 4 +push this 5 +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE28 +label IF_FALSE27 +push this 8 +push constant 1 +eq +if-goto IF_TRUE29 +goto IF_FALSE29 +label IF_TRUE29 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE30 +goto IF_FALSE30 +label IF_TRUE30 +push pointer 0 +push this 0 +push this 1 +push constant 16 +add +push this 0 +push constant 15 +add +push this 1 +push constant 31 +add +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +push this 6 +push constant 16 +sub +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE30 +label IF_FALSE29 +push this 8 +push constant 2 +eq +if-goto IF_TRUE31 +goto IF_FALSE31 +label IF_TRUE31 +push this 0 +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 32 +add +push this 3 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE32 +goto IF_FALSE32 +label IF_TRUE32 +push pointer 0 +push this 0 +push this 1 +push constant 16 +sub +push this 2 +push constant 32 +sub +push this 3 +push constant 16 +sub +push this 4 +push constant 16 +add +push this 5 +push constant 32 +sub +push this 6 +push constant 16 +add +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE32 +label IF_FALSE31 +push this 8 +push constant 3 +eq +if-goto IF_TRUE33 +goto IF_FALSE33 +label IF_TRUE33 +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE34 +goto IF_FALSE34 +label IF_TRUE34 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +push this 4 +push this 5 +push constant 32 +sub +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE34 +label IF_FALSE33 +push this 8 +push constant 4 +eq +if-goto IF_TRUE35 +goto IF_FALSE35 +label IF_TRUE35 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 32 +sub +push this 3 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE36 +goto IF_FALSE36 +label IF_TRUE36 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +push this 2 +push constant 32 +sub +push this 3 +push this 4 +push constant 16 +add +push this 5 +push constant 16 +sub +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE36 +label IF_FALSE35 +push this 8 +push constant 5 +eq +if-goto IF_TRUE37 +goto IF_FALSE37 +label IF_TRUE37 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +sub +push this 7 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE38 +goto IF_FALSE38 +label IF_TRUE38 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +push this 2 +push this 3 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +add +push this 6 +push constant 32 +sub +push this 7 +push constant 32 +add +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE38 +label IF_FALSE37 +goto IF_END26 +label IF_FALSE26 +push this 8 +push constant 0 +eq +if-goto IF_TRUE39 +goto IF_FALSE39 +label IF_TRUE39 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE40 +goto IF_FALSE40 +label IF_TRUE40 +push pointer 0 +push this 4 +push this 5 +push this 6 +push this 7 +push this 0 +push this 1 +push constant 32 +add +push this 0 +push constant 47 +add +push this 1 +push constant 47 +add +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE40 +label IF_FALSE39 +push this 8 +push constant 1 +eq +if-goto IF_TRUE41 +goto IF_FALSE41 +label IF_TRUE41 +push this 0 +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE42 +goto IF_FALSE42 +label IF_TRUE42 +push pointer 0 +push this 0 +push this 1 +push constant 16 +sub +push this 2 +push this 3 +push constant 16 +sub +push this 0 +push this 1 +push this 6 +push constant 16 +add +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE42 +label IF_FALSE41 +push this 8 +push constant 2 +eq +if-goto IF_TRUE43 +goto IF_FALSE43 +label IF_TRUE43 +push this 0 +push constant 32 +add +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +sub +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE44 +goto IF_FALSE44 +label IF_TRUE44 +push pointer 0 +push this 0 +push constant 32 +add +push this 1 +push constant 16 +add +push this 2 +push constant 32 +add +push this 3 +push constant 16 +add +push this 4 +push constant 16 +sub +push this 5 +push constant 32 +add +push this 6 +push constant 16 +add +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE44 +label IF_FALSE43 +push this 8 +push constant 3 +eq +if-goto IF_TRUE45 +goto IF_FALSE45 +label IF_TRUE45 +push this 4 +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE46 +goto IF_FALSE46 +label IF_TRUE46 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push this 5 +push constant 32 +add +push this 6 +push constant 16 +add +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE46 +label IF_FALSE45 +push this 8 +push constant 4 +eq +if-goto IF_TRUE47 +goto IF_FALSE47 +label IF_TRUE47 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 32 +add +push this 3 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE48 +goto IF_FALSE48 +label IF_TRUE48 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +add +push this 2 +push constant 32 +add +push this 3 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +add +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE48 +label IF_FALSE47 +push this 8 +push constant 5 +eq +if-goto IF_TRUE49 +goto IF_FALSE49 +label IF_TRUE49 +push this 0 +push constant 16 +sub +push this 1 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +add +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +add +push this 7 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE50 +goto IF_FALSE50 +label IF_TRUE50 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 32 +add +push this 2 +push this 3 +push constant 16 +add +push this 4 +push constant 16 +add +push this 5 +push this 6 +push constant 32 +add +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE50 +label IF_FALSE49 +label IF_END26 +label IF_END13 +label IF_END0 +push constant 0 +return diff --git a/projects/09/New folder/Tetris/Tetris.vm b/projects/09/New folder/Tetris/Tetris.vm new file mode 100755 index 0000000..0ed5ac1 --- /dev/null +++ b/projects/09/New folder/Tetris/Tetris.vm @@ -0,0 +1,999 @@ +function Tetris.tetris 25 +call Piece.init 0 +pop temp 0 +call Tetris.border 0 +pop temp 0 +push constant 0 +pop static 0 +push constant 25 +call Array.new 1 +pop local 23 +push constant 0 +push local 23 +add +push constant 16 +push constant 0 +push constant 31 +push constant 15 +push constant 0 +push constant 16 +push constant 47 +push constant 31 +push constant 0 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 23 +add +push constant 0 +push constant 0 +push constant 15 +push constant 15 +push constant 0 +push constant 16 +push constant 47 +push constant 31 +push constant 1 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 23 +add +push constant 32 +push constant 16 +push constant 47 +push constant 31 +push constant 0 +push constant 32 +push constant 47 +push constant 47 +push constant 2 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 23 +add +push constant 0 +push constant 0 +push constant 31 +push constant 15 +push constant 16 +push constant 16 +push constant 47 +push constant 31 +push constant 3 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 23 +add +push constant 16 +push constant 0 +push constant 47 +push constant 15 +push constant 0 +push constant 16 +push constant 31 +push constant 31 +push constant 4 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 23 +add +push constant 0 +push constant 0 +push constant 31 +push constant 15 +push constant 32 +push constant 0 +push constant 63 +push constant 15 +push constant 5 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 23 +add +push constant 0 +push constant 0 +push constant 15 +push constant 31 +push constant 16 +push constant 0 +push constant 31 +push constant 31 +push constant 6 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push argument 0 +push constant 3 +call Math.multiply 2 +pop static 1 +call Tetris.randomNumber 0 +pop static 2 +push constant 0 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 7 +call String.new 1 +push constant 80 +call String.appendChar 2 +push constant 111 +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 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push static 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 12 +call String.new 1 +push constant 78 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 80 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 101 +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 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +push static 2 +pop local 12 +call Tetris.randomNumber 0 +pop static 2 +push local 12 +push local 23 +add +pop pointer 1 +push that 0 +pop local 24 +push constant 0 +push local 24 +add +pop pointer 1 +push that 0 +pop local 3 +push constant 1 +push local 24 +add +pop pointer 1 +push that 0 +pop local 4 +push constant 2 +push local 24 +add +pop pointer 1 +push that 0 +pop local 5 +push constant 3 +push local 24 +add +pop pointer 1 +push that 0 +pop local 6 +push constant 4 +push local 24 +add +pop pointer 1 +push that 0 +pop local 7 +push constant 5 +push local 24 +add +pop pointer 1 +push that 0 +pop local 8 +push constant 6 +push local 24 +add +pop pointer 1 +push that 0 +pop local 9 +push constant 7 +push local 24 +add +pop pointer 1 +push that 0 +pop local 10 +push constant 8 +push local 24 +add +pop pointer 1 +push that 0 +pop local 14 +push local 3 +push constant 240 +add +push local 4 +push local 5 +push constant 240 +add +push local 6 +push local 7 +push constant 240 +add +push local 8 +push local 9 +push constant 240 +add +push local 10 +push local 14 +call Piece.new 9 +pop local 0 +push local 0 +call Piece.draw 1 +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Tetris.finish 0 +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +return +label IF_FALSE1 +label IF_FALSE0 +push static 2 +push local 23 +add +pop pointer 1 +push that 0 +pop local 24 +push constant 0 +push local 24 +add +pop pointer 1 +push that 0 +pop local 3 +push constant 1 +push local 24 +add +pop pointer 1 +push that 0 +pop local 4 +push constant 2 +push local 24 +add +pop pointer 1 +push that 0 +pop local 5 +push constant 3 +push local 24 +add +pop pointer 1 +push that 0 +pop local 6 +push constant 4 +push local 24 +add +pop pointer 1 +push that 0 +pop local 7 +push constant 5 +push local 24 +add +pop pointer 1 +push that 0 +pop local 8 +push constant 6 +push local 24 +add +pop pointer 1 +push that 0 +pop local 9 +push constant 7 +push local 24 +add +pop pointer 1 +push that 0 +pop local 10 +push constant 8 +push local 24 +add +pop pointer 1 +push that 0 +pop local 14 +push local 3 +push constant 16 +add +push local 4 +push constant 32 +add +push local 5 +push constant 16 +add +push local 6 +push constant 32 +add +push local 7 +push constant 16 +add +push local 8 +push constant 32 +add +push local 9 +push constant 16 +add +push local 10 +push constant 32 +add +push local 14 +call Piece.new 9 +pop local 1 +push local 1 +call Piece.draw 1 +pop temp 0 +label WHILE_EXP1 +push local 0 +call Piece.getMove 1 +not +if-goto WHILE_END1 +push constant 0 +pop local 15 +label WHILE_EXP2 +push local 15 +push constant 3 +lt +not +if-goto WHILE_END2 +call Keyboard.keyPressed 0 +pop local 11 +push local 11 +push constant 130 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +call Piece.moveLeft 1 +pop temp 0 +push constant 80 +call Sys.wait 1 +pop temp 0 +label IF_FALSE2 +push local 11 +push constant 132 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 0 +call Piece.moveRight 1 +pop temp 0 +push constant 80 +call Sys.wait 1 +pop temp 0 +label IF_FALSE3 +push local 11 +push constant 131 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +call Piece.rotate 1 +pop temp 0 +label IF_FALSE4 +push local 11 +push constant 133 +eq +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 0 +call Piece.moveDown 1 +pop temp 0 +push local 0 +call Piece.moveDown 1 +pop temp 0 +label IF_FALSE5 +push local 15 +push constant 1 +add +pop local 15 +goto WHILE_EXP2 +label WHILE_END2 +push local 0 +call Piece.moveDown 1 +pop temp 0 +push local 2 +push constant 1 +add +pop local 2 +push constant 80 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP1 +label WHILE_END1 +push constant 0 +pop local 2 +push local 0 +call Piece.dispose 1 +pop temp 0 +call Tetris.completeRow 0 +pop temp 0 +push constant 0 +push constant 7 +call Output.moveCursor 2 +pop temp 0 +push static 0 +call Output.printInt 1 +pop temp 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push constant 16 +push constant 32 +push constant 80 +push constant 96 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push local 1 +call Piece.dispose 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Tetris.completeRow 4 +push constant 16384 +push constant 11 +add +pop local 0 +push constant 15 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +not +pop local 3 +push constant 0 +pop local 2 +label WHILE_EXP1 +push local 2 +push constant 10 +lt +push local 3 +and +not +if-goto WHILE_END1 +push local 0 +push local 2 +add +push local 1 +push constant 512 +call Math.multiply 2 +add +call Memory.peek 1 +push local 3 +and +pop local 3 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP1 +label WHILE_END1 +push local 3 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push constant 176 +push local 1 +push constant 16 +call Math.multiply 2 +push constant 335 +push local 1 +push constant 16 +call Math.multiply 2 +push constant 15 +add +call Screen.drawRectangle 4 +pop temp 0 +push static 0 +push constant 1 +add +pop static 0 +push local 1 +call Tetris.shift 1 +pop temp 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Tetris.shift 5 +push constant 16384 +push constant 11 +add +pop local 2 +label WHILE_EXP0 +push argument 0 +push constant 1 +gt +not +if-goto WHILE_END0 +push constant 0 +pop local 0 +label WHILE_EXP1 +push local 0 +push constant 10 +lt +not +if-goto WHILE_END1 +push constant 0 +pop local 4 +label WHILE_EXP2 +push local 4 +push constant 16 +lt +not +if-goto WHILE_END2 +push local 2 +push local 0 +add +push argument 0 +push constant 1 +sub +push constant 512 +call Math.multiply 2 +push local 4 +push constant 32 +call Math.multiply 2 +add +add +pop local 3 +push local 3 +call Memory.peek 1 +pop local 1 +push local 2 +push local 0 +add +push argument 0 +push constant 512 +call Math.multiply 2 +push local 4 +push constant 32 +call Math.multiply 2 +add +add +push local 1 +call Memory.poke 2 +pop temp 0 +push local 3 +push constant 0 +call Memory.poke 2 +pop temp 0 +push local 4 +push constant 1 +add +pop local 4 +goto WHILE_EXP2 +label WHILE_END2 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push argument 0 +push constant 1 +sub +pop argument 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Tetris.border 0 +push constant 175 +push constant 0 +push constant 175 +push constant 255 +call Screen.drawLine 4 +pop temp 0 +push constant 336 +push constant 0 +push constant 336 +push constant 255 +call Screen.drawLine 4 +pop temp 0 +push constant 0 +return +function Tetris.newPiece 1 +push constant 9 +call Array.new 1 +pop local 0 +push constant 0 +push local 0 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push argument 3 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push argument 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push argument 5 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push argument 6 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push argument 7 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push argument 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +return +function Tetris.randomNumber 4 +push constant 7 +pop local 0 +push constant 13 +pop local 1 +push constant 1133 +pop local 2 +push local 0 +push static 1 +call Math.multiply 2 +push local 1 +add +pop local 3 +push local 3 +push local 2 +call Tetris.mod 2 +pop static 1 +push static 1 +push constant 7 +call Tetris.mod 2 +return +function Tetris.finish 1 +call Screen.clearScreen 0 +pop temp 0 +push constant 10 +push constant 24 +call Output.moveCursor 2 +pop temp 0 +push constant 12 +call String.new 1 +push constant 89 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 114 +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 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 +call Output.printString 1 +pop temp 0 +push static 0 +call Output.printInt 1 +pop temp 0 +push constant 10000 +call Sys.wait 1 +pop temp 0 +call Screen.clearScreen 0 +pop temp 0 +push constant 10 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 63 +call String.new 1 +push constant 87 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 105 +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 116 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 44 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 89 +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 102 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 78 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Keyboard.readChar 0 +pop local 0 +push local 0 +push constant 89 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Screen.clearScreen 0 +pop temp 0 +push constant 0 +return +label IF_FALSE0 +push local 0 +push constant 78 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +call Screen.clearScreen 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +label IF_FALSE1 +push constant 0 +not +return +function Tetris.mod 2 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +return +label IF_FALSE0 +push argument 0 +push argument 1 +call Math.divide 2 +push argument 1 +call Math.multiply 2 +pop local 1 +push argument 0 +push local 1 +sub +pop local 0 +push local 0 +return diff --git a/projects/09/New folder/Tetris/source/Main.jack b/projects/09/New folder/Tetris/source/Main.jack new file mode 100755 index 0000000..2dcf4ba --- /dev/null +++ b/projects/09/New folder/Tetris/source/Main.jack @@ -0,0 +1,19 @@ +class Main { + function void main (){ + var int s; + let s = -1; + do Output.moveCursor(0,20); + do Output.printString("Welcome to Tetris"); + do Sys.wait(2000); + do Output.println(); + do Output.println(); + do Output.println(); + while ((s < 0) | (s > 100)){ // gets a number used for seed for the random function + let s = Keyboard.readInt("Enter a number between 0 and 100:"); + do Screen.clearScreen(); + } + do Sys.wait(2000); + do Tetris.tetris(s); + return; + } +} \ No newline at end of file diff --git a/projects/09/New folder/Tetris/source/Piece.jack b/projects/09/New folder/Tetris/source/Piece.jack new file mode 100755 index 0000000..3ca2309 --- /dev/null +++ b/projects/09/New folder/Tetris/source/Piece.jack @@ -0,0 +1,473 @@ +class Piece { + static int lBorder, rBorder, uBorder, dBorder, st; + field int x1, y1, x2, y2, x3, y3, x4, y4, piece, direction; + field bool move; + static Array st; + + constructor Piece new(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4, int p) { + let x1 = Ax1; + let y1 = Ay1; + let x2 = Ax2; + let y2 = Ay2; + let x3 = Ax3; + let y3 = Ay3; + let x4 = Ax4; + let y4 = Ay4; + let piece = p; + let direction = 0; + let move = true; + return this; + } + + function void init(){ + var int a; + let lBorder = 0; + let rBorder = 511; + let uBorder = 0; + let dBorder = 255; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + return; + } + + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** draws 2 rectangles also checks if there is a piece at the spawn which will indicate end of the game. */ + method bool draw() { + var bool finish; + let finish = true; + let finish = Piece.sample(x1,y1) & finish; + let finish = Piece.sample(x2,y2) & finish; + let finish = Piece.sample(x3,y3) & finish; + let finish = Piece.sample(x4,y4) & finish; + if (finish){ + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return true; + } + return false; + } + + /** Erases the square from the screen. */ + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x1, y2, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return; + } + /** checks if those coodinates hold any value > 0. */ + function bool sample(int x, int y){ + var int value, address, bit, memBlock; + let memBlock = x / 16; + let address = (32 * y) + memBlock + 16384; + if (address > 24576){ + return false; + } + let value = Memory.peek(address); + if (value = 0){ + return true; + } + return false; + } + + method bool getMove(){ + return move; + } + + /** Checks if the piece can move in the given direction(dir). */ + method bool fullSample(int dir){ + var int size1, size2, i, j; + var bool result, flagUpon; + if (dir = 1){ //down + let size1 = x2 - x1; + let size2 = x4 - x3; + let result = true; + while (i < size1){ // for each block of the first rectangle + let j = 0; + let flagUpon = false; + while (j < size2){ // for each block of the second rectangle + if ((x1 + i) = (x3 + j)){ // if this block of the first rectangle sits upon a block of the second rectangle + let flagUpon = true; + } + let result = result & Piece.sample(x3 + j, y4 + 1); // if there is a block under the second rectangle + let j = j + 16; // sets the coords for the next block of the second rectangle + } + if (~(flagUpon)){ + let result = result & Piece.sample(x1 + i, y2 + 1); // if there is a block under the first rectangle + } + let i = i + 16; // sets the coords for the next block of the firs rectangle + } + return result; + } + else{ + if (dir = 2){ //right + let size1 = y2 - y1; + let size2 = y4 - y3; + let result = true; + while (i < size1){ + let j = 0; + let flagUpon = false; + while (j < size2){ + if ((y1 + i) = (y3 + j)){ + let flagUpon = true; + } + let result = result & Piece.sample(x4 + 1, (y3 + j)); + let j = j + 16; + } + if (~(flagUpon)){ + let result = result & Piece.sample(x2 + 1, (y1 + i)); + } + let i = i +16; + } + return result; + } + else{ // left + let size1 = y2 - y1; + let size2 = y4 - y3; + let result = true; + while (i < size2){ + let j = 0; + let flagUpon = false; + while (j < size1){ + if ((y3 + i) = (y1 + j)){ + let flagUpon = true; + } + let result = result & Piece.sample(x1 - 1, (y1 + j)); + let j = j + 16; + } + if (~(flagUpon)){ + let result = result & Piece.sample(x3 - 1, (y3 + i)); + } + let i = i + 16; + } + return result; + } + } + } + + /** Moves the game piece 16 pixels down. */ + method void moveDown() { + var int i; + if ((y2 < dBorder) & (y4 < dBorder) & (move) & fullSample(1)) { + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x2, y1); + do Screen.drawRectangle(x3, y3, x4, y3); + let y1 = y1 + 1; + let y2 = y2 + 1; + let y3 = y3 + 1; + let y4 = y4 + 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y2, x2, y2); + do Screen.drawRectangle(x3, y4, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + else{ + let move = false; + } + return; + } + + /** Moves the game piece 16 pixels to the left. */ + method void moveLeft() { + var int i; + if ((x1 + 15 > lBorder) & (move) & (x3 + 15 > lBorder)& fullSample(0)){ + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x2, y1, x2, y2); + do Screen.drawRectangle(x4, y3, x4, y4); + let x1 = x1 - 1; + let x2 = x2 - 1; + let x3 = x3 - 1; + let x4 = x4 - 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + return; + } + + /** Moves the game piece 16 pixels to the right. */ + method void moveRight() { + var int i; + if ((x4 < rBorder) & (move) & (x2 < rBorder) & fullSample(2)){ + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x1, y2); + do Screen.drawRectangle(x3, y3, x3, y4); + let x1 = x1 + 1; + let x2 = x2 + 1; + let x3 = x3 + 1; + let x4 = x4 + 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + return; + } + + /** Deletes the piece and draws it at the new coodinates. */ + method void reDraw(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4){ + var int absTmp; + if((Ax1 < 175) | (Ax3 < 175) | (Ax2 > 336) | (Ax4 > 336)){ + return; + } + if((Ay2 > 255) | (Ay4 > 255) | (Ay1 < 0) | (Ay3 < 0)){ + return; + } + if((Ax1 > Ax2) | (Ax3 > Ax4) | (Ay1 > Ay2) | (Ay3 > Ay4)){ + return; + } + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + do Screen.setColor(true); + let x1 = Ax1; + let y1 = Ay1; + let x2 = Ax2; + let y2 = Ay2; + let x3 = Ax3; + let y3 = Ay3; + let x4 = Ax4; + let y4 = Ay4; + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return; + } + + /** Rotates the piece clockwise. */ + method void rotate(){ + var bool samp; + let samp = true; + if (direction = 0){ // starting position + if (piece = 0){ // arrow + let samp = Piece.sample(x4, y1) & samp; // checks if the place at which the new piece will be drawn are free + let samp = Piece.sample(x4, y1 - 1) & samp; + if (samp){ + do reDraw(x1, y1, x2, y2, x4 - 15, y4 - 47, x4, y4); // redraws it at the new location + let direction = 1; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 + 16, y1) & samp; + let samp = Piece.sample(x1 + 16, y1 - 16) & samp; + let samp = Piece.sample(x4, y1 - 16) & samp; + if(samp){ + do reDraw(x1 + 16, y1 - 16, x4 - 16, y4, x4 - 15, y1 - 16, x4, y1 - 1); + let direction = 1; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 - 16, y1 - 16) & samp; + let samp = Piece.sample(x1 - 16, y1) & samp; + if (samp){ + do reDraw(x1 - 16, y1 - 16, x2 - 16, y2 + 16, x3 + 32, y3, x4, y4); + let direction = 1; + } + } + if (piece = 3){ + let samp = Piece.sample(x3 + 16, y3 - 32) & samp; + let samp = Piece.sample(x4, y4 - 16) & samp; + if (samp){ + do reDraw(x1 + 16, y1, x2, y2 + 16, x3 + 16, y3 - 32, x4, y4 - 16); + let direction = 1; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 + 32, y3 - 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 - 16, y2 + 16, x3 + 32, y3 - 32, x4 + 16, y4 - 16); + let direction = 1; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 + 32, y1 - 32) & samp; + let samp = Piece.sample(x2 + 16, y2 - 16) & samp; + let samp = Piece.sample(x4 - 16, y4 + 16) & samp; + if (samp){ + do reDraw(x1 + 32, y1 - 32, x2 + 16, y2 - 16, x3, y3, x4 - 16, y4 + 16); + let direction = 1; + } + } + } + else{ + if (direction = 1){ + if (piece = 0){ + let samp = Piece.sample(x1, y3) & samp; + let samp = Piece.sample(x1 - 1, y3) & samp; + if (samp){ + do reDraw(x1 - 16, y3, x4, y3 + 15, x1, y1, x2, y2); + let direction = 2; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3, y3 + 16) & samp; + let samp = Piece.sample(x3, y3 + 32) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 16, x4, y4 + 16, x3, y3 + 32, x4, y2); + let direction = 2; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x2 + 16, y2 - 16) & samp; + let samp = Piece.sample(x3 - 32, y3) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 16, x2 + 16, y2 - 16, x3 - 32, y3, x4 - 32, y4); + let direction = 2; + } + } + if (piece = 3){ + let samp = Piece.sample(x1 - 16, y1) & samp; + let samp = Piece.sample(x4, y4 + 16) & samp; + if (samp){ + do reDraw(x1 - 16, y1, x2, y2 - 16, x3 - 16, y3 +32, x4, y4 + 16); + let direction = 2; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 - 32, y3 + 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 + 16, y2 - 16, x3 - 32, y3 + 32, x4 - 16, y4 + 16); + let direction = 2; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3 + 16, y3 - 16) & samp; + let samp = Piece.sample(x4 + 32, y4 - 32) & samp; + if (samp){ + do reDraw(x1 - 32, y1 + 16, x2 - 16, y2, x3, y3 - 16, x4 + 16, y4 - 32); + let direction = 2; + } + } + } + else{ + if (direction = 2){ + if (piece = 0){ + let samp = Piece.sample(x1, y1+16) & samp; + let samp = Piece.sample(x1, y1+32) & samp; + if (samp){ + do reDraw(x1, y1, x1 + 15, y1 + 47, x3, y3, x4, y4); + let direction = 3; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3, y3 + 16) & samp; + let samp = Piece.sample(x3, y3 + 32) & samp; + if (samp){ + do reDraw(x1, y1 + 16, x1 + 15, y1 + 31, x1 + 16, y1 - 16, x4 - 16, y4); + let direction = 3; + } + } + if (piece = 2){ + let samp = Piece.sample(x1, y1 - 16) & samp; + let samp = Piece.sample(x2 + 32, y2 + 16) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1, y1 - 16, x2 - 32, y2 - 16, x3 + 16, y3 - 32, x4 + 16, y4); + let direction = 3; + } + } + if (piece = 3){ + let samp = Piece.sample(x2 - 16, y2 + 16) & samp; + let samp = Piece.sample(x3, y3 - 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 - 16, y2 + 16, x3, y3 - 32, x4 - 16, y4 - 16); + let direction = 3; + } + } + if (piece = 4){ + let samp = Piece.sample(x1 - 16, y1 - 16) & samp; + let samp = Piece.sample(x2 - 32, y2) & samp; + if (samp){ + do reDraw(x1 - 16, y1 - 16, x2 - 32, y2, x3 + 16, y3 - 16, x4, y4); + let direction = 3; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 + 16, y1 - 16) & samp; + let samp = Piece.sample(x3 - 16, y3 - 16) & samp; + let samp = Piece.sample(x4 - 32, y4 + 32) & samp; + if (samp){ + do reDraw(x1 + 16, y1 - 16, x2, y2, x3 - 16, y3 + 16, x4 - 32, y4 + 32); + let direction = 3; + } + } + } + else{ + if (piece = 0){ + let samp = Piece.sample(x4 + 16, y4) & samp; + let samp = Piece.sample(x4 + 32, y4) & samp; + if (samp){ + do reDraw(x3, y3, x4, y4, x1, y1 + 32, x1 + 47, y1 + 47); + let direction = 0; + } + } + if (piece = 1){ + let samp = Piece.sample(x1, y1 - 16) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1, y1 - 16, x2, y2 -16, x1, y1, x4 + 16, y4); + let direction = 0; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 + 32, y1 + 16) & samp; + let samp = Piece.sample(x3 - 16, y3 + 32) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1 + 32, y1 + 16, x2 + 32, y2 + 16, x3 - 16, y3 + 32, x4 + 16, y4); + let direction = 0; + } + } + if (piece = 3){ + let samp = Piece.sample(x3, y3 + 32) & samp; + let samp = Piece.sample(x4 + 16, y4 + 16) & samp; + if (samp){ + do reDraw(x1, y1, x2 + 16, y2 - 16, x3, y3 + 32, x4 + 16, y4 + 16); + let direction = 0; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 - 16, y3 + 16) & samp; + let samp = Piece.sample(x2 + 32, y2) & samp; + if (samp){ + do reDraw(x1 + 16, y1 + 16, x2 + 32, y2, x3 - 16, y3 + 16, x4, y4); + let direction = 0; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 - 16, y1 + 32) & samp; + let samp = Piece.sample(x3 + 16, y3) & samp; + let samp = Piece.sample(x4 + 32, y4 - 16) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 32, x2, y2 + 16, x3 + 16, y3, x4 + 32, y4 - 16); + let direction = 0; + } + } + } + } + } + return; + } +} + diff --git a/projects/09/New folder/Tetris/source/Tetris.jack b/projects/09/New folder/Tetris/source/Tetris.jack new file mode 100755 index 0000000..0d15797 --- /dev/null +++ b/projects/09/New folder/Tetris/source/Tetris.jack @@ -0,0 +1,203 @@ +class Tetris { + static int points, seed, next_seed; + + function void tetris(int z){ + var Piece p, nextPiece; + var int i, x1, y1, x2, y2, x3, y3, x4, y4, key, j, randTmp, piece_number, moves; + var Array left_g, right_g, box, stick, left_z, right_z,dick, all_piece, tmp; + do Piece.init(); + do Tetris.border(); + let points = 0; + let all_piece = Array.new(25); + let all_piece[0] = Tetris.newPiece(16,0,31,15, 0,16,47,31, 0); // arrow + let all_piece[1] = Tetris.newPiece(0,0,15,15, 0,16,47,31, 1); // right_L + let all_piece[2] = Tetris.newPiece(32,16,47,31, 0,32,47,47, 2); // left_L + let all_piece[3] = Tetris.newPiece(0,0,31,15, 16,16,47,31, 3); // left_z + let all_piece[4] = Tetris.newPiece(16,0,47,15, 0,16,31,31, 4); // right_z + let all_piece[5] = Tetris.newPiece(0,0,31,15, 32,0,63,15, 5); //stick + let all_piece[6] = Tetris.newPiece(0,0,15,31, 16,0,31,31, 6); //box + + + let seed = z * 3; // multiply by 3, because it gets in a loop on some even numbers + let next_seed = Tetris.randomNumber(); + do Output.moveCursor(0,0); + do Output.printString("Point: "); + do Output.printInt(points); + do Output.println(); + do Output.printString("Next Piece: "); + while (true){ // The main game loop + let j = next_seed; + let next_seed = Tetris.randomNumber(); + let tmp = all_piece[j]; // initializes the coords of the game piece + let x1 = tmp[0]; + let y1 = tmp[1]; + let x2 = tmp[2]; + let y2 = tmp[3]; + let x3 = tmp[4]; + let y3 = tmp[5]; + let x4 = tmp[6]; + let y4 = tmp[7]; + let piece_number = tmp[8]; + let p = Piece.new(x1 + 240, y1, x2 + 240, y2, x3 + 240, y3, x4 + 240, y4, piece_number); + if (~(p.draw())){ // if a piece tries to spawn above a limit the game ends + if (~(Tetris.finish())){ + return; + } + } + let tmp = all_piece[next_seed]; + let x1 = tmp[0]; // initializes the coords of the next game piece that is being displayed + let y1 = tmp[1]; + let x2 = tmp[2]; + let y2 = tmp[3]; + let x3 = tmp[4]; + let y3 = tmp[5]; + let x4 = tmp[6]; + let y4 = tmp[7]; + let piece_number = tmp[8]; + let nextPiece = Piece.new(x1 + 16, y1 + 32, x2+16, y2 + 32, x3+16, y3 + 32, x4 + 16, y4 + 32, piece_number); + do nextPiece.draw(); + while (p.getMove()){ + let moves = 0; + while (moves < 3){ // one can move its piece 3 times before it moves down automatically + let key = Keyboard.keyPressed(); + if (key = 130){ + do p.moveLeft(); + do Sys.wait(80); + } + if (key = 132){ + do p.moveRight(); + do Sys.wait(80); + } + if (key = 131){ + do p.rotate(); + } + if (key = 133){ + do p.moveDown(); + do p.moveDown(); + } + let moves = moves +1; + } + do p.moveDown(); + let i = i + 1; + do Sys.wait(80); + } + let i = 0; + do p.dispose(); + do Tetris.completeRow(); + do Output.moveCursor(0,7); + do Output.printInt(points); + do Screen.setColor(false); + do Screen.drawRectangle(16,32,80,96); + do Screen.setColor(true); + do nextPiece.dispose(); + } + return; + } + + function void completeRow(){ // checks if a row has been completed + var int adddress, row, colloum; + var bool complete; + let adddress = 16384 + 11; + let row = 15; + while (row > 0){ // for each row + let complete = true; + let colloum = 0; + while ((colloum < 10) & (complete)){ // for each collum + let complete = Memory.peek(adddress + colloum + (row * 512)) & complete; + let colloum = colloum + 1; + } + if (complete){ // removes the row + do Screen.setColor(false); + do Screen.drawRectangle(176, row * 16, 335, ((row * 16)+ 15) ); + let points = points + 1; + do Tetris.shift(row); + } + let row = row - 1; + } + return; + } + + function void shift(int rowShift){ // shifts all rows above the completed one + var int j, val, adddress, tmp, k; + let adddress = 16384 + 11; + while (rowShift > 1){ // each row + let j = 0; + while (j < 10){ // collum in the game field + let k = 0; + while (k < 16){ // each line a in 16 x 16 box + let tmp = adddress + j + (((rowShift - 1) * 512) + (k * 32)); + let val = Memory.peek(tmp); + do Memory.poke(adddress + j + ((rowShift * 512) + (k * 32)), val); + do Memory.poke(tmp,0); + let k = k+ 1; + } + let j = j + 1; + } + let rowShift = rowShift - 1; + } + return; + } + + function void border(){ // draws a border + do Screen.drawLine(175,0,175,255); + do Screen.drawLine(336,0,336,255); + return; + } + + function Array newPiece(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4,int p){ + var Array gamepice; + let gamepice = Array.new(9); + let gamepice[0] = Ax1; + let gamepice[1] = Ay1; + let gamepice[2] = Ax2; + let gamepice[3] = Ay2; + let gamepice[4] = Ax3; + let gamepice[5] = Ay3; + let gamepice[6] = Ax4; + let gamepice[7] = Ay4; + let gamepice[8] = p; + return gamepice; + } + + function int randomNumber(){ // radom number generator + var int multiplier,additor,moduler,toBeModulated; + let multiplier = 7; + let additor = 13; + let moduler = 1133; + let toBeModulated = (multiplier * seed) + additor; + let seed = Tetris.mod(toBeModulated,moduler); + return Tetris.mod(seed,7); + } + + function bool finish(){ // after finishing the game the player has 2 options to start onether or to end the game + var char c; + do Screen.clearScreen(); + do Output.moveCursor(10,24); + do Output.printString("Your score: "); + do Output.printInt(points); + do Sys.wait(10000); + do Screen.clearScreen(); + do Output.moveCursor(10,0); + do Output.printString("Would you like to play again, for yes click 'Y' and for no 'N':"); + let c = Keyboard.readChar(); + if (c = 89){ + do Screen.clearScreen(); + return false; + } + if (c = 78){ + do Screen.clearScreen(); + do Sys.halt(); + } + return true; + } + + function int mod(int tbm, int mo){ //simple moduler devision + var int val, tmp2; + if (tbm < mo){ + return tbm; + } + let tmp2 = (tbm / mo) * mo; + let val = tbm - tmp2; + return val; + } +} \ No newline at end of file diff --git a/projects/09/Square/Main.jack b/projects/09/Square/Main.jack new file mode 100755 index 0000000..8311cc2 --- /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 100755 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 100755 index 0000000..02393e2 --- /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/09/Tetris/Assembler.bat b/projects/09/Tetris/Assembler.bat new file mode 100755 index 0000000..93260ec --- /dev/null +++ b/projects/09/Tetris/Assembler.bat @@ -0,0 +1,27 @@ +@echo off + +rem $Id: Assembler.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo Assembler Starts the assembler in interactive mode. + echo Assembler FILE[.asm] Assembles FILE.asm to FILE.hack. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Compilers.jar;bin/lib/AssemblerGUI.jar;bin/lib/TranslatorsGUI.jar" ^ + HackAssemblerMain +) else ( + echo Assembling "%_arg1%" + java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Compilers.jar;bin/lib/AssemblerGUI.jar;bin/lib/TranslatorsGUI.jar" ^ + HackAssemblerMain "%_arg1%" +) +popd diff --git a/projects/09/Tetris/Assembler.sh b/projects/09/Tetris/Assembler.sh new file mode 100755 index 0000000..70db569 --- /dev/null +++ b/projects/09/Tetris/Assembler.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env sh + +# $Id: Assembler.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the assembler in interactive mode." + echo " `basename "$0"` FILE[.asm] Assembles FILE.asm to FILE.hack." +elif [ $# -eq 0 ] +then + # Run assembler in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Compilers.jar:bin/lib/AssemblerGUI.jar:bin/lib/TranslatorsGUI.jar" HackAssemblerMain & +else + # Convert arg1 to an absolute path and run assembler with arg1. + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi + echo Assembling "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Compilers.jar:bin/lib/AssemblerGUI.jar:bin/lib/TranslatorsGUI.jar" HackAssemblerMain "$arg1" +fi + diff --git a/projects/09/Tetris/CPUEmulator.bat b/projects/09/Tetris/CPUEmulator.bat new file mode 100755 index 0000000..f92cf40 --- /dev/null +++ b/projects/09/Tetris/CPUEmulator.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: CPUEmulator.bat,v 1.3 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo CPUEmulator Starts the CPU Emulator in interactive mode. + echo CPUEmulator FILE.tst Starts the CPU Emulator and runs the FILE.tst + echo test script. The success/failure message + echo is printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + CPUEmulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + CPUEmulatorMain "%_arg1%" +) +popd diff --git a/projects/09/Tetris/CPUEmulator.sh b/projects/09/Tetris/CPUEmulator.sh new file mode 100755 index 0000000..033d9d7 --- /dev/null +++ b/projects/09/Tetris/CPUEmulator.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env sh + +# $Id: CPUEmulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the CPU Emulator in interactive mode." + echo " `basename "$0"` FILE.tst Starts the CPU Emulator and runs the File.tst" + echo " test script. The success/failure message" + echo " is printed to the command console." +elif [ $# -eq 0 ] +then + # Run CPU emulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" CPUEmulatorMain & +else + # Convert arg1 to an absolute path and run CPU emulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" CPUEmulatorMain "$arg1" +fi diff --git a/projects/09/Tetris/HardwareSimulator.bat b/projects/09/Tetris/HardwareSimulator.bat new file mode 100755 index 0000000..76baa31 --- /dev/null +++ b/projects/09/Tetris/HardwareSimulator.bat @@ -0,0 +1,30 @@ +@echo off + +rem $Id: HardwareSimulator.bat,v 1.3 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo HardwareSimulator Starts the Hardware Simulator in + echo interactive mode. + echo HardwareSimulator FILE.tst Starts the Hardware Simulator and runs the + echo FILE.tst test script. The success/failure + echo message is printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + HardwareSimulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + HardwareSimulatorMain "%_arg1%" +) +popd diff --git a/projects/09/Tetris/HardwareSimulator.sh b/projects/09/Tetris/HardwareSimulator.sh new file mode 100755 index 0000000..47e7482 --- /dev/null +++ b/projects/09/Tetris/HardwareSimulator.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env sh + +# $Id: HardwareSimulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the Hardware Simulator in" + echo " interactive mode." + echo " `basename "$0"` FILE.tst Starts the Hardware Simulator and runs the" + echo " FILE.tst test script. The success/failure" + echo " message is printed to the command console." +elif [ $# -eq 0 ] +then + # Run hardware simulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:BuiltIn:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" HardwareSimulatorMain & +else + # Convert arg1 to an absolute path and run hardware simulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:BuiltIn:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" HardwareSimulatorMain "$arg1" +fi diff --git a/projects/09/Tetris/JackCompiler.bat b/projects/09/Tetris/JackCompiler.bat new file mode 100755 index 0000000..9399b94 --- /dev/null +++ b/projects/09/Tetris/JackCompiler.bat @@ -0,0 +1,26 @@ +@echo off + +rem $Id: JackCompiler.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo JackCompiler Compiles all .jack files in the current + echo working directory. + echo JackCompiler DIRECTORY Compiles all .jack files in DIRECTORY. + echo JackCompiler FILE.jack Compiles FILE.jack to FILE.vm. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) else ( + set "_arg1=%CD%" +) +pushd "%~dp0" +echo Compiling "%_arg1%" +java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/Compilers.jar" ^ + Hack.Compiler.JackCompiler "%_arg1%" +popd diff --git a/projects/09/Tetris/JackCompiler.py b/projects/09/Tetris/JackCompiler.py new file mode 100755 index 0000000..5782f99 --- /dev/null +++ b/projects/09/Tetris/JackCompiler.py @@ -0,0 +1,350 @@ +import os +from pathlib import Path +from tokenizer import Tokenizer +from vmwriter import VMWriter +from symbol_table import SymbolTable + + +# TODO add names to variables when you call for them, aka current_vm_append(thingtobeappended=blablac) + +class CompilationEngine: + def __init__(self, tokenizer, full_path_vm): + self.string = self.sub_type = self.class_name = self.function_type = '' + self.tab = self.recursion_index = 0 + self.tokenizer = tokenizer + self.sym_table = [] + self.vmwriter = VMWriter(full_path_vm) + self.current_vm = [] # used to reverse some of the commands, eg a+b need to be a b + + + def search_kind_of_sym(self, current_vm): + if self.sym_table[-1].kind_of(current_vm) is not None: + return self.sym_table[-1].kind_of(current_vm), self.sym_table[-1].index_of(current_vm) + for i in range(len(self.sym_table) - 2, -1, + -1): # start from the amount of sym_tables -2 so it starts from one below the current, + # until it is bigger than -1, walking it backwards + if self.sym_table[i].kind_of(current_vm) in ('static', 'this'): + return self.sym_table[i].kind_of(current_vm), self.sym_table[i].index_of(current_vm) + + def search_type_of_sym(self, current_vm): + for i in range(len(self.sym_table) - 1, -1, -1): + if self.sym_table[i].type_of(current_vm) is not None: + return self.sym_table[i].type_of(current_vm) + + def write_token(self): + if self.tokenizer.token_type() == 'stringConstant': + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token.strip( + '"') + ' \n' + else: + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token + ' \n' + + def compile_class(self): + self.sym_table.append(SymbolTable()) + self.tokenizer.advance() # class -> + self.tokenizer.advance() # type -> + self.class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + self.tokenizer.advance() # { -> + while self.tokenizer.token != '}': + if self.tokenizer.token in ['static', 'field']: + self.compile_class_var_dec() + if self.tokenizer.token in ['constructor', 'function', 'method']: + self.compile_subroutine() + self.tokenizer.advance() + self.sym_table.pop() + self.vmwriter.close_vm_file() + + def compile_class_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_subroutine(self): + self.sym_table.append(SymbolTable()) + self.sub_type = self.tokenizer.token + self.tokenizer.advance() # subroutine type(function|method|constructor) -> + self.function_type = self.tokenizer.token + self.tokenizer.advance() # subroutine kind(int|void|etc..) -> + sub_name = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + if self.sub_type == 'method': + self.sym_table[-1].start_subroutine('this', self.class_name) + self.compile_parameter_list() + self.tokenizer.advance() # { -> + while self.tokenizer.token == 'var': # create only symbol teable entries + self.compile_var_dec() + if self.sub_type == 'constructor': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('constant', self.sym_table[-2].var_count('field')) + self.vmwriter.write_call('Memory.alloc', 1) + self.vmwriter.write_pop('pointer', 0) + elif self.sub_type == 'method': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('argument', 0) + self.vmwriter.write_pop('pointer', 0) + else: + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + while self.tokenizer.token != '}': + self.compile_statements() + self.tokenizer.advance() + self.sym_table.pop() + + def compile_parameter_list(self): + if self.tokenizer.token != ')': + var_type = self.tokenizer.token + self.tokenizer.advance() # var ype -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # var name -> + while self.tokenizer.token == ',': + self.tokenizer.advance() # , -> + var_type = self.tokenizer.token + self.tokenizer.advance() # type -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # name -> + self.tokenizer.advance() # )-> + + def compile_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_statements(self): + while True: + if self.tokenizer.token == 'let': + self.compile_let() + elif self.tokenizer.token == 'if': + self.compile_if() + elif self.tokenizer.token == 'while': + self.compile_while() + elif self.tokenizer.token == 'do': + self.compile_do() + elif self.tokenizer.token == 'return': + self.compile_return() + else: + break + + def compile_do(self): + self.tokenizer.advance() # do -> + class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + if self.tokenizer.token == '(': # method + self.vmwriter.write_push('pointer', 0) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{class_name}', count + 1) + elif self.tokenizer.token == '.': # method or function + self.tokenizer.advance() # . -> + fname = f'{class_name}.{self.tokenizer.token}' + sname = f'{self.search_type_of_sym(class_name)}.{self.tokenizer.token}' + self.tokenizer.advance() # name -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_push(*self.search_kind_of_sym(class_name)) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_call(f'{sname}', count + 1) + else: + self.vmwriter.write_call(f'{fname}', count) + self.vmwriter.write_pop('temp', '0') + self.tokenizer.advance() # ; -> + + def compile_let(self): + flag_array = 0 + self.tokenizer.advance() # let -> + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # var_name -> + if self.tokenizer.token == '[': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.tokenizer.advance() # [ -> + self.compile_expression() + self.tokenizer.advance() # ] -> + flag_array = 1 + self.tokenizer.advance() # = -> + self.compile_expression() + self.tokenizer.advance() # ; -> + if flag_array == 0: + self.vmwriter.write_pop(*self.search_kind_of_sym(self.current_vm[-1])) + else: + self.vmwriter.write_pop('temp', 1) + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('temp', 1) + self.vmwriter.write_pop('that', 0) + self.current_vm.pop() + + def compile_while(self): + self.tokenizer.advance() # while -> + label1 = self.vmwriter.label_index + self.vmwriter.write_lable(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label2 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_goto(label1) + self.vmwriter.write_lable(label2) + + def compile_return(self): + self.tokenizer.advance() # return -> + if self.tokenizer.token != ';': + self.compile_expression() + self.vmwriter.write_return(self.function_type) + self.tokenizer.advance() # ; -> + + def compile_if(self): + self.tokenizer.advance() # if -> + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label1 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + label2 = self.vmwriter.label_index + self.vmwriter.write_goto(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.vmwriter.write_lable(label1) + if self.tokenizer.token == 'else': + self.tokenizer.advance() # else -> + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_lable(label2) + + def compile_expression(self): + self.compile_term() + while self.tokenizer.token in ['+', '-', '*', '/', '|', '=', '>', '<', '&']: + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # symbol -> + self.compile_term() + self.vmwriter.write_arithmetic(self.current_vm[-1]) + self.current_vm.pop() + + def compile_term(self): + if self.tokenizer.token == '(': # expression () + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + elif self.tokenizer.token in ['~', '-']: # uniry op + self.current_vm.append(self.tokenizer.token) + tmp = 'neg' if self.tokenizer.token == '-' else self.tokenizer.token + self.tokenizer.advance() # ~ or - -> + self.compile_term() + self.vmwriter.write_arithmetic(tmp) + self.current_vm.pop() + elif self.tokenizer.token_type() != 'symbol': + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # integer, string, keyword, varnname, subroutine_name, class_name, var_name -> + if self.tokenizer.token == '[': # Array + self.tokenizer.advance() # [ -> + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + self.compile_expression() + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('that', 0) + self.tokenizer.advance() # ] -> + elif self.tokenizer.token == '(': # subroutine_name () + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{self.current_vm[-1]}', count) + self.current_vm.pop() + elif self.tokenizer.token == '.': # method + if self.search_type_of_sym(self.current_vm[-1]) is not None: + flag = 1 + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + else: + flag = 0 + self.tokenizer.advance() # . -> + fname = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if flag == 1: + self.vmwriter.write_call(f'{self.search_type_of_sym(self.current_vm[-1])}.{fname}', count + 1) + else: + self.vmwriter.write_call(f'{self.current_vm[-1]}.{fname}', count) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'stringConstant': + self.vmwriter.write_push('constant', len(self.current_vm[-1].strip('"'))) + self.vmwriter.write_call('String.new', 1) + for index, item in enumerate(self.current_vm[-1].strip('"')): + self.vmwriter.write_push('constant', ord(item)) + self.vmwriter.write_call('String.appendChar', 2) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'integerConstant': + self.vmwriter.write_push('constant', self.current_vm[-1]) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'identifier': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + elif self.current_vm[-1] == 'true': + self.vmwriter.write_push('constant', '1') + self.vmwriter.write_arithmetic('neg') + self.current_vm.pop() + elif self.current_vm[-1] == 'false' or self.current_vm[-1] == 'null': + self.vmwriter.write_push('constant', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'this': + self.vmwriter.write_push('pointer', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'that': + self.vmwriter.write_push('pointer', '1') + self.current_vm.pop() + + def compile_expression_list(self): + count_exp = 0 + if self.tokenizer.token in ['(', '~', '-'] or self.tokenizer.token_type() != 'symbol': + count_exp += 1 + self.compile_expression() + while self.tokenizer.token == ',': + count_exp += 1 + self.tokenizer.advance() # , + self.compile_expression() + return count_exp + + +if __name__ == '__main__': + path = os.getcwd() + for root, dirs, files in os.walk(path, topdown=False): + for name in files: + if name[-4:] == 'jack': + tokenizer_main = Tokenizer() + tokenizer_main.clear_file(Path(root, name)) + full_path = Path(root, name[:-4] + 'vm') + comp_eng_main = CompilationEngine(tokenizer_main, full_path) + comp_eng_main.compile_class() diff --git a/projects/09/Tetris/JackCompiler.sh b/projects/09/Tetris/JackCompiler.sh new file mode 100755 index 0000000..699dfb8 --- /dev/null +++ b/projects/09/Tetris/JackCompiler.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env sh + +# $Id: JackCompiler.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Compiles all .jack files in the current" + echo " working directory." + echo " `basename "$0"` DIRECTORY Compiles all .jack files in DIRECTORY." + echo " `basename "$0"` FILE.jack Compiles FILE.jack to FILE.vm." +else + if [ $# -eq 0 ] + then + # Use current directory as arg1 + arg1="$dir" + else + # Convert arg1 to an absolute path + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="$dir/$1" + fi + fi + echo Compiling "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/Compilers.jar" Hack.Compiler.JackCompiler "$arg1" +fi diff --git a/projects/09/Tetris/Main.jack b/projects/09/Tetris/Main.jack new file mode 100755 index 0000000..2dcf4ba --- /dev/null +++ b/projects/09/Tetris/Main.jack @@ -0,0 +1,19 @@ +class Main { + function void main (){ + var int s; + let s = -1; + do Output.moveCursor(0,20); + do Output.printString("Welcome to Tetris"); + do Sys.wait(2000); + do Output.println(); + do Output.println(); + do Output.println(); + while ((s < 0) | (s > 100)){ // gets a number used for seed for the random function + let s = Keyboard.readInt("Enter a number between 0 and 100:"); + do Screen.clearScreen(); + } + do Sys.wait(2000); + do Tetris.tetris(s); + return; + } +} \ No newline at end of file diff --git a/projects/09/Tetris/Main.vm b/projects/09/Tetris/Main.vm new file mode 100755 index 0000000..9931b90 --- /dev/null +++ b/projects/09/Tetris/Main.vm @@ -0,0 +1,147 @@ +function Main.main 1 +push constant 1 +neg +pop local 0 +push constant 0 +push constant 20 +call Output.moveCursor 2 +pop temp 0 +push constant 17 +call String.new 1 +push constant 87 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 108 +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 101 +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 84 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push constant 2000 +call Sys.wait 1 +pop temp 0 +call Output.println 0 +pop temp 0 +call Output.println 0 +pop temp 0 +call Output.println 0 +pop temp 0 +label WHILE_EXP0 +push local 0 +push constant 0 +lt +push local 0 +push constant 100 +gt +or +not +if-goto WHILE_END0 +push constant 33 +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 32 +call String.appendChar 2 +push constant 98 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 119 +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 32 +call String.appendChar 2 +push constant 48 +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 49 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +push constant 48 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Keyboard.readInt 1 +pop local 0 +call Screen.clearScreen 0 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 2000 +call Sys.wait 1 +pop temp 0 +push local 0 +call Tetris.tetris 1 +pop temp 0 +push constant 0 +return diff --git a/projects/09/Tetris/OS/Array.vm b/projects/09/Tetris/OS/Array.vm new file mode 100755 index 0000000..aa4c9e8 --- /dev/null +++ b/projects/09/Tetris/OS/Array.vm @@ -0,0 +1,23 @@ +function Array.new 0 +push argument 0 +push constant 0 +gt +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 2 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +call Memory.alloc 1 +return +function Array.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return diff --git a/projects/09/Tetris/OS/Keyboard.vm b/projects/09/Tetris/OS/Keyboard.vm new file mode 100755 index 0000000..a806c4e --- /dev/null +++ b/projects/09/Tetris/OS/Keyboard.vm @@ -0,0 +1,102 @@ +function Keyboard.init 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 24576 +call Memory.peek 1 +return +function Keyboard.readChar 2 +push constant 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +push local 0 +push constant 0 +gt +or +not +if-goto WHILE_END0 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +pop local 1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +call String.backSpace 0 +call Output.printChar 1 +pop temp 0 +push local 1 +call Output.printChar 1 +pop temp 0 +push local 1 +return +function Keyboard.readLine 5 +push constant 80 +call String.new 1 +pop local 3 +push argument 0 +call Output.printString 1 +pop temp 0 +call String.newLine 0 +pop local 1 +call String.backSpace 0 +pop local 2 +label WHILE_EXP0 +push local 4 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 0 +push local 0 +push local 1 +eq +pop local 4 +push local 4 +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 3 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 3 +push local 0 +call String.appendChar 2 +pop local 3 +label IF_END1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Keyboard.readInt 2 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +pop local 1 +push local 0 +call String.dispose 1 +pop temp 0 +push local 1 +return diff --git a/projects/09/Tetris/OS/Math.vm b/projects/09/Tetris/OS/Math.vm new file mode 100755 index 0000000..b660688 --- /dev/null +++ b/projects/09/Tetris/OS/Math.vm @@ -0,0 +1,408 @@ +function Math.init 1 +push constant 16 +call Array.new 1 +pop static 1 +push constant 16 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Math.abs 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +neg +pop argument 0 +label IF_FALSE0 +push argument 0 +return +function Math.multiply 5 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 4 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop local 1 +push argument 1 +pop argument 0 +push local 1 +pop argument 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 2 +push constant 1 +sub +push argument 1 +push constant 1 +sub +lt +not +if-goto WHILE_END0 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +push argument 1 +and +push constant 0 +eq +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push argument 0 +add +pop local 0 +push local 2 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 2 +label IF_FALSE1 +push argument 0 +push argument 0 +add +pop argument 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +neg +pop local 0 +label IF_FALSE2 +push local 0 +return +function Math.divide 4 +push argument 1 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 3 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 2 +push constant 0 +push static 1 +add +push argument 1 +call Math.abs 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push argument 0 +call Math.abs 1 +pop argument 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +push local 3 +not +and +not +if-goto WHILE_END0 +push constant 32767 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +sub +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +lt +pop local 3 +push local 3 +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push constant 1 +add +push static 1 +add +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +pop local 3 +push local 3 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +label IF_FALSE1 +goto WHILE_EXP0 +label WHILE_END0 +label WHILE_EXP1 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END1 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +not +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push argument 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +sub +pop argument 0 +label IF_FALSE3 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 1 +neg +pop local 1 +label IF_FALSE4 +push local 1 +return +function Math.sqrt 4 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 4 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 7 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 3 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push local 1 +push local 1 +call Math.multiply 2 +pop local 2 +push local 2 +push argument 0 +gt +not +push local 2 +push constant 0 +lt +not +and +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +pop local 3 +label IF_FALSE1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Math.max 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return +function Math.min 0 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return diff --git a/projects/09/Tetris/OS/Memory.vm b/projects/09/Tetris/OS/Memory.vm new file mode 100755 index 0000000..8c74b87 --- /dev/null +++ b/projects/09/Tetris/OS/Memory.vm @@ -0,0 +1,376 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +push static 0 +add +push constant 14334 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2049 +push static 0 +add +push constant 2050 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.peek 0 +push argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Memory.poke 0 +push argument 0 +push static 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.alloc 2 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 5 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +pop argument 0 +label IF_FALSE1 +push constant 2048 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 16383 +lt +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +lt +and +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +push local 1 +push constant 16382 +gt +or +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +or +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +pop local 0 +goto IF_END2 +label IF_FALSE2 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END3 +label IF_FALSE3 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END3 +label IF_END2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +push argument 0 +add +push constant 16379 +gt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 6 +call Sys.error 1 +pop temp 0 +label IF_FALSE4 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 2 +add +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push argument 0 +push constant 2 +add +push local 0 +add +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 2 +add +eq +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push argument 0 +push constant 3 +add +push local 0 +add +push local 0 +push argument 0 +add +push constant 4 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END6 +label IF_FALSE6 +push argument 0 +push constant 3 +add +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END6 +push constant 1 +push local 0 +add +push local 0 +push argument 0 +add +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_FALSE5 +push constant 0 +push local 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 2 +add +return +function Memory.deAlloc 2 +push argument 0 +push constant 2 +sub +pop local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END1 +label IF_FALSE1 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END1 +label IF_END0 +push constant 0 +return diff --git a/projects/09/Tetris/OS/Output.vm b/projects/09/Tetris/OS/Output.vm new file mode 100755 index 0000000..b8addd7 --- /dev/null +++ b/projects/09/Tetris/OS/Output.vm @@ -0,0 +1,1852 @@ +function Output.init 0 +push constant 16384 +pop static 4 +push constant 0 +not +pop static 2 +push constant 32 +pop static 1 +push constant 0 +pop static 0 +push constant 6 +call String.new 1 +pop static 3 +call Output.initMap 0 +pop temp 0 +call Output.createShiftedMap 0 +pop temp 0 +push constant 0 +return +function Output.initMap 0 +push constant 127 +call Array.new 1 +pop static 5 +push constant 0 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 32 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 33 +push constant 12 +push constant 30 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 34 +push constant 54 +push constant 54 +push constant 20 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 35 +push constant 0 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 36 +push constant 12 +push constant 30 +push constant 51 +push constant 3 +push constant 30 +push constant 48 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 37 +push constant 0 +push constant 0 +push constant 35 +push constant 51 +push constant 24 +push constant 12 +push constant 6 +push constant 51 +push constant 49 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 38 +push constant 12 +push constant 30 +push constant 30 +push constant 12 +push constant 54 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 39 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 40 +push constant 24 +push constant 12 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 41 +push constant 6 +push constant 12 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 42 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 63 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 43 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 63 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 44 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 45 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 46 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 47 +push constant 0 +push constant 0 +push constant 32 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 1 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 48 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 49 +push constant 12 +push constant 14 +push constant 15 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 50 +push constant 30 +push constant 51 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 51 +push constant 30 +push constant 51 +push constant 48 +push constant 48 +push constant 28 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 52 +push constant 16 +push constant 24 +push constant 28 +push constant 26 +push constant 25 +push constant 63 +push constant 24 +push constant 24 +push constant 60 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 53 +push constant 63 +push constant 3 +push constant 3 +push constant 31 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 54 +push constant 28 +push constant 6 +push constant 3 +push constant 3 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 55 +push constant 63 +push constant 49 +push constant 48 +push constant 48 +push constant 24 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 56 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 57 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 24 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 58 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 59 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 60 +push constant 0 +push constant 0 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 61 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 62 +push constant 0 +push constant 0 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 64 +push constant 30 +push constant 51 +push constant 51 +push constant 59 +push constant 59 +push constant 59 +push constant 27 +push constant 3 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 63 +push constant 30 +push constant 51 +push constant 51 +push constant 24 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 65 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 66 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 67 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 68 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 69 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 70 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 71 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 59 +push constant 51 +push constant 51 +push constant 54 +push constant 44 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 72 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 73 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 74 +push constant 60 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 27 +push constant 27 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 75 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 76 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 77 +push constant 33 +push constant 51 +push constant 63 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 78 +push constant 51 +push constant 51 +push constant 55 +push constant 55 +push constant 63 +push constant 59 +push constant 59 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 79 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 80 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 81 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 59 +push constant 30 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 82 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 83 +push constant 30 +push constant 51 +push constant 51 +push constant 6 +push constant 28 +push constant 48 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 84 +push constant 63 +push constant 63 +push constant 45 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 85 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 86 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 87 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 88 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 30 +push constant 30 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 89 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 90 +push constant 63 +push constant 51 +push constant 49 +push constant 24 +push constant 12 +push constant 6 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 91 +push constant 30 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 92 +push constant 0 +push constant 0 +push constant 1 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 48 +push constant 32 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 93 +push constant 30 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 94 +push constant 8 +push constant 28 +push constant 54 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 95 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 96 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 97 +push constant 0 +push constant 0 +push constant 0 +push constant 14 +push constant 24 +push constant 30 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 98 +push constant 3 +push constant 3 +push constant 3 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 99 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 3 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 100 +push constant 48 +push constant 48 +push constant 48 +push constant 60 +push constant 54 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 101 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 63 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 102 +push constant 28 +push constant 54 +push constant 38 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 103 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 104 +push constant 3 +push constant 3 +push constant 3 +push constant 27 +push constant 55 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 105 +push constant 12 +push constant 12 +push constant 0 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 106 +push constant 48 +push constant 48 +push constant 0 +push constant 56 +push constant 48 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 107 +push constant 3 +push constant 3 +push constant 3 +push constant 51 +push constant 27 +push constant 15 +push constant 15 +push constant 27 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 108 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 109 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 63 +push constant 43 +push constant 43 +push constant 43 +push constant 43 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 110 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 111 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 112 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 113 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 114 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 55 +push constant 51 +push constant 3 +push constant 3 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 115 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 6 +push constant 24 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 116 +push constant 4 +push constant 6 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 117 +push constant 0 +push constant 0 +push constant 0 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 118 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 119 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 120 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 121 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 24 +push constant 15 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 122 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 27 +push constant 12 +push constant 6 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 123 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 124 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 125 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 126 +push constant 38 +push constant 45 +push constant 25 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 0 +return +function Output.create 1 +push constant 11 +call Array.new 1 +pop local 0 +push argument 0 +push static 5 +add +push local 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +push local 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push argument 3 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push argument 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push argument 5 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push argument 6 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push argument 7 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push argument 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push argument 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push local 0 +add +push argument 10 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push local 0 +add +push argument 11 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Output.createShiftedMap 4 +push constant 127 +call Array.new 1 +pop static 6 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 127 +lt +not +if-goto WHILE_END0 +push local 2 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +push constant 11 +call Array.new 1 +pop local 1 +push local 2 +push static 6 +add +push local 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +pop local 3 +label WHILE_EXP1 +push local 3 +push constant 11 +lt +not +if-goto WHILE_END1 +push local 3 +push local 1 +add +push local 3 +push local 0 +add +pop pointer 1 +push that 0 +push constant 256 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop local 2 +goto IF_END0 +label IF_FALSE0 +push local 2 +push constant 1 +add +pop local 2 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.getMap 1 +push argument 0 +push constant 32 +lt +push argument 0 +push constant 126 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop argument 0 +label IF_FALSE0 +push static 2 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +push static 6 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END1 +push local 0 +return +function Output.drawChar 4 +push argument 0 +call Output.getMap 1 +pop local 2 +push static 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 256 +neg +and +pop local 3 +goto IF_END0 +label IF_FALSE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 255 +and +pop local 3 +label IF_END0 +push local 0 +push static 4 +add +push local 1 +push local 2 +add +pop pointer 1 +push that 0 +push local 3 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 32 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.moveCursor 0 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 22 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 63 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 20 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push constant 2 +call Math.divide 2 +pop static 0 +push constant 32 +push argument 0 +push constant 352 +call Math.multiply 2 +add +push static 0 +add +pop static 1 +push argument 1 +push static 0 +push constant 2 +call Math.multiply 2 +eq +pop static 2 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return +function Output.printChar 0 +push argument 0 +call String.newLine 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Output.println 0 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +call String.backSpace 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +call Output.backSpace 0 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +call Output.drawChar 1 +pop temp 0 +push static 2 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push static 0 +push constant 1 +add +pop static 0 +push static 1 +push constant 1 +add +pop static 1 +label IF_FALSE2 +push static 0 +push constant 32 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +call Output.println 0 +pop temp 0 +goto IF_END3 +label IF_FALSE3 +push static 2 +not +pop static 2 +label IF_END3 +label IF_END1 +label IF_END0 +push constant 0 +return +function Output.printString 2 +push argument 0 +call String.length 1 +pop local 1 +label WHILE_EXP0 +push local 0 +push local 1 +lt +not +if-goto WHILE_END0 +push argument 0 +push local 0 +call String.charAt 2 +call Output.printChar 1 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.printInt 0 +push static 3 +push argument 0 +call String.setInt 2 +pop temp 0 +push static 3 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 1 +push constant 352 +add +push static 0 +sub +pop static 1 +push constant 0 +pop static 0 +push constant 0 +not +pop static 2 +push static 1 +push constant 8128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop static 1 +label IF_FALSE0 +push constant 0 +return +function Output.backSpace 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push static 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push static 0 +push constant 1 +sub +pop static 0 +push static 1 +push constant 1 +sub +pop static 1 +goto IF_END1 +label IF_FALSE1 +push constant 31 +pop static 0 +push static 1 +push constant 32 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 8128 +pop static 1 +label IF_FALSE2 +push static 1 +push constant 321 +sub +pop static 1 +label IF_END1 +push constant 0 +pop static 2 +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +pop static 2 +label IF_END0 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return diff --git a/projects/09/Tetris/OS/Screen.vm b/projects/09/Tetris/OS/Screen.vm new file mode 100755 index 0000000..fccafb5 --- /dev/null +++ b/projects/09/Tetris/OS/Screen.vm @@ -0,0 +1,806 @@ +function Screen.init 1 +push constant 16384 +pop static 1 +push constant 0 +not +pop static 2 +push constant 17 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.clearScreen 1 +label WHILE_EXP0 +push local 0 +push constant 8192 +lt +not +if-goto WHILE_END0 +push local 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.updateLocation 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +not +and +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END0 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 2 +push constant 0 +return +function Screen.drawPixel 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 7 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 0 +push argument 0 +push local 0 +push constant 16 +call Math.multiply 2 +sub +pop local 1 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 0 +add +pop local 2 +push local 2 +push local 1 +push static 0 +add +pop pointer 1 +push that 0 +call Screen.updateLocation 2 +pop temp 0 +push constant 0 +return +function Screen.drawConditional 0 +push argument 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +push argument 0 +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push constant 0 +return +function Screen.drawLine 11 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 2 +push argument 0 +sub +call Math.abs 1 +pop local 3 +push argument 3 +push argument 1 +sub +call Math.abs 1 +pop local 2 +push local 3 +push local 2 +lt +pop local 6 +push local 6 +push argument 3 +push argument 1 +lt +and +push local 6 +not +push argument 2 +push argument 0 +lt +and +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +pop local 4 +push argument 2 +pop argument 0 +push local 4 +pop argument 2 +push argument 1 +pop local 4 +push argument 3 +pop argument 1 +push local 4 +pop argument 3 +label IF_FALSE1 +push local 6 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 3 +pop local 4 +push local 2 +pop local 3 +push local 4 +pop local 2 +push argument 1 +pop local 1 +push argument 0 +pop local 0 +push argument 3 +pop local 8 +push argument 0 +push argument 2 +gt +pop local 7 +goto IF_END2 +label IF_FALSE2 +push argument 0 +pop local 1 +push argument 1 +pop local 0 +push argument 2 +pop local 8 +push argument 1 +push argument 3 +gt +pop local 7 +label IF_END2 +push constant 2 +push local 2 +call Math.multiply 2 +push local 3 +sub +pop local 5 +push constant 2 +push local 2 +call Math.multiply 2 +pop local 9 +push constant 2 +push local 2 +push local 3 +sub +call Math.multiply 2 +pop local 10 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 8 +lt +not +if-goto WHILE_END0 +push local 5 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 5 +push local 9 +add +pop local 5 +goto IF_END3 +label IF_FALSE3 +push local 5 +push local 10 +add +pop local 5 +push local 7 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END4 +label IF_FALSE4 +push local 0 +push constant 1 +add +pop local 0 +label IF_END4 +label IF_END3 +push local 1 +push constant 1 +add +pop local 1 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawRectangle 9 +push argument 0 +push argument 2 +gt +push argument 1 +push argument 3 +gt +or +push argument 0 +push constant 0 +lt +or +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 9 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push argument 0 +push local 3 +push constant 16 +call Math.multiply 2 +sub +pop local 7 +push argument 2 +push constant 16 +call Math.divide 2 +pop local 4 +push argument 2 +push local 4 +push constant 16 +call Math.multiply 2 +sub +pop local 8 +push local 7 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 6 +push local 8 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 5 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 3 +add +pop local 0 +push local 4 +push local 3 +sub +pop local 2 +label WHILE_EXP0 +push argument 1 +push argument 3 +gt +not +not +if-goto WHILE_END0 +push local 0 +push local 2 +add +pop local 1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 5 +push local 6 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 6 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP1 +push local 0 +push local 1 +lt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +push argument 1 +push constant 1 +add +pop argument 1 +push local 1 +push constant 32 +add +push local 2 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawHorizontal 11 +push argument 1 +push argument 2 +call Math.min 2 +pop local 7 +push argument 1 +push argument 2 +call Math.max 2 +pop local 8 +push argument 0 +push constant 1 +neg +gt +push argument 0 +push constant 256 +lt +and +push local 7 +push constant 512 +lt +and +push local 8 +push constant 1 +neg +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 7 +push constant 0 +call Math.max 2 +pop local 7 +push local 8 +push constant 511 +call Math.min 2 +pop local 8 +push local 7 +push constant 16 +call Math.divide 2 +pop local 1 +push local 7 +push local 1 +push constant 16 +call Math.multiply 2 +sub +pop local 9 +push local 8 +push constant 16 +call Math.divide 2 +pop local 2 +push local 8 +push local 2 +push constant 16 +call Math.multiply 2 +sub +pop local 10 +push local 9 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 5 +push local 10 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 4 +push argument 0 +push constant 32 +call Math.multiply 2 +push local 1 +add +pop local 0 +push local 2 +push local 1 +sub +pop local 6 +push local 0 +push local 6 +add +pop local 3 +push local 6 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 4 +push local 5 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP0 +push local 0 +push local 3 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +push local 4 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +label IF_FALSE0 +push constant 0 +return +function Screen.drawSymetric 0 +push argument 1 +push argument 3 +sub +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 3 +add +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +sub +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +add +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push constant 0 +return +function Screen.drawCircle 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 12 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push argument 2 +sub +push constant 0 +lt +push argument 0 +push argument 2 +add +push constant 511 +gt +or +push argument 1 +push argument 2 +sub +push constant 0 +lt +or +push argument 1 +push argument 2 +add +push constant 255 +gt +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 13 +call Sys.error 1 +pop temp 0 +label IF_FALSE1 +push argument 2 +pop local 1 +push constant 1 +push argument 2 +sub +pop local 2 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 0 +gt +not +if-goto WHILE_END0 +push local 2 +push constant 0 +lt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 2 +push constant 2 +push local 0 +call Math.multiply 2 +add +push constant 3 +add +pop local 2 +goto IF_END2 +label IF_FALSE2 +push local 2 +push constant 2 +push local 0 +push local 1 +sub +call Math.multiply 2 +add +push constant 5 +add +pop local 2 +push local 1 +push constant 1 +sub +pop local 1 +label IF_END2 +push local 0 +push constant 1 +add +pop local 0 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/09/Tetris/OS/String.vm b/projects/09/Tetris/OS/String.vm new file mode 100755 index 0000000..9b7577e --- /dev/null +++ b/projects/09/Tetris/OS/String.vm @@ -0,0 +1,393 @@ +function String.new 0 +push constant 3 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 14 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Array.new 1 +pop this 1 +label IF_FALSE1 +push argument 0 +pop this 0 +push constant 0 +pop this 2 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 1 +call Array.dispose 1 +pop temp 0 +label IF_FALSE0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function String.length 0 +push argument 0 +pop pointer 0 +push this 2 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 15 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 16 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function String.appendChar 0 +push argument 0 +pop pointer 0 +push this 2 +push this 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 17 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push this 1 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 18 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push constant 1 +sub +pop this 2 +push constant 0 +return +function String.intValue 5 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push constant 0 +not +pop local 3 +push constant 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 4 +push constant 1 +pop local 0 +label IF_FALSE1 +label WHILE_EXP0 +push local 0 +push this 2 +lt +push local 3 +and +not +if-goto WHILE_END0 +push local 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 2 +push constant 0 +lt +push local 2 +push constant 9 +gt +or +not +pop local 3 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 1 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +neg +pop local 1 +label IF_FALSE3 +push local 1 +return +function String.setInt 4 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 6 +call Array.new 1 +pop local 2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 3 +push argument 1 +neg +pop argument 1 +label IF_FALSE1 +push argument 1 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 0 +gt +not +if-goto WHILE_END0 +push argument 1 +push constant 10 +call Math.divide 2 +pop local 1 +push local 0 +push local 2 +add +push constant 48 +push argument 1 +push local 1 +push constant 10 +call Math.multiply 2 +sub +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +push local 1 +pop argument 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push local 2 +add +push constant 45 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +push this 0 +push local 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE3 +push local 0 +push constant 0 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 0 +push this 1 +add +push constant 48 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +pop this 2 +goto IF_END4 +label IF_FALSE4 +push constant 0 +pop this 2 +label WHILE_EXP1 +push this 2 +push local 0 +lt +not +if-goto WHILE_END1 +push this 2 +push this 1 +add +push local 0 +push this 2 +push constant 1 +add +sub +push local 2 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +goto WHILE_EXP1 +label WHILE_END1 +label IF_END4 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 0 +return +function String.newLine 0 +push constant 128 +return +function String.backSpace 0 +push constant 129 +return +function String.doubleQuote 0 +push constant 34 +return diff --git a/projects/09/Tetris/OS/Sys.vm b/projects/09/Tetris/OS/Sys.vm new file mode 100755 index 0000000..c186dad --- /dev/null +++ b/projects/09/Tetris/OS/Sys.vm @@ -0,0 +1,83 @@ +function Sys.init 0 +call Memory.init 0 +pop temp 0 +call Math.init 0 +pop temp 0 +call Screen.init 0 +pop temp 0 +call Output.init 0 +pop temp 0 +call Keyboard.init 0 +pop temp 0 +call Main.main 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return +function Sys.halt 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.wait 1 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 1 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +label WHILE_EXP0 +push argument 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 50 +pop local 0 +label WHILE_EXP1 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push argument 0 +push constant 1 +sub +pop argument 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 69 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push argument 0 +call Output.printInt 1 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return diff --git a/projects/09/Tetris/Piece.jack b/projects/09/Tetris/Piece.jack new file mode 100755 index 0000000..3ca2309 --- /dev/null +++ b/projects/09/Tetris/Piece.jack @@ -0,0 +1,473 @@ +class Piece { + static int lBorder, rBorder, uBorder, dBorder, st; + field int x1, y1, x2, y2, x3, y3, x4, y4, piece, direction; + field bool move; + static Array st; + + constructor Piece new(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4, int p) { + let x1 = Ax1; + let y1 = Ay1; + let x2 = Ax2; + let y2 = Ay2; + let x3 = Ax3; + let y3 = Ay3; + let x4 = Ax4; + let y4 = Ay4; + let piece = p; + let direction = 0; + let move = true; + return this; + } + + function void init(){ + var int a; + let lBorder = 0; + let rBorder = 511; + let uBorder = 0; + let dBorder = 255; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + return; + } + + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** draws 2 rectangles also checks if there is a piece at the spawn which will indicate end of the game. */ + method bool draw() { + var bool finish; + let finish = true; + let finish = Piece.sample(x1,y1) & finish; + let finish = Piece.sample(x2,y2) & finish; + let finish = Piece.sample(x3,y3) & finish; + let finish = Piece.sample(x4,y4) & finish; + if (finish){ + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return true; + } + return false; + } + + /** Erases the square from the screen. */ + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x1, y2, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return; + } + /** checks if those coodinates hold any value > 0. */ + function bool sample(int x, int y){ + var int value, address, bit, memBlock; + let memBlock = x / 16; + let address = (32 * y) + memBlock + 16384; + if (address > 24576){ + return false; + } + let value = Memory.peek(address); + if (value = 0){ + return true; + } + return false; + } + + method bool getMove(){ + return move; + } + + /** Checks if the piece can move in the given direction(dir). */ + method bool fullSample(int dir){ + var int size1, size2, i, j; + var bool result, flagUpon; + if (dir = 1){ //down + let size1 = x2 - x1; + let size2 = x4 - x3; + let result = true; + while (i < size1){ // for each block of the first rectangle + let j = 0; + let flagUpon = false; + while (j < size2){ // for each block of the second rectangle + if ((x1 + i) = (x3 + j)){ // if this block of the first rectangle sits upon a block of the second rectangle + let flagUpon = true; + } + let result = result & Piece.sample(x3 + j, y4 + 1); // if there is a block under the second rectangle + let j = j + 16; // sets the coords for the next block of the second rectangle + } + if (~(flagUpon)){ + let result = result & Piece.sample(x1 + i, y2 + 1); // if there is a block under the first rectangle + } + let i = i + 16; // sets the coords for the next block of the firs rectangle + } + return result; + } + else{ + if (dir = 2){ //right + let size1 = y2 - y1; + let size2 = y4 - y3; + let result = true; + while (i < size1){ + let j = 0; + let flagUpon = false; + while (j < size2){ + if ((y1 + i) = (y3 + j)){ + let flagUpon = true; + } + let result = result & Piece.sample(x4 + 1, (y3 + j)); + let j = j + 16; + } + if (~(flagUpon)){ + let result = result & Piece.sample(x2 + 1, (y1 + i)); + } + let i = i +16; + } + return result; + } + else{ // left + let size1 = y2 - y1; + let size2 = y4 - y3; + let result = true; + while (i < size2){ + let j = 0; + let flagUpon = false; + while (j < size1){ + if ((y3 + i) = (y1 + j)){ + let flagUpon = true; + } + let result = result & Piece.sample(x1 - 1, (y1 + j)); + let j = j + 16; + } + if (~(flagUpon)){ + let result = result & Piece.sample(x3 - 1, (y3 + i)); + } + let i = i + 16; + } + return result; + } + } + } + + /** Moves the game piece 16 pixels down. */ + method void moveDown() { + var int i; + if ((y2 < dBorder) & (y4 < dBorder) & (move) & fullSample(1)) { + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x2, y1); + do Screen.drawRectangle(x3, y3, x4, y3); + let y1 = y1 + 1; + let y2 = y2 + 1; + let y3 = y3 + 1; + let y4 = y4 + 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y2, x2, y2); + do Screen.drawRectangle(x3, y4, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + else{ + let move = false; + } + return; + } + + /** Moves the game piece 16 pixels to the left. */ + method void moveLeft() { + var int i; + if ((x1 + 15 > lBorder) & (move) & (x3 + 15 > lBorder)& fullSample(0)){ + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x2, y1, x2, y2); + do Screen.drawRectangle(x4, y3, x4, y4); + let x1 = x1 - 1; + let x2 = x2 - 1; + let x3 = x3 - 1; + let x4 = x4 - 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + return; + } + + /** Moves the game piece 16 pixels to the right. */ + method void moveRight() { + var int i; + if ((x4 < rBorder) & (move) & (x2 < rBorder) & fullSample(2)){ + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x1, y2); + do Screen.drawRectangle(x3, y3, x3, y4); + let x1 = x1 + 1; + let x2 = x2 + 1; + let x3 = x3 + 1; + let x4 = x4 + 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + return; + } + + /** Deletes the piece and draws it at the new coodinates. */ + method void reDraw(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4){ + var int absTmp; + if((Ax1 < 175) | (Ax3 < 175) | (Ax2 > 336) | (Ax4 > 336)){ + return; + } + if((Ay2 > 255) | (Ay4 > 255) | (Ay1 < 0) | (Ay3 < 0)){ + return; + } + if((Ax1 > Ax2) | (Ax3 > Ax4) | (Ay1 > Ay2) | (Ay3 > Ay4)){ + return; + } + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + do Screen.setColor(true); + let x1 = Ax1; + let y1 = Ay1; + let x2 = Ax2; + let y2 = Ay2; + let x3 = Ax3; + let y3 = Ay3; + let x4 = Ax4; + let y4 = Ay4; + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return; + } + + /** Rotates the piece clockwise. */ + method void rotate(){ + var bool samp; + let samp = true; + if (direction = 0){ // starting position + if (piece = 0){ // arrow + let samp = Piece.sample(x4, y1) & samp; // checks if the place at which the new piece will be drawn are free + let samp = Piece.sample(x4, y1 - 1) & samp; + if (samp){ + do reDraw(x1, y1, x2, y2, x4 - 15, y4 - 47, x4, y4); // redraws it at the new location + let direction = 1; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 + 16, y1) & samp; + let samp = Piece.sample(x1 + 16, y1 - 16) & samp; + let samp = Piece.sample(x4, y1 - 16) & samp; + if(samp){ + do reDraw(x1 + 16, y1 - 16, x4 - 16, y4, x4 - 15, y1 - 16, x4, y1 - 1); + let direction = 1; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 - 16, y1 - 16) & samp; + let samp = Piece.sample(x1 - 16, y1) & samp; + if (samp){ + do reDraw(x1 - 16, y1 - 16, x2 - 16, y2 + 16, x3 + 32, y3, x4, y4); + let direction = 1; + } + } + if (piece = 3){ + let samp = Piece.sample(x3 + 16, y3 - 32) & samp; + let samp = Piece.sample(x4, y4 - 16) & samp; + if (samp){ + do reDraw(x1 + 16, y1, x2, y2 + 16, x3 + 16, y3 - 32, x4, y4 - 16); + let direction = 1; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 + 32, y3 - 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 - 16, y2 + 16, x3 + 32, y3 - 32, x4 + 16, y4 - 16); + let direction = 1; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 + 32, y1 - 32) & samp; + let samp = Piece.sample(x2 + 16, y2 - 16) & samp; + let samp = Piece.sample(x4 - 16, y4 + 16) & samp; + if (samp){ + do reDraw(x1 + 32, y1 - 32, x2 + 16, y2 - 16, x3, y3, x4 - 16, y4 + 16); + let direction = 1; + } + } + } + else{ + if (direction = 1){ + if (piece = 0){ + let samp = Piece.sample(x1, y3) & samp; + let samp = Piece.sample(x1 - 1, y3) & samp; + if (samp){ + do reDraw(x1 - 16, y3, x4, y3 + 15, x1, y1, x2, y2); + let direction = 2; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3, y3 + 16) & samp; + let samp = Piece.sample(x3, y3 + 32) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 16, x4, y4 + 16, x3, y3 + 32, x4, y2); + let direction = 2; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x2 + 16, y2 - 16) & samp; + let samp = Piece.sample(x3 - 32, y3) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 16, x2 + 16, y2 - 16, x3 - 32, y3, x4 - 32, y4); + let direction = 2; + } + } + if (piece = 3){ + let samp = Piece.sample(x1 - 16, y1) & samp; + let samp = Piece.sample(x4, y4 + 16) & samp; + if (samp){ + do reDraw(x1 - 16, y1, x2, y2 - 16, x3 - 16, y3 +32, x4, y4 + 16); + let direction = 2; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 - 32, y3 + 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 + 16, y2 - 16, x3 - 32, y3 + 32, x4 - 16, y4 + 16); + let direction = 2; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3 + 16, y3 - 16) & samp; + let samp = Piece.sample(x4 + 32, y4 - 32) & samp; + if (samp){ + do reDraw(x1 - 32, y1 + 16, x2 - 16, y2, x3, y3 - 16, x4 + 16, y4 - 32); + let direction = 2; + } + } + } + else{ + if (direction = 2){ + if (piece = 0){ + let samp = Piece.sample(x1, y1+16) & samp; + let samp = Piece.sample(x1, y1+32) & samp; + if (samp){ + do reDraw(x1, y1, x1 + 15, y1 + 47, x3, y3, x4, y4); + let direction = 3; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3, y3 + 16) & samp; + let samp = Piece.sample(x3, y3 + 32) & samp; + if (samp){ + do reDraw(x1, y1 + 16, x1 + 15, y1 + 31, x1 + 16, y1 - 16, x4 - 16, y4); + let direction = 3; + } + } + if (piece = 2){ + let samp = Piece.sample(x1, y1 - 16) & samp; + let samp = Piece.sample(x2 + 32, y2 + 16) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1, y1 - 16, x2 - 32, y2 - 16, x3 + 16, y3 - 32, x4 + 16, y4); + let direction = 3; + } + } + if (piece = 3){ + let samp = Piece.sample(x2 - 16, y2 + 16) & samp; + let samp = Piece.sample(x3, y3 - 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 - 16, y2 + 16, x3, y3 - 32, x4 - 16, y4 - 16); + let direction = 3; + } + } + if (piece = 4){ + let samp = Piece.sample(x1 - 16, y1 - 16) & samp; + let samp = Piece.sample(x2 - 32, y2) & samp; + if (samp){ + do reDraw(x1 - 16, y1 - 16, x2 - 32, y2, x3 + 16, y3 - 16, x4, y4); + let direction = 3; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 + 16, y1 - 16) & samp; + let samp = Piece.sample(x3 - 16, y3 - 16) & samp; + let samp = Piece.sample(x4 - 32, y4 + 32) & samp; + if (samp){ + do reDraw(x1 + 16, y1 - 16, x2, y2, x3 - 16, y3 + 16, x4 - 32, y4 + 32); + let direction = 3; + } + } + } + else{ + if (piece = 0){ + let samp = Piece.sample(x4 + 16, y4) & samp; + let samp = Piece.sample(x4 + 32, y4) & samp; + if (samp){ + do reDraw(x3, y3, x4, y4, x1, y1 + 32, x1 + 47, y1 + 47); + let direction = 0; + } + } + if (piece = 1){ + let samp = Piece.sample(x1, y1 - 16) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1, y1 - 16, x2, y2 -16, x1, y1, x4 + 16, y4); + let direction = 0; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 + 32, y1 + 16) & samp; + let samp = Piece.sample(x3 - 16, y3 + 32) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1 + 32, y1 + 16, x2 + 32, y2 + 16, x3 - 16, y3 + 32, x4 + 16, y4); + let direction = 0; + } + } + if (piece = 3){ + let samp = Piece.sample(x3, y3 + 32) & samp; + let samp = Piece.sample(x4 + 16, y4 + 16) & samp; + if (samp){ + do reDraw(x1, y1, x2 + 16, y2 - 16, x3, y3 + 32, x4 + 16, y4 + 16); + let direction = 0; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 - 16, y3 + 16) & samp; + let samp = Piece.sample(x2 + 32, y2) & samp; + if (samp){ + do reDraw(x1 + 16, y1 + 16, x2 + 32, y2, x3 - 16, y3 + 16, x4, y4); + let direction = 0; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 - 16, y1 + 32) & samp; + let samp = Piece.sample(x3 + 16, y3) & samp; + let samp = Piece.sample(x4 + 32, y4 - 16) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 32, x2, y2 + 16, x3 + 16, y3, x4 + 32, y4 - 16); + let direction = 0; + } + } + } + } + } + return; + } +} + diff --git a/projects/09/Tetris/Piece.vm b/projects/09/Tetris/Piece.vm new file mode 100755 index 0000000..eb6061b --- /dev/null +++ b/projects/09/Tetris/Piece.vm @@ -0,0 +1,2219 @@ +function Piece.new 0 +push constant 11 +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 argument 5 +pop this 5 +push argument 6 +pop this 6 +push argument 7 +pop this 7 +push argument 8 +pop this 8 +push constant 0 +pop this 9 +push constant 0 +not +pop this 10 +push pointer 0 +return +function Piece.init 1 +push constant 0 +pop static 0 +push constant 511 +pop static 1 +push constant 0 +pop static 2 +push constant 255 +pop static 3 +push constant 16 +call Array.new 1 +pop static 5 +push constant 0 +push static 5 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 5 +add +push local 0 +push constant 1 +sub +push static 5 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 5 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Piece.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function Piece.draw 1 +push argument 0 +pop pointer 0 +push constant 0 +not +pop local 0 +push this 0 +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push this 3 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +return +label IF_FALSE0 +push constant 0 +return +function Piece.erase 0 +push argument 0 +pop pointer 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 3 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Piece.sample 4 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push constant 32 +push argument 1 +call Math.multiply 2 +push local 3 +add +push constant 16384 +add +pop local 1 +push local 1 +push constant 24576 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push local 1 +call Memory.peek 1 +pop local 0 +push local 0 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +return +label IF_FALSE1 +push constant 0 +return +function Piece.getMove 0 +push argument 0 +pop pointer 0 +push this 10 +return +function Piece.fullSample 6 +push argument 0 +pop pointer 0 +push argument 1 +push constant 1 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 2 +push this 0 +sub +pop local 0 +push this 6 +push this 4 +sub +pop local 1 +push constant 0 +not +pop local 4 +label WHILE_EXP0 +push local 2 +push local 0 +lt +not +if-goto WHILE_END0 +push constant 0 +pop local 3 +push constant 0 +pop local 5 +label WHILE_EXP1 +push local 3 +push local 1 +lt +not +if-goto WHILE_END1 +push this 0 +push local 2 +add +push this 4 +push local 3 +add +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 5 +label IF_FALSE1 +push local 4 +push this 4 +push local 3 +add +push this 7 +push constant 1 +add +call Piece.sample 2 +and +pop local 4 +push local 3 +push constant 16 +add +pop local 3 +goto WHILE_EXP1 +label WHILE_END1 +push local 5 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 4 +push this 0 +push local 2 +add +push this 3 +push constant 1 +add +call Piece.sample 2 +and +pop local 4 +label IF_FALSE2 +push local 2 +push constant 16 +add +pop local 2 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +return +goto IF_END0 +label IF_FALSE0 +push argument 1 +push constant 2 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push this 3 +push this 1 +sub +pop local 0 +push this 7 +push this 5 +sub +pop local 1 +push constant 0 +not +pop local 4 +label WHILE_EXP2 +push local 2 +push local 0 +lt +not +if-goto WHILE_END2 +push constant 0 +pop local 3 +push constant 0 +pop local 5 +label WHILE_EXP3 +push local 3 +push local 1 +lt +not +if-goto WHILE_END3 +push this 1 +push local 2 +add +push this 5 +push local 3 +add +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 0 +not +pop local 5 +label IF_FALSE4 +push local 4 +push this 6 +push constant 1 +add +push this 5 +push local 3 +add +call Piece.sample 2 +and +pop local 4 +push local 3 +push constant 16 +add +pop local 3 +goto WHILE_EXP3 +label WHILE_END3 +push local 5 +not +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 4 +push this 2 +push constant 1 +add +push this 1 +push local 2 +add +call Piece.sample 2 +and +pop local 4 +label IF_FALSE5 +push local 2 +push constant 16 +add +pop local 2 +goto WHILE_EXP2 +label WHILE_END2 +push local 4 +return +goto IF_END3 +label IF_FALSE3 +push this 3 +push this 1 +sub +pop local 0 +push this 7 +push this 5 +sub +pop local 1 +push constant 0 +not +pop local 4 +label WHILE_EXP4 +push local 2 +push local 1 +lt +not +if-goto WHILE_END4 +push constant 0 +pop local 3 +push constant 0 +pop local 5 +label WHILE_EXP5 +push local 3 +push local 0 +lt +not +if-goto WHILE_END5 +push this 5 +push local 2 +add +push this 1 +push local 3 +add +eq +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push constant 0 +not +pop local 5 +label IF_FALSE6 +push local 4 +push this 0 +push constant 1 +sub +push this 1 +push local 3 +add +call Piece.sample 2 +and +pop local 4 +push local 3 +push constant 16 +add +pop local 3 +goto WHILE_EXP5 +label WHILE_END5 +push local 5 +not +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push local 4 +push this 4 +push constant 1 +sub +push this 5 +push local 2 +add +call Piece.sample 2 +and +pop local 4 +label IF_FALSE7 +push local 2 +push constant 16 +add +pop local 2 +goto WHILE_EXP4 +label WHILE_END4 +push local 4 +return +label IF_END3 +label IF_END0 +function Piece.moveDown 1 +push argument 0 +pop pointer 0 +push this 3 +push static 3 +lt +push this 7 +push static 3 +lt +and +push this 10 +and +push pointer 0 +push constant 1 +call Piece.fullSample 2 +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 1 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 5 +call Screen.drawRectangle 4 +pop temp 0 +push this 1 +push constant 1 +add +pop this 1 +push this 3 +push constant 1 +add +pop this 3 +push this 5 +push constant 1 +add +pop this 5 +push this 7 +push constant 1 +add +pop this 7 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 3 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 7 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +push constant 10 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +pop this 10 +label IF_END0 +push constant 0 +return +function Piece.moveLeft 1 +push argument 0 +pop pointer 0 +push this 0 +push constant 15 +add +push static 0 +gt +push this 10 +and +push this 4 +push constant 15 +add +push static 0 +gt +and +push pointer 0 +push constant 0 +call Piece.fullSample 2 +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 2 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 6 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push this 0 +push constant 1 +sub +pop this 0 +push this 2 +push constant 1 +sub +pop this 2 +push this 4 +push constant 1 +sub +pop this 4 +push this 6 +push constant 1 +sub +pop this 6 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +push constant 10 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +label IF_FALSE0 +push constant 0 +return +function Piece.moveRight 1 +push argument 0 +pop pointer 0 +push this 6 +push static 1 +lt +push this 10 +and +push this 2 +push static 1 +lt +and +push pointer 0 +push constant 2 +call Piece.fullSample 2 +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 0 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 4 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push this 0 +push constant 1 +add +pop this 0 +push this 2 +push constant 1 +add +pop this 2 +push this 4 +push constant 1 +add +pop this 4 +push this 6 +push constant 1 +add +pop this 6 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +push constant 10 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +label IF_FALSE0 +push constant 0 +return +function Piece.reDraw 1 +push argument 0 +pop pointer 0 +push argument 1 +push constant 175 +lt +push argument 5 +push constant 175 +lt +or +push argument 3 +push constant 336 +gt +or +push argument 7 +push constant 336 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push argument 4 +push constant 255 +gt +push argument 8 +push constant 255 +gt +or +push argument 2 +push constant 0 +lt +or +push argument 6 +push constant 0 +lt +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +return +label IF_FALSE1 +push argument 1 +push argument 3 +gt +push argument 5 +push argument 7 +gt +or +push argument 2 +push argument 4 +gt +or +push argument 6 +push argument 8 +gt +or +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 0 +return +label IF_FALSE2 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push argument 1 +pop this 0 +push argument 2 +pop this 1 +push argument 3 +pop this 2 +push argument 4 +pop this 3 +push argument 5 +pop this 4 +push argument 6 +pop this 5 +push argument 7 +pop this 6 +push argument 8 +pop this 7 +push this 0 +push this 1 +push this 2 +push this 3 +call Screen.drawRectangle 4 +pop temp 0 +push this 4 +push this 5 +push this 6 +push this 7 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +return +function Piece.rotate 1 +push argument 0 +pop pointer 0 +push constant 0 +not +pop local 0 +push this 9 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 8 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push this 6 +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 1 +push constant 1 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push pointer 0 +push this 0 +push this 1 +push this 2 +push this 3 +push this 6 +push constant 15 +sub +push this 7 +push constant 47 +sub +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE2 +label IF_FALSE1 +push this 8 +push constant 1 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push this 0 +push constant 16 +add +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +push this 6 +push constant 16 +sub +push this 7 +push this 6 +push constant 15 +sub +push this 1 +push constant 16 +sub +push this 6 +push this 1 +push constant 1 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE4 +label IF_FALSE3 +push this 8 +push constant 2 +eq +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push constant 16 +sub +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +push this 4 +push constant 32 +add +push this 5 +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE6 +label IF_FALSE5 +push this 8 +push constant 3 +eq +if-goto IF_TRUE7 +goto IF_FALSE7 +label IF_TRUE7 +push this 4 +push constant 16 +add +push this 5 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 7 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE8 +goto IF_FALSE8 +label IF_TRUE8 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push this 2 +push this 3 +push constant 16 +add +push this 4 +push constant 16 +add +push this 5 +push constant 32 +sub +push this 6 +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE8 +label IF_FALSE7 +push this 8 +push constant 4 +eq +if-goto IF_TRUE9 +goto IF_FALSE9 +label IF_TRUE9 +push this 4 +push constant 32 +add +push this 5 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE10 +goto IF_FALSE10 +label IF_TRUE10 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +push this 4 +push constant 32 +add +push this 5 +push constant 32 +sub +push this 6 +push constant 16 +add +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE10 +label IF_FALSE9 +push this 8 +push constant 5 +eq +if-goto IF_TRUE11 +goto IF_FALSE11 +label IF_TRUE11 +push this 0 +push constant 32 +add +push this 1 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE12 +goto IF_FALSE12 +label IF_TRUE12 +push pointer 0 +push this 0 +push constant 32 +add +push this 1 +push constant 32 +sub +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push this 5 +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 1 +pop this 9 +label IF_FALSE12 +label IF_FALSE11 +goto IF_END0 +label IF_FALSE0 +push this 9 +push constant 1 +eq +if-goto IF_TRUE13 +goto IF_FALSE13 +label IF_TRUE13 +push this 8 +push constant 0 +eq +if-goto IF_TRUE14 +goto IF_FALSE14 +label IF_TRUE14 +push this 0 +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push constant 1 +sub +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE15 +goto IF_FALSE15 +label IF_TRUE15 +push pointer 0 +push this 0 +push constant 16 +sub +push this 5 +push this 6 +push this 5 +push constant 15 +add +push this 0 +push this 1 +push this 2 +push this 3 +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE15 +label IF_FALSE14 +push this 8 +push constant 1 +eq +if-goto IF_TRUE16 +goto IF_FALSE16 +label IF_TRUE16 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE17 +goto IF_FALSE17 +label IF_TRUE17 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +push this 6 +push this 7 +push constant 16 +add +push this 4 +push this 5 +push constant 32 +add +push this 6 +push this 3 +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE17 +label IF_FALSE16 +push this 8 +push constant 2 +eq +if-goto IF_TRUE18 +goto IF_FALSE18 +label IF_TRUE18 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 32 +sub +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE19 +goto IF_FALSE19 +label IF_TRUE19 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push constant 32 +sub +push this 5 +push this 6 +push constant 32 +sub +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE19 +label IF_FALSE18 +push this 8 +push constant 3 +eq +if-goto IF_TRUE20 +goto IF_FALSE20 +label IF_TRUE20 +push this 0 +push constant 16 +sub +push this 1 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push this 7 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE21 +goto IF_FALSE21 +label IF_TRUE21 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push this 2 +push this 3 +push constant 16 +sub +push this 4 +push constant 16 +sub +push this 5 +push constant 32 +add +push this 6 +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE21 +label IF_FALSE20 +push this 8 +push constant 4 +eq +if-goto IF_TRUE22 +goto IF_FALSE22 +label IF_TRUE22 +push this 4 +push constant 32 +sub +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE23 +goto IF_FALSE23 +label IF_TRUE23 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push constant 32 +sub +push this 5 +push constant 32 +add +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE23 +label IF_FALSE22 +push this 8 +push constant 5 +eq +if-goto IF_TRUE24 +goto IF_FALSE24 +label IF_TRUE24 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +add +push this 5 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +add +push this 7 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE25 +goto IF_FALSE25 +label IF_TRUE25 +push pointer 0 +push this 0 +push constant 32 +sub +push this 1 +push constant 16 +add +push this 2 +push constant 16 +sub +push this 3 +push this 4 +push this 5 +push constant 16 +sub +push this 6 +push constant 16 +add +push this 7 +push constant 32 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 2 +pop this 9 +label IF_FALSE25 +label IF_FALSE24 +goto IF_END13 +label IF_FALSE13 +push this 9 +push constant 2 +eq +if-goto IF_TRUE26 +goto IF_FALSE26 +label IF_TRUE26 +push this 8 +push constant 0 +eq +if-goto IF_TRUE27 +goto IF_FALSE27 +label IF_TRUE27 +push this 0 +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 0 +push this 1 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE28 +goto IF_FALSE28 +label IF_TRUE28 +push pointer 0 +push this 0 +push this 1 +push this 0 +push constant 15 +add +push this 1 +push constant 47 +add +push this 4 +push this 5 +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE28 +label IF_FALSE27 +push this 8 +push constant 1 +eq +if-goto IF_TRUE29 +goto IF_FALSE29 +label IF_TRUE29 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE30 +goto IF_FALSE30 +label IF_TRUE30 +push pointer 0 +push this 0 +push this 1 +push constant 16 +add +push this 0 +push constant 15 +add +push this 1 +push constant 31 +add +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +push this 6 +push constant 16 +sub +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE30 +label IF_FALSE29 +push this 8 +push constant 2 +eq +if-goto IF_TRUE31 +goto IF_FALSE31 +label IF_TRUE31 +push this 0 +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 32 +add +push this 3 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE32 +goto IF_FALSE32 +label IF_TRUE32 +push pointer 0 +push this 0 +push this 1 +push constant 16 +sub +push this 2 +push constant 32 +sub +push this 3 +push constant 16 +sub +push this 4 +push constant 16 +add +push this 5 +push constant 32 +sub +push this 6 +push constant 16 +add +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE32 +label IF_FALSE31 +push this 8 +push constant 3 +eq +if-goto IF_TRUE33 +goto IF_FALSE33 +label IF_TRUE33 +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push this 5 +push constant 32 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE34 +goto IF_FALSE34 +label IF_TRUE34 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +sub +push this 3 +push constant 16 +add +push this 4 +push this 5 +push constant 32 +sub +push this 6 +push constant 16 +sub +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE34 +label IF_FALSE33 +push this 8 +push constant 4 +eq +if-goto IF_TRUE35 +goto IF_FALSE35 +label IF_TRUE35 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 32 +sub +push this 3 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE36 +goto IF_FALSE36 +label IF_TRUE36 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 16 +sub +push this 2 +push constant 32 +sub +push this 3 +push this 4 +push constant 16 +add +push this 5 +push constant 16 +sub +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE36 +label IF_FALSE35 +push this 8 +push constant 5 +eq +if-goto IF_TRUE37 +goto IF_FALSE37 +label IF_TRUE37 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +sub +push this 7 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE38 +goto IF_FALSE38 +label IF_TRUE38 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +sub +push this 2 +push this 3 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +add +push this 6 +push constant 32 +sub +push this 7 +push constant 32 +add +call Piece.reDraw 9 +pop temp 0 +push constant 3 +pop this 9 +label IF_FALSE38 +label IF_FALSE37 +goto IF_END26 +label IF_FALSE26 +push this 8 +push constant 0 +eq +if-goto IF_TRUE39 +goto IF_FALSE39 +label IF_TRUE39 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE40 +goto IF_FALSE40 +label IF_TRUE40 +push pointer 0 +push this 4 +push this 5 +push this 6 +push this 7 +push this 0 +push this 1 +push constant 32 +add +push this 0 +push constant 47 +add +push this 1 +push constant 47 +add +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE40 +label IF_FALSE39 +push this 8 +push constant 1 +eq +if-goto IF_TRUE41 +goto IF_FALSE41 +label IF_TRUE41 +push this 0 +push this 1 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE42 +goto IF_FALSE42 +label IF_TRUE42 +push pointer 0 +push this 0 +push this 1 +push constant 16 +sub +push this 2 +push this 3 +push constant 16 +sub +push this 0 +push this 1 +push this 6 +push constant 16 +add +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE42 +label IF_FALSE41 +push this 8 +push constant 2 +eq +if-goto IF_TRUE43 +goto IF_FALSE43 +label IF_TRUE43 +push this 0 +push constant 32 +add +push this 1 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +sub +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE44 +goto IF_FALSE44 +label IF_TRUE44 +push pointer 0 +push this 0 +push constant 32 +add +push this 1 +push constant 16 +add +push this 2 +push constant 32 +add +push this 3 +push constant 16 +add +push this 4 +push constant 16 +sub +push this 5 +push constant 32 +add +push this 6 +push constant 16 +add +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE44 +label IF_FALSE43 +push this 8 +push constant 3 +eq +if-goto IF_TRUE45 +goto IF_FALSE45 +label IF_TRUE45 +push this 4 +push this 5 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 16 +add +push this 7 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE46 +goto IF_FALSE46 +label IF_TRUE46 +push pointer 0 +push this 0 +push this 1 +push this 2 +push constant 16 +add +push this 3 +push constant 16 +sub +push this 4 +push this 5 +push constant 32 +add +push this 6 +push constant 16 +add +push this 7 +push constant 16 +add +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE46 +label IF_FALSE45 +push this 8 +push constant 4 +eq +if-goto IF_TRUE47 +goto IF_FALSE47 +label IF_TRUE47 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 2 +push constant 32 +add +push this 3 +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE48 +goto IF_FALSE48 +label IF_TRUE48 +push pointer 0 +push this 0 +push constant 16 +add +push this 1 +push constant 16 +add +push this 2 +push constant 32 +add +push this 3 +push this 4 +push constant 16 +sub +push this 5 +push constant 16 +add +push this 6 +push this 7 +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE48 +label IF_FALSE47 +push this 8 +push constant 5 +eq +if-goto IF_TRUE49 +goto IF_FALSE49 +label IF_TRUE49 +push this 0 +push constant 16 +sub +push this 1 +push constant 32 +add +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 4 +push constant 16 +add +push this 5 +call Piece.sample 2 +push local 0 +and +pop local 0 +push this 6 +push constant 32 +add +push this 7 +push constant 16 +sub +call Piece.sample 2 +push local 0 +and +pop local 0 +push local 0 +if-goto IF_TRUE50 +goto IF_FALSE50 +label IF_TRUE50 +push pointer 0 +push this 0 +push constant 16 +sub +push this 1 +push constant 32 +add +push this 2 +push this 3 +push constant 16 +add +push this 4 +push constant 16 +add +push this 5 +push this 6 +push constant 32 +add +push this 7 +push constant 16 +sub +call Piece.reDraw 9 +pop temp 0 +push constant 0 +pop this 9 +label IF_FALSE50 +label IF_FALSE49 +label IF_END26 +label IF_END13 +label IF_END0 +push constant 0 +return diff --git a/projects/09/Tetris/Tetris.jack b/projects/09/Tetris/Tetris.jack new file mode 100755 index 0000000..0d15797 --- /dev/null +++ b/projects/09/Tetris/Tetris.jack @@ -0,0 +1,203 @@ +class Tetris { + static int points, seed, next_seed; + + function void tetris(int z){ + var Piece p, nextPiece; + var int i, x1, y1, x2, y2, x3, y3, x4, y4, key, j, randTmp, piece_number, moves; + var Array left_g, right_g, box, stick, left_z, right_z,dick, all_piece, tmp; + do Piece.init(); + do Tetris.border(); + let points = 0; + let all_piece = Array.new(25); + let all_piece[0] = Tetris.newPiece(16,0,31,15, 0,16,47,31, 0); // arrow + let all_piece[1] = Tetris.newPiece(0,0,15,15, 0,16,47,31, 1); // right_L + let all_piece[2] = Tetris.newPiece(32,16,47,31, 0,32,47,47, 2); // left_L + let all_piece[3] = Tetris.newPiece(0,0,31,15, 16,16,47,31, 3); // left_z + let all_piece[4] = Tetris.newPiece(16,0,47,15, 0,16,31,31, 4); // right_z + let all_piece[5] = Tetris.newPiece(0,0,31,15, 32,0,63,15, 5); //stick + let all_piece[6] = Tetris.newPiece(0,0,15,31, 16,0,31,31, 6); //box + + + let seed = z * 3; // multiply by 3, because it gets in a loop on some even numbers + let next_seed = Tetris.randomNumber(); + do Output.moveCursor(0,0); + do Output.printString("Point: "); + do Output.printInt(points); + do Output.println(); + do Output.printString("Next Piece: "); + while (true){ // The main game loop + let j = next_seed; + let next_seed = Tetris.randomNumber(); + let tmp = all_piece[j]; // initializes the coords of the game piece + let x1 = tmp[0]; + let y1 = tmp[1]; + let x2 = tmp[2]; + let y2 = tmp[3]; + let x3 = tmp[4]; + let y3 = tmp[5]; + let x4 = tmp[6]; + let y4 = tmp[7]; + let piece_number = tmp[8]; + let p = Piece.new(x1 + 240, y1, x2 + 240, y2, x3 + 240, y3, x4 + 240, y4, piece_number); + if (~(p.draw())){ // if a piece tries to spawn above a limit the game ends + if (~(Tetris.finish())){ + return; + } + } + let tmp = all_piece[next_seed]; + let x1 = tmp[0]; // initializes the coords of the next game piece that is being displayed + let y1 = tmp[1]; + let x2 = tmp[2]; + let y2 = tmp[3]; + let x3 = tmp[4]; + let y3 = tmp[5]; + let x4 = tmp[6]; + let y4 = tmp[7]; + let piece_number = tmp[8]; + let nextPiece = Piece.new(x1 + 16, y1 + 32, x2+16, y2 + 32, x3+16, y3 + 32, x4 + 16, y4 + 32, piece_number); + do nextPiece.draw(); + while (p.getMove()){ + let moves = 0; + while (moves < 3){ // one can move its piece 3 times before it moves down automatically + let key = Keyboard.keyPressed(); + if (key = 130){ + do p.moveLeft(); + do Sys.wait(80); + } + if (key = 132){ + do p.moveRight(); + do Sys.wait(80); + } + if (key = 131){ + do p.rotate(); + } + if (key = 133){ + do p.moveDown(); + do p.moveDown(); + } + let moves = moves +1; + } + do p.moveDown(); + let i = i + 1; + do Sys.wait(80); + } + let i = 0; + do p.dispose(); + do Tetris.completeRow(); + do Output.moveCursor(0,7); + do Output.printInt(points); + do Screen.setColor(false); + do Screen.drawRectangle(16,32,80,96); + do Screen.setColor(true); + do nextPiece.dispose(); + } + return; + } + + function void completeRow(){ // checks if a row has been completed + var int adddress, row, colloum; + var bool complete; + let adddress = 16384 + 11; + let row = 15; + while (row > 0){ // for each row + let complete = true; + let colloum = 0; + while ((colloum < 10) & (complete)){ // for each collum + let complete = Memory.peek(adddress + colloum + (row * 512)) & complete; + let colloum = colloum + 1; + } + if (complete){ // removes the row + do Screen.setColor(false); + do Screen.drawRectangle(176, row * 16, 335, ((row * 16)+ 15) ); + let points = points + 1; + do Tetris.shift(row); + } + let row = row - 1; + } + return; + } + + function void shift(int rowShift){ // shifts all rows above the completed one + var int j, val, adddress, tmp, k; + let adddress = 16384 + 11; + while (rowShift > 1){ // each row + let j = 0; + while (j < 10){ // collum in the game field + let k = 0; + while (k < 16){ // each line a in 16 x 16 box + let tmp = adddress + j + (((rowShift - 1) * 512) + (k * 32)); + let val = Memory.peek(tmp); + do Memory.poke(adddress + j + ((rowShift * 512) + (k * 32)), val); + do Memory.poke(tmp,0); + let k = k+ 1; + } + let j = j + 1; + } + let rowShift = rowShift - 1; + } + return; + } + + function void border(){ // draws a border + do Screen.drawLine(175,0,175,255); + do Screen.drawLine(336,0,336,255); + return; + } + + function Array newPiece(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4,int p){ + var Array gamepice; + let gamepice = Array.new(9); + let gamepice[0] = Ax1; + let gamepice[1] = Ay1; + let gamepice[2] = Ax2; + let gamepice[3] = Ay2; + let gamepice[4] = Ax3; + let gamepice[5] = Ay3; + let gamepice[6] = Ax4; + let gamepice[7] = Ay4; + let gamepice[8] = p; + return gamepice; + } + + function int randomNumber(){ // radom number generator + var int multiplier,additor,moduler,toBeModulated; + let multiplier = 7; + let additor = 13; + let moduler = 1133; + let toBeModulated = (multiplier * seed) + additor; + let seed = Tetris.mod(toBeModulated,moduler); + return Tetris.mod(seed,7); + } + + function bool finish(){ // after finishing the game the player has 2 options to start onether or to end the game + var char c; + do Screen.clearScreen(); + do Output.moveCursor(10,24); + do Output.printString("Your score: "); + do Output.printInt(points); + do Sys.wait(10000); + do Screen.clearScreen(); + do Output.moveCursor(10,0); + do Output.printString("Would you like to play again, for yes click 'Y' and for no 'N':"); + let c = Keyboard.readChar(); + if (c = 89){ + do Screen.clearScreen(); + return false; + } + if (c = 78){ + do Screen.clearScreen(); + do Sys.halt(); + } + return true; + } + + function int mod(int tbm, int mo){ //simple moduler devision + var int val, tmp2; + if (tbm < mo){ + return tbm; + } + let tmp2 = (tbm / mo) * mo; + let val = tbm - tmp2; + return val; + } +} \ No newline at end of file diff --git a/projects/09/Tetris/Tetris.vm b/projects/09/Tetris/Tetris.vm new file mode 100755 index 0000000..0ed5ac1 --- /dev/null +++ b/projects/09/Tetris/Tetris.vm @@ -0,0 +1,999 @@ +function Tetris.tetris 25 +call Piece.init 0 +pop temp 0 +call Tetris.border 0 +pop temp 0 +push constant 0 +pop static 0 +push constant 25 +call Array.new 1 +pop local 23 +push constant 0 +push local 23 +add +push constant 16 +push constant 0 +push constant 31 +push constant 15 +push constant 0 +push constant 16 +push constant 47 +push constant 31 +push constant 0 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 23 +add +push constant 0 +push constant 0 +push constant 15 +push constant 15 +push constant 0 +push constant 16 +push constant 47 +push constant 31 +push constant 1 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 23 +add +push constant 32 +push constant 16 +push constant 47 +push constant 31 +push constant 0 +push constant 32 +push constant 47 +push constant 47 +push constant 2 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 23 +add +push constant 0 +push constant 0 +push constant 31 +push constant 15 +push constant 16 +push constant 16 +push constant 47 +push constant 31 +push constant 3 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 23 +add +push constant 16 +push constant 0 +push constant 47 +push constant 15 +push constant 0 +push constant 16 +push constant 31 +push constant 31 +push constant 4 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 23 +add +push constant 0 +push constant 0 +push constant 31 +push constant 15 +push constant 32 +push constant 0 +push constant 63 +push constant 15 +push constant 5 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 23 +add +push constant 0 +push constant 0 +push constant 15 +push constant 31 +push constant 16 +push constant 0 +push constant 31 +push constant 31 +push constant 6 +call Tetris.newPiece 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push argument 0 +push constant 3 +call Math.multiply 2 +pop static 1 +call Tetris.randomNumber 0 +pop static 2 +push constant 0 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 7 +call String.new 1 +push constant 80 +call String.appendChar 2 +push constant 111 +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 58 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +push static 0 +call Output.printInt 1 +pop temp 0 +call Output.println 0 +pop temp 0 +push constant 12 +call String.new 1 +push constant 78 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 120 +call String.appendChar 2 +push constant 116 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 80 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 101 +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 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +push static 2 +pop local 12 +call Tetris.randomNumber 0 +pop static 2 +push local 12 +push local 23 +add +pop pointer 1 +push that 0 +pop local 24 +push constant 0 +push local 24 +add +pop pointer 1 +push that 0 +pop local 3 +push constant 1 +push local 24 +add +pop pointer 1 +push that 0 +pop local 4 +push constant 2 +push local 24 +add +pop pointer 1 +push that 0 +pop local 5 +push constant 3 +push local 24 +add +pop pointer 1 +push that 0 +pop local 6 +push constant 4 +push local 24 +add +pop pointer 1 +push that 0 +pop local 7 +push constant 5 +push local 24 +add +pop pointer 1 +push that 0 +pop local 8 +push constant 6 +push local 24 +add +pop pointer 1 +push that 0 +pop local 9 +push constant 7 +push local 24 +add +pop pointer 1 +push that 0 +pop local 10 +push constant 8 +push local 24 +add +pop pointer 1 +push that 0 +pop local 14 +push local 3 +push constant 240 +add +push local 4 +push local 5 +push constant 240 +add +push local 6 +push local 7 +push constant 240 +add +push local 8 +push local 9 +push constant 240 +add +push local 10 +push local 14 +call Piece.new 9 +pop local 0 +push local 0 +call Piece.draw 1 +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Tetris.finish 0 +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +return +label IF_FALSE1 +label IF_FALSE0 +push static 2 +push local 23 +add +pop pointer 1 +push that 0 +pop local 24 +push constant 0 +push local 24 +add +pop pointer 1 +push that 0 +pop local 3 +push constant 1 +push local 24 +add +pop pointer 1 +push that 0 +pop local 4 +push constant 2 +push local 24 +add +pop pointer 1 +push that 0 +pop local 5 +push constant 3 +push local 24 +add +pop pointer 1 +push that 0 +pop local 6 +push constant 4 +push local 24 +add +pop pointer 1 +push that 0 +pop local 7 +push constant 5 +push local 24 +add +pop pointer 1 +push that 0 +pop local 8 +push constant 6 +push local 24 +add +pop pointer 1 +push that 0 +pop local 9 +push constant 7 +push local 24 +add +pop pointer 1 +push that 0 +pop local 10 +push constant 8 +push local 24 +add +pop pointer 1 +push that 0 +pop local 14 +push local 3 +push constant 16 +add +push local 4 +push constant 32 +add +push local 5 +push constant 16 +add +push local 6 +push constant 32 +add +push local 7 +push constant 16 +add +push local 8 +push constant 32 +add +push local 9 +push constant 16 +add +push local 10 +push constant 32 +add +push local 14 +call Piece.new 9 +pop local 1 +push local 1 +call Piece.draw 1 +pop temp 0 +label WHILE_EXP1 +push local 0 +call Piece.getMove 1 +not +if-goto WHILE_END1 +push constant 0 +pop local 15 +label WHILE_EXP2 +push local 15 +push constant 3 +lt +not +if-goto WHILE_END2 +call Keyboard.keyPressed 0 +pop local 11 +push local 11 +push constant 130 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +call Piece.moveLeft 1 +pop temp 0 +push constant 80 +call Sys.wait 1 +pop temp 0 +label IF_FALSE2 +push local 11 +push constant 132 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 0 +call Piece.moveRight 1 +pop temp 0 +push constant 80 +call Sys.wait 1 +pop temp 0 +label IF_FALSE3 +push local 11 +push constant 131 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +call Piece.rotate 1 +pop temp 0 +label IF_FALSE4 +push local 11 +push constant 133 +eq +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push local 0 +call Piece.moveDown 1 +pop temp 0 +push local 0 +call Piece.moveDown 1 +pop temp 0 +label IF_FALSE5 +push local 15 +push constant 1 +add +pop local 15 +goto WHILE_EXP2 +label WHILE_END2 +push local 0 +call Piece.moveDown 1 +pop temp 0 +push local 2 +push constant 1 +add +pop local 2 +push constant 80 +call Sys.wait 1 +pop temp 0 +goto WHILE_EXP1 +label WHILE_END1 +push constant 0 +pop local 2 +push local 0 +call Piece.dispose 1 +pop temp 0 +call Tetris.completeRow 0 +pop temp 0 +push constant 0 +push constant 7 +call Output.moveCursor 2 +pop temp 0 +push static 0 +call Output.printInt 1 +pop temp 0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push constant 16 +push constant 32 +push constant 80 +push constant 96 +call Screen.drawRectangle 4 +pop temp 0 +push constant 0 +not +call Screen.setColor 1 +pop temp 0 +push local 1 +call Piece.dispose 1 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Tetris.completeRow 4 +push constant 16384 +push constant 11 +add +pop local 0 +push constant 15 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 0 +not +pop local 3 +push constant 0 +pop local 2 +label WHILE_EXP1 +push local 2 +push constant 10 +lt +push local 3 +and +not +if-goto WHILE_END1 +push local 0 +push local 2 +add +push local 1 +push constant 512 +call Math.multiply 2 +add +call Memory.peek 1 +push local 3 +and +pop local 3 +push local 2 +push constant 1 +add +pop local 2 +goto WHILE_EXP1 +label WHILE_END1 +push local 3 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +call Screen.setColor 1 +pop temp 0 +push constant 176 +push local 1 +push constant 16 +call Math.multiply 2 +push constant 335 +push local 1 +push constant 16 +call Math.multiply 2 +push constant 15 +add +call Screen.drawRectangle 4 +pop temp 0 +push static 0 +push constant 1 +add +pop static 0 +push local 1 +call Tetris.shift 1 +pop temp 0 +label IF_FALSE0 +push local 1 +push constant 1 +sub +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Tetris.shift 5 +push constant 16384 +push constant 11 +add +pop local 2 +label WHILE_EXP0 +push argument 0 +push constant 1 +gt +not +if-goto WHILE_END0 +push constant 0 +pop local 0 +label WHILE_EXP1 +push local 0 +push constant 10 +lt +not +if-goto WHILE_END1 +push constant 0 +pop local 4 +label WHILE_EXP2 +push local 4 +push constant 16 +lt +not +if-goto WHILE_END2 +push local 2 +push local 0 +add +push argument 0 +push constant 1 +sub +push constant 512 +call Math.multiply 2 +push local 4 +push constant 32 +call Math.multiply 2 +add +add +pop local 3 +push local 3 +call Memory.peek 1 +pop local 1 +push local 2 +push local 0 +add +push argument 0 +push constant 512 +call Math.multiply 2 +push local 4 +push constant 32 +call Math.multiply 2 +add +add +push local 1 +call Memory.poke 2 +pop temp 0 +push local 3 +push constant 0 +call Memory.poke 2 +pop temp 0 +push local 4 +push constant 1 +add +pop local 4 +goto WHILE_EXP2 +label WHILE_END2 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push argument 0 +push constant 1 +sub +pop argument 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Tetris.border 0 +push constant 175 +push constant 0 +push constant 175 +push constant 255 +call Screen.drawLine 4 +pop temp 0 +push constant 336 +push constant 0 +push constant 336 +push constant 255 +call Screen.drawLine 4 +pop temp 0 +push constant 0 +return +function Tetris.newPiece 1 +push constant 9 +call Array.new 1 +pop local 0 +push constant 0 +push local 0 +add +push argument 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push argument 3 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push argument 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push argument 5 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push argument 6 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push argument 7 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push argument 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +return +function Tetris.randomNumber 4 +push constant 7 +pop local 0 +push constant 13 +pop local 1 +push constant 1133 +pop local 2 +push local 0 +push static 1 +call Math.multiply 2 +push local 1 +add +pop local 3 +push local 3 +push local 2 +call Tetris.mod 2 +pop static 1 +push static 1 +push constant 7 +call Tetris.mod 2 +return +function Tetris.finish 1 +call Screen.clearScreen 0 +pop temp 0 +push constant 10 +push constant 24 +call Output.moveCursor 2 +pop temp 0 +push constant 12 +call String.new 1 +push constant 89 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 114 +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 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 +call Output.printString 1 +pop temp 0 +push static 0 +call Output.printInt 1 +pop temp 0 +push constant 10000 +call Sys.wait 1 +pop temp 0 +call Screen.clearScreen 0 +pop temp 0 +push constant 10 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 63 +call String.new 1 +push constant 87 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 100 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 117 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 105 +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 116 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 112 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 103 +call String.appendChar 2 +push constant 97 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 44 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 102 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 121 +call String.appendChar 2 +push constant 101 +call String.appendChar 2 +push constant 115 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 108 +call String.appendChar 2 +push constant 105 +call String.appendChar 2 +push constant 99 +call String.appendChar 2 +push constant 107 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 89 +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 102 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 114 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 110 +call String.appendChar 2 +push constant 111 +call String.appendChar 2 +push constant 32 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 78 +call String.appendChar 2 +push constant 39 +call String.appendChar 2 +push constant 58 +call String.appendChar 2 +call Output.printString 1 +pop temp 0 +call Keyboard.readChar 0 +pop local 0 +push local 0 +push constant 89 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Screen.clearScreen 0 +pop temp 0 +push constant 0 +return +label IF_FALSE0 +push local 0 +push constant 78 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +call Screen.clearScreen 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +label IF_FALSE1 +push constant 0 +not +return +function Tetris.mod 2 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +return +label IF_FALSE0 +push argument 0 +push argument 1 +call Math.divide 2 +push argument 1 +call Math.multiply 2 +pop local 1 +push argument 0 +push local 1 +sub +pop local 0 +push local 0 +return diff --git a/projects/09/Tetris/TextComparer.bat b/projects/09/Tetris/TextComparer.bat new file mode 100755 index 0000000..a036d00 --- /dev/null +++ b/projects/09/Tetris/TextComparer.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: TextComparer.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%3"=="" goto :USAGE +if "%1"=="/?" goto :USAGE +if not "%~1"=="" ( + set "_arg1=%~f1" +) +if not "%~2"=="" ( + set "_arg2=%~f2" +) +pushd "%~dp0" +if NOT "%~1"=="" ( + if NOT "%~2"=="" ( + java -classpath "%CLASSPATH%;bin/classes" TextComparer ^ + "%_arg1%" "%_arg2%" + popd + exit /B + ) +) +:USAGE +echo Usage: +echo TextComparer FILE1 FILE2 Compares FILE1 and FILE2. The success +echo message or the first miscompared line +echo is printed to the command console. +popd diff --git a/projects/09/Tetris/TextComparer.sh b/projects/09/Tetris/TextComparer.sh new file mode 100755 index 0000000..c8b08af --- /dev/null +++ b/projects/09/Tetris/TextComparer.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh + +# $Id: TextComparer.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -ne 2 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + # print usage + echo "Usage:" + echo " `basename "$0"` FILE1 FILE2 Compares FILE1 and FILE2. The success" + echo " message or the first miscompared line" + echo " is printed to the command console." +else + # Convert arg1 to an absolute path + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="$dir/$1" + fi + # Convert arg2 to an absolute path + if [ `echo "$2" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg2="$2" + else + arg2="$dir/$2" + fi +# echo Comparing "$arg1" "$arg2" + java -classpath "${CLASSPATH}:bin/classes" TextComparer "$arg1" "$arg2" +fi diff --git a/projects/09/Tetris/VMEmulator.bat b/projects/09/Tetris/VMEmulator.bat new file mode 100755 index 0000000..1b15b72 --- /dev/null +++ b/projects/09/Tetris/VMEmulator.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: VMEmulator.bat,v 1.3 2014/05/10 00:51:55 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo VMEmulator Starts the VM Emulator in interactive mode. + echo VMEmulator FILE.tst Starts the VM Emulator and runs the FILE.tst test + echo script. The success/failure message is + echo printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + VMEmulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + VMEmulatorMain "%_arg1%" +) +popd diff --git a/projects/09/Tetris/VMEmulator.sh b/projects/09/Tetris/VMEmulator.sh new file mode 100755 index 0000000..48f4f0f --- /dev/null +++ b/projects/09/Tetris/VMEmulator.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env sh + +# $Id: VMEmulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the VM Emulator in interactive mode." + echo " `basename "$0"` FILE.tst Starts the VM Emulator and runs the FILE.tst test" + echo " script. The success/failure message is" + echo " printed to the command console." +elif [ $# -eq 0 ] +then + # Run VM emulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" VMEmulatorMain & +else + # Convert arg1 to an absolute path and run VM emulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" VMEmulatorMain "$arg1" +fi diff --git a/projects/09/Tetris/__pycache__/symbol_table.cpython-39.pyc b/projects/09/Tetris/__pycache__/symbol_table.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..244e26dce3d35acfd10af05eab495208d9cbf2cf GIT binary patch literal 2289 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 H#K8;zC1mXn literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/__pycache__/vmwriter.cpython-39.pyc b/projects/09/Tetris/__pycache__/vmwriter.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..71cd27ba4f65f207df2bee0121e1c04cba04f095 GIT binary patch literal 2635 zcmYe~<>g{vU|?`*FH6kiWMFs<;vi#Y1_lNP1_p*=AqEBpcZL*(6vh^Y6vk$zD25cK zU-m3quq~3U3Nu3qurV3V(_~3qurFieQRR3qurlig1cZ3qur7 zifD>h3qurdig+-Cro=6dFyHW^%#zfiWRUG3SAZ~x4RXIT$o*mr3=Aa9qB}JV3z$+wQbZRrF*4+d)G(%qWiu6h z0E>!4M8OF|!tWQOb`?uvN($F6M%^lw;?g9pTg-W>=~XOwsp(w57;USVQwzC%G1^rz zrSCRV;~lAWbz@%=txJzZmPPSn~2qxNb3ORq^^JmSpJVmgbaX7UWdE z1SOPTjQUmFVBwU^vdolJO=fTkEaF8hxIhv5zj$%*F&&^HDOF@rs0Z4o&7G;)X zRF%f|oIT))X(UJ$kJW8_}OF@2tLJ=q_B9d?s$dTwi;e`04 zAiqE#HF(b6AG4Mxm^f*)LTs(@l1Qgn*cfKmWc3NxtCfu;d)fe9{ZSp9CXl;vlp+~P>i z&nqrT%qzLYXi&volv+|+l*gsXTqJ;!1Yjir*thW|l?AD2VSS4S;thxaE}%dMRTK=2 z9H0tR6wM>CX-T-A$NJ+Yo0a|G?`f0-I$>f~;;#5t>B9H~>&fo=0 z#+T*Br)B1(dV$;lGL?a`N(}A>6eWI|e4uJSFEKYYKK>S0e0*+xN@)&=%@ZGASelpv zktyN?g$FoLgh4ED4guw}B4rR46z<^UR-_8zYJv!D5CP8F2m+MHi$Gol;bKseh=Y-X m1q>CzBrBL?1FP}VWCYVlegvBYGUOJA4aA{#Ad^0W0ucZ~3^bYm literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/Assembler.dat b/projects/09/Tetris/bin/Assembler.dat new file mode 100755 index 0000000..0f3be3f --- /dev/null +++ b/projects/09/Tetris/bin/Assembler.dat @@ -0,0 +1 @@ +C:\Users\SQA-AGrudev\Desktop\nand2tetris\projects\08\ProgramFlow\BasicLoop\BasicLoop.hack diff --git a/projects/09/Tetris/bin/CPU Emulator.dat b/projects/09/Tetris/bin/CPU Emulator.dat new file mode 100755 index 0000000..1343654 --- /dev/null +++ b/projects/09/Tetris/bin/CPU Emulator.dat @@ -0,0 +1 @@ +C:\Users\SQA-AGrudev\Desktop\nand2tetris\projects\08\FunctionCalls\NestedCall diff --git a/projects/09/Tetris/bin/Hardware Simulator.dat b/projects/09/Tetris/bin/Hardware Simulator.dat new file mode 100755 index 0000000..33d02db --- /dev/null +++ b/projects/09/Tetris/bin/Hardware Simulator.dat @@ -0,0 +1 @@ +C:\Users\Andrean\Desktop\nand2tetris\projects\03\a diff --git a/projects/09/Tetris/bin/Virtual Machine Emulator.dat b/projects/09/Tetris/bin/Virtual Machine Emulator.dat new file mode 100755 index 0000000..b68de42 --- /dev/null +++ b/projects/09/Tetris/bin/Virtual Machine Emulator.dat @@ -0,0 +1 @@ +C:\Users\SQA-AGrudev\Desktop\nand2tetris\projects\09\Tetris diff --git a/projects/09/Tetris/bin/classes/CPUEmulatorMain.class b/projects/09/Tetris/bin/classes/CPUEmulatorMain.class new file mode 100755 index 0000000000000000000000000000000000000000..2c5b68f26f7b9d44b6989affae2ac01270fbae8e GIT binary patch literal 1084 zcmX^0Z`VEs1_pfw8!iSh1{qEUSq3={26-+91qMY91|=>AWd;>?232+jH7*7Y1{rn+ zbuI=j5Us(%pvl3Y#lfJ>#lXX$!_J_~&Y;J|AjBZU#URL_&(2`L&S1#Mz-E(~msw)R z$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`aAi>UH z#KU0BV8Y0t8Csl}o@%84QmNn^5bBy+nv+HSD9OyvV`NYY&V*WA>>lc=kK_>N{M>^4ywtoBMh0n*#N=$S zbbek*QGQNNY7vsGI!G2-Co62_QQO znGG_;nvsDY$={#|U}O+LgqD9&R%&tyicoN6aYP8b?M> zIJE>RY8e?SHGCkRgL_vW;dA#;Piv?&B6T7A9jpLk6(mtW6Dp>YFhxLV-UQQbkXzu% z$r_tB21N!@1~CQ@U}9hdWe5gF21y1620;c!21W)323D=@42&B=@(i2|QVh~i=}ZQ8 z1{MYehET12EK3;pHZd>>F>hmFSy2x~DLZD$Y(-^jqoAjTlgAjiNC GvKRnfi!EgU literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/classes/HackAssemblerMain.class b/projects/09/Tetris/bin/classes/HackAssemblerMain.class new file mode 100755 index 0000000000000000000000000000000000000000..b9123917e497a7915222bd03a2ac91be5fdda503 GIT binary patch literal 1098 zcmX^0Z`VEs1_pfwS1txI1{qEUSq3={26-+91qMYf23ZCrb_Qi;28IR(E(SIR6?O(y zE(T5pH4X-KE(Q$-O?Cz?b_Q)O20jKE4h9`=23-a{4hDS?Z2(el$j)HI&S1>Qz-E(~ zmsw)R$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`a zAi>UH!oy(7V8+Ox8d{u~o@%84QmNpPn4IlcT%4Mll#^Pd5UrP3oU4$Rn422Q&S1{N zV8LL?!(hc=&B!1FQm7ACsSo19c_0gH7#TD`g8CsviFw62i6!|(#b8wkzH3EtYC%b6 zejX2lErT5+gHdvRu3m9zo*u|0dd20LdFgruIf-d{<(YXY`Q^oW;SkyyQTacfZnpeWeAeNMwr=O9UQ=p$% zoa>mBUs|Gs4Dz5*K!h8Tfs)g#>mo z2r@Bf3kmIH5N2Wk8K5o1&dj)-LBw}CgAkH-kS!Y-m>DD()ETrGI2kM$Y#AIFco`fS M(ik!sI6;mD07icrqW}N^ literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/classes/HardwareSimulatorMain.class b/projects/09/Tetris/bin/classes/HardwareSimulatorMain.class new file mode 100755 index 0000000000000000000000000000000000000000..5786077f36cc03c74fdac38e8e31074e7b9ac3c2 GIT binary patch literal 1182 zcmX^0Z`VEs1_pfw8!iSh1{qEUSq3={26-+91qMY91|=>AWd;>?232+jH7*7Y1{rn+ zbuI=j5Us(%pvl3Y#lfJ>#lXX$!_J_~&Y;J|AjBZU#URL_&(2`L&S1#Mz-E(~msw)R z$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`aAi>UH z#KU0BV8Y0tA6lH4o@%84QmNpPSd>zpSd2hyrnT%MViu2+zgn5I{rnU|7ZUaS`mp?&i6vmNtN z+)`6>*cmK%7%V}Wg+ZDiE_1C&PAw?O%+F(F(12T9>>lc=kKr8W{M>^4ywtoBMg}8- zO7lvJ@^f-hi;y%Kdn6`jV;YMo;#g3SlbM_dag}6JW}ZGI42tzrQqvMkb4onI^-3yA z7#T!Cav7;P1^OA~;E>eID9O!16?aU^FD(I!gTmg5kwFgZ4Cj293-v*K1ecLP10;ay zDohcOf!2%+q8K3sia16F0YoVKCuOB3m!Jp*R~DC~<}xxcrxq14GKfMFOJ=@)Kv8C1 zNpML~YGST6BLgI+P=y&8*b6|4a`G4%L^U89QBxTsgDA-E3Vm?8&=2+WP0UM7Pc33( z;44loK}r&g40APni1jWajNC&#t%=qKRt$0uB*8(m0;aPuML@aA1nNG7<>2^&r$1|K z+87iWL>a^wK!AyX5tQW^7#SoP7#IW@7#SED7#LW!wlgqp1j#dSGDtBH&B*eUpfn_;^o7TQr4EjQ>I~drOGqCvVX5fh2&cNxjn}I8GI|H}x zZU&x69c>|AAwD7g?F<5b%Nay>GYCfRW)OsrAf=uh3|<@z-XJw*Ai@Vk_<{&O5aAEf6u{09$j%VN$iQZknU`5&$H>5}p&7== zz~Y>rlFG=ylAD;B$H*Y25$%(eSeB@tlbDyTA6!zDnU`)2QpQu1nwwvi8eEW=oLbDt zpr(OE8Kw{qgBpW6J3}xJLkL4CBZEO`abkL^l>*2Hg^<*W66gHfg2bZKA_beY%$!t( zyu{p8J7hLHLl_T3I70*vLnK2KBZC-7qkd+-zEf#hT53^hN>FNIN@@`!gAh!@Ei)$- zA_%fN0z^bJG6=(@J^fuPl2Z#xGV?)x1&bni6k;kP1CMiJUS58QLViJNo&pa;3_~mr zLmWdq4?_Zo&}Pu#VMqjdM>aS$IX^E&0qpk7Vuj+2{GyW7A_a~7yqrp~#w11tc7>eG zywqY%c7|jgh7^WWMh0n!uQQAD^Ayq&GjmFdQWY}uz{(UD85pe?8D!iti;7Edn9Il@ zgqbw&nJ=ls%~6a|nsl5_HlQz4R!46;a; zr{<-krYIDbCMTyB7pIlxvP=taji%U{-85x*Ui;5T-L?H3L}FKR2nIstu-MI zLK1>Ry)`2PM@c>;)iW}PXke-XsQ?AHPi9^!BLj1OX$d2Pw1y|9Lb!oQ0R=OdEw!*T zF{c>KgOFgf){J6gUIt1~{vFGBU6wXCxLmLVfPc$iP{gTH*{9V%6|; z289Ml%m=EArKBh`mqC$1g+Y}81eh5ZLHUt^kwJrjfkBXgk%5tcfq_+PI|JiJkURq? zgC>I(M4E9j0~-T70|R5a);`wx4E&oIn1qT;@!r;r^Rfvje&0)13y$FToVgalP@++EU228%~-X! zF$hHZ9b;(J-N7K}r?ZVgz=}nZqS(2d!BvuF2ZNv$ zi>@TgHU_a-45moB#NoOm;JP+32HiHf%f*7J1SQuCt7#RGS?U>D2K*6B3ok7k=ltp_R zgZv@}J#A5zZ43$m3JVxGTUZ#E|9>ef$}*pUPg@ouv5i5og_#j7b6#6^8-tQIIG&U@ IfKvhk0OEwC>Hq)$ literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/classes/VMEmulatorMain.class b/projects/09/Tetris/bin/classes/VMEmulatorMain.class new file mode 100755 index 0000000000000000000000000000000000000000..aa6b7ff524757fcdab43088e9e2a8d7d48d801c9 GIT binary patch literal 1073 zcmX^0Z`VEs1_pfw8!iSh1{qEUSq3={26-+91qMY91|=>AWd;>?232+jH7*7Y1{rn+ zbuI=j5Us(%pvl3Y#lfJ>#lXX$!_J_~&Y;J|AjBZU#URL_&(2`L&S1#Mz-E(~msw)R z$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`aAi>UH z#KU0BV8Y0t8Csl}o@%84QmNn^5bBy+nv+HSD9OyvV`NYa&V*WA>>lc=ALa{lhjV^zL4ICpUI`oDP{kdS@=Hs=;-HYUVq}m5Ta0j%K8TOtGBQYk1dyDA z!~_{(&B(xq@GmIb85sl+f#jc*m6}|FA{1O%T#}m0$iSRhRK&<23W?>+eEoo;%)FA| zlA_eaTx&)KNI;_sGcvFjfE4BAF*1m1Ks2Hz4@L%2klhvf;Aqtk_4G~5OH5BKVr1Ye zPAx%-QAUPx4Ii-25PsE1Fx^8vts&9~zae=XEDf>TnH;X}Eh;;`8+j0gLpWO@`k=q$KeReZ&MQ&%{ z_TA0E6RD#u#4E%n#J` + + + + + + + +About Assembler + + + + + + + +

+ +

Assembler, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The Assembler Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

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

CPU Emulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The CPU Emulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/projects/09/Tetris/bin/help/hwAbout.html b/projects/09/Tetris/bin/help/hwAbout.html new file mode 100755 index 0000000..67ad89b --- /dev/null +++ b/projects/09/Tetris/bin/help/hwAbout.html @@ -0,0 +1,96 @@ + + + + + + + + +About Hardware Simulator + + + + + + + +
+ +

Hardware Simulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The Hardware Simulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/projects/09/Tetris/bin/help/vmAbout.html b/projects/09/Tetris/bin/help/vmAbout.html new file mode 100755 index 0000000..c5b296a --- /dev/null +++ b/projects/09/Tetris/bin/help/vmAbout.html @@ -0,0 +1,110 @@ + + + + + + + + +About Virtual Machine Emulator + + + + + + + +
+ +

Virtual Machine Emulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. +Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The VM Emulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/projects/09/Tetris/bin/images/arrow2.gif b/projects/09/Tetris/bin/images/arrow2.gif new file mode 100755 index 0000000000000000000000000000000000000000..c744eabbbb92a178b85e66ff3666976727741cfb GIT binary patch literal 1073 zcmZ?wbhEHb^keX3_|Cxa|NsC03=rVP2%#D5xfvKlhjWnf@90Cii1FgpW?e?gI*!QurQ0|OHS!;tQcY#oEiKXd>H~5JQ;i#Tp5BGf*ITyLK!?6Vi-Ibd>I@W+!+`y(hcmWB+DKFU=;-~*8uYg4YSeAi7=Or711_LLQhf1k{ zJclGSV@5jz8v_T!A>AM41t0&E7ftz59x>%dIS15_;4t|PiMt$bE(Vr2Y~Ta{@)jfr z*csNmM2+h`P`=AcHU^tlYzz=tb_S3hkkxDq9891z0J0ZkKZE9vau)^$2D?`fl@K)` z5`yEPDo7-y_>%=3;yNJppgh6A@t=W_L&jsnf`iQ*!dfvWHY_~cE}-l+ z$7AE7qumn5S$9rsTztG=!MRFAWs{1Nql)h;k&dFLUQ;wnWaLvulCi;tF zv&%GYZ;#hJG}pUK>F#d#w~y{}2kXc0^ZNg=U z`QZZvscw(MZ`(PgCLCWObe!p)z^XN!S+grs&vd`us5sp$VvA)?VWSmCMSHB|^!E)V zb+Nhk?#UE37S|?)$H$k5INJ2~w&u2X7bSA<*F5#w^Pez>&~=w3CO?XMzCZ zVn+rUr?xL00u4-@($;k%Cnu#iGKlHSdBSl})q_v2=v9fPz=2k7E|Huk8JnBi`8_7r z73^dON>&C6AACC)`Oq6;Ao>5whyNQN{qMW-Kl|8!j~)M2 zSN&&Lb%$ZnPKK&!3`xZdUI7e7|F8W2zw!V7zW@KT|Nr;+|6le0KZbvI81C$3*g1`1 zS}{X$07C#aZ~dRdaHoo4XA;9SFNR_xh5&5d`tQkb$ChEIA;UCPhGI#E01R*aXJA10 z88&bIXYjnkV7rsSa2kVZF@t0PHgElBm~@AsY9~X|GzPC?2BQEBZ~bTZ_mAPu9fqAd z8KzBRC@y9Q2)Oe9!^Z!Q`u<C$b@u;$kN?H0|HBzD zBJ9flD;xiB?EBxB{Xg5|zlZ97RSa)2JpO;>`2UTo|M&I(&o2J&5&mB_6x~}4AO2r? z^nc@(|9!{)XYcs$u?ievsNQ1uj}c)Q-eUOl>C>}k&u-nib?)4`Lx&D++qP}hs#Wvm z&6_l7Qd?VFRaI49US3jCQdn4+mzS5Fot=@9k(!#Cl#~=7AK(Aq9~LZF($LWGpMinl zKf`}8^&iao|Np<@PZmZ7hCd8Cpqv286AT>x7=Cifcx+g3u$e$SI;dR)&^s{wO zv%WkH-spLG-`c9L88>&veDsU0-uUkHhJ?#ZY2MS~WA?Q_e6=;oqVVd`?!QX8M+3!= zhs)gdr$%{1m!pMKePxLrPe PCMz{a2h$_b!6!NBp4ftN!hf}!DHBL}YpOMt?|15I2)G71a_4lpn>GHLiMP*6JD z!eF5$VJXBX`StYvb^X` z&Sx))3T)1IXO)N!Qd#}Ifq~J$n(0TiMcVCl-Rr+X=lodzc&+K{l9FkRPm*Ud+Gxg^Suix&VIGS@Vd-e+p@>k12+fVxiiP`{_gzS ze(jY%_9SfQuq_pfdMjx%!hjWnf@90Cii1FgpW?e?gI*!QurQ0|OHS!;tQcY#oEiKXd>H~5JQ;i#Tp5BGf*ITyLK!?6Vi-Ibd>I@W+!+`y(hcmWB+DKFU=;-~*8uYg4YSeAi7=Or711_LLQhf1k{ zJclGSV@5jz8v_T!A>AM41t0&E7ftz59x>%dIS15_;4t|PiMt$bE(Vr2Y~Ta{@)jfr z*csNmM2+h`P`=AcHU^tlYzz=tb_S3hkkxDq9891z0J0ZkKZE9vau)^$2D?`fl@K)` z5`yEPDo7-y_>%=3;yNJppgh6A@t%Q^L&jsnf`iQ*!dfvWHY_~cE}-l+ z$7AE7qumn5S$9rsTztG=!MRJubJLQOlQn|*M2>7)dV0D+@~JtVo7E1_vM7FaNArc+ z`S}i|zj(a1tT?^UZ8DSVsx6s*%lsCfYSG%7<-ICwb<$a>Qtj)@;`XcYYH!oHxykYT zqQ5K4-k#f*H(#&kcBx+MhO+m4p(nSmzrVkMnOn|h$A*W8JA~D*trpRHJfly3e~-@3 ztb3<&^popWS8k4JooC$4cec{x<#|qj?zd~Cj9y=x9DjIQPSv*8x3(oeKIdy~nm=QT eA^Z9@J9d10d}6Y8{JA|lKR>^)SelQ6!5RS512(4s literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/find.gif b/projects/09/Tetris/bin/images/find.gif new file mode 100755 index 0000000000000000000000000000000000000000..e3f4c9d8ebefe041d8c3cfd9ca05aa096e551f24 GIT binary patch literal 1014 zcmZ?wbh9u|6k!ly_|5|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vhL49pxd9vc=omNPujj5#quk)fPXU|06? zb9Z;QGpUBvu=6J~lrr2~nf?93Tu%mN{Z+yoo9^x^d1E!p=I5llR+F^tFEJkwcCcyu zSjDtpy0LOYnfO!39*y@4&opvep6Y$wkima-(8?s2isHGumkah+mF_Hk=F^mRo^OqX zv3m4m*T_rB=6p}iGdRB9rR*i}#Ci$C1I}rj{;DCB4Z=z_H?FL-S;26wS3CS`){~P7 v*6XargEh{do%^s=Hd0W>sY}>#o=DEck_Xp}#H-`9qF)3x@8D)*VXy`OvYYiC literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/hex.gif b/projects/09/Tetris/bin/images/hex.gif new file mode 100755 index 0000000000000000000000000000000000000000..68a851b2d7aacbf14a139744febfa79a70a4b2b0 GIT binary patch literal 1422 zcmZ?wbh9u|RA5kG`2L@Pfq~)QzkmP#|Nr~ak?}7zOzJ2@t?c28xA3nZ& z_wM!U*H525d-Uk>g9i`4e*O0P_1i~}p4`9x@XnokZ{NOq_3G8LXV357e{ko{-J3UW zefjeB@85r)KYw}g;^mVkPjB3~b@l4?YuBz{x^(5^$4@U`zPf(>=H<&*&!4~e>C@+r zA3wf*`}Xwdv!6bF`uzFxg$tL?oH=*m#HkM-K0JK*=*pFAM~)o7d-vYOiRKRI>k%&}u9_U${k zefzE(H*W6Uy?4u&?N_c`J$v@tp+iSDZ{EIP!waI$gxyBq^i$15G2%j7f?7&NajM(wt8`0zm6 zkwHL7z*b?Q&dHq|HC7=nKD}k(;8Y4wh;Dr1$}A`r5pkwsWAp^^e{v2Ej)#2Kun8qt zOmIBh#w=r1QPIPGpq-mt!AEb_mu0V*`5Xjz6_Z#p8F}KYV+F@bvh_&ao&J64S{Lv)`e7RP1N~udZvsFBsczBYj zJ_BQ$q)Nt)4-JdjdZo9YZ8%)YJEyFH>51utWCb5ZAW=do#m#b5ui-@O( zA?tK+AI-E0AteIIf*EoQuA*Tw1xH09?tD`X)GH}yV0RLl%G&Gxt+GKZBBwB#JLOQv zi)PJ~LI!cWl0pZOxR^o)vG|6<+rlydg?A=s${b)3XK%^=*et5{WIAeM=CUs8XZ0?LX22GNt28zxS0dF=qOJ%Kjs3x5|;o&jqf;(=l?5;-y y*UFgxDR7a>JmcstTUPK|cSrf1ZP)ky_!b)A{^#54_xu0Jv3xkd!YnGlU=08brX8vP literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/keyboard.gif b/projects/09/Tetris/bin/images/keyboard.gif new file mode 100755 index 0000000000000000000000000000000000000000..823aaf868cd4e59fc747f96434c944f081d9f601 GIT binary patch literal 1017 zcmZ?wbhEHbRA5kG_|CxapW#0P1H=CP`|IoL|NsAAU(fLWKSRSP7!84u5dw-oSr{1@ z7#MUw1Sn51a9m?x`3}uovR+@*y%;?vYsH@0va(?k z^E|P+UZSspnV6UouFfi5eSKZR&Rbi4iexfu&e*)ncJ;QmH&&=-pPK8v{oU==5r^wU zcbmVzyTbD(SDg2aHCK0(3E#H$X<&%oJ7KHYy{a7_61HbD%ZHtrsrUF;mAZe}sp&?M i2U_PQnbqvtoZSLCju0k+quO|a(--h#Ka&h8-myLs3jj!g?r zw5xdY*}M!~>dCGYyeoyFc(Kn^6ZvaG@~jy1_JSN!RipyWD{-@c7! zLeS$=)5PK@P084#e0rvl=d+MV;iqm42AQ+IR9;9qJ(n%p&Sh4JW^l7i_AQ=Wfv--^ Zwy93KYFVOvZl$p!6R-ESHOCqltO2v`IX3_R literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/open.gif b/projects/09/Tetris/bin/images/open.gif new file mode 100755 index 0000000000000000000000000000000000000000..f69a024197318aa70fff927d760c14627d438536 GIT binary patch literal 930 zcmZ?wbhEHb6krfw_|55b-oMg!@nrVl z9UgmEsUBU$uznK5c0Q|+5d|@{)emn4`sOH$*|Lw zVVWUBu_{A=B*XtJSN?C@_`k33e|GkN50C$5`akobP;06X$-2x43YuZy!D@9(jA7XoeW9S z7`%!Zi~=yc^`GJ2KZZMZ7(;q*=MEh@v~AnARjXFbn>TOLq)BaUZB;M1%ia%Kx85kHD zbU--)lqVQC>KT|hWIQ%3I8glhmS)cOa}N%-FeotAdDahd0=OFqbhVwyV^J0(5ZaX9c(=RRO rn~`S1C8`-*YPVV`_LR`-BkL0wSq^Y)T63sb^zy3E*Bf#{+0YsQ*n!NC literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/open2.gif b/projects/09/Tetris/bin/images/open2.gif new file mode 100755 index 0000000000000000000000000000000000000000..2b94682b19d1cb5cf5c6aad7c7ed1af371fabe39 GIT binary patch literal 969 zcmZ?wbh9u|6k!ly_|5k`583H63{$IKBf8)mgeSQD4v;TW|{8v@|$G~uhfng^D!!!nlVg`l)28RDv z9{=BX{D0r-|JnWjJ&OOUhW}>>y~E(SlfiZxgJCg)Y5;@e|0^H@5=w|WB)yN z{8wG|pJCM@;MUrpiz($q<0yt^W)R=sv^dt^W+3cNlDUG8j%{P%UPV48Z2C{|uAvFjVbi zNSemrRm@-%fZ?tG4FCQy+_}TBb0@>JX$-~13;_XG{(so`|54xnE7|{#dHml2_SPzf zJChi8RxwOVVkq`v2r#!;@xNI0e>ek1gkAZ6W#j*iegFHi|7Uyr z_fY+>is3DW$N#S!|G#nd|GxhJ*~R}o!vCv=qI-+s!~ZLf{%^eUzwg-p>>d9-R)Hf7 z)msezF(M4ZTMVB*eR}rn*{xf*&Ye4V=+L2U+qSJ*wQAnHd6OnhYHMq&s;bJ%%S%d1 z3JVMK^768?vokU>Qd3itl9J-%n!-54%8X6k@GcYjxXZR1M{)1Wn|NmF~$pXp) z3_2hZlqVcGmN77M$ari>a4dbxpiyujpy_ZszpM+xg?DqT7$l6d?sRNSI>g51q{Z-H z-Q1It)z33dIIv;q>FIo$Y!=)3Qg@d==Ml1*Ua+v4%|VhwR;wh*f1+KyS&u^FBiCtO zQ;nutex7r6b;RapS59tKINKt1_u-wa3Co=pIH(t$c@dcCy`|uy6f3u&X3#V@Mw<>T i(`BA}YZA?Jr5A2^c(`5t#FNa;8+|v$?qp+Oum%7YQ{a^V literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/opendoc.gif b/projects/09/Tetris/bin/images/opendoc.gif new file mode 100755 index 0000000000000000000000000000000000000000..e84f0d69d646eab20c3c8d0d0dc0588207790a37 GIT binary patch literal 1094 zcmZ?wbhEHbRA5kG_|55b-oMg!@nrVl z9UgmEsUBU$uznK5c0Q|+5d|@{)emn4`sOH$*|Lw zVVWUBu_{A=B*XtJSN?C@_`k33e|GkN50C$5`akobP;06X$-2x43YuZy!D@9(jA7XoeW9S z7`%!Zi~=yc^`GJ2KZZMZ7(;q*=MEh@v~AnARjXFbn>TOLq)BaUZB;M1%ia%Kx85oW* z=zwwpC{HkO{A1|kl(7(KIM~b~C=_#IgMx~OvYh7}iT;?~Wgn%oL^vKK9_bX)?mE09 zP`RP_x!V+NbH6#KEB>E|WC@s*=-#2={O`7BU)tFgxnjGflb4^nG4M)h1QZxOJvB{F z-^(=1Xk`R5w{K;JlpT2uEyh?vxbR1EikL~)mQCHO9XH1YMuRc z<>_7j52)o%xc)3?pOEnq*2?J{?j24$J9Dzb&P}POE9Ce0+Wg#^}Kfix} K{a;2#25SI`hbCPB literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/redflag.gif b/projects/09/Tetris/bin/images/redflag.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b1a6b1881b227026310fe680ea692d0e7c0e004 GIT binary patch literal 1100 zcmZ?wbhEHbRA5kG_|55b-oMg!@nrVl z9UgmEsUBU$uznK5c0Q|+5d|@{)emn4`sOH$*|Lw zVVWUBu_{A=B*XtJSN?C@_`k33e|GkN50C$5`akobP;06X$-2x43YuZy!D@9(jA7XoeW9S z7`%!Zi~=yc^`GJ2KZZMZ7(;q*=MEh@v~AnARjXFbn>TOLq)BaUZB;M1%ia%Kx85n*s z=zwwpC{HkO{A2jaDdVwW!NFz@VKJ5i8y4D?^NDKZ+_)g?()Lb8DCGFXN4?S}PWKXa zBsj9P30a%PY*cdV>6iD^o6sPn=suMva#xF`kb~ze2EJ9hPkd-QEn!hm6LRp%@{^Or zxbLZO9awRCiTCVjJq%M99Bm7WZClb9@{(87u>Mkr`G-Yaixsm^?41?L>bXv0uThQm zw6;4^CFjk)c8WV3+vYm+-&Ak0%xm+E8>RltiZ~jx#%JrSBNaOo0uN4~nzn8C)Xl!9 zLLHObtUswcZ{xCGEq3;nX21=u_EXC|B(lOz*1Zy%l%ZwTiynGp&j4$m*RfzT#cpm-`QIe?Pa|&cc)P_G|w9ikSTl Qi~f0Djc<6!%EDj`05$<3%K!iX literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/save.gif b/projects/09/Tetris/bin/images/save.gif new file mode 100755 index 0000000000000000000000000000000000000000..7b5d5b9ea9a56f094fc5c2f731f227deb670171c GIT binary patch literal 1257 zcmZ?wbhEHbRA5kG_|5d^G?AX1i zpnJ(d_mZRTWk)>+q2%Yq$+~+Yj(+aZc=IBlQm=bps-=#sYwQjOaUt|HMjTjhpq`&$aM7F zJp0;DBCD7j+Gc9!?_#+i-0HvFf9|>ltE($7@<>d2)WWfK_4V}{3<(meOEWJEYg}06 zd%El`CxiH-X|5-)yzJav@%hzW?(lWKZSrxq?s`k;GjNNGoH=XxgN0M5Ptm?lMzW#l zbSm?8-|FullZEGbHvG$x{2V_a#?oEx;|x>I>+2YOX3ULzdh^_R_ZRohR=4DE2#Mt% zyIs}7A$Y7`*`AM~>GQ3Xo%`M7oLo9yU0-WnUpGtd(0g{p;}#78)y!c$h5Fhv9>nZv z{{G>ybwrMx^PMBp6*ttMKfu`h@Bh#1@s*M{rr%3_V|o03J&&13e4}^+`#mP+d14W@ zkvE?(vdfgMIM~i0qoBkfV)Q|wDoXH*BD+FY1w*H(R%v3RhsyCCT#&Sm~ttAiVRy~h3RjXF*-o5+G%(OFS z&fL9w_uad9|Noz1U|{&p!0?}m;kiG<3=1Yk1_o^gh8YY@EDr1p3_o}oOinP=GcZIj zFbFX)i0ZOWVEDnnV8Y2*pQ{{kgCU)PA(NLO?M48|&N>Fce~cdgm~Z@NU}zL(U`%9W z^ypyt&hWiTu*A;uK!ZjM1H*S-;r}O+o-&ji;ALP^VYtiS6TtADnc=?!!!rhk3mFWo z3=BmKx*s5J5@vYLAoyp>_wNk<|1-RN!7R&C&mh6Tki$^I@c#hA*BAyL28RC(3||=- zOc;JJGblPR7&0-i@G&rOI59BP|6us9$obz;@)FAgkO7PgFAW)FLl_t;|1%t5(2ZgE zFU;`5i;?j^gVu9~gc~4(UNA6hQIL3{z_5ow=0Ahb3kH!b3=E76N+3A_RmSfO66FjG z*$jGrK%xvFKMON3>|>BmU|@W~7?7dDaE?JihLeF;f!tn@W8VlF+IG(LJz$7B^XSF|MTp7{wv{z<#$0);JpxF$Y^6=DrY#$ z!*E20fq{vE@g0N46GjGxN(P1lVhk}13>7v^9t;f3kJ%aOzcc)=1cl(G7>1W#46+Q6 z7!ZEJwC@8)0w^YjGXDSnzv538Mg|6M1|5(;KzV|JV-kZn2aCgo1qYkiSoum0Y*=`> zosU5yfFVKgNH>qF-;x~+3y(KTTWVdA*tFzi2bcA%7)hb09z6!JdS4_29gZ~_SsyzR z@lo~QY&PjfZ!!y?J1??ozV?UHWV!ER_uyMgPMT<3S{~5qwU$#P{qpKa*{0A{B`Ys) lh>BliyL;QC|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vgT24)T!j|~eBHZm~WS#fZ~!`>EFVZ9oT z1_hf|Qw=T_fyIeD9gKQqDL*D89GWO8ZuBSOqKf+jvG{FwItrh9wi|HndVFKUG52z| z{7Ebi@|Jtew-i37Q&FhtyPSFUt~V!))Iui+*$Un53{pNc%Wn6xE1YJ^7n@B2vs$&T b=-gN(U0t=eV#_g~&SYn;Gu>jj4h+@+l4{q1 literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/smallequal.gif b/projects/09/Tetris/bin/images/smallequal.gif new file mode 100755 index 0000000000000000000000000000000000000000..a1db606b601fe57d8fa08e1d272b5706496f90f2 GIT binary patch literal 898 zcmZ?wbhEHbRA7*0_|Cxa|NsC03=rVP2%#D5xfvKlhjWnf@90Cii1FgpW?e?gI*!QurQ0|OHS!;tQcY#oEiKXd>H~5JQ;i#Tp5BGf*ITyLK!?6Vi-Ibd>I@W+!+`y(hcmWB+DKFU=;-~*8uYg4YSeAi7=Or711_LLQhf1k{ zJclGSV@5jz8v_T!A>AM41t0&E7ftz59x>%dIS15_;4t|PiMt$bE(Vr2Y~Ta{@)jfr z*csNmM2+h`P`=AcHU^tlYzz=tb_S3hkkxDq9891z0J0ZkKZE9vau)^$2D?`fl@K)` z5`yEPDo7-y_>%=3;yNJppgiHg5zoNLA>*-O!NF#BR?V0b8x}gZb0~XF z`LSWq(N1fC16=xSZRw~J^ELj<_#BK2;9u5X;0A`8jA^-pY literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/smallminus.gif b/projects/09/Tetris/bin/images/smallminus.gif new file mode 100755 index 0000000000000000000000000000000000000000..06492f570f9595a21b693ed5ffa2581f742854d8 GIT binary patch literal 863 zcmZ?wbhEHb3KSM#o1O|rxCj#Ew zXu0tw;KmJ$9XC{BKpIBzXb23K5K#Qd!pOkD$e;uA5GYSDaM&;~bI5pXSa7hJLs%>3 z#D;~3+XX~D=6D1?I?yE{sv|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vg&49qMR&(FoSG;s*d6Fw2J;2_&?DVGYD zjY_Tz@5HQFK4i2U?e90p>S0(Iy}e#d(M5y(!TtS3Z(NK@*cF;wCWxk5ZILW|q&&@_ zluISEDE`z`hDlmyErc0bY6S}7Qg&@zd}XB+^M#O8TUQ6nGE=S)JvCuP;MB(v`+7V@ zAMLBvyT32@!X;JjRg7oKf-|?zxxYIy)2`JZZ;to$*5kFMTvO*fJp7+a-){S*kB<*` heY|92erWyEL+$G2dhYAKJU|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vfU24)T!j|~Zq6$~XWvsfACIkc=T*;~cB zdf~x#2A#M&6@rV_b@4GPw3r4ybeSL%%vG}7@PJjzJDw^V&I7XElh%uctrnY@<}s6@ zU{Q$YmKA|hIpVkaSWZ@In9dNUo7-iS;o0_Kh2Pd$n?wDV+w&KF^(=W3u-L4B6)y*a FH2|)(%ZC5} literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/smallplus.gif b/projects/09/Tetris/bin/images/smallplus.gif new file mode 100755 index 0000000000000000000000000000000000000000..9030b0b323d21671c1dcca90bf03a818ffbbbfdb GIT binary patch literal 873 zcmZ?wbhEHb#=yuSCIfG%4K+iFOo^ujY z&PhzUra0%C=A3()OYa#jeQvq-xzpD7US3{ad%p)A`yX}g|FL7o{*Qvu5ExV;@cYAp z1xp$l8vZjdF#Kou52pTuS^xk4SNzGs$iVQ6K?jr*KzV|J;~&FUP8p943l27O2y4Zh z*s#!%K|tBnd$=;2I0f4+!9Gl5gdid$7d@j?sMt7vckVbK+&Ru!BneZaj0QLtd(%X zso6qNPHScz)HuJIeRCNvXW*KM4PN3=3};#0c6J@dLI)WxrwGda7cBWA93yY~jo;~cWqPRILft-m%_2RdYZ&6}3&_4d$e zW`~z0$=7Cm*w1eh8N9gk$Ggk?@$(HAH!u6ksxiMxR5T*NSxjX`LKBnjjs?yFZW<3; LM6^T%7#OSp>|#zc literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/vcrforward.gif b/projects/09/Tetris/bin/images/vcrforward.gif new file mode 100755 index 0000000000000000000000000000000000000000..b58d649fdf4ceb25b1558a9ada96747266845a22 GIT binary patch literal 1021 zcmZ?wbhEHbRA5kG_|5CIfH-zgJFWqVZp&>4q>gB6B`r{ zvoa`o9eEz0$iN|};uEldf#GNuyT02Dg~nvoeg)pR7K6maOtNC6o*z)qyV$b<*d(BiE*fu0D-=|af=z7zSqSyP*?%tk% JpOKNl8UQK$E_wg} literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/vcrrewind.gif b/projects/09/Tetris/bin/images/vcrrewind.gif new file mode 100755 index 0000000000000000000000000000000000000000..e55b4d67df125da7a480a9cea0de193024c97c23 GIT binary patch literal 1122 zcmZ?wbhEHbRA5kG_|5CIfG%4K+iFOo^ujY z&PhzUra0%C=A3()OYa#jeQvq-xzpD7US3{ad%p)A`yX}g|FL7o{*Qvu5ExV;@cYAp z1xp$l8vZjdF#Kou52pTuS^xk4SNzGs$iVQ6K?jr*KzV|J;~&FUP8p943l27O2y4Zh z*s$<$BZHFHlok1lT-yY-H7=|OY;@rekg-TOpz!EWk7&@ckOzVeEEAMGXZc8cbYh*Y z7422=QelY?g9&4dgjGoD5l-vGzB!c!N^RT{^Tc{rI5=IJz&Ar`jpWwVzNZR!gicA5TqFHCBhL$sJ5GYCZS|t9D$!%7+Lc~-v zeI0=+;SDXv`WQEa%q%*Xa!yu#{*^r!Hyk@J6B%}NPUYsT-Vp1oEvI%VWnLAIXbPS1 z``v?!VX6wQRgw)?H+W{di^$FS`RQ4HqgIc^!d<0%^wu8^;bT}*{$6mugZ5Lsy6W%m z4eR~c6*lel;1IlfTu0M(#h;0hH+TQBrIU^7VfsQx-JxMJ{;I#Km<)p_$)R O<6(=4k%#~TgEasss9CfC literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/images/vcrstop.gif b/projects/09/Tetris/bin/images/vcrstop.gif new file mode 100755 index 0000000000000000000000000000000000000000..abe2082b759dc281a72e6fd2d8f3e09917dd29ec GIT binary patch literal 972 zcmZ?wbhEHbRA5kG_|5)q5GH z+~e5#|Jbo(|3|@S2n?YR`2AtQf+YT|n84#bM*3qumnXOce(vaX=XD>J~iiL(UL>G`suHFA}>EZH{UjY+Mk`q8BTLtN~K&oOje#*%0Anw zmGkO?D=R~}<4R{ueQ<3_EPI`*RM>-v1-h-z=G#xL>W?&qV6X-NnY}BK literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/lib/AssemblerGUI.jar b/projects/09/Tetris/bin/lib/AssemblerGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..c40d4552654ad467da6fa5619f893f87d3c847aa GIT binary patch literal 4470 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 literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/lib/Compilers.jar b/projects/09/Tetris/bin/lib/Compilers.jar new file mode 100755 index 0000000000000000000000000000000000000000..9a78b05898628a46573810974ba601a1aae83238 GIT binary patch literal 27094 zcmWIWW@Zs#;9%fjSUjQ3lmQ8-Gq5mtBqnF;I~EtG<|gH&79m)!70IauC7JnoddWG7 z#l`h2|A@M` zWWfXG9|4bgM76hB9G>&^|2c#7bH9(DmS*5*SMyo(`i8;6gv$-OwUM*B8drTWm5sLA z#(697$l^aU0!sDs4PdPVZ}MM2nP} zORQOxADp##v?eoAyfjmaWvTWh+c&~tqYuQr?X3;AiBm;14F z)w(wU+?S_(WL&uW1$XhKEvEAW%A4y~OjHkU4Jds6y2c_xEO?qX<4Hq~-C9P`Pr5!t z?KWn#tq=9s_w6kI!Y*Emx8WMsg;$iVJP@?FA?>x&i;my}KX!Kc2Y9n{oN_s?;J#i01~M_7iawu|3LTa@i#4)2GGx;Yge%_EaW+MRDd(b!&>CRp%VX9-RVF0r|ZP*xa!+K@d*D1?LR^r^BVOU{C>>| zuFbo+|L98K)R#FBW$;`&H0=#o!>v!Q3Vt$8(2drRVO*R?I)V%t87)2bbo9 zCoOw^o0NF=Mt#r`k+e!{G6>kr!~E`#d;M|!{GSi2b}ma1Sm)orFWn=2QRu;h{kK+k zFXLKdu+8Au1CNUxWiD%9UUxkcup{T&QGdR?2g{o4cq}B`PhO0kUGRZ{U)DycqDP&l z`T6p_cjBUjCoP*QQFJUc$$#$7sl4&ON>x)r_wVZ}c@S(<{9#UlP%z&z&$AC$o&Rl( zzpr!t=*Eni8$zGv-Hf~e@k!9 zuYAOE?U8x#C)2;nN^f5O+Izj+Ph0D6uU_nb-Wj%T&x5#U{!G5%9mgG;e_Y6-TWVMJ zdYQx-Ea&A8YEJUH;4BvZr|47k^zyH(BN^)%K?#-D&{83giGg7rGrokXgqcu5#RR;R zfF#hV5u7z5&r9q5tyf2eF$-}saeG!Al)2y5Iv3;UFAH#W%LH1vEU5vH+Zlb&U8cUaYnMKo`zo;|q z7g!el!ax1O-!JJ}wW>a$U#<$&`aWCV&iJRTrq74s3zwA$p(rsV2>_7L#Y@_%i2UM8bcPJfU+>qdU&2g&s;VrFK z4a(A5EOZWN86@%QR4(J$tY8}M?7NQhV@{+?ilO_AGomd~lFv>S)rrO*E!`Bu(7PjU z8n2PbsSO54!cWJEXnj*cesgZJKuOqc9q!fdnA9ZN_+E$EOg3?wA(5jMzT8MNUAH7_mR`!9?D)@e zYN^dLTRI;4Dsv{E@SG_*`{lCJ@;g(@Wv*PdP1ljXJeP_`CVNZ2SjqZ$~k{qb}}j#W*k;AKd>+LN^$GP1F_p>4*D;> z>pX+WS5G-d@?3~pqUBj(d5ynr$2OE4f1&j?b?XA3q=@WvVa~(bes6l|`N5L2Jhfz* z(Xm}VMa?tMI!vy7nsQgZ{al=Z#G*I}7+v^B3T=caGY z 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
Qwx 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 QGI%oVkzimDIuGIj0MVy<-2eap literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/lib/HackGUI.jar b/projects/09/Tetris/bin/lib/HackGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..22d4ff389c3b46addfa05ff1c2fbc6048901a6af GIT binary patch literal 96666 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

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

+

+MemoryDiag tests the following: +

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

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

Using MemoryDiag as a diagnostic

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

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

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

Sample MemoryDiag output files

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

+Supplied Memory.vm passes: +

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

\ No newline at end of file diff --git a/projects/12/MemoryTest/MemoryTest.cmp b/projects/12/MemoryTest/MemoryTest.cmp new file mode 100755 index 0000000..057958b --- /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.out b/projects/12/MemoryTest/MemoryTest.out new file mode 100755 index 0000000..057958b --- /dev/null +++ b/projects/12/MemoryTest/MemoryTest.out @@ -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 100755 index 0000000..1da34fd --- /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/MemoryTest/Output.vm b/projects/12/MemoryTest/Output.vm new file mode 100755 index 0000000..b8addd7 --- /dev/null +++ b/projects/12/MemoryTest/Output.vm @@ -0,0 +1,1852 @@ +function Output.init 0 +push constant 16384 +pop static 4 +push constant 0 +not +pop static 2 +push constant 32 +pop static 1 +push constant 0 +pop static 0 +push constant 6 +call String.new 1 +pop static 3 +call Output.initMap 0 +pop temp 0 +call Output.createShiftedMap 0 +pop temp 0 +push constant 0 +return +function Output.initMap 0 +push constant 127 +call Array.new 1 +pop static 5 +push constant 0 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 32 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 33 +push constant 12 +push constant 30 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 34 +push constant 54 +push constant 54 +push constant 20 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 35 +push constant 0 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 36 +push constant 12 +push constant 30 +push constant 51 +push constant 3 +push constant 30 +push constant 48 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 37 +push constant 0 +push constant 0 +push constant 35 +push constant 51 +push constant 24 +push constant 12 +push constant 6 +push constant 51 +push constant 49 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 38 +push constant 12 +push constant 30 +push constant 30 +push constant 12 +push constant 54 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 39 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 40 +push constant 24 +push constant 12 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 41 +push constant 6 +push constant 12 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 42 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 63 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 43 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 63 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 44 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 45 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 46 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 47 +push constant 0 +push constant 0 +push constant 32 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 1 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 48 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 49 +push constant 12 +push constant 14 +push constant 15 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 50 +push constant 30 +push constant 51 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 51 +push constant 30 +push constant 51 +push constant 48 +push constant 48 +push constant 28 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 52 +push constant 16 +push constant 24 +push constant 28 +push constant 26 +push constant 25 +push constant 63 +push constant 24 +push constant 24 +push constant 60 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 53 +push constant 63 +push constant 3 +push constant 3 +push constant 31 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 54 +push constant 28 +push constant 6 +push constant 3 +push constant 3 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 55 +push constant 63 +push constant 49 +push constant 48 +push constant 48 +push constant 24 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 56 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 57 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 24 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 58 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 59 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 60 +push constant 0 +push constant 0 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 61 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 62 +push constant 0 +push constant 0 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 64 +push constant 30 +push constant 51 +push constant 51 +push constant 59 +push constant 59 +push constant 59 +push constant 27 +push constant 3 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 63 +push constant 30 +push constant 51 +push constant 51 +push constant 24 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 65 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 66 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 67 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 68 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 69 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 70 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 71 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 59 +push constant 51 +push constant 51 +push constant 54 +push constant 44 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 72 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 73 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 74 +push constant 60 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 27 +push constant 27 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 75 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 76 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 77 +push constant 33 +push constant 51 +push constant 63 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 78 +push constant 51 +push constant 51 +push constant 55 +push constant 55 +push constant 63 +push constant 59 +push constant 59 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 79 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 80 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 81 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 59 +push constant 30 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 82 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 83 +push constant 30 +push constant 51 +push constant 51 +push constant 6 +push constant 28 +push constant 48 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 84 +push constant 63 +push constant 63 +push constant 45 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 85 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 86 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 87 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 88 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 30 +push constant 30 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 89 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 90 +push constant 63 +push constant 51 +push constant 49 +push constant 24 +push constant 12 +push constant 6 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 91 +push constant 30 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 92 +push constant 0 +push constant 0 +push constant 1 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 48 +push constant 32 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 93 +push constant 30 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 94 +push constant 8 +push constant 28 +push constant 54 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 95 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 96 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 97 +push constant 0 +push constant 0 +push constant 0 +push constant 14 +push constant 24 +push constant 30 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 98 +push constant 3 +push constant 3 +push constant 3 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 99 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 3 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 100 +push constant 48 +push constant 48 +push constant 48 +push constant 60 +push constant 54 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 101 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 63 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 102 +push constant 28 +push constant 54 +push constant 38 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 103 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 104 +push constant 3 +push constant 3 +push constant 3 +push constant 27 +push constant 55 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 105 +push constant 12 +push constant 12 +push constant 0 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 106 +push constant 48 +push constant 48 +push constant 0 +push constant 56 +push constant 48 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 107 +push constant 3 +push constant 3 +push constant 3 +push constant 51 +push constant 27 +push constant 15 +push constant 15 +push constant 27 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 108 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 109 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 63 +push constant 43 +push constant 43 +push constant 43 +push constant 43 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 110 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 111 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 112 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 113 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 114 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 55 +push constant 51 +push constant 3 +push constant 3 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 115 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 6 +push constant 24 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 116 +push constant 4 +push constant 6 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 117 +push constant 0 +push constant 0 +push constant 0 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 118 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 119 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 120 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 121 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 24 +push constant 15 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 122 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 27 +push constant 12 +push constant 6 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 123 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 124 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 125 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 126 +push constant 38 +push constant 45 +push constant 25 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 0 +return +function Output.create 1 +push constant 11 +call Array.new 1 +pop local 0 +push argument 0 +push static 5 +add +push local 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +push local 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push argument 3 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push argument 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push argument 5 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push argument 6 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push argument 7 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push argument 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push argument 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push local 0 +add +push argument 10 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push local 0 +add +push argument 11 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Output.createShiftedMap 4 +push constant 127 +call Array.new 1 +pop static 6 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 127 +lt +not +if-goto WHILE_END0 +push local 2 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +push constant 11 +call Array.new 1 +pop local 1 +push local 2 +push static 6 +add +push local 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +pop local 3 +label WHILE_EXP1 +push local 3 +push constant 11 +lt +not +if-goto WHILE_END1 +push local 3 +push local 1 +add +push local 3 +push local 0 +add +pop pointer 1 +push that 0 +push constant 256 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop local 2 +goto IF_END0 +label IF_FALSE0 +push local 2 +push constant 1 +add +pop local 2 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.getMap 1 +push argument 0 +push constant 32 +lt +push argument 0 +push constant 126 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop argument 0 +label IF_FALSE0 +push static 2 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +push static 6 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END1 +push local 0 +return +function Output.drawChar 4 +push argument 0 +call Output.getMap 1 +pop local 2 +push static 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 256 +neg +and +pop local 3 +goto IF_END0 +label IF_FALSE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 255 +and +pop local 3 +label IF_END0 +push local 0 +push static 4 +add +push local 1 +push local 2 +add +pop pointer 1 +push that 0 +push local 3 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 32 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.moveCursor 0 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 22 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 63 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 20 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push constant 2 +call Math.divide 2 +pop static 0 +push constant 32 +push argument 0 +push constant 352 +call Math.multiply 2 +add +push static 0 +add +pop static 1 +push argument 1 +push static 0 +push constant 2 +call Math.multiply 2 +eq +pop static 2 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return +function Output.printChar 0 +push argument 0 +call String.newLine 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Output.println 0 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +call String.backSpace 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +call Output.backSpace 0 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +call Output.drawChar 1 +pop temp 0 +push static 2 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push static 0 +push constant 1 +add +pop static 0 +push static 1 +push constant 1 +add +pop static 1 +label IF_FALSE2 +push static 0 +push constant 32 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +call Output.println 0 +pop temp 0 +goto IF_END3 +label IF_FALSE3 +push static 2 +not +pop static 2 +label IF_END3 +label IF_END1 +label IF_END0 +push constant 0 +return +function Output.printString 2 +push argument 0 +call String.length 1 +pop local 1 +label WHILE_EXP0 +push local 0 +push local 1 +lt +not +if-goto WHILE_END0 +push argument 0 +push local 0 +call String.charAt 2 +call Output.printChar 1 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.printInt 0 +push static 3 +push argument 0 +call String.setInt 2 +pop temp 0 +push static 3 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 1 +push constant 352 +add +push static 0 +sub +pop static 1 +push constant 0 +pop static 0 +push constant 0 +not +pop static 2 +push static 1 +push constant 8128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop static 1 +label IF_FALSE0 +push constant 0 +return +function Output.backSpace 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push static 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push static 0 +push constant 1 +sub +pop static 0 +push static 1 +push constant 1 +sub +pop static 1 +goto IF_END1 +label IF_FALSE1 +push constant 31 +pop static 0 +push static 1 +push constant 32 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 8128 +pop static 1 +label IF_FALSE2 +push static 1 +push constant 321 +sub +pop static 1 +label IF_END1 +push constant 0 +pop static 2 +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +pop static 2 +label IF_END0 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/MemoryTest/README.txt b/projects/12/MemoryTest/README.txt new file mode 100755 index 0000000..15ad0c8 --- /dev/null +++ b/projects/12/MemoryTest/README.txt @@ -0,0 +1,9 @@ +There are some specific wrong values that indicate that your Memory.jack +returned identical pointers to allocated segments. Look at Main.jack to +see where the pointers a, b and c are used. + +RAM[8003] = 123 b = a +RAM[8004] = 101 c = a +RAM[8004] = 110 c = b +RAM[8004] = 111 c = a and c = b +RAM[8005] = 11 new b = c diff --git a/projects/12/MemoryTest/Screen.vm b/projects/12/MemoryTest/Screen.vm new file mode 100755 index 0000000..fccafb5 --- /dev/null +++ b/projects/12/MemoryTest/Screen.vm @@ -0,0 +1,806 @@ +function Screen.init 1 +push constant 16384 +pop static 1 +push constant 0 +not +pop static 2 +push constant 17 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.clearScreen 1 +label WHILE_EXP0 +push local 0 +push constant 8192 +lt +not +if-goto WHILE_END0 +push local 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.updateLocation 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +not +and +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END0 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 2 +push constant 0 +return +function Screen.drawPixel 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 7 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 0 +push argument 0 +push local 0 +push constant 16 +call Math.multiply 2 +sub +pop local 1 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 0 +add +pop local 2 +push local 2 +push local 1 +push static 0 +add +pop pointer 1 +push that 0 +call Screen.updateLocation 2 +pop temp 0 +push constant 0 +return +function Screen.drawConditional 0 +push argument 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +push argument 0 +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push constant 0 +return +function Screen.drawLine 11 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 2 +push argument 0 +sub +call Math.abs 1 +pop local 3 +push argument 3 +push argument 1 +sub +call Math.abs 1 +pop local 2 +push local 3 +push local 2 +lt +pop local 6 +push local 6 +push argument 3 +push argument 1 +lt +and +push local 6 +not +push argument 2 +push argument 0 +lt +and +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +pop local 4 +push argument 2 +pop argument 0 +push local 4 +pop argument 2 +push argument 1 +pop local 4 +push argument 3 +pop argument 1 +push local 4 +pop argument 3 +label IF_FALSE1 +push local 6 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 3 +pop local 4 +push local 2 +pop local 3 +push local 4 +pop local 2 +push argument 1 +pop local 1 +push argument 0 +pop local 0 +push argument 3 +pop local 8 +push argument 0 +push argument 2 +gt +pop local 7 +goto IF_END2 +label IF_FALSE2 +push argument 0 +pop local 1 +push argument 1 +pop local 0 +push argument 2 +pop local 8 +push argument 1 +push argument 3 +gt +pop local 7 +label IF_END2 +push constant 2 +push local 2 +call Math.multiply 2 +push local 3 +sub +pop local 5 +push constant 2 +push local 2 +call Math.multiply 2 +pop local 9 +push constant 2 +push local 2 +push local 3 +sub +call Math.multiply 2 +pop local 10 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 8 +lt +not +if-goto WHILE_END0 +push local 5 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 5 +push local 9 +add +pop local 5 +goto IF_END3 +label IF_FALSE3 +push local 5 +push local 10 +add +pop local 5 +push local 7 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END4 +label IF_FALSE4 +push local 0 +push constant 1 +add +pop local 0 +label IF_END4 +label IF_END3 +push local 1 +push constant 1 +add +pop local 1 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawRectangle 9 +push argument 0 +push argument 2 +gt +push argument 1 +push argument 3 +gt +or +push argument 0 +push constant 0 +lt +or +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 9 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push argument 0 +push local 3 +push constant 16 +call Math.multiply 2 +sub +pop local 7 +push argument 2 +push constant 16 +call Math.divide 2 +pop local 4 +push argument 2 +push local 4 +push constant 16 +call Math.multiply 2 +sub +pop local 8 +push local 7 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 6 +push local 8 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 5 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 3 +add +pop local 0 +push local 4 +push local 3 +sub +pop local 2 +label WHILE_EXP0 +push argument 1 +push argument 3 +gt +not +not +if-goto WHILE_END0 +push local 0 +push local 2 +add +pop local 1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 5 +push local 6 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 6 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP1 +push local 0 +push local 1 +lt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +push argument 1 +push constant 1 +add +pop argument 1 +push local 1 +push constant 32 +add +push local 2 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawHorizontal 11 +push argument 1 +push argument 2 +call Math.min 2 +pop local 7 +push argument 1 +push argument 2 +call Math.max 2 +pop local 8 +push argument 0 +push constant 1 +neg +gt +push argument 0 +push constant 256 +lt +and +push local 7 +push constant 512 +lt +and +push local 8 +push constant 1 +neg +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 7 +push constant 0 +call Math.max 2 +pop local 7 +push local 8 +push constant 511 +call Math.min 2 +pop local 8 +push local 7 +push constant 16 +call Math.divide 2 +pop local 1 +push local 7 +push local 1 +push constant 16 +call Math.multiply 2 +sub +pop local 9 +push local 8 +push constant 16 +call Math.divide 2 +pop local 2 +push local 8 +push local 2 +push constant 16 +call Math.multiply 2 +sub +pop local 10 +push local 9 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 5 +push local 10 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 4 +push argument 0 +push constant 32 +call Math.multiply 2 +push local 1 +add +pop local 0 +push local 2 +push local 1 +sub +pop local 6 +push local 0 +push local 6 +add +pop local 3 +push local 6 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 4 +push local 5 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP0 +push local 0 +push local 3 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +push local 4 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +label IF_FALSE0 +push constant 0 +return +function Screen.drawSymetric 0 +push argument 1 +push argument 3 +sub +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 3 +add +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +sub +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +add +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push constant 0 +return +function Screen.drawCircle 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 12 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push argument 2 +sub +push constant 0 +lt +push argument 0 +push argument 2 +add +push constant 511 +gt +or +push argument 1 +push argument 2 +sub +push constant 0 +lt +or +push argument 1 +push argument 2 +add +push constant 255 +gt +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 13 +call Sys.error 1 +pop temp 0 +label IF_FALSE1 +push argument 2 +pop local 1 +push constant 1 +push argument 2 +sub +pop local 2 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 0 +gt +not +if-goto WHILE_END0 +push local 2 +push constant 0 +lt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 2 +push constant 2 +push local 0 +call Math.multiply 2 +add +push constant 3 +add +pop local 2 +goto IF_END2 +label IF_FALSE2 +push local 2 +push constant 2 +push local 0 +push local 1 +sub +call Math.multiply 2 +add +push constant 5 +add +pop local 2 +push local 1 +push constant 1 +sub +pop local 1 +label IF_END2 +push local 0 +push constant 1 +add +pop local 0 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/12/MemoryTest/String.vm b/projects/12/MemoryTest/String.vm new file mode 100755 index 0000000..9b7577e --- /dev/null +++ b/projects/12/MemoryTest/String.vm @@ -0,0 +1,393 @@ +function String.new 0 +push constant 3 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 14 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Array.new 1 +pop this 1 +label IF_FALSE1 +push argument 0 +pop this 0 +push constant 0 +pop this 2 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 1 +call Array.dispose 1 +pop temp 0 +label IF_FALSE0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function String.length 0 +push argument 0 +pop pointer 0 +push this 2 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 15 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 16 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function String.appendChar 0 +push argument 0 +pop pointer 0 +push this 2 +push this 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 17 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push this 1 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 18 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push constant 1 +sub +pop this 2 +push constant 0 +return +function String.intValue 5 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push constant 0 +not +pop local 3 +push constant 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 4 +push constant 1 +pop local 0 +label IF_FALSE1 +label WHILE_EXP0 +push local 0 +push this 2 +lt +push local 3 +and +not +if-goto WHILE_END0 +push local 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 2 +push constant 0 +lt +push local 2 +push constant 9 +gt +or +not +pop local 3 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 1 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +neg +pop local 1 +label IF_FALSE3 +push local 1 +return +function String.setInt 4 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 6 +call Array.new 1 +pop local 2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 3 +push argument 1 +neg +pop argument 1 +label IF_FALSE1 +push argument 1 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 0 +gt +not +if-goto WHILE_END0 +push argument 1 +push constant 10 +call Math.divide 2 +pop local 1 +push local 0 +push local 2 +add +push constant 48 +push argument 1 +push local 1 +push constant 10 +call Math.multiply 2 +sub +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +push local 1 +pop argument 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push local 2 +add +push constant 45 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +push this 0 +push local 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE3 +push local 0 +push constant 0 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 0 +push this 1 +add +push constant 48 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +pop this 2 +goto IF_END4 +label IF_FALSE4 +push constant 0 +pop this 2 +label WHILE_EXP1 +push this 2 +push local 0 +lt +not +if-goto WHILE_END1 +push this 2 +push this 1 +add +push local 0 +push this 2 +push constant 1 +add +sub +push local 2 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +goto WHILE_EXP1 +label WHILE_END1 +label IF_END4 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 0 +return +function String.newLine 0 +push constant 128 +return +function String.backSpace 0 +push constant 129 +return +function String.doubleQuote 0 +push constant 34 +return diff --git a/projects/12/MemoryTest/Sys.vm b/projects/12/MemoryTest/Sys.vm new file mode 100755 index 0000000..c186dad --- /dev/null +++ b/projects/12/MemoryTest/Sys.vm @@ -0,0 +1,83 @@ +function Sys.init 0 +call Memory.init 0 +pop temp 0 +call Math.init 0 +pop temp 0 +call Screen.init 0 +pop temp 0 +call Output.init 0 +pop temp 0 +call Keyboard.init 0 +pop temp 0 +call Main.main 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return +function Sys.halt 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.wait 1 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 1 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +label WHILE_EXP0 +push argument 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 50 +pop local 0 +label WHILE_EXP1 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push argument 0 +push constant 1 +sub +pop argument 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 69 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push argument 0 +call Output.printInt 1 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return diff --git a/projects/12/MemoryTest/__pycache__/symbol_table.cpython-39.pyc b/projects/12/MemoryTest/__pycache__/symbol_table.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d9511ddc5378e0beedf6046c60938b6ef1baa44c GIT binary patch literal 2293 zcmYe~<>g{vU|`T>QcL{7#=!6x#6iZ)3=9ko3=9m#3JeSk?hGjmDU2-)DU8ibQ6L^u z3UdoX3Uf146k`fYFoPy*GO}I}n+c|0gn@w}l_82Tg&~S5g)xPxg&~SLg*li(ljRm$ zaAj^%eoitYNCOmu*dV>mAiHH47#LC*YZ&4oBqNy3l)_ZQ5YL>#5X_*-?01XdB}ga8 zwBq=@#N5ro^%i?^d}dxsYQ;*%TP($?IcX~yia=ifyUl5a*n3rNyl3G%fSsYVPl%JKFTv8lkXcXg{nwwu# z8IoFD5>pIzeSAq`QckK~LFFxu`1s7c%#!$cko$`{K+a-h1H&qQh)?xkD*QBAK*~Yx zjgP;@6(66QpHiBW8Xtd)CqBNgG%*JvQ^do-0C6qY$q<4YBnAp55H1GU#lctvV&jej zAFOeZ!qUPJ#gf9B!q&nN#hSvN!qLJI#g@XE!qvhM#h${Q!qdVK#gW3B!q>tO#hJpN zBGAGR#g!r$%%CZBiyPvj5Rm6_M<6Jm(;2`K$Pmo1lF?6-@fLG&Wo{8DbRgaVDJcT` z3FKK259}uf#wrmcE8roQ%mNBmC0g0op_nBi>J8ioaIHOvbcQf#DWgVnIP_ zUJ5w8i$K;Fv4Nt46(q-5mRJ;@oL`z(Qp66*S}aAJAURZ3Xr8{smXey5nU~57O70-f zGcfWo@_=EL5VHRv%9268g?gR=#0Fuo@0}PJ!0spPdr+2b$Nx{$0t8?q869ApQl#?=6AilEk8t_~O!} zqWsd5%)C@k(NGLhgyd-%WKW}OAjSKjvLcHig$XJ0L2MSNmqBdS6c%ulgV+%7v-;g) zDaptzh6Dm@T4ria3OEFcBtc%60udkwBl(IO;>hHj#NuLUEU_q#=^?P%WKhn9MI|VW zfC3sEm1^KpuNItOT^M4;YME=8vlwd_vzdyxYM4@(%o%E#3b|^Sz~vvrb)b;cWP(Hz zC@pG2(;kR@ixr$EZ!u;6E%v1L5>Asu!CKo zY0rfr)}ofFh6(Cewi>1^rWBB~RTvpkn1UI=eCBMXA`?aiP_+T#GchnS1Tz%EgP*x9 zu_%f)CqFqcr$`nQ+@Lx@lNsVQP%ssN{DhL$6hO+rz5){@_Y%HbyQ+HYOg%Dq&<#LRI7Tq6)%`66jt;_Ck>$DCZ+P7hFDoLK!XeZ?S`Fr}+Fd z6Oa=@Hm7lbE6n)(G%F0Zp%lt6Wqz96MW7O_hz}GM{2&5U zm=}qISfET%BnM)F(p!--hy@DHB2^Fz9AyXs6nRCU_yQH3#UKU;BL_1FI}~zruz_X$ gG?^epFh~Vbz=90|nQ@E522!Qkfr=||jl#zP0D6a}p#T5? literal 0 HcmV?d00001 diff --git a/projects/12/MemoryTest/__pycache__/tokenizer.cpython-39.pyc b/projects/12/MemoryTest/__pycache__/tokenizer.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..5e076e806fd62d4e4b403a4cf243328ba6663bc5 GIT binary patch literal 2122 zcmYe~<>g{vU|{%kN+xj^7X!m%5C<7EGcYhXFfcF_OEEAoq%fo~<}gGtxHF_Mr7*WJ zq%b!#MKPu@1~X`~yaeg;O9qk17_MKBfq@~FA&N1DA&M!5F@>pxA&NPLD}^P6wS_T? zC50`8y@er)HH9OEvxOmwErmIlL6iFyXGnf_YF=hlYEd#HlBpmz69WT-Gss~|Acry5 zFvK&YFx4=`Go~=tFvK&Zu+%WbGlNA~QW%06G+F(MK-z9GXbS&g)cD1y`HM077h~)% z#@b(u)xQ|+elgnoVzj-*sP&6c`xm3`FGl@ajC#Kqt$#7<{9;u5#aQ!;u})L;7He`& zVsY^;w%pW`jQo^a9BHL_$t9WjdAGQe^Ye;Jib|79@{4XUXXceeu_xu{=cFd)-C{}3 zNGytCDa+4Hxy4+TSagf6xFoS8Gx-*4T4ria$}Q%c)RJ3FDfzdUGShCcq~;W--eN7! z$jnK-#a5JBQd*REi>0KfH1!s1S|Uh}C9gCm=N3yzMrN@l>n+C2TP$fHwd}=}xk>ps z#kV-JQ!C@k^NUh$v6g^>Pm}Q$OL1yW+De8Z0|o|$Up~%OF`>n&Ma40}fsVS4?nR|3 zsbw)Psm0kP`2{g~iFqkTC8;GvnZ+>$Mfq8&$tA@xhDI^Isk!+@l_9CcB{5)AL6M?Y zP@N}!mmVXR@uVk~1QGDu+x2B~M3WJqDjW-4+>VGU*| zVOqeP!dAn$kf|sjg&ibc!;r;N#!wWO!V%1n!Wql}GDDNguLzVfZ?R{mR)T^GoHl+j zD&68ME-A{)OLqoEW@27R6?06A_AUO*ypq)P)FPPZEjCD4-{Q(lNzE(COv_9y(qt_H zCGjF%1_p*(Ohu`;SaTCgk~4~Q7#J8dnTqro7#JW5Kyd($h$2IfQZ8_4#+OtUqzZsS z5R}gt7&#c(7zG$v7`Yf(7x&1QTF3=5Tayiv1ge-~ieG|Ch9VON28Jr8m~u__A}vtNFz2M^6={Rw%@Radfe27+ zf}>HB87WFZ${|q-j$ClOvL~jLCFUikDu5ytWHbXK3pi4R7&#bOm;@Mkz>&+x$ic|R z$j8XV$i>LV$igJT$j2xKj(AWesuDy*H`F|o?8DB$z`y~E>n{up3?-lp!Pv~ye*qNR z3m6wN)G~v!1XBug4f8@~D31lkOJS{LsbMK$sbL1CiJ~(#%rz{M3@L2cOht!4>=br! z21$k#4mh6^iO*8Y3Q_}>XD;pmv7zeOvYCsf)v%n#8v8akgUtdoPoU5yN^`o_7qqSo7w4$|Q^}%_&2$Z>sY(R0y%fP_! z5>)VLvfX0IFG$V1#Zr`-m{J6aG4rWUq{3&#jCH zmA6sMB^4!*gu+@}l2}x7i>0_EzW_ZMa3$xYCKiEp*nv`l9H``Dj04jQmK?#V1iGzzvfI|)}s>uWn3oskWKVbbJt+zOA PAa>g^g1iJWh=Umbh4b#K literal 0 HcmV?d00001 diff --git a/projects/12/MemoryTest/__pycache__/vmwriter.cpython-39.pyc b/projects/12/MemoryTest/__pycache__/vmwriter.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..3234455dbca7de7740d79c81ffd254d7bbdc6d3c GIT binary patch literal 2963 zcmYe~<>g{vU|`TrlS_=?WMFs<;vi#Y1_lNP1_p*=AqEBpcZL*(6vh^Y6vk$zD25cK zU-m3quq~3U3Nu3qurV3V(_~3qurFieQRR3qurlig1cZ3qur7 zifD>h3qurdig+-Cro=6dFyHW^%#zfiWRUG3SAZ~x4RXIT$o*mr3=AaY*}&CM^W3`s36i7Cr12fJRcpz;<+e0*kJW=VWJ z$o0i6AV)FsFjfh|e5ePLPX>7nBn`qKHpnetuNpBhFw`()F)UzAVXR@C&5*)W!!(;A zg?TRPLPkc05+-EPxh&0$j11slVDYPBEhsI{Q252DaEp;^C36wT_FJrAx7}hbD9X$$ zS;<_)#=yW3#a^76o|~Fia*GulG~jT65F88)47a$zdg4K*fs{kNA;nlF4EF{?1xB2) zGB7ZJJ)(x;k-5ysUYN@ScRaIS6+1Yt6nu)f85kIfco-NMRx%ZVtiQzymVvkr6iP*4 zM{+})kdv5{lM2cNP*;jDR*9gw608KnnV`@CJJXGk0i3Y1nTiyk;m!ngCNs!^6BzT9 zY8X>kvYCn;pz^SoV1vpt)i9>8XEPPWLFGB1`q@G9c~5E>Q#iAkifW*;Tu@nVu=DzZli3SQ7KVM&+ga zVyvlR&M)G+#gt$4i?ObXB`?2(>lSlfe#tFHttwvM#F7lX+|rzq%z~WCm!Qn|i&4Ld z8!ViXS(cfSs>uS*5JkM82!0j{xa51%j zA%zi?{-J@$1TJ}*p#>Im3Yd>nV6pfWsW31wRB>je>4J=hI#!dVNDCB%pg=;TG_0=Y zfVe(0%^c)*P(jDQ$OQ^lL|p+>fj=ogb1$iN1t{4gr3G+_s|l$eiiAOx1V>(JZhT@< zdNEqK7ilsuFxY?`4e})eBbIsrWHv1v&6!r3mt2yWpNH4sTp)+%TQpga8*A0$X& z#(%iwEL6h#@YZ7y@Nr25@=A!&oJX=0AwKWJXXa2E`yYsPF{)4pcTk64ycoXd{Es zPm>8;T-;(!&dD!M)nqIJrCfA}@PZ}d%W~t>GILVBKrR89%D`A926qFB5CL@?e@*~(JkRi7?Y##a9eXVR literal 0 HcmV?d00001 diff --git a/projects/12/Output.jack b/projects/12/Output.jack new file mode 100755 index 0000000..774a265 --- /dev/null +++ b/projects/12/Output.jack @@ -0,0 +1,301 @@ +// This 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 address; + static bool half; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + do Output.initMap(); + do Output.moveCursor(0, 0); + return; + } + + // 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,63,51,51,51,51,0,0); // A ** TO BE FILLED ** + do Output.create(66,31,51,51,51,31,51,51,51,31,0,0); // B + do Output.create(67,28,54,35,3,3,3,35,54,28,0,0); // C + do Output.create(68,15,27,51,51,51,51,51,27,15,0,0); // D + do Output.create(69,63,51,35,11,15,11,35,51,63,0,0); // E + do Output.create(70,63,51,35,11,15,11,3,3,3,0,0); // F + do Output.create(71,28,54,35,3,59,51,51,54,44,0,0); // G + do Output.create(72,51,51,51,51,63,51,51,51,51,0,0); // H + do Output.create(73,30,12,12,12,12,12,12,12,30,0,0); // I + do Output.create(74,60,24,24,24,24,24,27,27,14,0,0); // J + do Output.create(75,51,51,51,27,15,27,51,51,51,0,0); // K + do Output.create(76,3,3,3,3,3,3,35,51,63,0,0); // L + do Output.create(77,33,51,63,63,51,51,51,51,51,0,0); // M + do Output.create(78,51,51,55,55,63,59,59,51,51,0,0); // N + do Output.create(79,30,51,51,51,51,51,51,51,30,0,0); // O + do Output.create(80,31,51,51,51,31,3,3,3,3,0,0); // P + do Output.create(81,30,51,51,51,51,51,63,59,30,48,0);// Q + do Output.create(82,31,51,51,51,31,27,51,51,51,0,0); // R + do Output.create(83,30,51,51,6,28,48,51,51,30,0,0); // S + do Output.create(84,63,63,45,12,12,12,12,12,30,0,0); // T + do Output.create(85,51,51,51,51,51,51,51,51,30,0,0); // U + do Output.create(86,51,51,51,51,51,30,30,12,12,0,0); // V + do Output.create(87,51,51,51,51,51,63,63,63,18,0,0); // W + do Output.create(88,51,51,30,30,12,30,30,51,51,0,0); // X + do Output.create(89,51,51,51,51,30,12,12,12,30,0,0); // Y + do Output.create(90,63,51,49,24,12,6,35,51,63,0,0); // Z + + do Output.create(91,30,6,6,6,6,6,6,6,30,0,0); // [ + do Output.create(92,0,0,1,3,6,12,24,48,32,0,0); // \ + do Output.create(93,30,24,24,24,24,24,24,24,30,0,0); // ] + do Output.create(94,8,28,54,0,0,0,0,0,0,0,0); // ^ + do Output.create(95,0,0,0,0,0,0,0,0,0,63,0); // _ + do Output.create(96,6,12,24,0,0,0,0,0,0,0,0); // ` + + do Output.create(97,0,0,0,14,24,30,27,27,54,0,0); // a + do Output.create(98,3,3,3,15,27,51,51,51,30,0,0); // b + do Output.create(99,0,0,0,30,51,3,3,51,30,0,0); // c + do Output.create(100,48,48,48,60,54,51,51,51,30,0,0); // d + do Output.create(101,0,0,0,30,51,63,3,51,30,0,0); // e + do Output.create(102,28,54,38,6,15,6,6,6,15,0,0); // f + do Output.create(103,0,0,30,51,51,51,62,48,51,30,0); // g + do Output.create(104,3,3,3,27,55,51,51,51,51,0,0); // h + do Output.create(105,12,12,0,14,12,12,12,12,30,0,0); // i + do Output.create(106,48,48,0,56,48,48,48,48,51,30,0); // j + do Output.create(107,3,3,3,51,27,15,15,27,51,0,0); // k + do Output.create(108,14,12,12,12,12,12,12,12,30,0,0); // l + do Output.create(109,0,0,0,29,63,43,43,43,43,0,0); // m + do Output.create(110,0,0,0,29,51,51,51,51,51,0,0); // n + do Output.create(111,0,0,0,30,51,51,51,51,30,0,0); // o + do Output.create(112,0,0,0,30,51,51,51,31,3,3,0); // p + do Output.create(113,0,0,0,30,51,51,51,62,48,48,0); // q + do Output.create(114,0,0,0,29,55,51,3,3,7,0,0); // r + do Output.create(115,0,0,0,30,51,6,24,51,30,0,0); // s + do Output.create(116,4,6,6,15,6,6,6,54,28,0,0); // t + do Output.create(117,0,0,0,27,27,27,27,27,54,0,0); // u + do Output.create(118,0,0,0,51,51,51,51,30,12,0,0); // v + do Output.create(119,0,0,0,51,51,51,63,63,18,0,0); // w + do Output.create(120,0,0,0,51,30,12,12,30,51,0,0); // x + do Output.create(121,0,0,0,51,51,51,62,48,24,15,0); // y + do Output.create(122,0,0,0,63,27,12,6,51,63,0,0); // z + + do Output.create(123,56,12,12,12,7,12,12,12,56,0,0); // { + do Output.create(124,12,12,12,12,12,12,12,12,12,0,0); // | + do Output.create(125,7,12,12,12,56,12,12,12,7,0,0); // } + do Output.create(126,38,45,25,0,0,0,0,0,0,0,0); // ~ + + return; + } + + // Creates the character map array of the given character index, using the given values. + function void create(int index, int a, int b, int c, int d, int e, + int f, int g, int h, int i, int j, int k) { + var Array map; + + let map = Array.new(11); + let charMaps[index] = map; + + let map[0] = a; + let map[1] = b; + let map[2] = c; + let map[3] = d; + let map[4] = e; + let map[5] = f; + let map[6] = g; + let map[7] = h; + let map[8] = i; + let map[9] = j; + let map[10] = k; + + return; + } + + // Returns the character map (array of size 11) of the given character. + // If the given character is invalid or non-printable, returns the + // character map of a black square. + function Array getMap(char c) { + if ((c < 32) | (c > 126)) { + let c = 0; + } + return charMaps[c]; + } + + /** Moves the cursor to the j-th column of the i-th row, + * and erases the character displayed there. */ + function void moveCursor(int i, int j) { + var int count; + var int display; + var Array r; + var Array char; + if (j = 0){ + let half = true; + } + else{ + let half = (j / 2) * 2 = j; // chetno true, 1vaa chast + } + let address = (352 * i) + (j / 2) + 16384; + let char = Output.getMap(32); + + while (count < 11){ + if (half){ + let display = r[address] & (-256); + let r[address] = char[count] | display; + } + else{ + let display = r[address] & 255; + let r[address] = (char[count]*256) | display; + } + let count = count + 1; + let address = address + 32; + } + let address = address - 352; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array char; + var Array r; + var int count; + var int display; + let char = Output.getMap(c); + while (count < 11){ + if (half){ + let display = r[address] & (-256); + let r[address] = char[count] | display; + } + else{ + let display = r[address] & 255; + let r[address] = (char[count]*256) | display; + } + let count = count + 1; + let address = address + 32; + } + + if (half){ + let address = address - 352; + let half = false; + } + else{ + if (address > 24480){ + let address = 16384; + let half = true; + } + else{ + let address = address - 351; + let half = true; + } + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int i, length; + let length = s.length(); + while (i < length){ + do Output.printChar(s[i+2]); + let i = i + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String s; + let s = String.new(6); + do s.setInt(i); + do Output.printString(s); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + var int row; + let row = (((address - 16384) / 32)/11) + 1; + if (row > 32){ + let row = 0; + } + do Output.moveCursor(row, 0); + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + if (address = 16384){ + let address = 24191; + let half = true; + return; + } + if (half){ + + let address = address - 1; + let half = false; + } + else{ + let half = true; + } + return; + } +} diff --git a/projects/12/OutputTest/Main.jack b/projects/12/OutputTest/Main.jack new file mode 100755 index 0000000..f243068 --- /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/OutputTestOutput.gif b/projects/12/OutputTest/OutputTestOutput.gif new file mode 100755 index 0000000000000000000000000000000000000000..b8ec2c087f7817b026f37825cdd9870ebef4ee45 GIT binary patch literal 6184 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 literal 0 HcmV?d00001 diff --git a/projects/12/OutputTest/__pycache__/symbol_table.cpython-39.pyc b/projects/12/OutputTest/__pycache__/symbol_table.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d0534a7c6d0b64a3407a74d486a180e46e84186f GIT binary patch literal 2293 zcmYe~<>g{vU|`T>QcL{7#=!6x#6iZ)3=9ko3=9m#3JeSk?hGjmDU2-)DU8ibQ6L^u z3UdoX3Uf146k`fYFoPy*GO}I}n+c|0gn@w}l_82Tg&~S5g)xPxg&~SLg*li(ljRm$ zaAj^%eoitYNCOmu*dV>mAiHH47#LC*YZ&4oBqNy3l)_ZQ5YL>#5X_*-?01XdB}ga8 zwBq=@#N5ro^%i?^d}dxsYQ;*%TP($?IcX~yia=ifyUl5a*n3rNyl3G%fSsYVPl%JKFTv8lkXcXgLT2fG2 z5|Ub65>pIzeSAq`QckK~LFFxu`1s7c%#!$cko$`{K+a-h1H&qQh)?xkD*QBAK*~Yx zjgP;@6(66QpHiBW8Xtd)CqBNgG%*JvQ^do-0C6qY$q<4YBnAp55H1GU#lctvV&jej zAFOeZ!qUPJ#gf9B!q&nN#hSvN!qLJI#g@XE!qvhM#h${Q!qdVK#gW3B!q>tO#hJpN zBGAGR#g!r$%%CZBiyPvj5Rm6_M<6Jm(;2`K$Pmo1lF?6-@fLG&Wo{8DbRgaVDJcT` z3FKK259}uf#wrmcE8roQ%mNBmC0g0op_nBi>J8ioaIHOvbcQf#DWgVnIP_ zUJ5w8i$K;Fv4Nt46(q-5mRJ;@oL`z(Qp66*S}aAJAURZ3Xr8{smXey5nU~57O70-f zGcfWo@_=EL5VHRv%9268g?gR=#0Fuo@0}PJ!0spPdr+2b$Nx{$0t8?q869ApQl#?=6AilEk8t_~O!} zqWsd5%)C@k(NGLhgyd-%WKW}OAjSKjvLcHig$XJ0L2MSNmqBdS6c%ulgV+%7v-;g) zDaptzh6Dm@T4ria3OEFcBtc%60udkwBl(IO;>hHj#NuLUEU_q#=^?P%WKhn9MI|VW zfC3sEm1^KpuNItOT^M4;YME=8vlwd_vzdyxYM4@(%o%E#3b|^Sz~vvrb)b;cWP(Hz zC@pG2(;kR@ixr$EZ!u;6E%v1L5>Asu!CKo zY0rfr)}ofFh6(Cewi>1^rWBB~RTvpkn1UI=eCBMXA`?aiP_+T#GchnS1Tz%EgP*x9 zu_%f)CqFqcr$`nQ+@Lx@lNsVQP%ssN{DhL$6hO+rz5){@_Y%HbyQ+HYOg%Dq&<#LRI7Tq6)%`66jt;_Ck>$DCZ+P7hFDoLK!XeZ?S`Fr}+Fd z6Oa=@Hm7lbE6n)(G%F0Zp%lt6Wqz96MW7O_hz}GM{2&5U zm=}qISfET%BnM)F(p!--hy@DHB2^Fz9AyXs6nRCU_yQH3#UKU;BL_1FI}~zruz_X$ gG?^epFh~Vbz=90|nQ@E522!Qkfr=||jl#zP05l?|xc~qF literal 0 HcmV?d00001 diff --git a/projects/12/OutputTest/__pycache__/tokenizer.cpython-39.pyc b/projects/12/OutputTest/__pycache__/tokenizer.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..7382823c011308b13b3d66a47bba560811913dce GIT binary patch literal 2122 zcmYe~<>g{vU|{%kN+xj^7X!m%5C<7EGcYhXFfcF_OEEAoq%fo~<}gGtxHF_Mr7*WJ zq%b!#MKPu@1~X`~yaeg;O9qk17_MKBfq@~FA&N1DA&M!5F@>pxA&NPLD}^P6wS_T? zC50`8y@er)HH9OEvxOmwErmIlL6iFyXGnf_YF=hlYEd#HlBpmz69WT-Gss~|Acry5 zFvK&YFx4=`Go~=tFvK&Zu+%WbGlNA~QW%06G+F(MK-z9GXbS&g)cD1y`HM077h~)% z#@b(u)xQ|+elgnoVzj-*sP&6c`xm3`FGl@ajC#Kqt$#7<{9;u5#aQ!;u})L;7He`& zVsY^;w%pW`jQo^a9BHL_$t9WjdAGQe^Ye;Jib|79@{4XUXXceeu_xu{=cFd)-C{}3 zNGytCDa+4Hxy4+TSagf6xFoS8Gx-*4T4ria$}Q%c)RJ3FDfzdUGShCcq~;W--eN7! z$jnK-#a5JBQd*REi>0KfH1!s1S|Uh}C9gCm=N3yzMrN@l>n+C2TP$fHwd}=}xk>ps z#kV-JQ!C@k^NUh$v6g^>Pm}Q$OL1yW+De8Z0|o|$Up~%OF`>n&Ma40}fsVS4?nR|3 zsbw)Psm0kP`2{g~iFqkTC8;GvnZ+>$Mfq8&$tA@xhDI^|r6mQWB_XNBB{5)AL6M?Y zP@N}!mmVXR@uVk~1QGDu+x2B~M3WJqDjW-4+>VGU*| zVOqeP!dAn$kf|sjg&ibc!;r;N#!wWO!V%1n!Wql}GDDNguLzVfZ?R{mR)T^GoHl+j zD&68ME-A{)OLqoEW@27R6?06A_AUO*ypq)P)FPPZEjCD4-{Q(lNzE(COv_9y(qt_H zCGjF%1_p*(Ohu`;SaTCgk~4~Q7#J8dnTqro7#JW5Kyd($h$2IfQZ8_4#+OtUqzZsS z5R}gt7&#c(7zG$v7`Yf(7x&1QTF3=5Tayiv1ge-~ieG|Ch9VON28Jr8m~u__A}vtNFz2M^6={Rw%@Radfe27+ zf}>HB87WFZ${|q-j$ClOvL~jLCFUikDu5ytWHbXK3pi4R7&#bOm;@Mkz>&+x$ic|R z$j8XV$i>LV$igJT$j2xKj(AWesuDy*H`F|o?8DB$z`y~E>n{up3?-lp!Pv~ye*qNR z3m6wN)G~v!1XBug4f8@~D31lkOJS{LsbMK$sbL1CiJ~(#%rz{M3@L2cOht!4>=br! z21$k#4mh6^iO*8Y3Q_}>XD;pmv7zeOvYCsf)v%n#8v8akgUtdoPoU5yN^`o_7qqSo7w4$|Q^}%_&2$Z>sY(R0y%fP_! z5>)VLvfX0IFG$V1#Zr`-m{J6aG4rWUq{3&#jCH zmA6sMB^4!*gu+@}l2}x7i>0_EzW_ZMa3$xYCKiEp*nv`l9H``Dj04jQmK?#V1iGzzvfI|)}s>uWn3oskWKVbbJt+zOA PAa>g^g1iJWh=Umb81C-F literal 0 HcmV?d00001 diff --git a/projects/12/OutputTest/__pycache__/vmwriter.cpython-39.pyc b/projects/12/OutputTest/__pycache__/vmwriter.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..f93075a456eb2db6f4ff65a90ec397b5dd99f9ec GIT binary patch literal 2963 zcmYe~<>g{vU|?V_$W4skWMFs<;vi#Y1_lNP1_p*=AqEBpcZL*(6vh^Y6vk$zD25cK zU-m3quq~3U3Nu3qurV3V(_~3qurFieQRR3qurlig1cZ3qur7 zifD>h3qurdig+-Cro=6dFyHW^%#zfiWRUG3SAZ~x4RXIT$o*mr3=AaY*rEh#812}vz3i7Cr12fJRcpz;<+e0*kJW=VWJ z$o0i6AV)FsFjfh|e5ePLPX>7nBn`qKHpnetuNpBhFw`()F)UzAVXR@C&5*)W!!(;A zg?TRPLPkc05+-EPxh&0$j11slVDYPBEhsI{Q252DaEp;^C36wT_FJrAx7}hbD9X$$ zS;<_)#=yW3#a^76o|~Fia*GulG~jT65F88)47a$zdg4K*fs{kNA;nlF4EF{?1xB2) zGB7ZJJ)(x;k-5ysUYN@ScRaIS6+1Yt6nu)f85kIfco-NMRx%ZVtiQzymVvkr6iP*4 zM{+})kdv5{lM2cNP*;jDR*9gw608KnnV`@CJJXGk0i3Y1nTiyk;m!ngCNs!^6BzT9 zY8X>kvYCn;pz^SoV1vpt)i9>8XEPPWLFGB1`q@G9c~5E>Q#iAkifW*;Tu@nVu=DzZli3SQ7KVM&+ga zVyvlR&M)G+#gt$4i?ObXB`?2(>lSlfe#tFHttwvM#F7lX+|rzq%z~WCm!Qn|i&4Ld z8!ViXS(cfSs>uS*5JkM82!0j{xa51%j zA%zi?{-J@$1TJ}*p#>Im3Yd>nV6pfWsW31wRB>je>4J=hI#!dVNDCB%pg=;TG_0=Y zfVe(0%^c)*P(jDQ$OQ^lL|p+>fj=ogb1$iN1t{4gr3G+_s|l$eiiAOx1V>(JZhT@< zdNEqK7ilsuFxY?`4e})eBbIsrWHv1v&6!r3mt2yWpNH4sTp)+%TQpga8*A0$X& z#(%iwEL6h#@YZ7y@Nr25@=A!&oJX=0AwKWJXXa2E`yYsPF{)4pcTk64ycoXd{Es zPm>8;T-;(!&dD!M)nqIJrCfA}@PZ}d%W~t>GILVBKrR89%D`A926qFB5CL@?e@*~(JkRi7?Y##>X?u16 literal 0 HcmV?d00001 diff --git a/projects/12/Screen.jack b/projects/12/Screen.jack new file mode 100755 index 0000000..006a905 --- /dev/null +++ b/projects/12/Screen.jack @@ -0,0 +1,206 @@ +// This 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 256 rows (indexed 0..255, top to bottom) + * of 512 pixels each (indexed 0..511, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + + static Array mem; + static Array st; + static boolean color; + /** Initializes the Screen. */ + function void init() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + let color = true; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int a; + let a = 16384; + while (a < 24575){ + let mem[a] = 0; + let a = a + 1; + } + 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 int value, address, bit, mem_block; + if ((x > 511) | (x < 0) | (y > 255) | (y < 0)){ + do Sys.error(7); + } + let mem_block = x / 16; + let address = (32 * y) + mem_block + 16384; + let value = mem[address]; + let bit = x - (mem_block * 16); + if (color){ + let mem[address] = st[bit] | value; + } + else{ + let mem[address] = (~st[bit])& 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 diff, dx, dy, a, b; + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let dx = x2 - x1; + let dy = y2 - y1; + if (dx = 0){ + if (dy > 0){ + while(~(b > dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b + 1; + } + return; + } + else{ + while(~(b < dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b - 1; + } + return; + } + } + if (dy = 0){ + if (dx > 0){ + while(~(a > dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a + 1; + } + return; + } + else{ + while(~(a < dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a - 1; + } + return; + } + } + if (dx < 0){ + if (dy < 0){ + while ((~(a < dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff + dx; + } + } + } + else{ + while ((~(a < dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff + dx; + } + } + } + } + else{ + if (dy < 0){ + while ((~(a > dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff - dx; + } + } + } + else{ + while ((~(a > dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff - 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 a, tmp; + if (x1 > x2){ + let tmp = x1; + let x1 = x2; + let x2 = tmp; + } + if (y1 > y2){ + let tmp = y1; + let y1 = y2; + let y2 = tmp; + } + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let tmp = y2 - y1; + while(a < tmp){ + do Screen.drawLine(x1, y1 + a, x2, y1 + a); + let a = a + 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, dx, tmp; + if(r > 181){ + do Sys.error(7); + } + let dy = - r; + while (dy < r){ + let tmp = Math.sqrt((r * r) - (dy * dy)); + do Screen.drawLine(x - tmp, y + dy, x + tmp, y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/ScreenTest/Main.jack b/projects/12/ScreenTest/Main.jack new file mode 100755 index 0000000..00f36bd --- /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 100755 index 0000000..31c8c16 --- /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 1 +neg +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/Screen.jack b/projects/12/ScreenTest/Screen.jack new file mode 100755 index 0000000..006a905 --- /dev/null +++ b/projects/12/ScreenTest/Screen.jack @@ -0,0 +1,206 @@ +// This 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 256 rows (indexed 0..255, top to bottom) + * of 512 pixels each (indexed 0..511, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + + static Array mem; + static Array st; + static boolean color; + /** Initializes the Screen. */ + function void init() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + let color = true; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int a; + let a = 16384; + while (a < 24575){ + let mem[a] = 0; + let a = a + 1; + } + 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 int value, address, bit, mem_block; + if ((x > 511) | (x < 0) | (y > 255) | (y < 0)){ + do Sys.error(7); + } + let mem_block = x / 16; + let address = (32 * y) + mem_block + 16384; + let value = mem[address]; + let bit = x - (mem_block * 16); + if (color){ + let mem[address] = st[bit] | value; + } + else{ + let mem[address] = (~st[bit])& 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 diff, dx, dy, a, b; + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let dx = x2 - x1; + let dy = y2 - y1; + if (dx = 0){ + if (dy > 0){ + while(~(b > dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b + 1; + } + return; + } + else{ + while(~(b < dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b - 1; + } + return; + } + } + if (dy = 0){ + if (dx > 0){ + while(~(a > dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a + 1; + } + return; + } + else{ + while(~(a < dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a - 1; + } + return; + } + } + if (dx < 0){ + if (dy < 0){ + while ((~(a < dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff + dx; + } + } + } + else{ + while ((~(a < dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff + dx; + } + } + } + } + else{ + if (dy < 0){ + while ((~(a > dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff - dx; + } + } + } + else{ + while ((~(a > dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff - 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 a, tmp; + if (x1 > x2){ + let tmp = x1; + let x1 = x2; + let x2 = tmp; + } + if (y1 > y2){ + let tmp = y1; + let y1 = y2; + let y2 = tmp; + } + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let tmp = y2 - y1; + while(a < tmp){ + do Screen.drawLine(x1, y1 + a, x2, y1 + a); + let a = a + 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, dx, tmp; + if(r > 181){ + do Sys.error(7); + } + let dy = - r; + while (dy < r){ + let tmp = Math.sqrt((r * r) - (dy * dy)); + do Screen.drawLine(x - tmp, y + dy, x + tmp, y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/ScreenTest/Screen.vm b/projects/12/ScreenTest/Screen.vm new file mode 100755 index 0000000..d08813b --- /dev/null +++ b/projects/12/ScreenTest/Screen.vm @@ -0,0 +1,656 @@ +function Screen.init 1 +push constant 16 +call Array.new 1 +pop static 1 +push static 1 +push constant 0 +push constant 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L0 +push local 0 +push constant 15 +lt +not +if-goto L1 +push local 0 +push constant 1 +add +pop local 0 +push static 1 +push local 0 +push static 1 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +push static 1 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +add +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L0 +label L1 +push constant 1 +neg +pop static 2 +push constant 0 +return +function Screen.clearScreen 1 +push constant 16384 +pop local 0 +label L2 +push local 0 +push constant 24575 +lt +not +if-goto L3 +push static 0 +push local 0 +push constant 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +goto L2 +label L3 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 2 +push constant 0 +return +function Screen.drawPixel 4 +push argument 0 +push constant 511 +gt +push argument 0 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +push argument 1 +push constant 0 +lt +or +not +if-goto L4 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L5 +label L4 +label L5 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push constant 32 +push argument 1 +call Math.multiply 2 +push local 3 +add +push constant 16384 +add +pop local 1 +push static 0 +push local 1 +add +pop pointer 1 +push that 0 +pop local 0 +push argument 0 +push local 3 +push constant 16 +call Math.multiply 2 +sub +pop local 2 +push static 2 +not +if-goto L6 +push static 0 +push local 1 +push static 1 +push local 2 +add +pop pointer 1 +push that 0 +push local 0 +or +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L7 +label L6 +push static 0 +push local 1 +push static 1 +push local 2 +add +pop pointer 1 +push that 0 +not +push local 0 +and +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L7 +push constant 0 +return +function Screen.drawLine 5 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +not +if-goto L8 +push constant 8 +call Sys.error 1 +pop temp 0 +goto L9 +label L8 +label L9 +push argument 2 +push argument 0 +sub +pop local 1 +push argument 3 +push argument 1 +sub +pop local 2 +push local 1 +push constant 0 +eq +not +if-goto L10 +push local 2 +push constant 0 +gt +not +if-goto L11 +label L12 +push local 4 +push local 2 +gt +not +not +if-goto L13 +push argument 0 +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 1 +add +pop local 4 +goto L12 +label L13 +push constant 0 +return +goto L14 +label L11 +label L15 +push local 4 +push local 2 +lt +not +not +if-goto L16 +push argument 0 +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 1 +sub +pop local 4 +goto L15 +label L16 +push constant 0 +return +label L14 +goto L17 +label L10 +label L17 +push local 2 +push constant 0 +eq +not +if-goto L18 +push local 1 +push constant 0 +gt +not +if-goto L19 +label L20 +push local 3 +push local 1 +gt +not +not +if-goto L21 +push argument 0 +push local 3 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 3 +push constant 1 +add +pop local 3 +goto L20 +label L21 +push constant 0 +return +goto L22 +label L19 +label L23 +push local 3 +push local 1 +lt +not +not +if-goto L24 +push argument 0 +push local 3 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 3 +push constant 1 +sub +pop local 3 +goto L23 +label L24 +push constant 0 +return +label L22 +goto L25 +label L18 +label L25 +push local 1 +push constant 0 +lt +not +if-goto L26 +push local 2 +push constant 0 +lt +not +if-goto L27 +label L28 +push local 3 +push local 1 +lt +not +push local 4 +push local 2 +lt +not +and +not +if-goto L29 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L30 +push local 3 +push constant 1 +sub +pop local 3 +push local 0 +push local 2 +sub +pop local 0 +goto L31 +label L30 +push local 4 +push constant 1 +sub +pop local 4 +push local 0 +push local 1 +add +pop local 0 +label L31 +goto L28 +label L29 +goto L32 +label L27 +label L33 +push local 3 +push local 1 +lt +not +push local 4 +push local 2 +gt +not +and +not +if-goto L34 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L35 +push local 3 +push constant 1 +sub +pop local 3 +push local 0 +push local 2 +add +pop local 0 +goto L36 +label L35 +push local 4 +push constant 1 +add +pop local 4 +push local 0 +push local 1 +add +pop local 0 +label L36 +goto L33 +label L34 +label L32 +goto L37 +label L26 +push local 2 +push constant 0 +lt +not +if-goto L38 +label L39 +push local 3 +push local 1 +gt +not +push local 4 +push local 2 +lt +not +and +not +if-goto L40 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L41 +push local 3 +push constant 1 +add +pop local 3 +push local 0 +push local 2 +sub +pop local 0 +goto L42 +label L41 +push local 4 +push constant 1 +sub +pop local 4 +push local 0 +push local 1 +sub +pop local 0 +label L42 +goto L39 +label L40 +goto L43 +label L38 +label L44 +push local 3 +push local 1 +gt +not +push local 4 +push local 2 +gt +not +and +not +if-goto L45 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L46 +push local 3 +push constant 1 +add +pop local 3 +push local 0 +push local 2 +add +pop local 0 +goto L47 +label L46 +push local 4 +push constant 1 +add +pop local 4 +push local 0 +push local 1 +sub +pop local 0 +label L47 +goto L44 +label L45 +label L43 +label L37 +push constant 0 +return +function Screen.drawRectangle 2 +push argument 0 +push argument 2 +gt +not +if-goto L48 +push argument 0 +pop local 1 +push argument 2 +pop argument 0 +push local 1 +pop argument 2 +goto L49 +label L48 +label L49 +push argument 1 +push argument 3 +gt +not +if-goto L50 +push argument 1 +pop local 1 +push argument 3 +pop argument 1 +push local 1 +pop argument 3 +goto L51 +label L50 +label L51 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +not +if-goto L52 +push constant 8 +call Sys.error 1 +pop temp 0 +goto L53 +label L52 +label L53 +push argument 3 +push argument 1 +sub +pop local 1 +label L54 +push local 0 +push local 1 +lt +not +if-goto L55 +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 +goto L54 +label L55 +push constant 0 +return +function Screen.drawCircle 3 +push argument 2 +push constant 181 +gt +not +if-goto L56 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L57 +label L56 +label L57 +push argument 2 +neg +pop local 0 +label L58 +push local 0 +push argument 2 +lt +not +if-goto L59 +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 +pop local 2 +push argument 0 +push local 2 +sub +push argument 1 +push local 0 +add +push argument 0 +push local 2 +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 L58 +label L59 +push constant 0 +return diff --git a/projects/12/ScreenTest/ScreenTestOutput.gif b/projects/12/ScreenTest/ScreenTestOutput.gif new file mode 100755 index 0000000000000000000000000000000000000000..f1742cc1c2e1d0b118d0e00313c12255902eaf8e GIT binary patch literal 4563 zcmZ?wbhEHb%ws&r@SOn+I5;>M7&t&cfI|QbBp^UhLQzpsLP8NtD=KO#YAPyfYC;H2 zLqkJNO+!NvZD?s}X=rF^38F16oh+T4oM4oblarH|larShhyYVwAQ0pg6cps;1*U?6 zf}(<=qM~3_R8&+{a#U1uGME6-$;sKt+1c62AR@cCxHvnz7)%ux7Z+DoSAz%;UER{s zQeEBB0-{@5dRlsVdZ1KKPtTN|DLp+?ra*`(bLPyM116R(T{>sZ(xr2jE?v5G?b@|V zm#zg-YuB#bx_0ZXv2*9nfr)eH zuARGf?b^9>*TD3(d)KbryLa!}IS>tI-Me@1-t*_r@7;S2rk+24{`~#(=kMQx2@w7M z`}_Cbzk>)c^&JHMfB*me`~UwS0!;n?{~sK4qXeZPp!kyoY=jPo1my_^j(-gAF9>=R zEI8Q2!LQ|WqF~|SHUW9B9*@FBN4q5Sv(B6-TztGw!M=;fv*^hItIRNoIh!{vb(p3f zd#TYfSncd=v*KfSA}6c+&9|!N`fF*TadENRWTx1tDVjmcy=HsWTA6BHT^+WW>&W3W z*OTkj4tDW+m#w+EDdYSq-_v3_r{|o_g21*#F<2+2Zfxc9#5~$CD$z;ohNU z{`XJ3D>f$X@Azoe_WOt4(<2jPleg(?-;{8&OTYP?&My7*qs#1<_w9-L{NnP==;>-V zL?6raZ8v|mt#|kKy!(6Vx%vJ6Jj#1~U?P8b+?+>+&m{s^#nia>r@SuS7{33UZT0uJ z_YVJSmS4a3Pxg9`;V35K||FEMUn70 z*(+?4i3Tqcng#4M5?e(4G7?)Q;#MTK$>hCAY*(n$Na|4O%Sh_fn71OSOK07Sq_$QG zk8rP=xr!%yEuO7-+-LLc#p8YlHq9p!T*NY;O!QD&`DBuh*~=x93pI*v$8MEuIWF04 zv-0V*n6j5orzf;&KAT~Cs<5L+eec&va+wxR&t?}K(|kUsNe9na-1S)%7p=1OUYqv2zAf)6U(4?7`>nj=)wb%~ZESm0!xz8% zbs}%?52@QZ@#mM#*6;iNPupP4(s`@Yw&#A^b$q@LTh0<$W_O$Po!itrChXr(r06`E zPxvPrhfw<;wLKLVE%G;RY)W)Kyk0AkgH5Ab$9Vehq%1?(3;()U`Mk?yRAeR2=zN*3 zvUpe8q5W|SnSUaGeBMq*$1gw3=v(8iCbZkgq zTVgzW&n2 zy4I3V?lQ$11<`x#9K0rr++%h)etME-Zzp@C`QLsgN1kK}(@QfQm>n)LvFuYY|NQe^ z%2lo-3~dsJ#7z8IawINsU2-scao4fx>Y_&icc)tj?^x)eWbydQoEwMOetGp6_B?oz zB+#ZjH-R_!wc@`eqRbY@F7S68W@0$eu*7}F0p=&OXEN0u*DycDCBXe5nWNoc`&>g! zK4pnn;=iZb$8!cvQk)_!X>?h7a4mu*nG+r1<@ryQ${qfvKEt1w+Mks6zd~&b-vvb< zn+4Af+^8^d=i?HrVPH}Cx8Pjqw#jqrcT6<0a00!|dH8_=JUnnB)fH$&T{7J zEE@@z9DacxjdNcVFs_u^k|pZ=V$;3@S034hGF$fwi&g}zPjL#2jCrx@4coPL0g)|! zK>|&?*F;X3quISW>*yT@mbMOVg+l>80G;(H^$+0DGT2o(*XAijGjkJ zFUYrjo!GfGXrt&O%saTREBPM2l=|%Is;^y);toq2^Q*eoh28qMbY0Pe>vg-d z*&{eaUpQs!E?Jft-B)gnCwegtHVVkqB*O@KZ9v-i-bQ6bk%;8^M zTxVns@LgTXC~%-WB!+`Qc(Q10jPLdEOx9G!J6|~jZkR=CXgF^Qsk)Z6m66AM(;Ruu z1s&20uSKgrNZK0aa3cQUmu{=A*W|1YbjXxC^dz6SsIhk{yNJ)VD2)S?*4IQEJy_%) zS@MFRzs{kB-RuF!_A7#7c?oMZSR!N0B@Q-PUQJlznJp;h@ucrZ1LL>ChwE)G9s1`# zc`4hBs&0Oj7gHl8cdW5>DfZBu;mDij&@8z_;keVSTS3C!8Q(a?!rmR7IbmvQ$Kfc9HQhUnWbRnUF|F z!kVDlzlxUkUCogGx!O6!;f&iS$q9W8EjjmgUD@eYa(9KuhSbpKp-4||LGp(rK?bRu26T_}}%y9u^;q6Pim9C19FXk{&P z@7<}2xPRv7R*Dy2dZds){lrzTBCpKfHHYq&pSrsB)4FXnVG*`-^{&gV>yBUj%xCY; zB_CqhYyY2SX_+8#p<3&U2WQPi!QY3b{oY&Btu`ltTfgYAYQ~#Y*_&TZSY>g2_q)>g zroVx^zx}x39$S_+?{0wq^PjhrQ*BJFPcq%AZkQ%>aR2Jfub#T~{k#*Ix+h=Xlj&A; z!!(A2`?rgGy=m^B`tj2O)g$TtjNSQvmTtCN!{CK zhv>dfw+{cAEOFj$|NYsY4Zi2UmjC)oed4}~uKG*zCjGDG+|Pf$n|<#ajrYHA%&)6m zDIaqD^V;7}gjap{`?dFt&p-R>N5@Y+IlIkng&P0w)AsSz7sW*$Y}c#vO5E>xt3UR` zT$kz>&ewm~P09OxJl^J6`u(4G+pA`$8~86N`>n3|{6Ulg>+dbknLa7Fl(m%I zqkLg_-7)2AzKCk(6HZ>CjT{w?XQ$hKzOM4Mz3zLsw$<`bg^b42?TtqlH>&+;sGnY% ze%OQUMpNsghW6#QycW$&8rp@+o7Y{hH_)&)I-#OI!*-jx*6Z($E<2i)e$=Z})ZLt1 z*T_^EXrb}Myh$>n^;mOjgHwsy_SUjP&5NHmCq&pJWvH)CZ@V6Dqw!TmgrPxthn=s4 z)(o|Z0uS|L#%v`4!i^_{nk71#DmwnPc(6AxFm^6iJuKd`aZzh+g!;8AysdFQT`YMTr zZ_{&kgg4Bc(Y>i6XJJL>Vu^y&X~x1Qst%n{-CfasYjV5H_wF~>ds2+LS4&vuMyT(| z=uQ08<8Y&!Yr2NHN7U8ly?#txH)mMh_E2~3=(}E#Gi`;+j0l@cCp7&}w# zdO?JHQ2&~U8m)>NogMx6HTo@;*k>}^xhhS#wW4#sY8=N;)mI(L3~iQS2`U07`*wY5 z6XjHUFoS)DGQ*l|OU-v6!hUXp1{ThASJL;>yOp0Ub+uAYN z)T3`sM2YFi$u30`FI2S3@63@&>2jOd#dWeXEBMN_j^PKlivI&JCn zNX==rC#ODMA&?>5)3j10>*wSg&c?FGQ@T&iXn8rq=SEjW<WC>@PfqtKn%qA# zZ_&@GTQya-cdG1sX`fozto?NMnwPVdXLhd%>e^V^wLfy^`hS*lzK2b{eJ%cYq{@Mv zbL%8Kk4nyXcyrb*%efm~wyb(t`SPdorOw$aIJFcc=Q~WA!+5hi_2=A~ZS!r6=Dj&N zchRL@hFQwLPEP#V*>5&uhD+swPo6#VI_$>Jk_P85q59E%Eua#7}BzfYs8VsHGuQOT%U@jo7s`>ekYjUrXbpmL*s%3*FT) z#f>qAYZ>nWdo~5eOs!=Fzm|o}VsL!G;j~id^QFZJne0A4r_E}bTV>VxlVje$##58k zqgGsdv8dzMB-33hKHQky7d5e6YUPRt@BQeT@v67^*ZkR1-IITQnmU5i@&SF2WJ%&pg2J@wUGo2=E7Z=~j4T%G-K^**UJ2dvf{idu7| zY7N&$7PSKsD=tc`{kZ0w)Y`LFYd0#cz3R30Ox4<3v)0~uB{}=y+VzakX1H1MHuG<@UesAF9-pDPzQN((q*zFBpeyx|fyqe zn_fvtKkC|~`g`9xt?EsBr^U6UH|xA!W7;ic{(IBguFVF!H(TA_WT(B^wtAg?_GXjn zE#(t7vVW8jKDb5T;TC?ztvrfbxgEE1ByRPdEpuU`O!RFT-_={=Pj5|pz15$4TdMXp z#^{ZFtG5a5-X?x~TfymVMZdQdzus0Ry}e}icK3rUstTJFe{Zjo-qB#aqbXWYMSH!= z>2;mb>pw_s?wP%*t9!?!+dCY8@0jSlv-|aqS 0){ + let str = Array.new(maxLength); + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + if(length > 0){ + do str.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) { + if(j > length){ + do Sys.error(7); + } + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + if(j > length){ + do Sys.error(7); + } + 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] = 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 d, sum, i; + var bool f; + while(i < length){ + let d = str[i]; // kak da go zavyrtq v realen int + if ((d > 47) & (d < 58)){ + let sum = (sum * 10) + (d - 48); + } + else{ + if((i = 0) & (d = 45)){ + let f = true; + } + else{ + let i = length; + } + } + let i = i + 1; + } + if (f){ + return -sum; + } + return sum; + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var int lastDigit, a, i; + var char c; + if(val < 0){ + let neg = true; + let val = -val; + } + let a = val / 10; + let lastDigit = val - (a * 10); + let i = 48; + while (i < 58){ + if (i = (48 + lastDigit)){ + let c = i; + let i = 59; + } + let i = i + 1; + } + if (val < 10){ + let length = 0; + if (neg){ + let neg = false; + do this.appendChar("-"); + } + + do this.appendChar(c); + return; + } + else{ + do this.setInt(a); + do this.appendChar(c); + } + 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/JackCompiler.py b/projects/12/StringTest/JackCompiler.py new file mode 100755 index 0000000..5782f99 --- /dev/null +++ b/projects/12/StringTest/JackCompiler.py @@ -0,0 +1,350 @@ +import os +from pathlib import Path +from tokenizer import Tokenizer +from vmwriter import VMWriter +from symbol_table import SymbolTable + + +# TODO add names to variables when you call for them, aka current_vm_append(thingtobeappended=blablac) + +class CompilationEngine: + def __init__(self, tokenizer, full_path_vm): + self.string = self.sub_type = self.class_name = self.function_type = '' + self.tab = self.recursion_index = 0 + self.tokenizer = tokenizer + self.sym_table = [] + self.vmwriter = VMWriter(full_path_vm) + self.current_vm = [] # used to reverse some of the commands, eg a+b need to be a b + + + def search_kind_of_sym(self, current_vm): + if self.sym_table[-1].kind_of(current_vm) is not None: + return self.sym_table[-1].kind_of(current_vm), self.sym_table[-1].index_of(current_vm) + for i in range(len(self.sym_table) - 2, -1, + -1): # start from the amount of sym_tables -2 so it starts from one below the current, + # until it is bigger than -1, walking it backwards + if self.sym_table[i].kind_of(current_vm) in ('static', 'this'): + return self.sym_table[i].kind_of(current_vm), self.sym_table[i].index_of(current_vm) + + def search_type_of_sym(self, current_vm): + for i in range(len(self.sym_table) - 1, -1, -1): + if self.sym_table[i].type_of(current_vm) is not None: + return self.sym_table[i].type_of(current_vm) + + def write_token(self): + if self.tokenizer.token_type() == 'stringConstant': + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token.strip( + '"') + ' \n' + else: + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token + ' \n' + + def compile_class(self): + self.sym_table.append(SymbolTable()) + self.tokenizer.advance() # class -> + self.tokenizer.advance() # type -> + self.class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + self.tokenizer.advance() # { -> + while self.tokenizer.token != '}': + if self.tokenizer.token in ['static', 'field']: + self.compile_class_var_dec() + if self.tokenizer.token in ['constructor', 'function', 'method']: + self.compile_subroutine() + self.tokenizer.advance() + self.sym_table.pop() + self.vmwriter.close_vm_file() + + def compile_class_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_subroutine(self): + self.sym_table.append(SymbolTable()) + self.sub_type = self.tokenizer.token + self.tokenizer.advance() # subroutine type(function|method|constructor) -> + self.function_type = self.tokenizer.token + self.tokenizer.advance() # subroutine kind(int|void|etc..) -> + sub_name = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + if self.sub_type == 'method': + self.sym_table[-1].start_subroutine('this', self.class_name) + self.compile_parameter_list() + self.tokenizer.advance() # { -> + while self.tokenizer.token == 'var': # create only symbol teable entries + self.compile_var_dec() + if self.sub_type == 'constructor': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('constant', self.sym_table[-2].var_count('field')) + self.vmwriter.write_call('Memory.alloc', 1) + self.vmwriter.write_pop('pointer', 0) + elif self.sub_type == 'method': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('argument', 0) + self.vmwriter.write_pop('pointer', 0) + else: + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + while self.tokenizer.token != '}': + self.compile_statements() + self.tokenizer.advance() + self.sym_table.pop() + + def compile_parameter_list(self): + if self.tokenizer.token != ')': + var_type = self.tokenizer.token + self.tokenizer.advance() # var ype -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # var name -> + while self.tokenizer.token == ',': + self.tokenizer.advance() # , -> + var_type = self.tokenizer.token + self.tokenizer.advance() # type -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # name -> + self.tokenizer.advance() # )-> + + def compile_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_statements(self): + while True: + if self.tokenizer.token == 'let': + self.compile_let() + elif self.tokenizer.token == 'if': + self.compile_if() + elif self.tokenizer.token == 'while': + self.compile_while() + elif self.tokenizer.token == 'do': + self.compile_do() + elif self.tokenizer.token == 'return': + self.compile_return() + else: + break + + def compile_do(self): + self.tokenizer.advance() # do -> + class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + if self.tokenizer.token == '(': # method + self.vmwriter.write_push('pointer', 0) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{class_name}', count + 1) + elif self.tokenizer.token == '.': # method or function + self.tokenizer.advance() # . -> + fname = f'{class_name}.{self.tokenizer.token}' + sname = f'{self.search_type_of_sym(class_name)}.{self.tokenizer.token}' + self.tokenizer.advance() # name -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_push(*self.search_kind_of_sym(class_name)) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_call(f'{sname}', count + 1) + else: + self.vmwriter.write_call(f'{fname}', count) + self.vmwriter.write_pop('temp', '0') + self.tokenizer.advance() # ; -> + + def compile_let(self): + flag_array = 0 + self.tokenizer.advance() # let -> + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # var_name -> + if self.tokenizer.token == '[': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.tokenizer.advance() # [ -> + self.compile_expression() + self.tokenizer.advance() # ] -> + flag_array = 1 + self.tokenizer.advance() # = -> + self.compile_expression() + self.tokenizer.advance() # ; -> + if flag_array == 0: + self.vmwriter.write_pop(*self.search_kind_of_sym(self.current_vm[-1])) + else: + self.vmwriter.write_pop('temp', 1) + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('temp', 1) + self.vmwriter.write_pop('that', 0) + self.current_vm.pop() + + def compile_while(self): + self.tokenizer.advance() # while -> + label1 = self.vmwriter.label_index + self.vmwriter.write_lable(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label2 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_goto(label1) + self.vmwriter.write_lable(label2) + + def compile_return(self): + self.tokenizer.advance() # return -> + if self.tokenizer.token != ';': + self.compile_expression() + self.vmwriter.write_return(self.function_type) + self.tokenizer.advance() # ; -> + + def compile_if(self): + self.tokenizer.advance() # if -> + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label1 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + label2 = self.vmwriter.label_index + self.vmwriter.write_goto(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.vmwriter.write_lable(label1) + if self.tokenizer.token == 'else': + self.tokenizer.advance() # else -> + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_lable(label2) + + def compile_expression(self): + self.compile_term() + while self.tokenizer.token in ['+', '-', '*', '/', '|', '=', '>', '<', '&']: + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # symbol -> + self.compile_term() + self.vmwriter.write_arithmetic(self.current_vm[-1]) + self.current_vm.pop() + + def compile_term(self): + if self.tokenizer.token == '(': # expression () + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + elif self.tokenizer.token in ['~', '-']: # uniry op + self.current_vm.append(self.tokenizer.token) + tmp = 'neg' if self.tokenizer.token == '-' else self.tokenizer.token + self.tokenizer.advance() # ~ or - -> + self.compile_term() + self.vmwriter.write_arithmetic(tmp) + self.current_vm.pop() + elif self.tokenizer.token_type() != 'symbol': + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # integer, string, keyword, varnname, subroutine_name, class_name, var_name -> + if self.tokenizer.token == '[': # Array + self.tokenizer.advance() # [ -> + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + self.compile_expression() + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('that', 0) + self.tokenizer.advance() # ] -> + elif self.tokenizer.token == '(': # subroutine_name () + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{self.current_vm[-1]}', count) + self.current_vm.pop() + elif self.tokenizer.token == '.': # method + if self.search_type_of_sym(self.current_vm[-1]) is not None: + flag = 1 + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + else: + flag = 0 + self.tokenizer.advance() # . -> + fname = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if flag == 1: + self.vmwriter.write_call(f'{self.search_type_of_sym(self.current_vm[-1])}.{fname}', count + 1) + else: + self.vmwriter.write_call(f'{self.current_vm[-1]}.{fname}', count) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'stringConstant': + self.vmwriter.write_push('constant', len(self.current_vm[-1].strip('"'))) + self.vmwriter.write_call('String.new', 1) + for index, item in enumerate(self.current_vm[-1].strip('"')): + self.vmwriter.write_push('constant', ord(item)) + self.vmwriter.write_call('String.appendChar', 2) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'integerConstant': + self.vmwriter.write_push('constant', self.current_vm[-1]) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'identifier': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + elif self.current_vm[-1] == 'true': + self.vmwriter.write_push('constant', '1') + self.vmwriter.write_arithmetic('neg') + self.current_vm.pop() + elif self.current_vm[-1] == 'false' or self.current_vm[-1] == 'null': + self.vmwriter.write_push('constant', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'this': + self.vmwriter.write_push('pointer', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'that': + self.vmwriter.write_push('pointer', '1') + self.current_vm.pop() + + def compile_expression_list(self): + count_exp = 0 + if self.tokenizer.token in ['(', '~', '-'] or self.tokenizer.token_type() != 'symbol': + count_exp += 1 + self.compile_expression() + while self.tokenizer.token == ',': + count_exp += 1 + self.tokenizer.advance() # , + self.compile_expression() + return count_exp + + +if __name__ == '__main__': + path = os.getcwd() + for root, dirs, files in os.walk(path, topdown=False): + for name in files: + if name[-4:] == 'jack': + tokenizer_main = Tokenizer() + tokenizer_main.clear_file(Path(root, name)) + full_path = Path(root, name[:-4] + 'vm') + comp_eng_main = CompilationEngine(tokenizer_main, full_path) + comp_eng_main.compile_class() diff --git a/projects/12/StringTest/Main.jack b/projects/12/StringTest/Main.jack new file mode 100755 index 0000000..73331ef --- /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: "); + 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 100755 index 0000000..edf09b5 --- /dev/null +++ b/projects/12/StringTest/Main.vm @@ -0,0 +1,447 @@ +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 5 +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 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 100755 index 0000000..f64ff57 --- /dev/null +++ b/projects/12/StringTest/String.jack @@ -0,0 +1,147 @@ +// This 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; + static bool neg; + + /** 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); + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + if(length > 0){ + do str.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) { + if(j > length){ + do Sys.error(7); + } + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + if(j > length){ + do Sys.error(7); + } + 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] = 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 d, sum, i; + var bool f; + while(i < length){ + let d = str[i]; // kak da go zavyrtq v realen int + if ((d > 47) & (d < 58)){ + let sum = (sum * 10) + (d - 48); + } + else{ + if((i = 0) & (d = 45)){ + let f = true; + } + else{ + let i = length; + } + } + let i = i + 1; + } + if (f){ + return -sum; + } + return sum; + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var int lastDigit, a, i; + var char c; + if(val < 0){ + let neg = true; + let val = -val; + } + let a = val / 10; + let lastDigit = val - (a * 10); + let i = 48; + while (i < 58){ + if (i = (48 + lastDigit)){ + let c = i; + let i = 59; + } + let i = i + 1; + } + if (val < 10){ + let length = 0; + if (neg){ + let neg = false; + do this.appendChar("-"); + } + do this.appendChar(c); + return; + } + else{ + do this.setInt(a); + do this.appendChar(c); + } + 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 100755 index 0000000..96c9780 --- /dev/null +++ b/projects/12/StringTest/String.vm @@ -0,0 +1,295 @@ +function String.new 0 +push constant 2 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +not +if-goto L0 +push argument 0 +call Array.new 1 +pop this 0 +goto L1 +label L0 +label L1 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 0 +gt +not +if-goto L2 +push this 0 +call Array.dispose 1 +pop temp 0 +goto L3 +label L2 +label L3 +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 1 +gt +not +if-goto L4 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L5 +label L4 +label L5 +push this 0 +push argument 1 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 1 +gt +not +if-goto L6 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L7 +label L6 +label L7 +push this 0 +push argument 1 +push argument 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return +function String.appendChar 0 +push argument 0 +pop pointer 0 +push this 0 +push this 1 +push argument 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 0 +push this 1 +push constant 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 +label L8 +push local 2 +push this 1 +lt +not +if-goto L9 +push this 0 +push local 2 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +push constant 47 +gt +push local 0 +push constant 58 +lt +and +not +if-goto L10 +push local 1 +push constant 10 +call Math.multiply 2 +push local 0 +push constant 48 +sub +add +pop local 1 +goto L11 +label L10 +push local 2 +push constant 0 +eq +push local 0 +push constant 45 +eq +and +not +if-goto L12 +push constant 1 +neg +pop local 3 +goto L13 +label L12 +push this 1 +pop local 2 +label L13 +label L11 +push local 2 +push constant 1 +add +pop local 2 +goto L8 +label L9 +push local 3 +not +if-goto L14 +push local 1 +neg +return +goto L15 +label L14 +label L15 +push local 1 +return +function String.setInt 4 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +not +if-goto L16 +push constant 1 +neg +pop static 0 +push argument 1 +neg +pop argument 1 +goto L17 +label L16 +label L17 +push argument 1 +push constant 10 +call Math.divide 2 +pop local 1 +push argument 1 +push local 1 +push constant 10 +call Math.multiply 2 +sub +pop local 0 +push constant 48 +pop local 2 +label L18 +push local 2 +push constant 58 +lt +not +if-goto L19 +push local 2 +push constant 48 +push local 0 +add +eq +not +if-goto L20 +push local 2 +pop local 3 +push constant 59 +pop local 2 +goto L21 +label L20 +label L21 +push local 2 +push constant 1 +add +pop local 2 +goto L18 +label L19 +push argument 1 +push constant 10 +lt +not +if-goto L22 +push constant 0 +pop this 1 +push static 0 +not +if-goto L23 +push constant 0 +pop static 0 +push argument 0 +push constant 1 +call String.new 1 +push constant 45 +call String.appendChar 2 +call String.appendChar 2 +pop temp 0 +goto L24 +label L23 +label L24 +push argument 0 +push local 3 +call String.appendChar 2 +pop temp 0 +push constant 0 +return +goto L25 +label L22 +push argument 0 +push local 1 +call String.setInt 2 +pop temp 0 +push argument 0 +push local 3 +call String.appendChar 2 +pop temp 0 +label L25 +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 100755 index 0000000000000000000000000000000000000000..5c2932c07fc2fd63f3e73b9cb6ece86b71ccd4b3 GIT binary patch literal 8126 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 literal 0 HcmV?d00001 diff --git a/projects/12/StringTest/__pycache__/tokenizer.cpython-39.pyc b/projects/12/StringTest/__pycache__/tokenizer.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d49ace603c3e3a44248eed00cc207dcbe4a36658 GIT binary patch literal 2122 zcmYe~<>g{vU|{%kN+xj^7X!m%5C<7EGcYhXFfcF_OEEAoq%fo~<}gGtxHF_Mr7*WJ zq%b!#MKPu@1~X`~yaeg;O9qk17_MKBfq@~FA&N1DA&M!5F@>pxA&NPLD}^P6wS_T? zC50`8y@er)HH9OEvxOmwErmIlL6iFyXGnf_YF=hlYEd#HlBpmz69WT-Gss~|Acry5 zFvK&YFx4=`Go~=tFvK&Zu+%WbGlNA~QW%06G+F(MK-z9GXbS&g)cD1y`HM077h~)% z#@b(u)xQ|+elgnoVzj-*sP&6c`xm3`FGl@ajC#Kqt$#7<{9;u5#aQ!;u})L;7He`& zVsY^;w%pW`jQo^a9BHL_$t9WjdAGQe^Ye;Jib|79@{4XUXXceeu_xu{=cFd)-C{}3 zNGytCDa+4Hxy4+TSagf6xFoS8Gx-*4T4ria$}Q%c)RJ3FDfzdUGShCcq~;W--eN7! z$jnK-#a5JBQd*REi>0KfH1!s1S|Uh}C9gCm=N3yzMrN@l>n+C2TP$fHwd}=}xk>ps z#kV-JQ!C@k^NUh$v6g^>Pm}Q$OL1yW+De8Z0|o|$Up~%OF`>n&Ma40}fsVS4?nR|3 zsbw)Psm0kP`2{g~iFqkTC8;GvnZ+>$Mfq8&$tA@xhDI^LB}JKe=^?4bB{5)AL6M?Y zP@N}!mmVXR@uVk~1QGDu+x2B~M3WJqDjW-4+>VGU*| zVOqeP!dAn$kf|sjg&ibc!;r;N#!wWO!V%1n!Wql}GDDNguLzVfZ?R{mR)T^GoHl+j zD&68M2K&<)6q$*6B~{EZDcZOAGxJJP(^HFJqPN%}VSS4$GbJ^zBr`2DwMdh-2$aN& zbQu^JZZQ?5-eS#7EJ@BN(qUj=&}1soXJBA}C;-I)I3kJ+K}xy6p&4INS&%9K3PDgl zV_@W9WMdRyWMSlDWMSliVlGA&rYaFch$1wiWDbzOSYbgb#>l{s!dMFmGKN~F8m1Bu zi>aA0n_&WDkx&Wq0v1pf$zrNul4MxORAf=Zl)@~|P|H-vRmfGt01>ZY$YL#HC`v-` zi-T{WO$0jw_` zY-%AF$ZSnEND`=GiYa~xDjAAQ7#J9;m}1H`*^9J5F~gjbnpdO^iZ@FTVFe;Uu?dbw zO=hGh1u2I_DL8V$@yecndRFKgOj4a?t6=LLIWML9uw!v?Vx#1m(zWv*dOVV7V4xdy7sB%C3IfrWvEp_!SHAy2@Nq4nuz>j5>@gj53T| zj2w(Ij2w&_jL2CWp;?pBPm>)~*ybhXrpCwL;);*Y%}*)K0kL`F;|og@b09KBMj*#q zg9wm?MQ$J#I9VbHPy#Iig#f7NEe0hZ4kivRE&&cXu&5>zI4r#Z*gS6h_uz}cZ M#|ZKg$RG}80D2bgsQ>@~ literal 0 HcmV?d00001 diff --git a/projects/12/StringTest/__pycache__/vmwriter.cpython-39.pyc b/projects/12/StringTest/__pycache__/vmwriter.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..7e2ab5f0de90902fa0d8c925b7731cf1397beb4e GIT binary patch literal 2963 zcmYe~<>g{vU|?V_$W4skWMFs<;vi#Y1_lNP1_p*=AqEBpcZL*(6vh^Y6vk$zD25cK zU-m3quq~3U3Nu3qurV3V(_~3qurFieQRR3qurlig1cZ3qur7 zifD>h3qurdig+-Cro=6dFyHW^%#zfiWRUG3SAZ~x4RXIT$o*mr3=AaQo>Day=C4@oU9i7Cr12fJRcpz;<+e0*kJW=VWJ z$o0i6AV)FsFjfh|e5ePLPX>7nBn`qKHpnetuNpBhFw`()F)UzAVXR@C&5*)W!!(;A zg?TRPLPkc05+-EPxh&0$j11slVDYPBEhsI{Q252DaEp;^C36wT_FJrAx7}hbD9X$$ zS;<_)#=yW3#a^76o|~Fia*GulG~jT65F88)47a$zdg4K*fs{kNA;nlF4EF{?1xB2) zGB7ZJJ)(x;k-5ysUYN@ScRaIS6+1Yt6nu)f85kIfco-NMRx%ZVtiQzymVvkr6iP*4 zM{+})kdv5{lM2cNP*;jDR*9gw608KnnV`@CJJXGk0i3Y1nTiyk;m!ngCNs!^6BzT9 zY8X>kvYCn;pz^SoV1vpt)i9>8XEPPWLFGB1`q@G9c~5E>Q#iAkifW*;Tu@nVu=DzZli3SQ7KVM&+ga zVyvlR&M)G+#gt$4i?ObXB`?2(>lSlfe#tFHttwvM#F7lX+|rzq%z~WCm!Qn|i&4Ld z8!ViXS(cfSs>uS*5JkM82!0j{xa51%j zA%zi?{-J@$1TJ}*p#>Im3Yd>nV6pfWsW31wRB>je>4J=hI#!dVNDCB%pg=;TG_0=Y zfVe(0%^c)*P(jDQ$OQ^lL|p+>fj=ogb1$iN1t{4gr3G+_s|l$eiiAOx1V>(JZhT@< zdNEqK7ilsuFxY?`4e})eBbIsrWHv1v&6!r3mt2yWpNH4sTp)+%TQpga8*A0$X& z#(%iwEL6h#@YZ7y@Nr25@=A!&oJX=0AwKWJXXa2E`yYsPF{)4pcTk64ycoXd{Es zPm>8;T-;(!&dD!M)nqIJrCfA}@PZ}d%W~t>GILVBKrR89%D`A926qFB5CL@?e@*~(JkRi7?Y##*VS8Kv literal 0 HcmV?d00001 diff --git a/projects/12/StringTest/symbol_table.py b/projects/12/StringTest/symbol_table.py new file mode 100755 index 0000000..7c62c3e --- /dev/null +++ b/projects/12/StringTest/symbol_table.py @@ -0,0 +1,62 @@ +class Symbol: + def __init__(self): + self.s_name = '' + self.s_kind = '' + self.s_type = '' + self.s_index = 0 + + +class SymbolTable: + def __init__(self): + self.sym = [] + + def define(self, s_name, s_type, s_kind): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = s_kind + self.sym[-1].s_index = self.var_count(s_kind) - 1 + + def start_subroutine(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'argument' + self.sym[-1].s_index = 0 + + def start_class(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = 'this' + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'field' + self.sym[-1].s_index = 0 + + def var_count(self, s_kind): + count = 0 # it is -1 so the first index is 0 + for i in self.sym: + if i.s_kind == s_kind: + count += 1 + return count + + def kind_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + if i.s_kind == 'var': + return 'local' + elif i.s_kind == 'field': + return 'this' + else: + return i.s_kind + return None + + def type_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_type + return None + + def index_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_index + return None diff --git a/projects/12/StringTest/tokenizer.py b/projects/12/StringTest/tokenizer.py new file mode 100755 index 0000000..aaaa873 --- /dev/null +++ b/projects/12/StringTest/tokenizer.py @@ -0,0 +1,78 @@ +import re + + +class Tokenizer: + + def __init__(self): + self.i = 0 + self.file = '' + self.symbols = ('(', ')', '[', ']', '}', '{', '>', '<', '=', '*', '+', '-', '/', '.', ';', ',', '&', '|', + '~') + self.key_word = ( + 'class', 'method', 'function', 'constructor', 'int', 'boolean', 'char', 'void', 'var', 'static', 'field', + 'let', 'do', 'if', 'else', 'while', 'return', 'true', 'false', 'null', 'this') + self.token = '' + + def token_type(self, token=None): + if token is None: + token = self.token + if token is None or token == '': + return None + if token in self.key_word: + return 'keyword' + elif token[0] == '"': + return 'stringConstant' + elif re.match(r"\d+", token): + return 'integerConstant' + elif token in self.symbols: + return 'symbol' + else: + return 'identifier' + + def advance(self): + token = '' + i = self.i + while i < len(self.file): + if re.match(r'\s', self.file[i]): + i = i + 1 + continue + else: + if self.file[i] in self.symbols: + self.token = self.file[i] + self.i = i + 1 + return + elif self.file[i] == '"': + i += 1 + while self.file[i] != '"': + token += self.file[i] + i += 1 + self.i = i + 1 + self.token = '"' + token + '"' + return + else: + while re.match(r'\w', self.file[i]): + token += self.file[i] + if i + 1 > len(self.file) - 1: + break + i += 1 + self.i = i + self.token = token + return + + def clear_file(self, directory): + with open(directory, "r") as my_file: + txt = my_file.read() + txt = re.sub(r"//.*", "", txt) + txt = re.sub(r"/[*][*].*[*]/", "", txt) + i = 0 + # TODO this should be a regex + while i < len(txt): + if txt[i] == '/' and txt[i + 1] == '*' and txt[i + 2] == '*': + start = i + while txt[i] != '*' or txt[i + 1] != '/': + i += 1 + stop = i + 2 + txt = txt[:start] + txt[stop:len(txt)] + i = start - 1 + i += 1 + self.file = txt diff --git a/projects/12/StringTest/vmwriter.py b/projects/12/StringTest/vmwriter.py new file mode 100755 index 0000000..5bf6929 --- /dev/null +++ b/projects/12/StringTest/vmwriter.py @@ -0,0 +1,75 @@ +class VMWriter: + def __init__(self, vm_path): + self.my_vm = open(vm_path, "w+") + self.label_index = 0 + + def write_push(self, segment, index): + self.my_vm.write(f'push {segment} {index}\n') + print(f'push {segment} {index}') + + def write_lable(self, label): + self.my_vm.write(f'label L{label}\n') + print(f'label L{label}') + + def write_arithmetic(self, command): + if command == '+': + self.my_vm.write('add\n') + print('add') + elif command == '-': + self.my_vm.write('sub\n') + print('sub') + elif command == 'neg': + self.my_vm.write('neg\n') + print('neg') + elif command == '=': + self.my_vm.write('eq\n') + print('eq') + elif command == '>': + self.my_vm.write('gt\n') + print('gt') + elif command == '<': + self.my_vm.write('lt\n') + print('lt') + elif command == '&': + self.my_vm.write('and\n') + print('and') + elif command == '|': + self.my_vm.write('or\n') + print('or') + elif command == '~': + self.my_vm.write('not\n') + print('not') + elif command == '*': + self.write_call('Math.multiply', 2) + elif command == '/': + self.write_call('Math.divide', 2) + + def write_pop(self, segment, index): + print(f'pop {segment} {index}') + self.my_vm.write(f'pop {segment} {index}\n') + + def write_goto(self, label): + self.my_vm.write(f'goto L{label}\n') + print(f'goto L{label}') + + def write_if(self, label): + self.write_arithmetic('~') + self.my_vm.write(f'if-goto L{label}\n') + print(f'if-goto L{label}') + + def write_call(self, label, num_args): + self.my_vm.write(f'call {label} {num_args}\n') + print(f'call {label} {num_args}') + + def write_function(self, label, num_locals): + self.my_vm.write(f'function {label} {num_locals}\n') + print(f'function {label} {num_locals}') + + def write_return(self, func_type): + if func_type == 'void': + self.write_push('constant', '0') + self.my_vm.write('return\n') + print(f'return') + + def close_vm_file(self): + self.my_vm.close() diff --git a/projects/12/Sys.jack b/projects/12/Sys.jack new file mode 100755 index 0000000..0eed65b --- /dev/null +++ b/projects/12/Sys.jack @@ -0,0 +1,53 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/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 Output.init(); + do Screen.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; + while (duration > 0){ + let i = 100; + while(i > 0){ + let i = i -1; + } + let duration = duration - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + var String s; + let s = String.new(3); + do s.setInt(errorCode); + do Output.printString("ERR"); + do Output.printString(s); + return; + } +} diff --git a/projects/12/SysTest/Main.jack b/projects/12/SysTest/Main.jack new file mode 100755 index 0000000..a153b25 --- /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 100755 index 0000000..21b5a2a --- /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 L0 +push local 0 +push constant 0 +eq +not +if-goto L1 +call Keyboard.keyPressed 0 +pop local 0 +goto L0 +label L1 +label L2 +push local 0 +push constant 0 +eq +not +not +if-goto L3 +call Keyboard.keyPressed 0 +pop local 0 +goto L2 +label L3 +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 100755 index 0000000..5d6a5f1 --- /dev/null +++ b/projects/12/SysTest/Sys.jack @@ -0,0 +1,51 @@ +// This 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 Math.init(); + do Keyboard.init(); + do Memory.init(); + do Output.init(); + do Screen.init(); + do Main.main(); + do Sys.halt(); + } + + /** Halts the program execution. */ + function void halt() { + while(true){ + } + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + var int i; + while (duration > 0){ + let i = 100; + while(i > 0){ + let i = i -1; + } + let duration = duration - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + var String s; + let s = String.new(3); + do s.setInt(errorCode); + do Output.printString("ERR"); + do Output.printString(s); + return; + } +} diff --git a/projects/12/SysTest/Sys.vm b/projects/12/SysTest/Sys.vm new file mode 100755 index 0000000..ffbadbf --- /dev/null +++ b/projects/12/SysTest/Sys.vm @@ -0,0 +1,75 @@ +function Sys.init 0 +call Math.init 0 +pop temp 0 +call Keyboard.init 0 +pop temp 0 +call Memory.init 0 +pop temp 0 +call Output.init 0 +pop temp 0 +call Screen.init 0 +pop temp 0 +call Main.main 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +function Sys.halt 0 +label L0 +push constant 1 +neg +not +if-goto L1 +goto L0 +label L1 +function Sys.wait 1 +label L2 +push argument 0 +push constant 0 +gt +not +if-goto L3 +push constant 100 +pop local 0 +label L4 +push local 0 +push constant 0 +gt +not +if-goto L5 +push local 0 +push constant 1 +sub +pop local 0 +goto L4 +label L5 +push argument 0 +push constant 1 +sub +pop argument 0 +goto L2 +label L3 +push constant 0 +return +function Sys.error 1 +push constant 3 +call String.new 1 +pop local 0 +push local 0 +push argument 0 +call String.setInt 2 +pop temp 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 local 0 +call Output.printString 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/archive/Main.jack b/projects/12/archive/Main.jack new file mode 100755 index 0000000..cc64493 --- /dev/null +++ b/projects/12/archive/Main.jack @@ -0,0 +1,132 @@ +class Main{ + static Array mem; + + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void test_init() { + let mem = 0; + return; + } + + function void main(){ + var String s; + var int i; + let s = String.new(10); + do Main.test_init(); + let s = Main.readLine("String: "); + let i = Main.readInt("INT: "); + do Output.printString(s); + do Output.printInt(i); + return; + } + + + function char keyPressed(){ + return mem[24576]; + } + + function int readInt_stolen(String message){ + var starting a; + var int b; + let a = Main.readLine_stolen(message); + let b = String.intValue(a); + do String.dispose(a); + return b; + } + function string readLine_stolen(String message){ + var char a, b ,c; + var String d; + var bool e; + let d = String.new(80); + do Output.printString(message); + let b = String.newLine(); + let c = String.backSpace(); + while (~e){ + let a = Main.readChar(); + let e = a = b; + if (~e){ + if (a = c){ + do d.eraseLastChar(); + } + else{ + do d.appendChar(a); + } + } + } + return d; + } + /** + * 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 s, b; + var char c; + let s = String.new(100); + do Output.printString(message); + while (true){ + let c = Main.readChar(); + if (c = 128){ + return s; + } + else{ + if (c = 129){ + do s.eraseLastChar(); + } + else{ + do s.appendChar(c); + } + } + } + } + /** + * 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 a, b; + do Output.printChar(0); + while ((b = 0) | (a > 0)){ + let a = Main.keyPressed(); + if (a > 0){ + let b = a; + } + } + do Output.printChar(String.backSpace()); + do Output.printChar(b); + return b; + } + + + + /** + * 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 s; + var char c; + let s = String.new(100); + do Output.printString(message); + while (true){ + let c = Main.readChar(c); + if (c = 128){ + return s.intValue(); + } + else{ + if (c = 129){ + let s = s.eraseLastChar(); + } + else{ + if ((c > 47) & (c < 57)){ + let s = s.appendChar(c); + } + } + } + } + } +} \ No newline at end of file diff --git a/projects/12/archive/Main_math_memory_screen.jack b/projects/12/archive/Main_math_memory_screen.jack new file mode 100755 index 0000000..5960bb1 --- /dev/null +++ b/projects/12/archive/Main_math_memory_screen.jack @@ -0,0 +1,341 @@ +class Main { + + static int division_tmp; + static Array mem; + static Array st; + static int f; + static boolean color; + + /** Initializes the library. */ + function void init_test() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + let color = 1; + return; + } + + + function void main(){ + do Main.init_test(); + do Main.test_drawPixel(256,128); + do Main.test_drawPixel(255,128); + do Main.test_drawPixel(257,128); + do Main.test_changeColor(0); + do Main.test_drawPixel(256,128); + return; + } + function void test_changeColor(boolean x){ + let color = x; + return; + } + function void test_clearScreen(){ + var int a; + let a = 16384; + while (a < 24575){ + let mem[a] = 0; + let a = a + 1; + } + return; + } + function void test_drawRectangle(int x1, int y1, int x2, int y2){ + var int a, tmp; + if (x1 > x2){ + let tmp = x1; + let x1 = x2; + let x2 = tmp; + } + if (y1 > y2){ + let tmp = y1; + let y1 = y2; + let y2 = tmp; + } + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + while(a < y2){ + do Screen.drawLine(x1, y1 + a, x2, y1 + a); + let a = a + 1; + } + return; + } + function void test_drawCicle(int x, int y, int r){ + var int dy, dx, tmp; + if(r > 181){ + do Sys.error(7); + } + let dy = - r; + while (dy < r){ + let tmp = Math.sqrt((r * r) - (dy * dy)); + do Screen.drawLine(x - tmp, y + dy, x + tmp, y + dy); + let dy = dy + 1; + } + return; + } + function void test_drawLine_optimize(int x1, int y1, int x2, int y2){ + var int diff, dx, dy, a, b, tmp; + if (x1 > x2){ + let tmp = x1; + let x1 = x2; + let x2 = tmp; + } + if (y1 > y2){ + let tmp = y1; + let y1 = y2; + let y2 = tmp; + } + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let dx = x2 - x1; + let dy = y2 - y1; + if (dx = 0){ + while(~(b > dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b + 1; + } + return; + } + if (dy = 0){ + while(~(a > dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a + 1; + } + return; + } + while ((~(a > dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff - dx; + } + } + return; + } + + function void test_drawPixel(int x, int y) { + var int value, address, bit, mem_block; + if ((x > 511) | (x < 0) | (y > 255) | (y < 0)){ + do Sys.error(7); + } + let mem_block = x / 16; + let address = (32 * y) + mem_block + 16384; + let value = mem[address]; + let bit = x - (mem_block * 16); + if (color = 1){ + let mem[address] = st[bit] | value; + } + else{ + let mem[address] = (~st[bit])& value; + } + return; + } + + + function int test_multiply(int x, int y){ + var int sum, temp, y_comp, i, neg; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (x < y){ + let temp = x; + let x = y; + let y = temp; + } + if (y = 1){ + if(neg){ + return -x; + } + return x; + } + while((y_comp - 1) < (y - 1)){ + if ((st[i] & y) > 0) { + let sum = sum + x; + let y_comp = y_comp + st[i]; + } + let x = x + x; + let i = i + 1; + } + if(neg){ + let sum = -sum; + } + return sum; + } + function int test_max(int x, int y){ + if (x > y){ + return x; + } + return y; + } + + function int test_min(int x, int y){ + if (x < y){ + return x; + } + return y; + } + function int test_sqrt(int x) { + var int j, b, d, y; + if (x < 0){ + do Sys.error(4); + } + let j = 7; + while (j > -1){ + let d = y + st[j]; + let b = Main.test_multiply(d,d); + if ((~(b > x)) & (b > 0)){ + let y = d; + } + let j = j - 1; + } + return y; + } + function int test_divide(int x, int y) { + var int q, neg; + if (f = 0){ + let division_tmp = 0; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (y = 0){ + do Sys.error(3); + } + let f = 1; + } + if ((y > x) | (y < 0)){ + return 0; + } + let q = test_divide(x, y + y); + let f = 0; + let q = Math.abs(q); + if ((q & 1) = 1){ + let division_tmp = division_tmp + y + y; + } + if (x - division_tmp < y){ + if (neg){ + return -(q + q); + } + return q + q; + } + else{ + if (neg){ + return -(q + q + 1); + } + return q + q + 1; + } + } + + + function int test_abs(int x) { + if (x > 0){ + return x; + } + return -x; + } + + function int test_peek(int x){ + return mem[x]; + } + + function void test_poke(int x, int y){ + let mem[x] = y; + return; + } + + function int test_dealloc_stolen(Array x){ + var int obj_add,b; + let obj_add = x - 2; + let b = obj_add[1]; + if (b[0] = 0){ + let obj_add[0] = obj_add[1] - obj_add -2; + } + else{ + let obj_add[0] = obj_add[1] - obj_add + b[0]; + if (b[1] = b +2){ + let obj_add[1] = obj_add + 2; + } + else{ + let obj_add[1] = b[1]; + } + } + } + + function void test_dealloc(Array o){ + var Array current_block; + let current_block = 2048; + let o[1]= current_block[1]; + let current_block[1] = o; + } + + function int test_alloc(int size){ + var Array current_block; + var int tmp; + let current_block = 2048; + if (size < 0){ + do Sys.error(5); + } + if (size = 0){ + let size = 1; + } + while (current_block[0] < (size + 2)) { + let current_block = current_block[1]; + } + let current_block[0] = current_block[0] - size - 2; + let current_block = current_block + current_block[0] + 2; + let current_block[0] = size; + return current_block + 2; + } + + function int test_alloc_stolen(int x){ + var Array curret_block, next_block; + if (x < 0){ + do Sys.error(5); + } + if (x = 0){ + let x = 1; + } + let curret_block = 2048; + let curret_block[0] = 14334; + let curret_block[1] = 2050; + while ((curret_block < 16383) & (curret_block[0] < x)){ + let next_block = curret_block[1]; + if ((curret_block[0] = 0) | (next_block > 16382) | (next_block[0] = 0)){ // this sends directly out of while + let curret_block = next_block; + } + else { + let curret_block[0] = curret_block[1] - curret_block + next_block[0]; // cb size = + if (next_block[1] = next_block + 2){ + let curret_block[1] = curret_block + 2; + } + else{ + let curret_block[1] = next_block[1]; + } + } + } + if ((curret_block + x) > 16379){ + do Sys.error(6); + } + if (curret_block[0] > (x + 2)){ // if current block fills the desired size perfectly + let curret_block[x + 2] = curret_block[0] - x -2; + if (curret_block[1] = curret_block + 2){ + let curret_block[x + 3] = curret_block + x + 4; + } + else{ + let curret_block[x + 3] = curret_block[1]; + } + } + let curret_block[0] = 0; + return (curret_block + 2); + } + + +} + diff --git a/projects/12/archive/Main_output.jack b/projects/12/archive/Main_output.jack new file mode 100755 index 0000000..0f1942e --- /dev/null +++ b/projects/12/archive/Main_output.jack @@ -0,0 +1,280 @@ +class Main { + + + static Array charMaps; + static int address; + static bool half; + + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void test_init() { + do Main.initMap(); + do Main.moveCursor(0, 0); + return; + } + + function void main(){tInt(i); + + 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) { + var int count, display; + var Array r, char; + if (j = 0){ + let half = true; + } + else{ + let half = (j / 2) * 2 = j; // chetno true, 1vaa chast + } + let address = (352 * i) + (j / 2) + 16384; + let char = Main.getMap(32); + + while (count < 11){ + if (half){ + let display = r[address] & (-256); + let r[address] = char[count] | display; + } + else{ + let display = r[address] & 255; + let r[address] = (char[count]*256) | display; + } + let count = count + 1; + let address = address + 32; + } + let address = address - 352; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array char, r; + var int count, display; + let char = Main.getMap(c); + while (count < 11){ + if (half){ + let display = r[address] & (-256); + let r[address] = char[count] | display; + } + else{ + let display = r[address] & 255; + let r[address] = (char[count]*256) | display; + } + let count = count + 1; + let address = address + 32; + } + + if (half){ + let address = address - 352; + let half = false; + } + else{ + if (address > 24480){ + let address = 16384; + let half = true; + } + else{ + let address = address - 351; + let half = true; + } + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int i, length; + let length = s.length(); + while (i < length){ + do Main.printChar(s[i+2]); + let i = i + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String s; + let s = String.new(6); + do s.setInt(i); + do Main.printString(s); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + var int row; + let row = (((address - 16384) / 32)/11) + 1; + if (row > 32){ + let row = 0; + } + do Main.moveCursor(row, 0); + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + if (address = 16384){ + let address = 24191; + let half = true; + return; + } + if (half){ + + let address = address - 1; + let half = false; + } + else{ + let half = true; + } + return; + } + // 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 Main.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 Main.create(32,0,0,0,0,0,0,0,0,0,0,0); // + do Main.create(33,12,30,30,30,12,12,0,12,12,0,0); // ! + do Main.create(34,54,54,20,0,0,0,0,0,0,0,0); // " + do Main.create(35,0,18,18,63,18,18,63,18,18,0,0); // # + do Main.create(36,12,30,51,3,30,48,51,30,12,12,0); // $ + do Main.create(37,0,0,35,51,24,12,6,51,49,0,0); // % + do Main.create(38,12,30,30,12,54,27,27,27,54,0,0); // & + do Main.create(39,12,12,6,0,0,0,0,0,0,0,0); // ' + do Main.create(40,24,12,6,6,6,6,6,12,24,0,0); // ( + do Main.create(41,6,12,24,24,24,24,24,12,6,0,0); // ) + do Main.create(42,0,0,0,51,30,63,30,51,0,0,0); // * + do Main.create(43,0,0,0,12,12,63,12,12,0,0,0); // + + do Main.create(44,0,0,0,0,0,0,0,12,12,6,0); // , + do Main.create(45,0,0,0,0,0,63,0,0,0,0,0); // - + do Main.create(46,0,0,0,0,0,0,0,12,12,0,0); // . + do Main.create(47,0,0,32,48,24,12,6,3,1,0,0); // / + do Main.create(48,12,30,51,51,51,51,51,30,12,0,0); // 0 + do Main.create(49,12,14,15,12,12,12,12,12,63,0,0); // 1 + do Main.create(50,30,51,48,24,12,6,3,51,63,0,0); // 2 + do Main.create(51,30,51,48,48,28,48,48,51,30,0,0); // 3 + do Main.create(52,16,24,28,26,25,63,24,24,60,0,0); // 4 + do Main.create(53,63,3,3,31,48,48,48,51,30,0,0); // 5 + do Main.create(54,28,6,3,3,31,51,51,51,30,0,0); // 6 + do Main.create(55,63,49,48,48,24,12,12,12,12,0,0); // 7 + do Main.create(56,30,51,51,51,30,51,51,51,30,0,0); // 8 + do Main.create(57,30,51,51,51,62,48,48,24,14,0,0); // 9 + do Main.create(58,0,0,12,12,0,0,12,12,0,0,0); // : + do Main.create(59,0,0,12,12,0,0,12,12,6,0,0); // ; + do Main.create(60,0,0,24,12,6,3,6,12,24,0,0); // < + do Main.create(61,0,0,0,63,0,0,63,0,0,0,0); // = + do Main.create(62,0,0,3,6,12,24,12,6,3,0,0); // > + do Main.create(64,30,51,51,59,59,59,27,3,30,0,0); // @ + do Main.create(63,30,51,51,24,12,12,0,12,12,0,0); // ? + do Main.create(65,12,30,51,51,63,51,51,51,51,0,0); // A + do Main.create(66,31,51,51,51,31,51,51,51,31,0,0); // B + do Main.create(67,28,54,35,3,3,3,35,54,28,0,0); // C + do Main.create(68,15,27,51,51,51,51,51,27,15,0,0); // D + do Main.create(69,63,51,35,11,15,11,35,51,63,0,0); // E + do Main.create(70,63,51,35,11,15,11,3,3,3,0,0); // F + do Main.create(71,28,54,35,3,59,51,51,54,44,0,0); // G + do Main.create(72,51,51,51,51,63,51,51,51,51,0,0); // H + do Main.create(73,30,12,12,12,12,12,12,12,30,0,0); // I + do Main.create(74,60,24,24,24,24,24,27,27,14,0,0); // J + do Main.create(75,51,51,51,27,15,27,51,51,51,0,0); // K + do Main.create(76,3,3,3,3,3,3,35,51,63,0,0); // L + do Main.create(77,33,51,63,63,51,51,51,51,51,0,0); // M + do Main.create(78,51,51,55,55,63,59,59,51,51,0,0); // N + do Main.create(79,30,51,51,51,51,51,51,51,30,0,0); // O + do Main.create(80,31,51,51,51,31,3,3,3,3,0,0); // P + do Main.create(81,30,51,51,51,51,51,63,59,30,48,0);// Q + do Main.create(82,31,51,51,51,31,27,51,51,51,0,0); // R + do Main.create(83,30,51,51,6,28,48,51,51,30,0,0); // S + do Main.create(84,63,63,45,12,12,12,12,12,30,0,0); // T + do Main.create(85,51,51,51,51,51,51,51,51,30,0,0); // U + do Main.create(86,51,51,51,51,51,30,30,12,12,0,0); // V + do Main.create(87,51,51,51,51,51,63,63,63,18,0,0); // W + do Main.create(88,51,51,30,30,12,30,30,51,51,0,0); // X + do Main.create(89,51,51,51,51,30,12,12,12,30,0,0); // Y + do Main.create(90,63,51,49,24,12,6,35,51,63,0,0); // Z + + do Main.create(91,30,6,6,6,6,6,6,6,30,0,0); // [ + do Main.create(92,0,0,1,3,6,12,24,48,32,0,0); // \ + do Main.create(93,30,24,24,24,24,24,24,24,30,0,0); // ] + do Main.create(94,8,28,54,0,0,0,0,0,0,0,0); // ^ + do Main.create(95,0,0,0,0,0,0,0,0,0,63,0); // _ + do Main.create(96,6,12,24,0,0,0,0,0,0,0,0); // ` + do Main.create(97,0,0,0,14,24,30,27,27,54,0,0); // a + do Main.create(98,3,3,3,15,27,51,51,51,30,0,0); // b + do Main.create(99,0,0,0,30,51,3,3,51,30,0,0); // c + do Main.create(100,48,48,48,60,54,51,51,51,30,0,0); // d + do Main.create(101,0,0,0,30,51,63,3,51,30,0,0); // e + do Main.create(102,28,54,38,6,15,6,6,6,15,0,0); // f + do Main.create(103,0,0,30,51,51,51,62,48,51,30,0); // g + do Main.create(104,3,3,3,27,55,51,51,51,51,0,0); // h + do Main.create(105,12,12,0,14,12,12,12,12,30,0,0); // i + do Main.create(106,48,48,0,56,48,48,48,48,51,30,0); // j + do Main.create(107,3,3,3,51,27,15,15,27,51,0,0); // k + do Main.create(108,14,12,12,12,12,12,12,12,30,0,0); // l + do Main.create(109,0,0,0,29,63,43,43,43,43,0,0); // m + do Main.create(110,0,0,0,29,51,51,51,51,51,0,0); // n + do Main.create(111,0,0,0,30,51,51,51,51,30,0,0); // o + do Main.create(112,0,0,0,30,51,51,51,31,3,3,0); // p + do Main.create(113,0,0,0,30,51,51,51,62,48,48,0); // q + do Main.create(114,0,0,0,29,55,51,3,3,7,0,0); // r + do Main.create(115,0,0,0,30,51,6,24,51,30,0,0); // s + do Main.create(116,4,6,6,15,6,6,6,54,28,0,0); // t + do Main.create(117,0,0,0,27,27,27,27,27,54,0,0); // u + do Main.create(118,0,0,0,51,51,51,51,30,12,0,0); // v + do Main.create(119,0,0,0,51,51,51,63,63,18,0,0); // w + do Main.create(120,0,0,0,51,30,12,12,30,51,0,0); // x + do Main.create(121,0,0,0,51,51,51,62,48,24,15,0); // y + do Main.create(122,0,0,0,63,27,12,6,51,63,0,0); // z + do Main.create(123,56,12,12,12,7,12,12,12,56,0,0); // { + do Main.create(124,12,12,12,12,12,12,12,12,12,0,0); // | + do Main.create(125,7,12,12,12,56,12,12,12,7,0,0); // } + do Main.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; + } +} diff --git a/projects/12/archive/String.jack b/projects/12/archive/String.jack new file mode 100755 index 0000000..2e8d90e --- /dev/null +++ b/projects/12/archive/String.jack @@ -0,0 +1,148 @@ +// This 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; + static bool neg; + + /** 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); + } + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + if(length > 0){ + do str.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) { + if(j > length){ + do Sys.error(7); + } + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + if(j > length){ + do Sys.error(7); + } + 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] = 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 d, sum, i; + var bool f; + while(i < length){ + let d = str[i]; // kak da go zavyrtq v realen int + if ((d > 47) & (d < 58)){ + let sum = (sum * 10) + (d - 48); + } + else{ + if((i = 0) & (d = 45)){ + let f = true; + } + else{ + let i = length; + } + } + let i = i + 1; + } + if (f){ + return -sum; + } + return sum; + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var int lastDigit, a,i; + var char c; + if(val < 0){ + let neg = true; + let val = -val; + } + let a = val / 10; + let lastDigit = val - (a * 10); + let i = 48; + while (i < 58){ + if (i = (48 + lastDigit)){ + let c = i; + let i = 59; + } + let i = i + 1; + } + if (val < 10){ + let length = 0; + if (neg){ + let neg = false; + do this.appendChar(45); + } + + do this.appendChar(c); + return; + } + else{ + do this.setInt(a); + do this.appendChar(c); + } + 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/test/Array.jack b/projects/12/test/Array.jack new file mode 100755 index 0000000..f16cad6 --- /dev/null +++ b/projects/12/test/Array.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/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) { + if(size < 0){ + do Sys.error(7); + } + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/projects/12/test/Array.vm b/projects/12/test/Array.vm new file mode 100755 index 0000000..60838ae --- /dev/null +++ b/projects/12/test/Array.vm @@ -0,0 +1,23 @@ +function Array.new 0 +push argument 0 +push constant 0 +lt +not +if-goto L0 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L1 +label L0 +label L1 +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/test/JackCompiler.py b/projects/12/test/JackCompiler.py new file mode 100755 index 0000000..5782f99 --- /dev/null +++ b/projects/12/test/JackCompiler.py @@ -0,0 +1,350 @@ +import os +from pathlib import Path +from tokenizer import Tokenizer +from vmwriter import VMWriter +from symbol_table import SymbolTable + + +# TODO add names to variables when you call for them, aka current_vm_append(thingtobeappended=blablac) + +class CompilationEngine: + def __init__(self, tokenizer, full_path_vm): + self.string = self.sub_type = self.class_name = self.function_type = '' + self.tab = self.recursion_index = 0 + self.tokenizer = tokenizer + self.sym_table = [] + self.vmwriter = VMWriter(full_path_vm) + self.current_vm = [] # used to reverse some of the commands, eg a+b need to be a b + + + def search_kind_of_sym(self, current_vm): + if self.sym_table[-1].kind_of(current_vm) is not None: + return self.sym_table[-1].kind_of(current_vm), self.sym_table[-1].index_of(current_vm) + for i in range(len(self.sym_table) - 2, -1, + -1): # start from the amount of sym_tables -2 so it starts from one below the current, + # until it is bigger than -1, walking it backwards + if self.sym_table[i].kind_of(current_vm) in ('static', 'this'): + return self.sym_table[i].kind_of(current_vm), self.sym_table[i].index_of(current_vm) + + def search_type_of_sym(self, current_vm): + for i in range(len(self.sym_table) - 1, -1, -1): + if self.sym_table[i].type_of(current_vm) is not None: + return self.sym_table[i].type_of(current_vm) + + def write_token(self): + if self.tokenizer.token_type() == 'stringConstant': + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token.strip( + '"') + ' \n' + else: + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token + ' \n' + + def compile_class(self): + self.sym_table.append(SymbolTable()) + self.tokenizer.advance() # class -> + self.tokenizer.advance() # type -> + self.class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + self.tokenizer.advance() # { -> + while self.tokenizer.token != '}': + if self.tokenizer.token in ['static', 'field']: + self.compile_class_var_dec() + if self.tokenizer.token in ['constructor', 'function', 'method']: + self.compile_subroutine() + self.tokenizer.advance() + self.sym_table.pop() + self.vmwriter.close_vm_file() + + def compile_class_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_subroutine(self): + self.sym_table.append(SymbolTable()) + self.sub_type = self.tokenizer.token + self.tokenizer.advance() # subroutine type(function|method|constructor) -> + self.function_type = self.tokenizer.token + self.tokenizer.advance() # subroutine kind(int|void|etc..) -> + sub_name = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + if self.sub_type == 'method': + self.sym_table[-1].start_subroutine('this', self.class_name) + self.compile_parameter_list() + self.tokenizer.advance() # { -> + while self.tokenizer.token == 'var': # create only symbol teable entries + self.compile_var_dec() + if self.sub_type == 'constructor': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('constant', self.sym_table[-2].var_count('field')) + self.vmwriter.write_call('Memory.alloc', 1) + self.vmwriter.write_pop('pointer', 0) + elif self.sub_type == 'method': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('argument', 0) + self.vmwriter.write_pop('pointer', 0) + else: + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + while self.tokenizer.token != '}': + self.compile_statements() + self.tokenizer.advance() + self.sym_table.pop() + + def compile_parameter_list(self): + if self.tokenizer.token != ')': + var_type = self.tokenizer.token + self.tokenizer.advance() # var ype -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # var name -> + while self.tokenizer.token == ',': + self.tokenizer.advance() # , -> + var_type = self.tokenizer.token + self.tokenizer.advance() # type -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # name -> + self.tokenizer.advance() # )-> + + def compile_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_statements(self): + while True: + if self.tokenizer.token == 'let': + self.compile_let() + elif self.tokenizer.token == 'if': + self.compile_if() + elif self.tokenizer.token == 'while': + self.compile_while() + elif self.tokenizer.token == 'do': + self.compile_do() + elif self.tokenizer.token == 'return': + self.compile_return() + else: + break + + def compile_do(self): + self.tokenizer.advance() # do -> + class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + if self.tokenizer.token == '(': # method + self.vmwriter.write_push('pointer', 0) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{class_name}', count + 1) + elif self.tokenizer.token == '.': # method or function + self.tokenizer.advance() # . -> + fname = f'{class_name}.{self.tokenizer.token}' + sname = f'{self.search_type_of_sym(class_name)}.{self.tokenizer.token}' + self.tokenizer.advance() # name -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_push(*self.search_kind_of_sym(class_name)) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_call(f'{sname}', count + 1) + else: + self.vmwriter.write_call(f'{fname}', count) + self.vmwriter.write_pop('temp', '0') + self.tokenizer.advance() # ; -> + + def compile_let(self): + flag_array = 0 + self.tokenizer.advance() # let -> + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # var_name -> + if self.tokenizer.token == '[': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.tokenizer.advance() # [ -> + self.compile_expression() + self.tokenizer.advance() # ] -> + flag_array = 1 + self.tokenizer.advance() # = -> + self.compile_expression() + self.tokenizer.advance() # ; -> + if flag_array == 0: + self.vmwriter.write_pop(*self.search_kind_of_sym(self.current_vm[-1])) + else: + self.vmwriter.write_pop('temp', 1) + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('temp', 1) + self.vmwriter.write_pop('that', 0) + self.current_vm.pop() + + def compile_while(self): + self.tokenizer.advance() # while -> + label1 = self.vmwriter.label_index + self.vmwriter.write_lable(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label2 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_goto(label1) + self.vmwriter.write_lable(label2) + + def compile_return(self): + self.tokenizer.advance() # return -> + if self.tokenizer.token != ';': + self.compile_expression() + self.vmwriter.write_return(self.function_type) + self.tokenizer.advance() # ; -> + + def compile_if(self): + self.tokenizer.advance() # if -> + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label1 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + label2 = self.vmwriter.label_index + self.vmwriter.write_goto(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.vmwriter.write_lable(label1) + if self.tokenizer.token == 'else': + self.tokenizer.advance() # else -> + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_lable(label2) + + def compile_expression(self): + self.compile_term() + while self.tokenizer.token in ['+', '-', '*', '/', '|', '=', '>', '<', '&']: + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # symbol -> + self.compile_term() + self.vmwriter.write_arithmetic(self.current_vm[-1]) + self.current_vm.pop() + + def compile_term(self): + if self.tokenizer.token == '(': # expression () + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + elif self.tokenizer.token in ['~', '-']: # uniry op + self.current_vm.append(self.tokenizer.token) + tmp = 'neg' if self.tokenizer.token == '-' else self.tokenizer.token + self.tokenizer.advance() # ~ or - -> + self.compile_term() + self.vmwriter.write_arithmetic(tmp) + self.current_vm.pop() + elif self.tokenizer.token_type() != 'symbol': + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # integer, string, keyword, varnname, subroutine_name, class_name, var_name -> + if self.tokenizer.token == '[': # Array + self.tokenizer.advance() # [ -> + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + self.compile_expression() + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('that', 0) + self.tokenizer.advance() # ] -> + elif self.tokenizer.token == '(': # subroutine_name () + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{self.current_vm[-1]}', count) + self.current_vm.pop() + elif self.tokenizer.token == '.': # method + if self.search_type_of_sym(self.current_vm[-1]) is not None: + flag = 1 + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + else: + flag = 0 + self.tokenizer.advance() # . -> + fname = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if flag == 1: + self.vmwriter.write_call(f'{self.search_type_of_sym(self.current_vm[-1])}.{fname}', count + 1) + else: + self.vmwriter.write_call(f'{self.current_vm[-1]}.{fname}', count) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'stringConstant': + self.vmwriter.write_push('constant', len(self.current_vm[-1].strip('"'))) + self.vmwriter.write_call('String.new', 1) + for index, item in enumerate(self.current_vm[-1].strip('"')): + self.vmwriter.write_push('constant', ord(item)) + self.vmwriter.write_call('String.appendChar', 2) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'integerConstant': + self.vmwriter.write_push('constant', self.current_vm[-1]) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'identifier': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + elif self.current_vm[-1] == 'true': + self.vmwriter.write_push('constant', '1') + self.vmwriter.write_arithmetic('neg') + self.current_vm.pop() + elif self.current_vm[-1] == 'false' or self.current_vm[-1] == 'null': + self.vmwriter.write_push('constant', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'this': + self.vmwriter.write_push('pointer', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'that': + self.vmwriter.write_push('pointer', '1') + self.current_vm.pop() + + def compile_expression_list(self): + count_exp = 0 + if self.tokenizer.token in ['(', '~', '-'] or self.tokenizer.token_type() != 'symbol': + count_exp += 1 + self.compile_expression() + while self.tokenizer.token == ',': + count_exp += 1 + self.tokenizer.advance() # , + self.compile_expression() + return count_exp + + +if __name__ == '__main__': + path = os.getcwd() + for root, dirs, files in os.walk(path, topdown=False): + for name in files: + if name[-4:] == 'jack': + tokenizer_main = Tokenizer() + tokenizer_main.clear_file(Path(root, name)) + full_path = Path(root, name[:-4] + 'vm') + comp_eng_main = CompilationEngine(tokenizer_main, full_path) + comp_eng_main.compile_class() diff --git a/projects/12/test/Keyboard.jack b/projects/12/test/Keyboard.jack new file mode 100755 index 0000000..81e4cc6 --- /dev/null +++ b/projects/12/test/Keyboard.jack @@ -0,0 +1,102 @@ +// This 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 mem; + /** Initializes the keyboard. */ + function void init() { + let mem = 0; + 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 mem[24576]; + } + + /** + * 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 a, b; + do Output.printChar(0); + while ((b = 0) | (a > 0)){ + let a = Keyboard.keyPressed(); + if (a > 0){ + let b = a; + } + } + do Output.printChar(String.backSpace()); + do Output.printChar(b); + return b; + } + + /** + * 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 s, b; + var char c; + let s = String.new(100); + do Output.printString(message); + while (true){ + let c = Keyboard.readChar(); + if (c = 128){ + return s; + } + else{ + if (c = 129){ + do s.eraseLastChar(); + } + else{ + do s.appendChar(c); + } + } + } + return s; + } + + /** + * 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 starting a; + var int b; + let a = Keyboard.readLine(message); + let b = String.intValue(a); + do String.dispose(a); + return b; + } +} diff --git a/projects/12/test/Keyboard.vm b/projects/12/test/Keyboard.vm new file mode 100755 index 0000000..47c4a9c --- /dev/null +++ b/projects/12/test/Keyboard.vm @@ -0,0 +1,103 @@ +function Keyboard.init 0 +push constant 0 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push static 0 +push constant 24576 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 2 +push constant 0 +call Output.printChar 1 +pop temp 0 +label L0 +push local 1 +push constant 0 +eq +push local 0 +push constant 0 +gt +or +not +if-goto L1 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 0 +gt +not +if-goto L2 +push local 0 +pop local 1 +goto L3 +label L2 +label L3 +goto L0 +label L1 +call String.backSpace 0 +call Output.printChar 1 +pop temp 0 +push local 1 +call Output.printChar 1 +pop temp 0 +push local 1 +return +function Keyboard.readLine 3 +push constant 100 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label L4 +push constant 1 +neg +not +if-goto L5 +call Keyboard.readChar 0 +pop local 2 +push local 2 +push constant 128 +eq +not +if-goto L6 +push local 0 +return +goto L7 +label L6 +push local 2 +push constant 129 +eq +not +if-goto L8 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto L9 +label L8 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +label L9 +label L7 +goto L4 +label L5 +push local 0 +return +function Keyboard.readInt 2 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +pop local 1 +push local 0 +call String.dispose 1 +pop temp 0 +push local 1 +return diff --git a/projects/12/test/Main.jack b/projects/12/test/Main.jack new file mode 100755 index 0000000..73331ef --- /dev/null +++ b/projects/12/test/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: "); + 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/test/Main.vm b/projects/12/test/Main.vm new file mode 100755 index 0000000..edf09b5 --- /dev/null +++ b/projects/12/test/Main.vm @@ -0,0 +1,447 @@ +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 5 +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 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/test/Math.jack b/projects/12/test/Math.jack new file mode 100755 index 0000000..1730de4 --- /dev/null +++ b/projects/12/test/Math.jack @@ -0,0 +1,143 @@ +// This 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 st; + static int division_tmp, f; + + /** Initializes the library. */ + function void init() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + return; + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x > 0){ + return x; + } + 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, temp, y_comp, i, neg; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (x < y){ + let temp = x; + let x = y; + let y = temp; + } + if (y = 1){ + if(neg){ + return -x; + } + return x; + } + while((y_comp - 1) < (y - 1)){ + if ((st[i] & y) > 0) { + let sum = sum + x; + let y_comp = y_comp + st[i]; + } + let x = x + x; + let i = i + 1; + } + if(neg){ + let sum = -sum; + } + 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, neg; + if (f = 0){ + let division_tmp = 0; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (y = 0){ + do Sys.error(3); + } + let f = 1; + } + if ((y > x) | (y < 0)){ + return 0; + } + let q = Math.divide(x, y + y); + let f = 0; + let q = Math.abs(q); + if ((q & 1) = 1){ + let division_tmp = division_tmp + y + y; + } + if (x - division_tmp < y){ + if (neg){ + return -(q + q); + } + return q + q; + } + else{ + if (neg){ + return -(q + q + 1); + } + return q + q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int j, b, d, y; + + if (x < 0){ + do Sys.error(4); + } + let j = 7; + while (j > -1){ + let d = y + st[j]; + let b = d * d; + if ((~(b > x)) & (b > 0)){ + let y = d; + } + let j = j - 1; + } + return y; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if (a > b){ + return a; + } + return b; + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if (a < b){ + return a; + } + return b; + } +} diff --git a/projects/12/test/Math.vm b/projects/12/test/Math.vm new file mode 100755 index 0000000..5f85428 --- /dev/null +++ b/projects/12/test/Math.vm @@ -0,0 +1,388 @@ +function Math.init 1 +push constant 16 +call Array.new 1 +pop static 0 +push static 0 +push constant 0 +push constant 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L0 +push local 0 +push constant 15 +lt +not +if-goto L1 +push local 0 +push constant 1 +add +pop local 0 +push static 0 +push local 0 +push static 0 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +push static 0 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +add +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L0 +label L1 +push constant 0 +return +function Math.abs 0 +push argument 0 +push constant 0 +gt +not +if-goto L2 +push argument 0 +return +goto L3 +label L2 +label L3 +push argument 0 +neg +return +function Math.multiply 5 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 4 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 0 +push argument 1 +lt +not +if-goto L4 +push argument 0 +pop local 1 +push argument 1 +pop argument 0 +push local 1 +pop argument 1 +goto L5 +label L4 +label L5 +push argument 1 +push constant 1 +eq +not +if-goto L6 +push local 4 +not +if-goto L7 +push argument 0 +neg +return +goto L8 +label L7 +label L8 +push argument 0 +return +goto L9 +label L6 +label L9 +label L10 +push local 2 +push constant 1 +sub +push argument 1 +push constant 1 +sub +lt +not +if-goto L11 +push static 0 +push local 3 +add +pop pointer 1 +push that 0 +push argument 1 +and +push constant 0 +gt +not +if-goto L12 +push local 0 +push argument 0 +add +pop local 0 +push local 2 +push static 0 +push local 3 +add +pop pointer 1 +push that 0 +add +pop local 2 +goto L13 +label L12 +label L13 +push argument 0 +push argument 0 +add +pop argument 0 +push local 3 +push constant 1 +add +pop local 3 +goto L10 +label L11 +push local 4 +not +if-goto L14 +push local 0 +neg +pop local 0 +goto L15 +label L14 +label L15 +push local 0 +return +function Math.divide 2 +push static 2 +push constant 0 +eq +not +if-goto L16 +push constant 0 +pop static 1 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 1 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 1 +push constant 0 +eq +not +if-goto L17 +push constant 3 +call Sys.error 1 +pop temp 0 +goto L18 +label L17 +label L18 +push constant 1 +pop static 2 +goto L19 +label L16 +label L19 +push argument 1 +push argument 0 +gt +push argument 1 +push constant 0 +lt +or +not +if-goto L20 +push constant 0 +return +goto L21 +label L20 +label L21 +push argument 0 +push argument 1 +push argument 1 +add +call Math.divide 2 +pop local 0 +push constant 0 +pop static 2 +push local 0 +call Math.abs 1 +pop local 0 +push local 0 +push constant 1 +and +push constant 1 +eq +not +if-goto L22 +push static 1 +push argument 1 +add +push argument 1 +add +pop static 1 +goto L23 +label L22 +label L23 +push argument 0 +push static 1 +sub +push argument 1 +lt +not +if-goto L24 +push local 1 +not +if-goto L25 +push local 0 +push local 0 +add +neg +return +goto L26 +label L25 +label L26 +push local 0 +push local 0 +add +return +goto L27 +label L24 +push local 1 +not +if-goto L28 +push local 0 +push local 0 +add +push constant 1 +add +neg +return +goto L29 +label L28 +label L29 +push local 0 +push local 0 +add +push constant 1 +add +return +label L27 +function Math.sqrt 4 +push argument 0 +push constant 0 +lt +not +if-goto L30 +push constant 4 +call Sys.error 1 +pop temp 0 +goto L31 +label L30 +label L31 +push constant 7 +pop local 0 +label L32 +push local 0 +push constant 1 +neg +gt +not +if-goto L33 +push local 3 +push static 0 +push local 0 +add +pop pointer 1 +push that 0 +add +pop local 2 +push local 2 +push local 2 +call Math.multiply 2 +pop local 1 +push local 1 +push argument 0 +gt +not +push local 1 +push constant 0 +gt +and +not +if-goto L34 +push local 2 +pop local 3 +goto L35 +label L34 +label L35 +push local 0 +push constant 1 +sub +pop local 0 +goto L32 +label L33 +push local 3 +return +function Math.max 0 +push argument 0 +push argument 1 +gt +not +if-goto L36 +push argument 0 +return +goto L37 +label L36 +label L37 +push argument 1 +return +function Math.min 0 +push argument 0 +push argument 1 +lt +not +if-goto L38 +push argument 0 +return +goto L39 +label L38 +label L39 +push argument 1 +return diff --git a/projects/12/test/Memory.jack b/projects/12/test/Memory.jack new file mode 100755 index 0000000..14305f1 --- /dev/null +++ b/projects/12/test/Memory.jack @@ -0,0 +1,63 @@ +// This 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 mem; + /** Initializes the class. */ + function void init() { + let mem = 0; + let mem[2048] = 14334; + let mem[2049] = -1; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return mem[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let mem[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 current_block; + var int tmp; + let current_block = 2048; + if (size < 0){ + do Sys.error(5); + } + if (size = 0){ + let size = 1; + } + while (current_block[0] < (size + 2)) { + let current_block = current_block[1]; + } + let current_block[0] = current_block[0] - size - 2; + let current_block = current_block + current_block[0] + 2; + let current_block[0] = size; + return current_block + 2; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array current_block; + let current_block = 2048; + let o[1]= current_block[1]; + let current_block[1] = o; + return; + + } +} diff --git a/projects/12/test/Memory.vm b/projects/12/test/Memory.vm new file mode 100755 index 0000000..a19cd86 --- /dev/null +++ b/projects/12/test/Memory.vm @@ -0,0 +1,147 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push static 0 +push constant 2048 +push constant 14334 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push static 0 +push constant 2049 +push constant 1 +neg +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return +function Memory.peek 0 +push static 0 +push argument 0 +add +pop pointer 1 +push that 0 +return +function Memory.poke 0 +push static 0 +push argument 0 +push argument 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return +function Memory.alloc 2 +push constant 2048 +pop local 0 +push argument 0 +push constant 0 +lt +not +if-goto L0 +push constant 5 +call Sys.error 1 +pop temp 0 +goto L1 +label L0 +label L1 +push argument 0 +push constant 0 +eq +not +if-goto L2 +push constant 1 +pop argument 0 +goto L3 +label L2 +label L3 +label L4 +push local 0 +push constant 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 2 +add +lt +not +if-goto L5 +push local 0 +push constant 1 +add +pop pointer 1 +push that 0 +pop local 0 +goto L4 +label L5 +push local 0 +push constant 0 +push local 0 +push constant 0 +add +pop pointer 1 +push that 0 +push argument 0 +sub +push constant 2 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push local 0 +push constant 0 +add +pop pointer 1 +push that 0 +add +push constant 2 +add +pop local 0 +push local 0 +push constant 0 +push argument 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 2 +add +return +function Memory.deAlloc 1 +push constant 2048 +pop local 0 +push argument 0 +push constant 1 +push local 0 +push constant 1 +add +pop pointer 1 +push that 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 1 +push argument 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return diff --git a/projects/12/test/Output.jack b/projects/12/test/Output.jack new file mode 100755 index 0000000..9132280 --- /dev/null +++ b/projects/12/test/Output.jack @@ -0,0 +1,299 @@ +// This 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 address; + static bool half; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + do Output.initMap(); + do Output.moveCursor(0, 0); + return; + } + + // 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,63,51,51,51,51,0,0); // A ** TO BE FILLED ** + do Output.create(66,31,51,51,51,31,51,51,51,31,0,0); // B + do Output.create(67,28,54,35,3,3,3,35,54,28,0,0); // C + do Output.create(68,15,27,51,51,51,51,51,27,15,0,0); // D + do Output.create(69,63,51,35,11,15,11,35,51,63,0,0); // E + do Output.create(70,63,51,35,11,15,11,3,3,3,0,0); // F + do Output.create(71,28,54,35,3,59,51,51,54,44,0,0); // G + do Output.create(72,51,51,51,51,63,51,51,51,51,0,0); // H + do Output.create(73,30,12,12,12,12,12,12,12,30,0,0); // I + do Output.create(74,60,24,24,24,24,24,27,27,14,0,0); // J + do Output.create(75,51,51,51,27,15,27,51,51,51,0,0); // K + do Output.create(76,3,3,3,3,3,3,35,51,63,0,0); // L + do Output.create(77,33,51,63,63,51,51,51,51,51,0,0); // M + do Output.create(78,51,51,55,55,63,59,59,51,51,0,0); // N + do Output.create(79,30,51,51,51,51,51,51,51,30,0,0); // O + do Output.create(80,31,51,51,51,31,3,3,3,3,0,0); // P + do Output.create(81,30,51,51,51,51,51,63,59,30,48,0);// Q + do Output.create(82,31,51,51,51,31,27,51,51,51,0,0); // R + do Output.create(83,30,51,51,6,28,48,51,51,30,0,0); // S + do Output.create(84,63,63,45,12,12,12,12,12,30,0,0); // T + do Output.create(85,51,51,51,51,51,51,51,51,30,0,0); // U + do Output.create(86,51,51,51,51,51,30,30,12,12,0,0); // V + do Output.create(87,51,51,51,51,51,63,63,63,18,0,0); // W + do Output.create(88,51,51,30,30,12,30,30,51,51,0,0); // X + do Output.create(89,51,51,51,51,30,12,12,12,30,0,0); // Y + do Output.create(90,63,51,49,24,12,6,35,51,63,0,0); // Z + + do Output.create(91,30,6,6,6,6,6,6,6,30,0,0); // [ + do Output.create(92,0,0,1,3,6,12,24,48,32,0,0); // \ + do Output.create(93,30,24,24,24,24,24,24,24,30,0,0); // ] + do Output.create(94,8,28,54,0,0,0,0,0,0,0,0); // ^ + do Output.create(95,0,0,0,0,0,0,0,0,0,63,0); // _ + do Output.create(96,6,12,24,0,0,0,0,0,0,0,0); // ` + + do Output.create(97,0,0,0,14,24,30,27,27,54,0,0); // a + do Output.create(98,3,3,3,15,27,51,51,51,30,0,0); // b + do Output.create(99,0,0,0,30,51,3,3,51,30,0,0); // c + do Output.create(100,48,48,48,60,54,51,51,51,30,0,0); // d + do Output.create(101,0,0,0,30,51,63,3,51,30,0,0); // e + do Output.create(102,28,54,38,6,15,6,6,6,15,0,0); // f + do Output.create(103,0,0,30,51,51,51,62,48,51,30,0); // g + do Output.create(104,3,3,3,27,55,51,51,51,51,0,0); // h + do Output.create(105,12,12,0,14,12,12,12,12,30,0,0); // i + do Output.create(106,48,48,0,56,48,48,48,48,51,30,0); // j + do Output.create(107,3,3,3,51,27,15,15,27,51,0,0); // k + do Output.create(108,14,12,12,12,12,12,12,12,30,0,0); // l + do Output.create(109,0,0,0,29,63,43,43,43,43,0,0); // m + do Output.create(110,0,0,0,29,51,51,51,51,51,0,0); // n + do Output.create(111,0,0,0,30,51,51,51,51,30,0,0); // o + do Output.create(112,0,0,0,30,51,51,51,31,3,3,0); // p + do Output.create(113,0,0,0,30,51,51,51,62,48,48,0); // q + do Output.create(114,0,0,0,29,55,51,3,3,7,0,0); // r + do Output.create(115,0,0,0,30,51,6,24,51,30,0,0); // s + do Output.create(116,4,6,6,15,6,6,6,54,28,0,0); // t + do Output.create(117,0,0,0,27,27,27,27,27,54,0,0); // u + do Output.create(118,0,0,0,51,51,51,51,30,12,0,0); // v + do Output.create(119,0,0,0,51,51,51,63,63,18,0,0); // w + do Output.create(120,0,0,0,51,30,12,12,30,51,0,0); // x + do Output.create(121,0,0,0,51,51,51,62,48,24,15,0); // y + do Output.create(122,0,0,0,63,27,12,6,51,63,0,0); // z + + do Output.create(123,56,12,12,12,7,12,12,12,56,0,0); // { + do Output.create(124,12,12,12,12,12,12,12,12,12,0,0); // | + do Output.create(125,7,12,12,12,56,12,12,12,7,0,0); // } + do Output.create(126,38,45,25,0,0,0,0,0,0,0,0); // ~ + + return; + } + + // Creates the character map array of the given character index, using the given values. + function void create(int index, int a, int b, int c, int d, int e, + int f, int g, int h, int i, int j, int k) { + var Array map; + + let map = Array.new(11); + let charMaps[index] = map; + + let map[0] = a; + let map[1] = b; + let map[2] = c; + let map[3] = d; + let map[4] = e; + let map[5] = f; + let map[6] = g; + let map[7] = h; + let map[8] = i; + let map[9] = j; + let map[10] = k; + + return; + } + + // Returns the character map (array of size 11) of the given character. + // If the given character is invalid or non-printable, returns the + // character map of a black square. + function Array getMap(char c) { + if ((c < 32) | (c > 126)) { + let c = 0; + } + return charMaps[c]; + } + + /** Moves the cursor to the j-th column of the i-th row, + * and erases the character displayed there. */ + function void moveCursor(int i, int j) { + var int co,display; + var Array r,ch; + if (j = 0){ + let half = true; + } + else{ + let half = (j / 2) * 2 = j; // chetno true, 1vaa chast + } + let address = (352 * i) + (j / 2) + 16384; + let ch = Output.getMap(32); + + while (co < 11){ + if (half){ + let display = r[address] & (-256); + let r[address] = ch[co] | display; + } + else{ + let display = r[address] & 255; + let r[address] = (ch[co]*256) | display; + } + let co = co + 1; + let address = address + 32; + } + let address = address - 352; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array ch; + var Array r; + var int co; + var int ds; + let ch = Output.getMap(c); + while (co < 11){ + if (half){ + let ds = r[address] & (-256); + let r[address] = ch[co] | ds; + } + else{ + let ds = r[address] & 255; + let r[address] = (ch[co]*256) | ds; + } + let co = co + 1; + let address = address + 32; + } + + if (half){ + let address = address - 352; + let half = false; + } + else{ + if (address > 24480){ + let address = 16384; + let half = true; + } + else{ + let address = address - 351; + let half = true; + } + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int i, length; + let length = s.length(); + while (i < length){ + do Output.printChar(s.charAt(i)); + let i = i + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String s; + let s = String.new(6); + do s.setInt(i); + do Output.printString(s); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + var int row; + let row = (((address - 16384) / 32)/11) + 1; + if (row > 32){ + let row = 0; + } + do Output.moveCursor(row, 0); + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + if (address = 16384){ + let address = 24191; + let half = true; + return; + } + if (half){ + + let address = address - 1; + let half = false; + } + else{ + let half = true; + } + return; + } +} diff --git a/projects/12/test/Output.vm b/projects/12/test/Output.vm new file mode 100755 index 0000000..63a6cc0 --- /dev/null +++ b/projects/12/test/Output.vm @@ -0,0 +1,1793 @@ +function Output.init 0 +call Output.initMap 0 +pop temp 0 +push constant 0 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 0 +return +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 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 66 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 67 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 68 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 69 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 70 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 71 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 59 +push constant 51 +push constant 51 +push constant 54 +push constant 44 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 72 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 73 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 74 +push constant 60 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 27 +push constant 27 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 75 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 76 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 77 +push constant 33 +push constant 51 +push constant 63 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 78 +push constant 51 +push constant 51 +push constant 55 +push constant 55 +push constant 63 +push constant 59 +push constant 59 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 79 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 80 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 81 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 59 +push constant 30 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 82 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 83 +push constant 30 +push constant 51 +push constant 51 +push constant 6 +push constant 28 +push constant 48 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 84 +push constant 63 +push constant 63 +push constant 45 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 85 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 86 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 87 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 88 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 30 +push constant 30 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 89 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 90 +push constant 63 +push constant 51 +push constant 49 +push constant 24 +push constant 12 +push constant 6 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 91 +push constant 30 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 92 +push constant 0 +push constant 0 +push constant 1 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 48 +push constant 32 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 93 +push constant 30 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 94 +push constant 8 +push constant 28 +push constant 54 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 95 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 96 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 97 +push constant 0 +push constant 0 +push constant 0 +push constant 14 +push constant 24 +push constant 30 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 98 +push constant 3 +push constant 3 +push constant 3 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 99 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 3 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 100 +push constant 48 +push constant 48 +push constant 48 +push constant 60 +push constant 54 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 101 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 63 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 102 +push constant 28 +push constant 54 +push constant 38 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 103 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 104 +push constant 3 +push constant 3 +push constant 3 +push constant 27 +push constant 55 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 105 +push constant 12 +push constant 12 +push constant 0 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 106 +push constant 48 +push constant 48 +push constant 0 +push constant 56 +push constant 48 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 107 +push constant 3 +push constant 3 +push constant 3 +push constant 51 +push constant 27 +push constant 15 +push constant 15 +push constant 27 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 108 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 109 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 63 +push constant 43 +push constant 43 +push constant 43 +push constant 43 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 110 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 111 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 112 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 113 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 114 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 55 +push constant 51 +push constant 3 +push constant 3 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 115 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 6 +push constant 24 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 116 +push constant 4 +push constant 6 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 117 +push constant 0 +push constant 0 +push constant 0 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 118 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 119 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 120 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 121 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 24 +push constant 15 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 122 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 27 +push constant 12 +push constant 6 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 123 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 124 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 125 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 126 +push constant 38 +push constant 45 +push constant 25 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 0 +return +function Output.create 1 +push constant 11 +call Array.new 1 +pop local 0 +push static 0 +push argument 0 +push local 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 0 +push argument 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 1 +push argument 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 2 +push argument 3 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 3 +push argument 4 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 4 +push argument 5 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 5 +push argument 6 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 6 +push argument 7 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 7 +push argument 8 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 8 +push argument 9 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 9 +push argument 10 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 10 +push argument 11 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 +not +if-goto L0 +push constant 0 +pop argument 0 +goto L1 +label L0 +label L1 +push static 0 +push argument 0 +add +pop pointer 1 +push that 0 +return +function Output.moveCursor 4 +push argument 1 +push constant 0 +eq +not +if-goto L2 +push constant 1 +neg +pop static 2 +goto L3 +label L2 +push argument 1 +push constant 2 +call Math.divide 2 +push constant 2 +call Math.multiply 2 +push argument 1 +eq +pop static 2 +label L3 +push constant 352 +push argument 0 +call Math.multiply 2 +push argument 1 +push constant 2 +call Math.divide 2 +add +push constant 16384 +add +pop static 1 +push constant 32 +call Output.getMap 1 +pop local 3 +label L4 +push local 0 +push constant 11 +lt +not +if-goto L5 +push static 2 +not +if-goto L6 +push local 2 +push static 1 +add +pop pointer 1 +push that 0 +push constant 256 +neg +and +pop local 1 +push local 2 +push static 1 +push local 3 +push local 0 +add +pop pointer 1 +push that 0 +push local 1 +or +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L7 +label L6 +push local 2 +push static 1 +add +pop pointer 1 +push that 0 +push constant 255 +and +pop local 1 +push local 2 +push static 1 +push local 3 +push local 0 +add +pop pointer 1 +push that 0 +push constant 256 +call Math.multiply 2 +push local 1 +or +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L7 +push local 0 +push constant 1 +add +pop local 0 +push static 1 +push constant 32 +add +pop static 1 +goto L4 +label L5 +push static 1 +push constant 352 +sub +pop static 1 +push constant 0 +return +function Output.printChar 4 +push argument 0 +call Output.getMap 1 +pop local 0 +label L8 +push local 2 +push constant 11 +lt +not +if-goto L9 +push static 2 +not +if-goto L10 +push local 1 +push static 1 +add +pop pointer 1 +push that 0 +push constant 256 +neg +and +pop local 3 +push local 1 +push static 1 +push local 0 +push local 2 +add +pop pointer 1 +push that 0 +push local 3 +or +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L11 +label L10 +push local 1 +push static 1 +add +pop pointer 1 +push that 0 +push constant 255 +and +pop local 3 +push local 1 +push static 1 +push local 0 +push local 2 +add +pop pointer 1 +push that 0 +push constant 256 +call Math.multiply 2 +push local 3 +or +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L11 +push local 2 +push constant 1 +add +pop local 2 +push static 1 +push constant 32 +add +pop static 1 +goto L8 +label L9 +push static 2 +not +if-goto L12 +push static 1 +push constant 352 +sub +pop static 1 +push constant 0 +pop static 2 +goto L13 +label L12 +push static 1 +push constant 24480 +gt +not +if-goto L14 +push constant 16384 +pop static 1 +push constant 1 +neg +pop static 2 +goto L15 +label L14 +push static 1 +push constant 351 +sub +pop static 1 +push constant 1 +neg +pop static 2 +label L15 +label L13 +push constant 0 +return +function Output.printString 2 +push argument 0 +call String.length 1 +pop local 1 +label L16 +push local 0 +push local 1 +lt +not +if-goto L17 +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 L16 +label L17 +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 1 +push static 1 +push constant 16384 +sub +push constant 32 +call Math.divide 2 +push constant 11 +call Math.divide 2 +push constant 1 +add +pop local 0 +push local 0 +push constant 32 +gt +not +if-goto L18 +push constant 0 +pop local 0 +goto L19 +label L18 +label L19 +push local 0 +push constant 0 +call Output.moveCursor 2 +pop temp 0 +push constant 0 +return +function Output.backSpace 0 +push static 1 +push constant 16384 +eq +not +if-goto L20 +push constant 24191 +pop static 1 +push constant 1 +neg +pop static 2 +push constant 0 +return +goto L21 +label L20 +label L21 +push static 2 +not +if-goto L22 +push static 1 +push constant 1 +sub +pop static 1 +push constant 0 +pop static 2 +goto L23 +label L22 +push constant 1 +neg +pop static 2 +label L23 +push constant 0 +return diff --git a/projects/12/test/Screen.jack b/projects/12/test/Screen.jack new file mode 100755 index 0000000..006a905 --- /dev/null +++ b/projects/12/test/Screen.jack @@ -0,0 +1,206 @@ +// This 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 256 rows (indexed 0..255, top to bottom) + * of 512 pixels each (indexed 0..511, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + + static Array mem; + static Array st; + static boolean color; + /** Initializes the Screen. */ + function void init() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + let color = true; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int a; + let a = 16384; + while (a < 24575){ + let mem[a] = 0; + let a = a + 1; + } + 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 int value, address, bit, mem_block; + if ((x > 511) | (x < 0) | (y > 255) | (y < 0)){ + do Sys.error(7); + } + let mem_block = x / 16; + let address = (32 * y) + mem_block + 16384; + let value = mem[address]; + let bit = x - (mem_block * 16); + if (color){ + let mem[address] = st[bit] | value; + } + else{ + let mem[address] = (~st[bit])& 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 diff, dx, dy, a, b; + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let dx = x2 - x1; + let dy = y2 - y1; + if (dx = 0){ + if (dy > 0){ + while(~(b > dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b + 1; + } + return; + } + else{ + while(~(b < dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b - 1; + } + return; + } + } + if (dy = 0){ + if (dx > 0){ + while(~(a > dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a + 1; + } + return; + } + else{ + while(~(a < dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a - 1; + } + return; + } + } + if (dx < 0){ + if (dy < 0){ + while ((~(a < dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff + dx; + } + } + } + else{ + while ((~(a < dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff + dx; + } + } + } + } + else{ + if (dy < 0){ + while ((~(a > dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff - dx; + } + } + } + else{ + while ((~(a > dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff - 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 a, tmp; + if (x1 > x2){ + let tmp = x1; + let x1 = x2; + let x2 = tmp; + } + if (y1 > y2){ + let tmp = y1; + let y1 = y2; + let y2 = tmp; + } + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let tmp = y2 - y1; + while(a < tmp){ + do Screen.drawLine(x1, y1 + a, x2, y1 + a); + let a = a + 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, dx, tmp; + if(r > 181){ + do Sys.error(7); + } + let dy = - r; + while (dy < r){ + let tmp = Math.sqrt((r * r) - (dy * dy)); + do Screen.drawLine(x - tmp, y + dy, x + tmp, y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/projects/12/test/Screen.vm b/projects/12/test/Screen.vm new file mode 100755 index 0000000..d08813b --- /dev/null +++ b/projects/12/test/Screen.vm @@ -0,0 +1,656 @@ +function Screen.init 1 +push constant 16 +call Array.new 1 +pop static 1 +push static 1 +push constant 0 +push constant 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L0 +push local 0 +push constant 15 +lt +not +if-goto L1 +push local 0 +push constant 1 +add +pop local 0 +push static 1 +push local 0 +push static 1 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +push static 1 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +add +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L0 +label L1 +push constant 1 +neg +pop static 2 +push constant 0 +return +function Screen.clearScreen 1 +push constant 16384 +pop local 0 +label L2 +push local 0 +push constant 24575 +lt +not +if-goto L3 +push static 0 +push local 0 +push constant 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +goto L2 +label L3 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 2 +push constant 0 +return +function Screen.drawPixel 4 +push argument 0 +push constant 511 +gt +push argument 0 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +push argument 1 +push constant 0 +lt +or +not +if-goto L4 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L5 +label L4 +label L5 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push constant 32 +push argument 1 +call Math.multiply 2 +push local 3 +add +push constant 16384 +add +pop local 1 +push static 0 +push local 1 +add +pop pointer 1 +push that 0 +pop local 0 +push argument 0 +push local 3 +push constant 16 +call Math.multiply 2 +sub +pop local 2 +push static 2 +not +if-goto L6 +push static 0 +push local 1 +push static 1 +push local 2 +add +pop pointer 1 +push that 0 +push local 0 +or +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L7 +label L6 +push static 0 +push local 1 +push static 1 +push local 2 +add +pop pointer 1 +push that 0 +not +push local 0 +and +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L7 +push constant 0 +return +function Screen.drawLine 5 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +not +if-goto L8 +push constant 8 +call Sys.error 1 +pop temp 0 +goto L9 +label L8 +label L9 +push argument 2 +push argument 0 +sub +pop local 1 +push argument 3 +push argument 1 +sub +pop local 2 +push local 1 +push constant 0 +eq +not +if-goto L10 +push local 2 +push constant 0 +gt +not +if-goto L11 +label L12 +push local 4 +push local 2 +gt +not +not +if-goto L13 +push argument 0 +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 1 +add +pop local 4 +goto L12 +label L13 +push constant 0 +return +goto L14 +label L11 +label L15 +push local 4 +push local 2 +lt +not +not +if-goto L16 +push argument 0 +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 4 +push constant 1 +sub +pop local 4 +goto L15 +label L16 +push constant 0 +return +label L14 +goto L17 +label L10 +label L17 +push local 2 +push constant 0 +eq +not +if-goto L18 +push local 1 +push constant 0 +gt +not +if-goto L19 +label L20 +push local 3 +push local 1 +gt +not +not +if-goto L21 +push argument 0 +push local 3 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 3 +push constant 1 +add +pop local 3 +goto L20 +label L21 +push constant 0 +return +goto L22 +label L19 +label L23 +push local 3 +push local 1 +lt +not +not +if-goto L24 +push argument 0 +push local 3 +add +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +push local 3 +push constant 1 +sub +pop local 3 +goto L23 +label L24 +push constant 0 +return +label L22 +goto L25 +label L18 +label L25 +push local 1 +push constant 0 +lt +not +if-goto L26 +push local 2 +push constant 0 +lt +not +if-goto L27 +label L28 +push local 3 +push local 1 +lt +not +push local 4 +push local 2 +lt +not +and +not +if-goto L29 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L30 +push local 3 +push constant 1 +sub +pop local 3 +push local 0 +push local 2 +sub +pop local 0 +goto L31 +label L30 +push local 4 +push constant 1 +sub +pop local 4 +push local 0 +push local 1 +add +pop local 0 +label L31 +goto L28 +label L29 +goto L32 +label L27 +label L33 +push local 3 +push local 1 +lt +not +push local 4 +push local 2 +gt +not +and +not +if-goto L34 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L35 +push local 3 +push constant 1 +sub +pop local 3 +push local 0 +push local 2 +add +pop local 0 +goto L36 +label L35 +push local 4 +push constant 1 +add +pop local 4 +push local 0 +push local 1 +add +pop local 0 +label L36 +goto L33 +label L34 +label L32 +goto L37 +label L26 +push local 2 +push constant 0 +lt +not +if-goto L38 +label L39 +push local 3 +push local 1 +gt +not +push local 4 +push local 2 +lt +not +and +not +if-goto L40 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L41 +push local 3 +push constant 1 +add +pop local 3 +push local 0 +push local 2 +sub +pop local 0 +goto L42 +label L41 +push local 4 +push constant 1 +sub +pop local 4 +push local 0 +push local 1 +sub +pop local 0 +label L42 +goto L39 +label L40 +goto L43 +label L38 +label L44 +push local 3 +push local 1 +gt +not +push local 4 +push local 2 +gt +not +and +not +if-goto L45 +push argument 0 +push local 3 +add +push argument 1 +push local 4 +add +call Screen.drawPixel 2 +pop temp 0 +push local 0 +push constant 0 +lt +not +if-goto L46 +push local 3 +push constant 1 +add +pop local 3 +push local 0 +push local 2 +add +pop local 0 +goto L47 +label L46 +push local 4 +push constant 1 +add +pop local 4 +push local 0 +push local 1 +sub +pop local 0 +label L47 +goto L44 +label L45 +label L43 +label L37 +push constant 0 +return +function Screen.drawRectangle 2 +push argument 0 +push argument 2 +gt +not +if-goto L48 +push argument 0 +pop local 1 +push argument 2 +pop argument 0 +push local 1 +pop argument 2 +goto L49 +label L48 +label L49 +push argument 1 +push argument 3 +gt +not +if-goto L50 +push argument 1 +pop local 1 +push argument 3 +pop argument 1 +push local 1 +pop argument 3 +goto L51 +label L50 +label L51 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +not +if-goto L52 +push constant 8 +call Sys.error 1 +pop temp 0 +goto L53 +label L52 +label L53 +push argument 3 +push argument 1 +sub +pop local 1 +label L54 +push local 0 +push local 1 +lt +not +if-goto L55 +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 +goto L54 +label L55 +push constant 0 +return +function Screen.drawCircle 3 +push argument 2 +push constant 181 +gt +not +if-goto L56 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L57 +label L56 +label L57 +push argument 2 +neg +pop local 0 +label L58 +push local 0 +push argument 2 +lt +not +if-goto L59 +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 +pop local 2 +push argument 0 +push local 2 +sub +push argument 1 +push local 0 +add +push argument 0 +push local 2 +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 L58 +label L59 +push constant 0 +return diff --git a/projects/12/test/String.jack b/projects/12/test/String.jack new file mode 100755 index 0000000..4d936cb --- /dev/null +++ b/projects/12/test/String.jack @@ -0,0 +1,154 @@ +// This 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; + field int strLength; + + /** constructs a new empty string with a mavalimum length of mavalLength + * and initial length of 0. */ + constructor String new(int mavalLength) { + if (mavalLength > 0){ + let str = Array.new(mavalLength); + } + let strLength = mavalLength; + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + if(length > 0){ + do str.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) { + if(j > length){ + do Sys.error(7); + } + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + if(j > length){ + do Sys.error(7); + } + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + if(strLength = length){ + do Sys.error(7); + } + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + if (length = 0){ + do Sys.error(7); + } + let str[length] = 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 d, sum, i; + var bool f; + while(i < length){ + let d = str[i]; + if ((d > 47) & (d < 58)){ + let sum = (sum * 10) + (d - 48); + } + else{ + if((i = 0) & (d = 45)){ + let f = true; + } + else{ + let i = length; + } + } + let i = i + 1; + } + if (f){ + return -sum; + } + return sum; + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var Array c; + var int d, b, a; + let c = Array.new(6); + if (val < 0){ + let d = ~0; + let val = -val; + } + let b = val; + while(b > 0){ + let b = val / 10; + let c[a] = 48 + val - (b * 10); + let a = a + 1; + let val = b; + } + if (d){ + let c[a] = 45; + let a = a + 1; + } + if (a = 0){ + let str[0] = 48; + let length = 1; + } + else{ + let length = 0; + while (length < a){ + let str[length] = c[a - 1 - length]; + let length = length + 1; + } + } + do Array.dispose(c); + 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/test/String.vm b/projects/12/test/String.vm new file mode 100755 index 0000000..4d1b86c --- /dev/null +++ b/projects/12/test/String.vm @@ -0,0 +1,348 @@ +function String.new 0 +push constant 3 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +gt +not +if-goto L0 +push argument 0 +call Array.new 1 +pop this 0 +goto L1 +label L0 +label L1 +push argument 0 +pop this 2 +push constant 0 +pop this 1 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 0 +gt +not +if-goto L2 +push this 0 +call Array.dispose 1 +pop temp 0 +goto L3 +label L2 +label L3 +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 1 +gt +not +if-goto L4 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L5 +label L4 +label L5 +push this 0 +push argument 1 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push this 1 +gt +not +if-goto L6 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L7 +label L6 +label L7 +push this 0 +push argument 1 +push argument 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return +function String.appendChar 0 +push argument 0 +pop pointer 0 +push this 2 +push this 1 +eq +not +if-goto L8 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L9 +label L8 +label L9 +push this 0 +push this 1 +push argument 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 0 +eq +not +if-goto L10 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L11 +label L10 +label L11 +push this 0 +push this 1 +push constant 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 +label L12 +push local 2 +push this 1 +lt +not +if-goto L13 +push this 0 +push local 2 +add +pop pointer 1 +push that 0 +pop local 0 +push local 0 +push constant 47 +gt +push local 0 +push constant 58 +lt +and +not +if-goto L14 +push local 1 +push constant 10 +call Math.multiply 2 +push local 0 +push constant 48 +sub +add +pop local 1 +goto L15 +label L14 +push local 2 +push constant 0 +eq +push local 0 +push constant 45 +eq +and +not +if-goto L16 +push constant 1 +neg +pop local 3 +goto L17 +label L16 +push this 1 +pop local 2 +label L17 +label L15 +push local 2 +push constant 1 +add +pop local 2 +goto L12 +label L13 +push local 3 +not +if-goto L18 +push local 1 +neg +return +goto L19 +label L18 +label L19 +push local 1 +return +function String.setInt 4 +push argument 0 +pop pointer 0 +push constant 6 +call Array.new 1 +pop local 0 +push argument 1 +push constant 0 +lt +not +if-goto L20 +push constant 0 +not +pop local 1 +push argument 1 +neg +pop argument 1 +goto L21 +label L20 +label L21 +push argument 1 +pop local 2 +label L22 +push local 2 +push constant 0 +gt +not +if-goto L23 +push argument 1 +push constant 10 +call Math.divide 2 +pop local 2 +push local 0 +push local 3 +push constant 48 +push argument 1 +add +push local 2 +push constant 10 +call Math.multiply 2 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +push constant 1 +add +pop local 3 +push local 2 +pop argument 1 +goto L22 +label L23 +push local 1 +not +if-goto L24 +push local 0 +push local 3 +push constant 45 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +push constant 1 +add +pop local 3 +goto L25 +label L24 +label L25 +push local 3 +push constant 0 +eq +not +if-goto L26 +push this 0 +push constant 0 +push constant 48 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 1 +pop this 1 +goto L27 +label L26 +push constant 0 +pop this 1 +label L28 +push this 1 +push local 3 +lt +not +if-goto L29 +push this 0 +push this 1 +push local 0 +push local 3 +push constant 1 +sub +push this 1 +sub +add +pop pointer 1 +push that 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push this 1 +push constant 1 +add +pop this 1 +goto L28 +label L29 +label L27 +push local 0 +call Array.dispose 1 +pop temp 0 +push constant 0 +return +function String.newLine 0 +push constant 128 +return +function String.backSpace 0 +push constant 129 +return +function String.doubleQuote 0 +push constant 34 +return diff --git a/projects/12/test/Sys.jack b/projects/12/test/Sys.jack new file mode 100755 index 0000000..0eed65b --- /dev/null +++ b/projects/12/test/Sys.jack @@ -0,0 +1,53 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/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 Output.init(); + do Screen.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; + while (duration > 0){ + let i = 100; + while(i > 0){ + let i = i -1; + } + let duration = duration - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + var String s; + let s = String.new(3); + do s.setInt(errorCode); + do Output.printString("ERR"); + do Output.printString(s); + return; + } +} diff --git a/projects/12/test/Sys.vm b/projects/12/test/Sys.vm new file mode 100755 index 0000000..c95e21d --- /dev/null +++ b/projects/12/test/Sys.vm @@ -0,0 +1,79 @@ +function Sys.init 0 +call Memory.init 0 +pop temp 0 +call Math.init 0 +pop temp 0 +call Output.init 0 +pop temp 0 +call Screen.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 L0 +push constant 1 +neg +not +if-goto L1 +goto L0 +label L1 +push constant 0 +return +function Sys.wait 1 +label L2 +push argument 0 +push constant 0 +gt +not +if-goto L3 +push constant 100 +pop local 0 +label L4 +push local 0 +push constant 0 +gt +not +if-goto L5 +push local 0 +push constant 1 +sub +pop local 0 +goto L4 +label L5 +push argument 0 +push constant 1 +sub +pop argument 0 +goto L2 +label L3 +push constant 0 +return +function Sys.error 1 +push constant 3 +call String.new 1 +pop local 0 +push local 0 +push argument 0 +call String.setInt 2 +pop temp 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 local 0 +call Output.printString 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/test/__pycache__/symbol_table.cpython-39.pyc b/projects/12/test/__pycache__/symbol_table.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..e6bb655440cd6d0590bd2054dcc80eacde1a3ddd GIT binary patch literal 2287 zcmYe~<>g{vU|`T>QcL{7#=!6x#6iZ)3=9ko3=9m#3JeSk?hGjmDU2-)DU8ibQ6L^u z3UdoX3Uf146k`fYFoPy*GO}I}n+c|0gn@w}l_82Tg&~S5g)xPxg&~SLg*li(ljRm$ zaAj^%eoitYNCOmu*dV>mAiHH47#LC*YZ&4oBqNy3l)_ZQ5YL>#5X_*-?01XdB}ga8 zwBq=@#N5ro^%i?^d}dxsYQ;*%TP($?IcX~yia=if<>_n{6Iz^F zR2&l==&0-HUR0WrS{CDyTAW>yUl5a*n3rNyl3G%fSsYVPl%JKFTv8lkXcSYDT3ixS z40d;XNn%n?s$N0mEsps3%)HE!_;`@Zi#b3JVq^ouDt?F`^C)lwNf*T|T3Lp?J2HC~ISOj9@4t*c2p`XIi z!Vtxh!kWU?!Vtxp!k)s>!Vtxl!kNO=!Vtxt!kxm?!Vtxg!kfa^!Vtxo!k;40!Vtxk zA{fk|DRhe);-e6d=W$0JD2US;z){B#%&?NtPm}Q$b8%&E5h!#Z-T^5o0{aQ%Sr8BG zCkDnU5hN?%A(zYo3Rfrwu|Y``oJ>HTtYOGvSio4q)XcDuk&&T>5yVenlw^o!u3>_+ zS!$T!Y}Oiv1#C6U3mH?GBpBeL?9gQO^8f$;|6hW_R+FPhh=GCO7F%LLL26zKIJ}EM z))%pXqJtGA$61zG6rY@5npaZ94$4$4MVufxR8?r6zQvZ3nwFWD$_q;9AkQ-}@-gy& zVU-ZF{~^kfLB550o&m%LVX*I=7#P6rC+vGr#>rv;hYD*7A|%+rerEA25(fE&Be5vG zG&eP`qzGigN_MdCi$p>G0R;z|*TMc>$&Bt_kbfZl1;y_zf#QR7fKrYxoukh4`78B&;n8NhtzY^EX;Mg~xY0pc?;Ffs%)6vBg_xh%0LiZv%c zIWeb578Kl|(qEGq;x$k(6@mPOlGYSJ%D}z?6CkhMVh0ue@%d?*Anyr)f*I^JE=D#+ zE=D#c9>ywRWKTj>g{vU|{%kN+xj^7X!m%5C<7EGcYhXFfcF_OEEAoq%fo~<}gGtxHF_Mr7*WJ zq%b!#MKPu@1~X`~yaeg;O9qk17_MKBfq@~FA&N1DA&M!5F@>pxA&NPLD}^P6wS_T? zC50`8y@er)HH9OEvxOmwErmIlL6iFyXGnf_YF=hlYEd#HlBpmz69WT-Gss~|Acry5 zFvK&YFx4=`Go~=tFvK&Zu+%WbGlNA~QW%06G+F(MK-z9GXbS&g)cD1y`HM077h~)% z#@b(u)xQ|+elgnoVzj-*sP&6c`xm3`FGl@ajC#Kqt$#7<{9;u5#aQ!;u})L;7He`& zVsY^;w%pW`jQo^a9BHL_$t9WjdAGQe^Ye;Jib|79@{4XUXXceeu_xu{=cFd)-C{}3 zNGytCDa+4Hxy4+TSagf6xFoS8Gx-*4T4ria$}Q%c)RJ3FDfzdUGShCcq~;W--eN7! z$jnK-#a5JBQd*REi>0KfH1!s1S|Uh}C9gCm=N3yzMrN@l>n+C2TP$fHwd}=}xk>ps z#kV-JQ!C@k^NUh$v6g^>Pm}Q$OL1yW+De8Z0|o|$UvAD;F`>n&Ma40}fsVS4?nR|3 zsbw)Psm0kP`2{g~iFqkTC8;GvnZ+>$Mfq8&$tA@xhDI?Zsl_ERVDmuHp;u6Oiz7Zh zGcU6wKAsH}4d7(N$OeK;Y|K?c@R-wsDf3GP#ThIbL2MRS9HucaFw`)nFqASB@zpS7 zG1M|bc*Sxxj46!SOhrndIILl;VaQ@EV<<96VG0JRXO?70VaaAHa!6qfW+-7=z?{NX z!?=*CC?JI$Bwxdj#Ztyl6qmvg%#gwv%m6Y&lgqCNlqPSnXQx(z0tuWdelaTD;wvsG z%FIi521R3HUP%>mOp5j`{>;3R)b!LMnCLAwNGRXp%1lYkE6GgDOfAx6EdnL(B3%Xs zhFeTUskc~j6HAgaigXwl7&MuR^cff!APPXC4~~K&Ly%G~aA?MtR2HNPfI<+I!x$Jj z7}*#F7+Dy(7+Dy3pqPu1g{eve5uyl7_wN)7>be*{CGBq zI&gMl2xfrEfTLj-NX{H&8&rP^OEz=SJaDvu?J);MEK>?INKIh{NVPZv*d&%3MsbD| z7BG(u6is0FvBFGW$TWemhyl|aaR!*LQkW$evRR70O<*i!0GSK6VOI^PKmhBD2b)^R z1u|Qc4Uz<^m|}`wg35#<69xu`DyEonP4*%!P|Psrq~;ZAgW}B+L|B0cP;7#uQIi=d zNLT z$j8XSB*MtYCe;fHi>B4Eq_CSa)Up&7)Uc#*iZj%*)i9?p)UdWPNix(h z*RVls1@XigYMEvPYax@t9bRJwPK^SV)eA5wPN+bdAkUdxr%H+amdTS!0-}O@MyB# zV#zN^&AY`?l$w}Q1d8Qb%*CZiMYbSipqSTW2gh<0XG&&KDyU4ajAGBNj0cspQOqS3 zC6I)|T3nJ?RC0@@xFo*-JsEH%=cFbUfpyq{Qi2?)`VXv literal 0 HcmV?d00001 diff --git a/projects/12/test/__pycache__/vmwriter.cpython-39.pyc b/projects/12/test/__pycache__/vmwriter.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..a048be9fd9968b9b1081130676e492b791928cf7 GIT binary patch literal 2957 zcmYe~<>g{vU|?V_$W4skWMFs<;vi#Y1_lNP1_p*=AqEBpcZL*(6vh^Y6vk$zD25cK zU-m3quq~3U3Nu3qurV3V(_~3qurFieQRR3qurlig1cZ3qur7 zifD>h3qurdig+-Cro=6dFyHW^%#zfiWRUG3SAZ~x4RXIT$o*mr3=AaR!nEiQ>E%Pj}HTd$z<7Ds%1W?p7Vd_2hA#VjD_ zF!C@~3BvrQ2a`_*c?u*A!XP%t6<|*qF)%RHFk~?-U`%1GVVup7!c@aFn<0gHF6%-@ zMurk5WYM`S&5Vo;-~eFpt70uEEzVH*#i($Lk!vM$5yalp7#LPE6@je3#R`^zxDOOcMPNsAL!6M4 zn3R(WO8!t+iZE7*pt%yP1jCu2&;dKsjgbMIq_UZc6rkbG1a&4e$bl0W^OR~BQ&_T@ ziX5Qwu$W+j$}`n4rm$x-6~#g2IiUL4LGpP|Y8X>Evzdx&pt4+0S#GfGu^Pq{o@}O~ zSx{MCs4O2?c0~itIurMut4G8paek zu(%UgTpl70PJ;@5zZkWvSQ1lGxNb2grlkC0)U9GEE=}UP#avvPbc;DJHNA=@FEyR( z7o%+zb7~>iEvD4MUyOED%;_aux0upPelglqG3S8TIVHas)v8z$^T0;srTk*7sbbDA z;=09@U-XNyu8Jiuzl7@+b6$SQEk>;>Uf;x$487daoRZ9foXVG=%=e2?zls|yoRV3V znUbo>0?rUcyrAU8hm_2d6LWGjAxSNYJvl!&H!&{-J+TQu5?f+XW=TeFYDs1?$be!y zP~K(aVB}%sK_a=pY}_OlBM&1NBNrndBNt_!X%zFfdecW~S+ajE6c_lch)t6ojBaLZmdTuIGTbJ~Pc6 zi&nqrT%qzLYXi&volv+|+l*e_84Z_f5DH6m?MX)jo90>6xl?AD25p#q*AU3G*1p5wDHb4^BLI!9fgV9fu30z#< zVolD;FHY5DECQumbcgVQCF9F-1O*E?Y(zjTa9+~}u|P3Vqzht!QfHAKhy^MXicCQ) zaAAfZK%r6u@+t@ygBq0_j2tXrs0b!m!6X}4jh`kXm`3s=*d&l4w>WGd4z&ZB^cfV0 E0Ez>6{{R30 literal 0 HcmV?d00001 diff --git a/projects/12/test/project12.zip b/projects/12/test/project12.zip new file mode 100755 index 0000000000000000000000000000000000000000..0a2df83883433c9141f1ccada2a0bfa4d8cb5c9d GIT binary patch literal 11271 zcmWIWW@Zs#U|`^2aG4nrte?!3eTtER!HJoHfs28G!Lg_)u~IK9F*!STl4JfA1A*4} z+HdP6zHZqamAX(|wsNmf-uCGA3GDY*PWSq%yX(}8W3d-%=C`un4ics#Lk+7GSW37%m>H}@K?=((Y)-s+~~zbV6|_2i)gmx>-f$#qz-WYgNS-|Hd& z_svbwCU5JtCTDHA813-#TB+V{b;F}Q6PCwqkqk*wdH>XT)*OX-rvgg$H}$Vur`dUp z`(~6*l(<8y*vp+K4_7UfwJ-m_{EXO>Nk31;PZ3<|_)PyHQ?GHcWVo^;^M>EPQ%{@; z{VL#7W_TuLY;Q+C?7B z+cjeu*WP}&R1k5(OSj&xGe^%VUhip4Fu}amj2~e zo);8yskwNiLzJ#U=$u8`6%IBQotJ0%zBy55CUWEdxf_0Omb{fa?^3;^xW@SL&$LS? zS(FK!g|O4_~qG6)23vn z?m6cYd3DxD(>2??E(hJ+?srnm&d7Dg*SMw96XOEx+W1cw|Ik?(v~g=ycF=<*OY|2^ zdZg~Vb=H|@lgmqHb0}^8q3)^Q*MH&5!RE)x6%5M*Hn<4wY>n}_p-`5nbiKWhgI$2%E4xfh9)-1xvQ`a{Fl#QR~0*QVA<)40`-b!>RzV;r>Meh9Ck;DyMi zrv9eFGJ3418y41@Y&!5ZI3U;Hp{kF#qt?oGs`;$p1vO8ccQK3oIy!5|hL>#~ld^OI zpZEoMcV3UrS!fjQX*^ky!_K4V;l>EQ7zsigw9n|e)qqo>zNt&AwHW?Z82prmwL zOk2$riH@eWMQuAmiUUO!9h^3!;8pAKhg%rmh#c*nad!UW`%|Z7h%UaWfnAgSYqQqAE}B)2KQtx^=A*_&Ut#?$=>2pX!OI+6Bu0A?eI`ny!7gfhg|!id*>b~{+k)S z(enJfEv|10FMT`t<>BV+l7zGe3lyJ!|M^(`{JeiJUff82y!YG3i~9xJoa2knZg{M_ z*h=p0r}KRKj;!iXjAT#ru?V=sp190`yEvw8!V-+IZcBd&U#!Wmhj_Ny%Wu9c*a|GjdH2(!8>Pfb={jC`^>Jq^}XP_P;Kv>wOY%%AKrH6otA1c z+b{pcY~!9?7k>9#-L$OTW7ap%TfC<~qtIP2bXc%RjT^^qYgGhtq>LZQt_b*R+Gi@n4qwo#)k7oNn+&CvNxF z-52jkuGuj2aF5cp@M3F0$-d0x=Qq4|TKMbP(=Pk}42bNXF)bwc2WKz;MJ5J@a&86& zP6h@B-^9#3aMs^DEjIs_fk@l?i9h(=@0f%LaOGxZZtY%qYl+v}Tbx^FXNvnJ9Z=n< zd|NZ=^1t7GxlUbP($mAbCu~^rea~~tDKo{yE=yMPb>77(Hjd3Zn}l z-pia6)6cSX6>@!<XPDY6uawG#lJgH%EHybBa+=Lm`^Pbnhh|kW z=Uw+K*u%X2y6}$aAuBJe+9$>0XH>2BMc1-R(Vi)M1X0N&Dfr&57*^JP-Oi*=l+Y+fJ33u34cnsne;kXrbgo z9sQt1GasBPQuleP8L2tB+0)^j($#BsclvV6Nt@bmO-rzO?0EYL)At!Hs?&Gfu{=A^ zCw%dgtbh-hx?GmAZ0>Kp4YC>cuN1jEViQLJd{tF_&wfy-CZ z>EeQ3&Ujywl1?+pHd&pV#2(e7b^^VQHOrnCbX6~Zb3rZkX{V*3%M=1jB&2-?JCdz^|!B7h^LzH5N^&({K6KzB)-q?ojSdnfWym zvirX0Nqko?uJYa*7i^w9yKJAhSoNpBPrfFquGCYB&;D;F{o^+~BHf>>2n`lt^b!eR zVPKHsho$?H3~;(X8Xnz!*+HaE{0~37yvf^TYrk^c5_J&~*|VUDf76L2Gq+v#HF|p{ zWp>5yxATlWjeTdCXf>tY_EEdPbN*-FGNZp69mf29t!9e#a1 zfx}->s4+=PeRZ+qaih*64^w_cH=E<~hUtPjms0Xtd@itb?w!cCb-z=p$`;3FujUSO zR}O*Y69s2;s0J?kU?vjo^qBY6vJLm@8fMI%%EP$Tz4hA3ui2kFGI^h9)*ROTli@6P zAb4p+pLu`wZl>I~qVt#PN*NO{+FM@ahs^IkdNN zYfRm`8Jpa0BySflZ2tCe&xg!8ALg3Z8dxyZ?5k~@@$%rmJlEEb5@!;s>H{JRop{cD ztPbNe6)_6QSZ~nulJ(K5uZ;iNqqXvarcOCuC-dy--rAriEv!*)D<4W^Pbtc3eq&)j zg~h3=`)7QQf|KamS^7KlJxqi<-a_BGL(Vbv>$KmYR z=`o?~d1fb%|8J63``;_AR#}?V_9uVl!U^x5x2{!Yyk5?|=IqlgBjr;cx#?UmCa$+n|^)nko4cS9cPdr>z(}LJ2#@(Non;Bb`&z6`;>`+VL3Yk12?F; zP0h_Of^@KYLw)maISA}k{wVLZSA;{N;F8JNct+H+DeH*)FcSFY1 z|Mzajs+$>leq=mTv#0X&pFKS71?J*xX-e)3-m_j7yTWtrb*aispXBZ^Zeh*87xDrP zTMwKQ6k2NZqrkoVez8tK)Z<+{O!*HyO|3j!Ih zJfFVvwkFGyPSmMyZ`*+Wq%skwJgnV>JH|4EvapDM0wuwTq&&=V?F(%Va*?{ zoU?C@m!6#N!jRqmWwv^3*Ytba4$jrGS@kz}cfWIO?;`hGH7C}ulB#41UbpPyt?5p? z`pde%{6VUO7u1CY+e93DT*1x25NZg?4gRGi1*Ik6YIyIg%IUXF1P=UP_WrANhjrwp zn>RMjZ7G;qG*x=roTUwqEjr6(ts~C0v7Sm#cblYox-4z`1^4R-s+;O&c`I99x+z(` z!_y*KHS^4aecauXo@$p_$h1Yy(7kJ<*WJSZIjQzLpAAp^#vN&4buJRzCt5S-_pBkgSBec~qL(ufl3r@dV%MUGktrWS*pzG6Hv-mdE6>s}m=T6wy6ZrpP z!HZqYVb838@G~vd`J5{sm~rZW@wN%qwn(u(X7qj>+NsNZVb>e}K!%o+?^%y`>^fc9 z)VKX^&$ZPH_Fhb2nNY2BOWa2PfZ^@AJvS;e6BMiZ@(-IFb)4WN{O`7%&Lc*pNggjM zZX9vdu{vR}%;$eQ%Pifb$3cmkH}5WAWb$Or$s4KlNe_&Eum{$~Z@=4SZBl<#Y;CrW z^8Dwi5o&_F!$lr$UGYcf&d18Vd~=TJhG+4Gu)6hYjvm_d?aFGIzXe@&5>1nsR<+CRKBZ_Rbm0516$Zior|sNyNZ_@@ zzqtB)p}WtnfAo7%@COO$tMXcpisDmVb*mqnrkkpCdYfX@T5k{44&CRW5ggHKtK@?x zA6vT3wmR4gcZNuINr9deJzttmGN3`rMP7R!MT1K9E*LP zv_1_~J*q8|v`mGsFG^T&y%0x!NN4=thwR~;3j}Ss9)|RO2{lx8Rr)33baYvfv%$1` zhPynDaJEXEUasBUle)08qSvWn>d%~z!*iIq9=<-dqV26fv&B*Y$LS)v%lSU~C5E)@ z61aOyHepIz^3{g@oMu;*-QufG%!rT;IGq#jkSYQ^(W> zCN4#l?`apdZ(FgiM@g7V@JjQdK(h|b))^6JnYOF>>GGb-6J7rAO3#d{m4aW^2X{oO zD`hA=V{vM0h4hS8M($wicu+A9~#Jqr<7^>6a_}*4+8h z;FRFC{kmz^)U>C|`ZZhb7pVN(zxIT>2-Bj=e?s5o@ILX^Wa)`C4VH@Dw)97jlh0~4 zyO<`U=GC1)<~W^^^6q$d^AR_bp{%J}da6kE)bFaT1-F7cN}sG|C}Q|1+FBqTRAT)# zo6B(BQ{$a{6X(CVQst*;^VIMBa;86utp_4@-Bi9G(6QjI(7I<@kD|E@Gj}`3p1Y#3 zZ?V8-x96KKd^z!5BzU$Bgh(< zEpGfbxuN&=dO`a@fu6vOTl=KAuO1gUBJK0E#Nq#k19i(3er-KfwKvQE&;Ec3ubzHW z^Q>F?*LdZ<(^FKX^xsMe2TfS%6MdF5@lMPtJ&hASUP*PQHV8@y2@0f}7_C=eY}m8S zglUtCqF=1Y$Fj>S{d}D6WZh+$v>^3B;-U);Ydkt6GT)YSY4&yAH0Aubq`D=4jZEfw zV`-sBv!AZ}ns-&gmXninO18uNRT**Oz2$lyCtOx77FRTS6ZI-)(u9>Ei)(KdPMS19 zE9LIY89UFUdT&~)aL&Woq4n{-lO7$S8_&)#pD?Foht#E*DG`FZl@(vzUH9AehR)7< zWyQF&YIRfj)YgUsOc1y~iKYJO3z?&HS{!CL1sgZKy{^Ek>Dl44No)JIddam4)j~#7 zCw$wJ=e*A2#2Utn+QQOB3ly%Nzx%b7RU}IAw>4*B)T9^k-~U9-iJ2^L{mi^~OMcyz zvNMhO)805?hv5>{$sB6SUPRmf`{(Jj>$2Bt_on?G9rs_{U+2U;k!L6qSV6+uiewSReXcXn16-t!o=(A=1!6}JG1Io1kcl4 z#r%nTbf4;8+aI_6eq4-;j2j9_l%aQ5BJ1AOgOq|@u8z#D;6j9h@S4_;@5uE$0e^FCM(Jq zw#HgZEn?%#6*H1tF9jMN?&{WKZGAO8pg8Az_`Q-dwYplnlh!S7?mN8BfVp0V^T5KJ zF7MV%cjr)$QT+7j(7iRX8xC;<6y`W?xIRHQYxaTO8DST<^d0px*_JwStNh$G5$nY_ zn%}tbcJqD-k^4yoX}^CdYM(k#w|G|Sd=uWxM+Q|nJz0IMHPhm6O8-yQvx}WGZA0Lk z<-c>oB#j!^7p&hV6{GGWBiGSA!TfTArC8&A@sAsWnYZr!|BK_zt@-SUY+X^8uk)Nw z63BhFO;rDa#oujLk38g9q1|13C)e6SL0CSwJ>f>f%Vx$H!5c;#kBm;U79E(g+Q23G z!=**iQ|xv&ZrS*rN$ch2>mrigeg^ZZ)=pvSU!Ah)w|uKFNIvvk7XlOIyF;p5~l(p}$*iUzuMctWqoTv|q7GyWce0!|k-$v0wh` zGhhGSF1T9#sg3_U@0^y7gYmd6FJHE7muNxj$Ly z^SLvk)3!G1@O^#YvAJFQOQmSqMB8Vdb;6Qm`8#C}B~|7e=nCmjpXu}Ll|+w1@OO#1 z<-D)^^r!!McA@{*=XA06edOMp%@1t&{NH$+@5vj#&0Hk^x^I4~<@59HWs|bl z#`{U@p8I~~DF_kLzIiWiU4>PB+3PodrpwL0qZX}m`)1R0gQn{R&5!p5{P=FEeCJ?f ztOxrB6aV!mOA7UNy_vgu-fsT;4_}_oi8Z@6^_BMqHu+OY>yxjjzv2Cw@buNU)BTLnxhaxeGuNM)=w$Q4M{91{+~-z>N3$}u z_Z^J6`TFHW4P%G-b004H&7&qD%b>P8VfFS6abGVgn2A49Q=a4=xA5s(zP+cm{<>IM z&8RQqen$D#xrZ6$ce3|pm=rxYyYkZ4IWvvZ{b%ot>dLgfYmmC3tIZq@*(k7C zaKC@@%$i4yVeWO`U+7GjbNsEp&X1Z3hJ$X8KQu^vnV@uWy3ew-`v+C{ws<7nnCQXP zD&?+YYM`eg&F{)ku(5TmQEFH-WAUt!Y((=cpG1&(%K6Df?T>3&s_*b9fpVa$a#=1;Z8miuzN8FFEKKx^& zNmi3oVVaD9s?q$W{V!d0wj@maacnB<)OHq*HD?a}{bDMp$mwCd&UNzt+Ek&%vu=D$ z;`x@9b|zWU>_f+u}~2sjV<9> z6YKeQ9{iETSH63$_H16^TuEu4B~J?98JvH{zP$6%LSG*- z#p7zVNB8^m1Zdp+^7r?50lD4)$q?)Ns~o>*7Yb9?(I?vTRe`Gdz zd@QvKjj=Z~m}9y2_s;b2$G7fltnhCzH@-Zxa^>vQ)$E@GGQ-x!GoOz7du&aKPfYqe z-ux)>k{IP=J#ObZuAsCp*Jq0e}6uv2H@OZE?q%(B(flSIC1?cTmP zG^(X@<+WTr)tb`lv9no^p8Ig4r|-c2)Sz>XNw;=hUD~#BRbFVXulZbj=xO+iGj-+Jk`i494=gTd z^XF1(YVwvVXD~{i)fldn5Y@B%Zco#6;rI8d9wpXWNWF?~sE?WHWjHm7ODyz6LU`%3 z*?MOcG{e%mgkJqA`X#_|S@a0&r=P|fPNY4KjJWGEbLEt4s#>$Nf;Bg4hpi7v3tjf$ z#nLpJ8_Olv?oV{9i$0Q;dnGO0wRh%ml-7&-Mr%~*CYBTd{z$Y_6}LO$G=U| z7TazRCYMu12b5o{^6+C|=y<^9r zw%AE|vJ=$qRK`raDRKS$+-(0`1ONY*6U@GgpLw>;;hW%@Q`YCtt*ox{4KBA1FR;n)=>-+f<3%)A1SghpMBKbq5P>+YpyeEXU|TPzvchz zUg$*?o4ootGrX)N^u)iw=1*qrn}Vk^&3bvU;^)`<0v|-Uvv)Zv=SX$UVpih06}C8U zS-0fov$w+MUwJblZc}p9W@WZq_F(hi&5!M0>@#}f+P^hK_l)yBk271>Piv|C9a$oF zrrG%U_jl)>2b7o|WL7NPly)vvmHQ~maZi4~Kh<`IGkqRikbC^b?fUVskC!<8$|ioz zEyv{4mbqv=@V=3^z0PUUhn;Y;v)W zEB%aF_dX|_ZI+(J^YHag)f({-ulo_T z7Zp`hmgOso);Ke(9>4tj@lGL*7x^9q#WgK${`2MJ4+j763@$M}a&Q)hkcO6nRP@Wk zmPM_K!9D65o-i@Zdk`b`;)aii;$+R~KYW`->ztK!J35ZE1S~R2X_&Fflz(YsWMHV0 z$L}+fCfwa*pgggy=-`W%3>$7c6NV50-zdp?CB~mqK1*jwB>P;NqO{}L>Wq**?|Rjo zg#*s8vTpT`oY0=+>lS0+Bh1^l++%&PQmw7Mo!zOW&m`OI8y5eFGLmX7P-D57*%6s4 za#X7$V^h%UXB*7+YNUO#jM182(WxY~i&bhlS7Grf-QaAQ{*$_$5p#};NgGe^f7)Ov z#pN_}7Wee2E~1w^`;&SmE`EII)TJeI$HG}<4#=Bq*Wbpn-iTd3!RW%}cda3Aa(m8i zew2Me>&}^(_iwsCPfffZ&OGDl+C_&_f@TVcyw*RsHSJR0y-?xbCq)dV9y{=C^O~&j9qXMF+?BTfR?PW1#qBFBL;o-I_&#C5>Ik3k-w}akTax4>6vg&VZFiNI2{BAx zCYiMP_yca;bR^4UNmj15T@=U-lxB9&}|M`Tf3gI6*9`~3s z9t$)seem($HHWSLS*vFGY`L}QwKu;?-6r=x9Lv~6olEtT=Ux)kI`(YVMYo0g2j|L0 zE{a&fuQ;#AX9{&pcAx5SihJloYm6FS+56nmX)tM`n z#kv&~S!FQXzq@njSRtfFw6#F?p zZNM3`+|dTF*PLgK6O^vjUlE%g$D8)GMuAoA#*+0e|NYY5a(+3uQn2oec?)Zl z1@m@ov8~-6w;7KaynV#8?!;ETW5E?^XWSYBmOZlW;fxZBW#4;H|ChE($;GWNef{Svz--4gX*iQG6d zqF1MK$($?FpWZK?qVRpq>`gG6y)^9RpF@k) z&#qitxLft$Cf0op5?1Do=Qi8imD0Ib#kWQ}JZ$UrGM?r(+i7D4eTZeOxu zV$2lwb*oQJTw)NqB=&5hy;>;Kz9hAu7Ti51S0%fqeyDyMmL^hsLa2^Caf0fj4;>~& zAx0X>Npo*yt)F^vf5?PHg+Gzmhhnn2ejHX1-P?L##kNS3*;aGi(~5+iBsm_|JhFws}Jq`y;^Uo`(=l?$z5ej&D@OB z&OMV+%U^j|Q^qq_Evs`|o$AJ!X)|;=7VNv@DLZNEQ`0&6SrPipPL0|x=Fivfyj}WQ z_mW-UzVyGc&uY#m#eTi|>m$#v>HlwDI6q5!@vNgW`@V|kDoj*95hJJPe23qh#cI31 zzr1pp@`cjpC7SnJZ@f+_H@f%n_GZDSk2u$~eD6zmpt&dBB5nV=`46)=mx`sI{5^N) zvndzvN6uf>qzaw$t_&g`RyO?uj{J$#}MGn$YjqTf@9613IhZvKq#aYj9d&5 zF-8UnhULFFKA$;yopHfG>8P$_*BL9A9~~+|GV;tK*Q({=|s3Ru0+t1Qw}( z#mBBQ=FXA<8y|J?Glub)t8b8v|Hz8876;jAV;;qTQ%A2eE^<@{8@;3b33nly%P|)? zARGOX17tLGxdXD%PA;p3OO9P!W886w+1RH+h?<)+$G5fQ~ zhV#oXFd+4AkqwvJUGr4<=ygWd`q*etTG?6q9K&$TCK|HgGZh&af)NciWW)DnZ*c(` zIz44R*zlx??(_pkQ4=C&xruCeq8g$UMK-zGo0lu^*mcIvaaJ}^-r!{5 OWUyyuVA!Mq;sF4g8)no1 literal 0 HcmV?d00001 diff --git a/projects/12/test/symbol_table.py b/projects/12/test/symbol_table.py new file mode 100755 index 0000000..7c62c3e --- /dev/null +++ b/projects/12/test/symbol_table.py @@ -0,0 +1,62 @@ +class Symbol: + def __init__(self): + self.s_name = '' + self.s_kind = '' + self.s_type = '' + self.s_index = 0 + + +class SymbolTable: + def __init__(self): + self.sym = [] + + def define(self, s_name, s_type, s_kind): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = s_kind + self.sym[-1].s_index = self.var_count(s_kind) - 1 + + def start_subroutine(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'argument' + self.sym[-1].s_index = 0 + + def start_class(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = 'this' + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'field' + self.sym[-1].s_index = 0 + + def var_count(self, s_kind): + count = 0 # it is -1 so the first index is 0 + for i in self.sym: + if i.s_kind == s_kind: + count += 1 + return count + + def kind_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + if i.s_kind == 'var': + return 'local' + elif i.s_kind == 'field': + return 'this' + else: + return i.s_kind + return None + + def type_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_type + return None + + def index_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_index + return None diff --git a/projects/12/test/tokenizer.py b/projects/12/test/tokenizer.py new file mode 100755 index 0000000..aaaa873 --- /dev/null +++ b/projects/12/test/tokenizer.py @@ -0,0 +1,78 @@ +import re + + +class Tokenizer: + + def __init__(self): + self.i = 0 + self.file = '' + self.symbols = ('(', ')', '[', ']', '}', '{', '>', '<', '=', '*', '+', '-', '/', '.', ';', ',', '&', '|', + '~') + self.key_word = ( + 'class', 'method', 'function', 'constructor', 'int', 'boolean', 'char', 'void', 'var', 'static', 'field', + 'let', 'do', 'if', 'else', 'while', 'return', 'true', 'false', 'null', 'this') + self.token = '' + + def token_type(self, token=None): + if token is None: + token = self.token + if token is None or token == '': + return None + if token in self.key_word: + return 'keyword' + elif token[0] == '"': + return 'stringConstant' + elif re.match(r"\d+", token): + return 'integerConstant' + elif token in self.symbols: + return 'symbol' + else: + return 'identifier' + + def advance(self): + token = '' + i = self.i + while i < len(self.file): + if re.match(r'\s', self.file[i]): + i = i + 1 + continue + else: + if self.file[i] in self.symbols: + self.token = self.file[i] + self.i = i + 1 + return + elif self.file[i] == '"': + i += 1 + while self.file[i] != '"': + token += self.file[i] + i += 1 + self.i = i + 1 + self.token = '"' + token + '"' + return + else: + while re.match(r'\w', self.file[i]): + token += self.file[i] + if i + 1 > len(self.file) - 1: + break + i += 1 + self.i = i + self.token = token + return + + def clear_file(self, directory): + with open(directory, "r") as my_file: + txt = my_file.read() + txt = re.sub(r"//.*", "", txt) + txt = re.sub(r"/[*][*].*[*]/", "", txt) + i = 0 + # TODO this should be a regex + while i < len(txt): + if txt[i] == '/' and txt[i + 1] == '*' and txt[i + 2] == '*': + start = i + while txt[i] != '*' or txt[i + 1] != '/': + i += 1 + stop = i + 2 + txt = txt[:start] + txt[stop:len(txt)] + i = start - 1 + i += 1 + self.file = txt diff --git a/projects/12/test/vmwriter.py b/projects/12/test/vmwriter.py new file mode 100755 index 0000000..5bf6929 --- /dev/null +++ b/projects/12/test/vmwriter.py @@ -0,0 +1,75 @@ +class VMWriter: + def __init__(self, vm_path): + self.my_vm = open(vm_path, "w+") + self.label_index = 0 + + def write_push(self, segment, index): + self.my_vm.write(f'push {segment} {index}\n') + print(f'push {segment} {index}') + + def write_lable(self, label): + self.my_vm.write(f'label L{label}\n') + print(f'label L{label}') + + def write_arithmetic(self, command): + if command == '+': + self.my_vm.write('add\n') + print('add') + elif command == '-': + self.my_vm.write('sub\n') + print('sub') + elif command == 'neg': + self.my_vm.write('neg\n') + print('neg') + elif command == '=': + self.my_vm.write('eq\n') + print('eq') + elif command == '>': + self.my_vm.write('gt\n') + print('gt') + elif command == '<': + self.my_vm.write('lt\n') + print('lt') + elif command == '&': + self.my_vm.write('and\n') + print('and') + elif command == '|': + self.my_vm.write('or\n') + print('or') + elif command == '~': + self.my_vm.write('not\n') + print('not') + elif command == '*': + self.write_call('Math.multiply', 2) + elif command == '/': + self.write_call('Math.divide', 2) + + def write_pop(self, segment, index): + print(f'pop {segment} {index}') + self.my_vm.write(f'pop {segment} {index}\n') + + def write_goto(self, label): + self.my_vm.write(f'goto L{label}\n') + print(f'goto L{label}') + + def write_if(self, label): + self.write_arithmetic('~') + self.my_vm.write(f'if-goto L{label}\n') + print(f'if-goto L{label}') + + def write_call(self, label, num_args): + self.my_vm.write(f'call {label} {num_args}\n') + print(f'call {label} {num_args}') + + def write_function(self, label, num_locals): + self.my_vm.write(f'function {label} {num_locals}\n') + print(f'function {label} {num_locals}') + + def write_return(self, func_type): + if func_type == 'void': + self.write_push('constant', '0') + self.my_vm.write('return\n') + print(f'return') + + def close_vm_file(self): + self.my_vm.close() diff --git a/projects/13/more fun to go.txt b/projects/13/more fun to go.txt new file mode 100755 index 0000000..a7f066e --- /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/solutions_only/project 01/And16.hdl b/solutions_only/project 01/And16.hdl new file mode 100755 index 0000000..1fbcabe --- /dev/null +++ b/solutions_only/project 01/And16.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: 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/solutions_only/project 01/DMux.hdl b/solutions_only/project 01/DMux.hdl new file mode 100755 index 0000000..ede6878 --- /dev/null +++ b/solutions_only/project 01/DMux.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/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=in,b=notsel,out=a); + And(a=in,b=sel,out=b); + +} diff --git a/solutions_only/project 01/DMux4Way.hdl b/solutions_only/project 01/DMux4Way.hdl new file mode 100755 index 0000000..7346e03 --- /dev/null +++ b/solutions_only/project 01/DMux4Way.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/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[1],out=notsel1); + Not(in=sel[0],out=notsel0); + + And(a=notsel1,b=notsel0,out=out1); + And(a=notsel1,b=sel[0],out=out2); + And(a=sel[1],b=notsel0,out=out3); + And(a=sel[1],b=sel[0],out=out4); + + And(a=in,b=out1,out=a); + And(a=in,b=out2,out=b); + And(a=in,b=out3,out=c); + And(a=in,b=out4,out=d); + +} \ No newline at end of file diff --git a/solutions_only/project 01/DMux8Way.hdl b/solutions_only/project 01/DMux8Way.hdl new file mode 100755 index 0000000..04d82ca --- /dev/null +++ b/solutions_only/project 01/DMux8Way.hdl @@ -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/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: + Not(in=sel[0],out=notsel0); + Not(in=sel[1],out=notsel1); + Not(in=sel[2],out=notsel2); + + And(a=notsel2,b=notsel1,out=out1); + And(a=out1,b=notsel0,out=outA); + And(a=out1,b=sel[0],out=outB); + + And(a=notsel2,b=sel[1],out=out2); + And(a=out2,b=notsel0,out=outC); + And(a=out2,b=sel[0],out=outD); + + And(a=sel[2],b=notsel1,out=out3); + And(a=out3,b=notsel0,out=outE); + And(a=out3,b=sel[0],out=outF); + + And(a=sel[2],b=sel[1],out=out4); + And(a=out4,b=notsel0,out=outG); + And(a=out4,b=sel[0],out=outH); + + And(a=in,b=outA,out=a); + And(a=in,b=outB,out=b); + And(a=in,b=outC,out=c); + And(a=in,b=outD,out=d); + And(a=in,b=outE,out=e); + And(a=in,b=outF,out=f); + And(a=in,b=outG,out=g); + And(a=in,b=outH,out=h); +} \ No newline at end of file diff --git a/solutions_only/project 01/Mux.hdl b/solutions_only/project 01/Mux.hdl new file mode 100755 index 0000000..1afeb7b --- /dev/null +++ b/solutions_only/project 01/Mux.hdl @@ -0,0 +1,17 @@ + +/** + * Multiplexor: + * out = a if sel == 0 + * b otherwise + */ + +CHIP Mux { + IN a, b, sel; + OUT out; + + PARTS: + Not(in=sel,out=notsel); + And(a=a,b=notsel,out=out1); + And(a=b,b=sel,out=out2); + Or(a=out1,b=out2,out=out); +} \ No newline at end of file diff --git a/solutions_only/project 01/Mux16.hdl b/solutions_only/project 01/Mux16.hdl new file mode 100755 index 0000000..21b0184 --- /dev/null +++ b/solutions_only/project 01/Mux16.hdl @@ -0,0 +1,34 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/11/Mux16.hdl + +/** + * 16-bit multiplexor: + * for i = 1..15 out[i] = a[i] if sel == 1 + * b[i] if sel == 1 + */ + +CHIP Mux16 { + IN a[16], b[16], sel; + OUT out[16]; + + PARTS: + Mux(a=a[0],b=b[0],sel=sel,out=out[0]); + Mux(a=a[1],b=b[1],sel=sel,out=out[1]); + Mux(a=a[2],b=b[2],sel=sel,out=out[2]); + Mux(a=a[3],b=b[3],sel=sel,out=out[3]); + Mux(a=a[4],b=b[4],sel=sel,out=out[4]); + Mux(a=a[5],b=b[5],sel=sel,out=out[5]); + Mux(a=a[6],b=b[6],sel=sel,out=out[6]); + Mux(a=a[7],b=b[7],sel=sel,out=out[7]); + Mux(a=a[8],b=b[8],sel=sel,out=out[8]); + Mux(a=a[9],b=b[9],sel=sel,out=out[9]); + Mux(a=a[10],b=b[10],sel=sel,out=out[10]); + Mux(a=a[11],b=b[11],sel=sel,out=out[11]); + Mux(a=a[12],b=b[12],sel=sel,out=out[12]); + Mux(a=a[13],b=b[13],sel=sel,out=out[13]); + Mux(a=a[14],b=b[14],sel=sel,out=out[14]); + Mux(a=a[15],b=b[15],sel=sel,out=out[15]); + +} \ No newline at end of file diff --git a/solutions_only/project 01/Mux4Way.hdl b/solutions_only/project 01/Mux4Way.hdl new file mode 100755 index 0000000..fca2c16 --- /dev/null +++ b/solutions_only/project 01/Mux4Way.hdl @@ -0,0 +1,21 @@ +CHIP Mux4Way { + IN a, b, c, d, sel0, sel1; + OUT out; + + PARTS: + Not(in=sel0,out=notsel0); + Not(in=sel1,out=notsel1); + + And(a=notsel0,b=notsel1,out=outA); + And(a=sel0,b=notsel1,out=outB); + And(a=notsel0,b=sel1,out=outC); + And(a=sel0,b=sel1,out=outD); + + And(a=outA,b=a,out=outA1); + And(a=outB,b=b,out=outB1); + And(a=outC,b=c,out=outC1); + And(a=outD,b=d,out=outD1); + Or(a=outA1,b=outB1,out=out1); + Or(a=outC1,b=outD1,out=out2); + Or(a=out1,b=out2,out=out); +} \ No newline at end of file diff --git a/solutions_only/project 01/Mux4Way16.hdl b/solutions_only/project 01/Mux4Way16.hdl new file mode 100755 index 0000000..64fbffc --- /dev/null +++ b/solutions_only/project 01/Mux4Way16.hdl @@ -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/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: + + Mux4Way(a=a[0],b=b[0],c=c[0],d=d[0],sel0=sel[0],sel1=sel[1],out=out[0]); + Mux4Way(a=a[1],b=b[1],c=c[1],d=d[1],sel0=sel[0],sel1=sel[1],out=out[1]); + Mux4Way(a=a[2],b=b[2],c=c[2],d=d[2],sel0=sel[0],sel1=sel[1],out=out[2]); + Mux4Way(a=a[3],b=b[3],c=c[3],d=d[3],sel0=sel[0],sel1=sel[1],out=out[3]); + Mux4Way(a=a[4],b=b[4],c=c[4],d=d[4],sel0=sel[0],sel1=sel[1],out=out[4]); + Mux4Way(a=a[5],b=b[5],c=c[5],d=d[5],sel0=sel[0],sel1=sel[1],out=out[5]); + Mux4Way(a=a[6],b=b[6],c=c[6],d=d[6],sel0=sel[0],sel1=sel[1],out=out[6]); + Mux4Way(a=a[7],b=b[7],c=c[7],d=d[7],sel0=sel[0],sel1=sel[1],out=out[7]); + Mux4Way(a=a[8],b=b[8],c=c[8],d=d[8],sel0=sel[0],sel1=sel[1],out=out[8]); + Mux4Way(a=a[9],b=b[9],c=c[9],d=d[9],sel0=sel[0],sel1=sel[1],out=out[9]); + + Mux4Way(a=a[10],b=b[10],c=c[10],d=d[10],sel0=sel[0],sel1=sel[1],out=out[10]); + Mux4Way(a=a[11],b=b[11],c=c[11],d=d[11],sel0=sel[0],sel1=sel[1],out=out[11]); + Mux4Way(a=a[12],b=b[12],c=c[12],d=d[12],sel0=sel[0],sel1=sel[1],out=out[12]); + Mux4Way(a=a[13],b=b[13],c=c[13],d=d[13],sel0=sel[0],sel1=sel[1],out=out[13]); + Mux4Way(a=a[14],b=b[14],c=c[14],d=d[14],sel0=sel[0],sel1=sel[1],out=out[14]); + Mux4Way(a=a[15],b=b[15],c=c[15],d=d[15],sel0=sel[0],sel1=sel[1],out=out[15]); + +} \ No newline at end of file diff --git a/solutions_only/project 01/Mux8Way.hdl b/solutions_only/project 01/Mux8Way.hdl new file mode 100755 index 0000000..00816be --- /dev/null +++ b/solutions_only/project 01/Mux8Way.hdl @@ -0,0 +1,41 @@ +CHIP Mux8Way { + IN a, b, c, d, e, f, g, h, sel0, sel1, sel2; + OUT out; + + PARTS: + Not(in=sel0,out=notsel0); + Not(in=sel1,out=notsel1); + Not(in=sel2,out=notsel2); + + + And(a=notsel0,b=notsel1,out=outA); + And(a=notsel0,b=sel2,out=outC); + And(a=sel0,b=notsel1,out=outE); + And(a=sel0,b=sel1,out=outG); + + And(a=outA,b=notsel2,out=outA1); + And(a=outC,b=notsel2,out=outC1); + And(a=outE,b=notsel2,out=outE1); + And(a=outG,b=notsel2,out=outG1); + And(a=outA,b=sel2,out=outB1); + And(a=outG,b=sel2,out=outH1); + And(a=outC,b=sel2,out=outD1); + And(a=outE,b=sel2,out=outF1); + + And(a=outA1,b=a,out=outA2); + And(a=outB1,b=b,out=outB2); + And(a=outC1,b=c,out=outC2); + And(a=outD1,b=d,out=outD2); + And(a=outE1,b=e,out=outE2); + And(a=outF1,b=f,out=outF2); + And(a=outG1,b=g,out=outG2); + And(a=outH1,b=h,out=outH2); + + Or(a=outA2,b=outB2,out=out1); + Or(a=outC2,b=outD2,out=out2); + Or(a=outE2,b=outF2,out=out4); + Or(a=outG2,b=outH2,out=out5); + Or(a=out4,b=out5,out=out6); + Or(a=out1,b=out2,out=out3); + Or(a=out3,b=out6,out=out); +} diff --git a/solutions_only/project 01/Mux8Way16.hdl b/solutions_only/project 01/Mux8Way16.hdl new file mode 100755 index 0000000..960aa7d --- /dev/null +++ b/solutions_only/project 01/Mux8Way16.hdl @@ -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/01/Mux8Way16.hdl + +/** + * 8-way 16-bit multiplexor: + * out = a if sel == 000 + * b if sel == 001 + * etc. + * h if sel == 111 + */ + +CHIP Mux8Way16 { + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + OUT out[16]; + + PARTS: + Mux8Way(a=a[0],b=b[0],c=c[0],d=d[0],e=e[0],f=f[0],g=g[0],h=h[0],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[0]); + Mux8Way(a=a[1],b=b[1],c=c[1],d=d[1],e=e[1],f=f[1],g=g[1],h=h[1],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[1]); + Mux8Way(a=a[2],b=b[2],c=c[2],d=d[2],e=e[2],f=f[2],g=g[2],h=h[2],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[2]); + Mux8Way(a=a[3],b=b[3],c=c[3],d=d[3],e=e[3],f=f[3],g=g[3],h=h[3],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[3]); + Mux8Way(a=a[4],b=b[4],c=c[4],d=d[4],e=e[4],f=f[4],g=g[4],h=h[4],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[4]); + Mux8Way(a=a[5],b=b[5],c=c[5],d=d[5],e=e[5],f=f[5],g=g[5],h=h[5],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[5]); + Mux8Way(a=a[6],b=b[6],c=c[6],d=d[6],e=e[6],f=f[6],g=g[6],h=h[6],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[6]); + Mux8Way(a=a[7],b=b[7],c=c[7],d=d[7],e=e[7],f=f[7],g=g[7],h=h[7],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[7]); + Mux8Way(a=a[8],b=b[8],c=c[8],d=d[8],e=e[8],f=f[8],g=g[8],h=h[8],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[8]); + Mux8Way(a=a[9],b=b[9],c=c[9],d=d[9],e=e[9],f=f[9],g=g[9],h=h[9],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[9]); + + Mux8Way(a=a[11],b=b[11],c=c[11],d=d[11],e=e[11],f=f[11],g=g[11],h=h[11],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[11]); + Mux8Way(a=a[12],b=b[12],c=c[12],d=d[12],e=e[12],f=f[12],g=g[12],h=h[12],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[12]); + Mux8Way(a=a[14],b=b[14],c=c[14],d=d[14],e=e[14],f=f[14],g=g[14],h=h[14],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[14]); + Mux8Way(a=a[13],b=b[13],c=c[13],d=d[13],e=e[13],f=f[13],g=g[13],h=h[13],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[13]); + Mux8Way(a=a[15],b=b[15],c=c[15],d=d[15],e=e[15],f=f[15],g=g[15],h=h[15],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[15]); + Mux8Way(a=a[10],b=b[10],c=c[10],d=d[10],e=e[10],f=f[10],g=g[10],h=h[10],sel0=sel[0],sel1=sel[1],sel2=sel[2],out=out[10]); +} \ No newline at end of file diff --git a/solutions_only/project 01/Not.hdl b/solutions_only/project 01/Not.hdl new file mode 100755 index 0000000..5b75a10 --- /dev/null +++ b/solutions_only/project 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/solutions_only/project 01/Not16.hdl b/solutions_only/project 01/Not16.hdl new file mode 100755 index 0000000..88fb6b6 --- /dev/null +++ b/solutions_only/project 01/Not16.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/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/solutions_only/project 01/Or.hdl b/solutions_only/project 01/Or.hdl new file mode 100755 index 0000000..283c7d5 --- /dev/null +++ b/solutions_only/project 01/Or.hdl @@ -0,0 +1,9 @@ +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/solutions_only/project 01/Or16.hdl b/solutions_only/project 01/Or16.hdl new file mode 100755 index 0000000..7708c5b --- /dev/null +++ b/solutions_only/project 01/Or16.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/11/Or16.hdl + +/** + * 16-bit bitwise Or: + * for i = 1..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/solutions_only/project 01/Or8Way.hdl b/solutions_only/project 01/Or8Way.hdl new file mode 100755 index 0000000..667b506 --- /dev/null +++ b/solutions_only/project 01/Or8Way.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/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=out1); + Or(a=out1,b=in[2],out=out2); + Or(a=out2,b=in[3],out=out3); + Or(a=out3,b=in[4],out=out4); + Or(a=out4,b=in[5],out=out5); + Or(a=out5,b=in[6],out=out6); + Or(a=out6,b=in[7],out=out); + + +} \ No newline at end of file diff --git a/solutions_only/project 02/ALU.hdl b/solutions_only/project 02/ALU.hdl new file mode 100755 index 0000000..856ebf4 --- /dev/null +++ b/solutions_only/project 02/ALU.hdl @@ -0,0 +1,66 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/ALU.hdl + +/** + * The ALU (Arithmetic Logic Unit). + * Computes one of the following functions: + * x+y, x-y, y-x, 0, 1, -1, x, y, -x, -y, !x, !y, + * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs, + * according to 6 input bits denoted zx,nx,zy,ny,f,no. + * In addition, the ALU computes two 1-bit outputs: + * if the ALU output == 0, zr is set to 1; otherwise zr is set to 0; + * if the ALU output < 0, ng is set to 1; otherwise ng is set to 0. + */ + +// Implementation: the ALU logic manipulates the x and y inputs +// and operates on the resulting values, as follows: +// if (zx == 1) set x = 0 // 16-bit constant +// if (nx == 1) set x = !x // bitwise not +// if (zy == 1) set y = 0 // 16-bit constant +// if (ny == 1) set y = !y // bitwise not +// if (f == 1) set out = x + y // integer 2's complement addition +// if (f == 0) set out = x & y // bitwise and +// if (no == 1) set out = !out // bitwise not +// if (out == 0) set zr = 1 +// if (out < 0) set ng = 1 + +CHIP ALU { + IN + x[16], y[16], // 16-bit inputs + zx, // zero the x input? + nx, // negate the x input? + zy, // zero the y input? + ny, // negate the y input? + f, // compute out = x + y (if 1) or x & y (if 0) + no; // negate the out output? + + OUT + out[16], // 16-bit output + zr, // 1 if (out == 0), 0 otherwise + ng; // 1 if (out < 0), 0 otherwise + + PARTS: + Mux16(a=x,b[0..15]=false,sel=zx,out=outZx);//zx + + Mux16(a=y,b[0..15]=false,sel=zy,out=outZy);//zy + + + Not16(in=outZx,out=outNx1);//nx1 + Not16(in=outZy,out=outNy1);//ny1 + Mux16(a=outZx,b=outNx1,sel=nx,out=outNx);//nx + + Mux16(a=outZy,b=outNy1,sel=ny,out=outNy);//ny + + + Add16(a=outNx,b=outNy,out=outF1);//f1 + + And16(a=outNy,b=outNx,out=outF0);//f0 + + Mux16(a=outF0,b=outF1,sel=f,out=outF);//f + + Not16(in=outF,out=outNo1);//no + + Mux16(a=outF, b=outNo1, sel=no, out=out, out[15]=ng, out[0..7]=zr1, out[8..15]=zr2); + + + Or8Way(in=zr1,out=out2); + Or8Way(in=zr2,out=out3); + Not(in=out2,out=out4); + Not(in=out3,out=out5); + And(a=out4,b=out5,out=zr); + +} \ No newline at end of file diff --git a/solutions_only/project 02/Add16.hdl b/solutions_only/project 02/Add16.hdl new file mode 100755 index 0000000..a33305e --- /dev/null +++ b/solutions_only/project 02/Add16.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: projects/02/Adder16.hdl + +/** + * Adds two 16-bit values. + * The most significant carry bit is ignored. + */ + +CHIP Add16 { + IN a[16], b[16]; + OUT out[16]; + + PARTS: + HalfAdder(a=a[0], b=b[0], sum=out[0], carry=carry1); + FullAdder(a=a[1], b=b[1], c=carry1, sum=out[1], carry=carry2); + FullAdder(a=a[2], b=b[2], c=carry2, sum=out[2], carry=carry3); + FullAdder(a=a[3], b=b[3], c=carry3, sum=out[3], carry=carry4); + FullAdder(a=a[4], b=b[4], c=carry4, sum=out[4], carry=carry5); + FullAdder(a=a[5], b=b[5], c=carry5, sum=out[5], carry=carry6); + FullAdder(a=a[6], b=b[6], c=carry6, sum=out[6], carry=carry7); + FullAdder(a=a[7], b=b[7], c=carry7, sum=out[7], carry=carry8); + FullAdder(a=a[8], b=b[8], c=carry8, sum=out[8], carry=carry9); + FullAdder(a=a[9], b=b[9], c=carry9, sum=out[9], carry=carry10); + + FullAdder(a=a[10],b=b[10],c=carry10,sum=out[10],carry=carry11); + FullAdder(a=a[11],b=b[11],c=carry11,sum=out[11],carry=carry12); + FullAdder(a=a[12],b=b[12],c=carry12,sum=out[12],carry=carry13); + FullAdder(a=a[13],b=b[13],c=carry13,sum=out[13],carry=carry14); + FullAdder(a=a[14],b=b[14],c=carry14,sum=out[14],carry=carry15); + FullAdder(a=a[15],b=b[15],c=carry15,sum=out[15],carry=carry16); + + +} \ No newline at end of file diff --git a/solutions_only/project 02/FullAdder.hdl b/solutions_only/project 02/FullAdder.hdl new file mode 100755 index 0000000..e87e8a7 --- /dev/null +++ b/solutions_only/project 02/FullAdder.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/02/FullAdder.hdl + +/** + * Computes the sum of three bits. + */ + +CHIP FullAdder { + IN a, b, c; // 1-bit inputs + OUT sum, // Right bit of a + b + c + carry; // Left bit of a + b + c + + PARTS: + HalfAdder(a=b,b=c,sum=sum1,carry=carry1); + HalfAdder(a=a,b=sum1,sum=sum,carry=carry2); + Or(a=carry1,b=carry2,out=carry); + +} \ No newline at end of file diff --git a/solutions_only/project 02/HalfAdder.hdl b/solutions_only/project 02/HalfAdder.hdl new file mode 100755 index 0000000..27ada40 --- /dev/null +++ b/solutions_only/project 02/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: projects/02/HalfAdder.hdl + +/** + * Computes the sum of two bits. + */ + +CHIP HalfAdder { + IN a, b; // 1-bit inputs + OUT sum, // Right bit of a + b + carry; // Left bit of a + b + + PARTS: + Xor(a=a,b=b,out=sum); + And(a=a,b=b,out=carry); +} diff --git a/solutions_only/project 02/Inc16.hdl b/solutions_only/project 02/Inc16.hdl new file mode 100755 index 0000000..23c872e --- /dev/null +++ b/solutions_only/project 02/Inc16.hdl @@ -0,0 +1,18 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/02/Inc16.hdl + +/** + * 16-bit incrementer: + * out = in + 1 (arithmetic addition) + */ + +CHIP Inc16 { + IN in[16]; + OUT out[16]; + + PARTS: + Add16(a=in, b[1..15]=false, b[0]=true , out=out); + +} \ No newline at end of file diff --git a/solutions_only/project 03/Bit.hdl b/solutions_only/project 03/Bit.hdl new file mode 100755 index 0000000..a85e716 --- /dev/null +++ b/solutions_only/project 03/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=out2,b=in,sel=load,out=out1); + DFF(in=out1,out=out2,out=out); +} diff --git a/solutions_only/project 03/DMux8Way16.hdl b/solutions_only/project 03/DMux8Way16.hdl new file mode 100755 index 0000000..1029f09 --- /dev/null +++ b/solutions_only/project 03/DMux8Way16.hdl @@ -0,0 +1,22 @@ +CHIP DMux8Way16 { + IN in[16], sel[3]; + OUT a[16], b[16], c[16], d[16], e[16], f[16], g[16], h[16]; + + PARTS: + DMux8Way(a=a[0],b=b[0],c=c[0],d=d[0],e=e[0],f=f[0],g=g[0],h=h[0],sel=sel,in=in[0]); + DMux8Way(a=a[1],b=b[1],c=c[1],d=d[1],e=e[1],f=f[1],g=g[1],h=h[1],sel=sel,in=in[1]); + DMux8Way(a=a[2],b=b[2],c=c[2],d=d[2],e=e[2],f=f[2],g=g[2],h=h[2],sel=sel,in=in[2]); + DMux8Way(a=a[3],b=b[3],c=c[3],d=d[3],e=e[3],f=f[3],g=g[3],h=h[3],sel=sel,in=in[3]); + DMux8Way(a=a[4],b=b[4],c=c[4],d=d[4],e=e[4],f=f[4],g=g[4],h=h[4],sel=sel,in=in[4]); + DMux8Way(a=a[5],b=b[5],c=c[5],d=d[5],e=e[5],f=f[5],g=g[5],h=h[5],sel=sel,in=in[5]); + DMux8Way(a=a[6],b=b[6],c=c[6],d=d[6],e=e[6],f=f[6],g=g[6],h=h[6],sel=sel,in=in[6]); + DMux8Way(a=a[7],b=b[7],c=c[7],d=d[7],e=e[7],f=f[7],g=g[7],h=h[7],sel=sel,in=in[7]); + DMux8Way(a=a[8],b=b[8],c=c[8],d=d[8],e=e[8],f=f[8],g=g[8],h=h[8],sel=sel,in=in[8]); + DMux8Way(a=a[9],b=b[9],c=c[9],d=d[9],e=e[9],f=f[9],g=g[9],h=h[9],sel=sel,in=in[9]); + DMux8Way(a=a[10],b=b[10],c=c[10],d=d[10],e=e[10],f=f[10],g=g[10],h=h[10],sel=sel,in=in[10]); + DMux8Way(a=a[11],b=b[11],c=c[11],d=d[11],e=e[11],f=f[11],g=g[11],h=h[11],sel=sel,in=in[11]); + DMux8Way(a=a[12],b=b[12],c=c[12],d=d[12],e=e[12],f=f[12],g=g[12],h=h[12],sel=sel,in=in[12]); + DMux8Way(a=a[13],b=b[13],c=c[13],d=d[13],e=e[13],f=f[13],g=g[13],h=h[13],sel=sel,in=in[13]); + DMux8Way(a=a[14],b=b[14],c=c[14],d=d[14],e=e[14],f=f[14],g=g[14],h=h[14],sel=sel,in=in[14]); + DMux8Way(a=a[15],b=b[15],c=c[15],d=d[15],e=e[15],f=f[15],g=g[15],h=h[15],sel=sel,in=in[15]); +} \ No newline at end of file diff --git a/solutions_only/project 03/PC.hdl b/solutions_only/project 03/PC.hdl new file mode 100755 index 0000000..448e6c2 --- /dev/null +++ b/solutions_only/project 03/PC.hdl @@ -0,0 +1,44 @@ +// This 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: + DMux8Way(in=true,sel[0]=reset,sel[1]=load,sel[2]=inc,a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + + DFF(in=inc,out=inct); + And(a=inc,b=inct,out=out1); + Mux16(a=in,b=out4,sel=out1,out=out2); + Inc16(in=out2,out=out3); + Register(in=out3,load=load,out=out4,out=out); + + Not(in=a,out=notа); + Register(in=in,load=notа,out=outA); + + And16(a[0..15]=false,b[0..15]=false,out=outB); + + Register(in=in,load=c,out=outC); + + And16(a[0..15]=false,b[0..15]=false,out=outD); + + + And16(a[0..15]=false,b[0..15]=false,out=outF); + + Register(in=in,load=g,out=outG); + + And16(a[0..15]=false,b[0..15]=false,out=outH); + And16(a[0..15]=false,b[0..15]=false,out=outE); + Mux8Way16(a=outA,b=outB,c=outC,d=outD,e=outE,f=outF,g=outG,h=outH,sel[0]=reset,sel[1]=load,sel[2]=inc,out=out67); + } \ No newline at end of file diff --git a/solutions_only/project 03/RAM16K.hdl b/solutions_only/project 03/RAM16K.hdl new file mode 100755 index 0000000..31127b0 --- /dev/null +++ b/solutions_only/project 03/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: 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: + DMux4Way(in=load,sel=address[0..1],a=a,b=b,c=c,d=d); + RAM4K(in=in,load=a,address=address[2..13],out=outa); + RAM4K(in=in,load=b,address=address[2..13],out=outb); + RAM4K(in=in,load=c,address=address[2..13],out=outc); + RAM4K(in=in,load=d,address=address[2..13],out=outd); + Mux4Way16(a=outa,b=outb,c=outc,d=outd,sel=address[0..1],out=out); +} \ No newline at end of file diff --git a/solutions_only/project 03/RAM4K.hdl b/solutions_only/project 03/RAM4K.hdl new file mode 100755 index 0000000..1f969ef --- /dev/null +++ b/solutions_only/project 03/RAM4K.hdl @@ -0,0 +1,28 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/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: + DMux8Way(in=load,sel=address[0..2],a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + RAM512(in=in,load=a,address=address[3..11],out=outa); + RAM512(in=in,load=b,address=address[3..11],out=outb); + RAM512(in=in,load=c,address=address[3..11],out=outc); + RAM512(in=in,load=d,address=address[3..11],out=outd); + RAM512(in=in,load=e,address=address[3..11],out=oute); + RAM512(in=in,load=f,address=address[3..11],out=outf); + RAM512(in=in,load=g,address=address[3..11],out=outg); + RAM512(in=in,load=h,address=address[3..11],out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address[0..2],out=out); +} \ No newline at end of file diff --git a/solutions_only/project 03/RAM512.hdl b/solutions_only/project 03/RAM512.hdl new file mode 100755 index 0000000..e62e717 --- /dev/null +++ b/solutions_only/project 03/RAM512.hdl @@ -0,0 +1,28 @@ +// 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: + DMux8Way(in=load,sel=address[0..2],a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + RAM64(in=in,load=a,address=address[3..8],out=outa); + RAM64(in=in,load=b,address=address[3..8],out=outb); + RAM64(in=in,load=c,address=address[3..8],out=outc); + RAM64(in=in,load=d,address=address[3..8],out=outd); + RAM64(in=in,load=e,address=address[3..8],out=oute); + RAM64(in=in,load=f,address=address[3..8],out=outf); + RAM64(in=in,load=g,address=address[3..8],out=outg); + RAM64(in=in,load=h,address=address[3..8],out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address[0..2],out=out); +} \ No newline at end of file diff --git a/solutions_only/project 03/RAM64.hdl b/solutions_only/project 03/RAM64.hdl new file mode 100755 index 0000000..44d11bf --- /dev/null +++ b/solutions_only/project 03/RAM64.hdl @@ -0,0 +1,28 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/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: + DMux8Way(in=load,sel=address[0..2],a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + RAM8(in=in,load=a,address=address[3..5],out=outa); + RAM8(in=in,load=b,address=address[3..5],out=outb); + RAM8(in=in,load=c,address=address[3..5],out=outc); + RAM8(in=in,load=d,address=address[3..5],out=outd); + RAM8(in=in,load=e,address=address[3..5],out=oute); + RAM8(in=in,load=f,address=address[3..5],out=outf); + RAM8(in=in,load=g,address=address[3..5],out=outg); + RAM8(in=in,load=h,address=address[3..5],out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address[0..2],out=out); +} \ No newline at end of file diff --git a/solutions_only/project 03/RAM8.hdl b/solutions_only/project 03/RAM8.hdl new file mode 100755 index 0000000..9562736 --- /dev/null +++ b/solutions_only/project 03/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: + DMux8Way(in=load,sel=address,a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h); + + Register(in=in,load=a,out=outa); + Register(in=in,load=b,out=outb); + Register(in=in,load=c,out=outc); + Register(in=in,load=d,out=outd); + Register(in=in,load=e,out=oute); + Register(in=in,load=f,out=outf); + Register(in=in,load=g,out=outg); + Register(in=in,load=h,out=outh); + Mux8Way16(a=outa,b=outb,c=outc,d=outd,e=oute,f=outf,g=outg,h=outh,sel=address,out=out); +} \ No newline at end of file diff --git a/solutions_only/project 03/Register.hdl b/solutions_only/project 03/Register.hdl new file mode 100755 index 0000000..257c7a0 --- /dev/null +++ b/solutions_only/project 03/Register.hdl @@ -0,0 +1,34 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/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/solutions_only/project 04/Fill.asm b/solutions_only/project 04/Fill.asm new file mode 100755 index 0000000..c96edc6 --- /dev/null +++ b/solutions_only/project 04/Fill.asm @@ -0,0 +1,97 @@ +@END //check if button is pressed +0;JMP + +(BLACK) +//start= 16384 the start of the screen memory +@SCREEN +D=A +@start +M=D + +//n=8,192 this is the memory for the display =addreass of the keyboard - address of the screen +@8192 +D=A +@n +M=D + +//i=0 this is the index for each group of pixels +@i +M=0 + +(LOOP1) +//if i==n goto end +@i +D=M +@n +D=D-M +@END +D;JEQ + +//start+1=-1 set each group of pixels to -1 which is = 111111111111 +@start +D=M +@i +A=D+M +M=-1 + +// increment i by 1 +@i +M=M+1 + +// go back to the start of the loop +@LOOP1 +0;JMP + +(WHITE) +//start= 16384 the start of the screen memory +@SCREEN +D=A +@start +M=D + +//n=8,192 this is the memory for the display =addreass of the keyboard - address of the screen +@8192 +D=A +@n +M=D + +//i=0 this is the index for each group of pixels +@i +M=0 + +(LOOP2) +//if i==n goto end +@i +D=M +@n +D=D-M +@END +D;JEQ + +//start+1=-1 set each group of pixels to 0 which is = 00000000 +@start +D=M +@i +A=D+M +M=0 + +// increment i by 1 +@i +M=M+1 + +// go back to the start of the loop +@LOOP2 +0;JMP + +//check if button is pressed +(END) +@KBD +D=M +@WHITE +D;JEQ +@KBD +D=M +@BLACK +D;JNE +@END +0;JMP \ No newline at end of file diff --git a/solutions_only/project 04/Mult.asm b/solutions_only/project 04/Mult.asm new file mode 100755 index 0000000..59bb1ac --- /dev/null +++ b/solutions_only/project 04/Mult.asm @@ -0,0 +1,24 @@ +@R2 +M=0 +@sum +M=0 +(LOOP) +@1 +D=M +@END +D;JEQ // if R1==0 goto end +@R0 +D=M // D=R0 +@sum +M=M+D // sum=sum+R0 +@R1 +M=M-1 //R1=R1-1 +@sum +D=M +@R2 +M=D +@LOOP +0;JMP +(END) +@END +0;JMP \ No newline at end of file diff --git a/solutions_only/project 05/CPU.hdl b/solutions_only/project 05/CPU.hdl new file mode 100755 index 0000000..1b03712 --- /dev/null +++ b/solutions_only/project 05/CPU.hdl @@ -0,0 +1,115 @@ +// This 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: + Mux16(a=instruction ,b=ALUout ,sel=instruction[15] ,out=outToAreg ); + ARegister(in=outToAreg ,load=loadAreg ,out=outAreg,out[0..14]=addressM ); + DRegister(in=ALUout ,load=loadDreg ,out=outDreg ); + Mux16(a=outAreg ,b=inM ,sel=instruction[12] ,out=outToALU ); + ALU(x=outDreg ,y=outToALU ,zx=instruction[11] ,nx=instruction[10] ,zy=instruction[9] ,ny=instruction[8] ,f=instruction[7] ,no=instruction[6] ,out=ALUout,out=outM ,zr=zr ,ng=ng ); + And(a=instruction[3],b=instruction[15],out=writeM); + + //when to load A reg + Not(in=instruction[5],out=notd5); + Nand(a=instruction[15],b=notd5,out=loadAreg); + Not(in=ng,out=notNg); + Not(in=zr,out=notZr); + + //when to load D reg + And(a=instruction[4],b=instruction[15],out=loadDreg); + + //checking if instruction is a or c before jump decision is made + And(a=instruction[2],b=instruction[15],out=J1); + And(a=instruction[1],b=instruction[15],out=J2); + And(a=instruction[0],b=instruction[15],out=J3); + + //NULL + Nand(a=J1,b=J2,out=NandJ1J2); + Nand(a=NandJ1J2,b=J3,out=NoJump); + //JGT + And(a=J3,b=J3,out=AndJ3J3); + Or(a=zr,b=ng,out=orZrNg); + Not(in=orZrNg,out=NorZrNg); + And(a=AndJ3J3,b=NorZrNg,out=JGT); + + //JEQ + And(a=J2,b=J2,out=AndJ2J2); + And(a=zr,b=zr,out=AndZrZr); + And(a=AndZrZr,b=AndJ2J2,out=JEQ); + + //JGE + And(a=J3,b=J2,out=AndJ3J2); + Or(a=zr,b=notNg,out=AndZrNotNg); + And(a=AndZrNotNg,b=AndJ3J2,out=JGE); + + //JLT + And(a=J1,b=J1,out=AndJ1J1); + And(a=ng,b=ng,out=AndNgNg); + And(a=AndJ1J1,b=AndNgNg,out=JLT); + + //JNE + And(a=J3,b=J1,out=AndJ3J1); + And(a=notZr,b=notZr,out=AndNotZrNotZr); + And(a=AndNotZrNotZr,b=AndJ3J1,out=JNE); + + //JLE + And(a=J2,b=J1,out=AndJ2J1); + And(a=AndJ2J1,b=orZrNg,out=JLE); + + //JMP + And(a=AndJ3J1,b=J2,out=JMP); + + Not(in=outToLoad,out=outToLoad1); // once needted to know when to increes but also needed to not it so it dosent load the reg when J1J2J3=000 + + //4wayMux one + Mux(a=JMP,b=JGT,sel=instruction[0] ,out=out1); + Mux(a=JEQ,b=JGE,sel=instruction[0] ,out=out2); + Mux(a=out1,b=out2, sel=instruction[1] ,out=out5); + + //4wayMux two + Mux(a=JLT,b=JNE,sel=instruction[0] ,out=out3); + Mux(a=JLE,b=JMP,sel=instruction[0] ,out=out4); + Mux(a=out3,b=out4,sel=instruction[1] ,out=out6); + + //2wayMux + Mux(a=out5,b=out6,sel= instruction[2],out=outToLoad); + + PC(in=outAreg ,load=outToLoad ,inc=outToLoad1 ,reset=reset ,out[0..14]=pc); +} \ No newline at end of file diff --git a/solutions_only/project 05/Computer.hdl b/solutions_only/project 05/Computer.hdl new file mode 100755 index 0000000..ea198e4 --- /dev/null +++ b/solutions_only/project 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: + CPU(inM=inM ,instruction=inst ,reset=reset ,outM=outM ,writeM=writeM ,addressM=addressM ,pc=pc ); + Memory(in=outM ,load=writeM ,address= addressM,out=inM ); + ROM32K(address=pc ,out=inst ); +} diff --git a/solutions_only/project 05/Memory.hdl b/solutions_only/project 05/Memory.hdl new file mode 100755 index 0000000..6aff3c3 --- /dev/null +++ b/solutions_only/project 05/Memory.hdl @@ -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/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: + DMux4Way(in=load,sel[0]=address[13],sel[1]=address[14] ,a=ram16k ,b=ram16k2,c=ramScreen); + Or(a=ram16k ,b=ram16k2 ,out=ram16end); + RAM16K(in=in ,load=ram16end ,address=address[0..13] ,out=out1); + Screen(in=in ,load=ramScreen ,address=address[0..12] ,out=out2); + Keyboard(out=outKey); + Mux4Way16(a=out1 ,b=out1 ,c=out2 ,d=outKey ,sel[0]=address[13],sel[1]=address[14] ,out=out); +} \ No newline at end of file diff --git a/solutions_only/project 06/assembler.py b/solutions_only/project 06/assembler.py new file mode 100755 index 0000000..22765fd --- /dev/null +++ b/solutions_only/project 06/assembler.py @@ -0,0 +1,230 @@ +def a_instruct(string): # covert the A instruction to bits + string = string.strip('@\n') + x = "{0:b}".format(int(string)) # convert the number to binary, problem if the number is too big + while len(x) < 16: # need to be 16 bits and 1 for \n + x = "0" + x + return x # return th 16 bit value + + +def c_instruct(string): # priema edna liniq koeto e edna instrukciq i q prevryshta v bit kod + string = string + "\n" + flag1, flag2, p = 0, 0, 0 + dest_s = '' + comp_s = '' + jump_s = '' + for c in range(len(string)): + if string[c] == '=': # ako ima ravno znachi predi nego ima destination + i = 0 + flag1 = 1 # diga flag za destination + while i < c: + p = c + dest_s += string[i] + i += 1 + dest_s = destDic.get(dest_s) # convert t to Destination + if string[c] == ';': # ako ima ; znachi predi nego ima computation + flag2 = 1 # diga flag za Jump + if flag1 == 0: # ako flaga za destination ne e dignat zapochvame ot nachaloto na liniqta + p = 0 + else: # ako e zapochvame ot kydeto e ravnoto koeto se pazi vyv var i + p = i + while p < c: + comp_s += string[p] + p += 1 + comp_s = compDic.get(comp_s) # convert t1 to Computation + + if string[c] == '\n': + if flag2 == 1: # ako ima flag za jump to vzimame stoinosta na jumpa + j = p + 1 + while j < c: + jump_s += string[j] + j += 1 + jump_s = jumpDic.get(jump_s) + else: # ako nqma togava vzima stoinosta na computationa + j = i + 1 + while j < c: + comp_s += string[j] + j += 1 + comp_s = compDic.get(comp_s) + final_result = '111' + comp_s # dobavqme 111 koeto e standart za C instrukt i computation bez koeto nqma instrukciq + if dest_s != '': # ako e imalo dest go dobavqme + final_result = final_result + dest_s + else: # inache dobavqme 3 nuli + final_result = final_result + '000' + if jump_s != '': # ako e imalo jump go dobavqme + final_result = final_result + jump_s + else: # inache dobavqme 3 nuli + final_result = final_result + '000' + return final_result + + +def check_a_or_c(temp_string): + line = '' + temp_string1 = '' + for j in temp_string: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + for index in range(len(line)): # proverqva vseki simvol ot liniqta + if line[index] == "@": # ako liniqta zapochva s @ znachi e a instrukciq + temp_string1 += a_instruct(line) + '\n' + line = '' + break + else: # ako ne zapochva s @ znachi e C instrukciq + temp_string1 += c_instruct(line) + '\n' + line = '' + break + return temp_string1 + + +def clear_file(temp_string_cf): # clears the empty lines, comments and spaces and writes them in a string + for line in asmfile: + f = 0 + if line == '\n': # removes empty lines + continue + for index in range(len(line)): + if line[index] == "/" and line[index + 1] == '/': # checks if it is comment + if f == 1: # maybe a problem if the last element of a line is / since it will stay + temp_string_cf += '\n' + break + if line[index] != ' ': # removes all of the whitespaces except newlines + temp_string_cf += line[index] + f = 1 + return temp_string_cf + + +def label(temp_string): # removes the labels and adds them to the dictionary writes all in a string + line = '' + temp_string_l = '' + global rowasm + for j in temp_string: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + f = 0 + for index in range(len(line)): # loops through the lines char by char + if line[index] == "(": + # checks if it is a label, will be a problem if there is only "(" and no closing bracket alse need to check label syntax + if bool(labelDic.get(line.strip('()'))) == False: # check if label is already in the Dictionary + labelDic[line.strip("()")] = str(rowasm) # adds the label to the dictionary + rowasm -= 1 # need to pay attention to the counting cause im not sure + f = 1 + break # brake so i don't write this line in the string since it needs to be removed + if f != 1: + temp_string_l += line + temp_string_l += '\n' + rowasm += 1 + line = '' + return temp_string_l + + +def variable(temp_string): # replaces the variables with the correct address + global variableCount + line = '' + temp_string_v = '' + for j in temp_string: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + for index in range(len(line)): + if line[index] == '@' and numbers.find(line[index + 1]) < 0: # checks if the line holds a variable + if bool(labelDic.get(line.strip('@'))): # check if variable is already in the Dictionary + line = '@' + labelDic[line.strip('@')] # replaces the variable with address i hope + else: + labelDic[line.strip('@')] = str(variableCount) # if isn't it adds it + line = '@' + str(variableCount) # replaces the variable with address i hope + variableCount += 1 # increases the variable counter so i don't write them all in address 16 + break + temp_string_v += line + '\n' # appends the line to the string + line = '' + return temp_string_v + + +destDic = {'None': '000', + 'M': '001', + 'D': '010', + 'MD': '011', + 'A': '100', + 'AM': '101', + 'AD': '110', + 'AMD': '111', } # contains all destinations and their bit equivalent +jumpDic = {'None': '000', + 'JGT': '001', + 'JQE': '010', + 'JGE': '011', + 'JLT': '100', + 'JNE': '101', + 'JLE': '110', + 'JMP': '111', } # contains all jumps and their bit equivalent +compDic = {'0': '0101010', + '1': '0111111', + '-1': '0111010', + 'D': '0001100', + 'A': '0110000', + '!D': '0001101', + '!A': '0110001', + '-D': '0001111', + '-A': '0110011', + 'D+1': '0011111', + 'A+1': '0110111', + 'D-1': '0001110', + 'A-1': '0110010', + 'D+A': '0000010', + 'D-A': '0010011', + 'A-D': '0000111', + 'D&A': '0000000', + 'D|A': '0010101', + 'M': '1110000', + '!M': '1110001', + '-M': '1110011', + 'M+1': '1110111', + 'M-1': '1110010', + 'D+M': '1000010', + 'D-M': '1010011', + 'M-D': '1000111', + 'D&M': '1000000', + 'D|M': '1010101', + } # contains all computations and their bit equivalent +tempString = '' # create empty string +rowasm = 0 +numbers = '0123456789' # used to check if given instruction calls to variable +variableCount = 16 # keeps count of the variable address + +labelDic = {'SP': '0', + 'LCL': '1', + 'ARG': '2', + 'THIS': '3', + 'THAT': '4', + 'SCREEN': '16384', + 'KBD': '24576', + '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', + } # dictionary containing Labels and Variables in format: AddressNumber : LabelName/ VariableName +with open("C:/Users/AGrudev/Desktop/n2t/nand2tetris/projects/06/pong/Pong.asm", "r+") as asmfile: + tempString = clear_file(tempString) +print(tempString + '----------') + +tempString = label(tempString) +print(tempString + '----------') + +tempString = variable(tempString) +print(tempString + '----------') + +tempString = check_a_or_c(tempString) +print(tempString + '----------') + +with open("C:/Users/AGrudev/Desktop/n2t/nand2tetris/projects/06/pong/Pong.hack", "w+") as destfile: + destfile.write(tempString) diff --git a/solutions_only/project 07/VMTranslator.py b/solutions_only/project 07/VMTranslator.py new file mode 100755 index 0000000..9afbca4 --- /dev/null +++ b/solutions_only/project 07/VMTranslator.py @@ -0,0 +1,160 @@ +import os +import sys +from pathlib import Path + +trueCounter = 0 +falseCounter = 0 +staticCounter = 16 + + +def clear_file(temp_string_cf, asmfile): # clears the empty lines, comments and spaces and writes them in a string + for line in asmfile: + f = 0 + if line == '\n': # removes empty lines + continue + for index in range(len(line)): + if line[index] == "/" and line[index + 1] == '/': # checks if it is comment + if f == 1: # maybe a problem if the last element of a line is / since it will stay + temp_string_cf += '\n' + break + if line[index] != ' ': # removes all of the whitespaces except newlines + temp_string_cf += line[index] + f = 1 + return temp_string_cf + + +def push(line): + global tempString1 + if line[4:8] == 'this': + number = int(line[8:]) + line = '@' + str(number) + '\nD=A\n@THIS\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:8] == 'that': + number = int(line[8:]) + line = '@' + str(number) + '\nD=A\n@THAT\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:8] == 'temp': + number = int(line[8:]) + number += 5 + line = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:9] == 'local': + number = int(line[9:]) + line = '@' + str(number) + '\nD=A\n@LCL\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:10] == 'static': + number = int(line[10:]) + line = '@' + name1 + '.' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:11] == 'pointer': + number = int(line[11:]) + number += 3 + line = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:12] == 'argument': + number = int(line[12:]) + line = '@' + str(number) + '\nD=A\n@ARG\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + elif line[4:12] == 'constant': + number = line[12:] + line = '@' + str(number) + '\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + tempString1 += line + + +def pop(line): + global SP + global tempString1 + if line[3:7] == 'this': + number = int(line[7:]) + line = '@' + str(number) + '\nD=A\n@THIS\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THIS\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THIS\nM=M-D\n' + elif line[3:7] == 'that': + number = int(line[7:]) + line = '@' + str(number) + '\nD=A\n@THAT\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THAT\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THAT\nM=M-D\n' + elif line[3:7] == 'temp': + number = int(line[7:]) + number = number + 5 + line = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n' + elif line[3:8] == 'local': + number = int(line[8:]) + line = '@' + str(number) + '\nD=A\n@LCL\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@LCL\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@LCL\nM=M-D\n' + elif line[3:9] == 'static': + number = int(line[9:]) + line = '@SP\nM=M-1\nA=M\nD=M\n@' + name1 + '.' + str(number) + '\nM=D\n' + elif line[3:10] == 'pointer': + number = int(line[10:]) + number = number + 3 + line = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n' + elif line[3:11] == 'argument': + number = int(line[11:]) + line = '@' + str(number) + '\nD=A\n@ARG\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@ARG\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@ARG\nM=M-D\n' + tempString1 += line + + +def aritmetic(line): + global trueCounter + global falseCounter + global tempString1 + if line == 'add': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M+D\n" + elif line == 'sub': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M-D\n" + elif line == 'neg': + line = "@SP\nA=M\nA=A-1\nM=-M\n" + elif line == 'eq': + line = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JEQ\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n' + trueCounter += 1 + falseCounter += 1 + elif line == 'gt': + line = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JGT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n' + trueCounter += 1 + falseCounter += 1 + elif line == 'lt': + line = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JLT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n' + trueCounter += 1 + falseCounter += 1 + elif line == 'and': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M&D\n" + elif line == 'or': + line = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M|D\n" + elif line == 'not': + line = "@SP\nA=M\nA=A-1\nM=!M\n" + tempString1 += line + + +name1 = None +line, tempString = '', '' +tempString1 = '' +aritmeticList3 = ['add', 'sub', 'neg', 'and', 'not'] +aritmeticList2 = ['or', 'gt', 'lt', 'eq'] +yourpath = os.getcwd() +for root, dirs, files in os.walk(yourpath, topdown=False): + nam1 = '' + for name in files: + if name[-3:] == '.vm': + name1 = name + tempString1 = '' + tempString = '' + with open(Path(root, name), "r+") as vmfile: + tempString = clear_file(tempString, vmfile) + for j in tempString: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + if line[:4] == 'push': + push(line) + line = '' + elif line[:3] == 'pop': + pop(line) + line = '' + elif line[:2] in aritmeticList2 or line[:3] in aritmeticList3: + aritmetic(line) + line = '' + if name1 == name: + with open(Path(root, f'{name1[:-3]}.asm'), 'w+') as newfile: + newfile.write(tempString1) diff --git a/solutions_only/project 08/VMTranslator.py b/solutions_only/project 08/VMTranslator.py new file mode 100755 index 0000000..46f68e4 --- /dev/null +++ b/solutions_only/project 08/VMTranslator.py @@ -0,0 +1,246 @@ +import os +from pathlib import Path + + +def clear_file(clearfile): + temp_string_cf = '' # clears the empty lines, comments and spaces and writes them in a string + for vmline in clearfile: + flag = 0 + if vmline == '\n': + continue + for index in range(len(vmline)): + if vmline[index:index + 2] == '//': + if flag == 1: + temp_string_cf += '\n' + break + if flag == 1 and vmline[index:index + 2] == ' ': + temp_string_cf += '\n' + break + temp_string_cf += vmline[index] + flag = 1 + return temp_string_cf + + +def push(pushline, funcname): + if 'this' in pushline: + number = int(pushline[10:]) + pushline = '@' + str(number) + '\nD=A\n@THIS\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push THIS\n' + elif 'that' in pushline: + number = int(pushline[10:]) + pushline = '@' + str(number) + '\nD=A\n@THAT\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push THAT\n' + elif 'temp' in pushline: + number = int(pushline[10:]) + number += 5 + pushline = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push TMP\n' + elif 'local' in pushline: + number = int(pushline[11:]) + pushline = '@' + str(number) + '\nD=A\n@LCL\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push LOCAL\n' + elif 'static' in pushline: + number = int(pushline[12:]) + pushline = '@' + funcname + '.' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push STATIC\n' + elif 'pointer' in pushline: + number = int(pushline[13:]) + number += 3 + pushline = '@' + str(number) + '\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push POINTER\n' + elif 'argument' in pushline: + number = int(pushline[14:]) + pushline = '@' + str(number) + '\nD=A\n@ARG\nA=M+D\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push ARGUMENT\n' + elif 'constant' in pushline: + number = pushline[14:] + pushline = '@' + str(number) + '\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//push CONSTANT\n' + return pushline + + +def pop(popline, funcname): + if 'this' in popline: + number = int(popline[9:]) + popline = '@' + str(number) + '\nD=A\n@THIS\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THIS\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THIS\nM=M-D\n//pop THIS\n' + elif 'that' in popline: + number = int(popline[9:]) + popline = '@' + str(number) + '\nD=A\n@THAT\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@THAT\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@THAT\nM=M-D\n//pop THAT\n' + elif 'temp' in popline: + number = int(popline[9:]) + number = number + 5 + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n//pop TMP\n' + elif 'local' in popline: + number = int(popline[10:]) + popline = '@' + str(number) + '\nD=A\n@LCL\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@LCL\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@LCL\nM=M-D\n//pop LOCAL\n' + elif 'static' in popline: + number = int(popline[11:]) + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + funcname + '.' + str(number) + '\nM=D\n//pop STATIC\n' + elif 'pointer' in popline: + number = int(popline[12:]) + number = number + 3 + popline = '@SP\nM=M-1\nA=M\nD=M\n@' + str(number) + '\nM=D\n//pop POINTER\n' + elif 'argument' in popline: + number = int(popline[13:]) + popline = '@' + str(number) + '\nD=A\n@ARG\nM=M+D\n@SP\nM=M-1\nA=M\nD=M\n@ARG\nA=M\nM=D\n' + '@' + str( + number) + '\nD=A\n@ARG\nM=M-D\n//pop ARG\n' + return popline + + +def aritmetic(armline): + global trueCounter + global falseCounter + if armline == 'add': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M+D\n//ADD\n" + elif armline == 'sub': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M-D\n//SUB\n" + elif armline == 'neg': + armline = "@SP\nA=M\nA=A-1\nM=-M\n//NEG\n" + elif armline == 'eq': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JEQ\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//EQ\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'gt': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JGT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//GT\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'lt': + armline = '@SP\nM=M-1\nA=M\nD=M\nA=A-1\nD=M-D\n@TRUE' + str( + trueCounter) + '\nD;JLT\n@SP\nA=M\nA=A-1\nM=0\n@FALSE' + str( + falseCounter) + '\n0;JMP\n(TRUE' + str(trueCounter) + ')\n@SP\nA=M\nA=A-1\nM=-1\n(FALSE' + str( + falseCounter) + ')\n//LT\n' + trueCounter += 1 + falseCounter += 1 + elif armline == 'and': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M&D\n//AND\n" + elif armline == 'or': + armline = "@SP\nM=M-1\nA=M\nD=M\nA=A-1\nM=M|D\n//OR\n" + elif armline == 'not': + armline = "@SP\nA=M\nA=A-1\nM=!M\n//NOT\n" + return armline + + +def label(labelline): + labelline = '(' + func_label_name + '$' + labelline[6:] + ')\n//LABEL\n' + return labelline + + +def goto(gotoline): + gotoline = '@' + func_label_name + '$' + gotoline[5:] + '\n0;JMP\n//GOTO\n' + return gotoline + + +def if_goto(ifline): + ifline = '@SP\nM=M-1\nA=M\nD=M\n@' + func_label_name + '$' + ifline[8:] + '\nD;JNE\n//IFGOTO\n' + return ifline + + +def define_func(funcline): + global func_label_name + def_func_list = funcline.rsplit(' ') + func_label_name = def_func_list[1] + funcline = '(' + def_func_list[1] + ')\n' + for ind in range(int(def_func_list[2])): + funcline += '@0\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n//DEFINEFUNC\n' + return funcline + + +def call_func(callline): + global f + call_func_list = callline.rsplit(' ') + callline = '@' + call_func_list[1] + str(f) + 'RA\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@LCL\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@ARG\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@THIS\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@THAT\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n' + callline += '@SP\nD=M\n@' + call_func_list[2] + '\nD=D-A\n@5\nD=D-A\n@ARG\nM=D\n' + callline += '@SP\nD=M\n@LCL\nM=D\n' + callline += '@' + call_func_list[1] + '\n0;JMP\n' + callline += '(' + call_func_list[1] + str(f) + 'RA)\n//CALLFUNC\n' + f += 1 + return callline + + +def return_func(returnline): + returnline = '@LCL\nD=M\n@R13\nM=D\n' + returnline += '@5\nD=A\n@R13\nD=M-D\nA=D\nD=M\n@R14\nM=D\n' + returnline += '@SP\nA=M-1\nD=M\n@ARG\nA=M\nM=D\n' + returnline += '@ARG\nD=M+1\n@SP\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@THAT\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@THIS\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@ARG\nM=D\n' + returnline += '@R13\nM=M-1\nA=M\nD=M\n@LCL\nM=D\n' + returnline += '@R14\nA=M\n0;JMP\n//RETURN\n' + return returnline + + +def iterate(name_iterate, yourpath_iterate): + line = '' + new_string = '' + with open(Path(yourpath_iterate, name_iterate + '.vm'), "r+") as vmfile: + string_iterate = clear_file(vmfile) + for j in string_iterate: # zapisva liniqta v string koito posle se obrabotva + if j != '\n': + line += j + else: + if line[:4] == 'push': + new_string += push(line, name_iterate) + line = '' + elif line[:3] == 'pop': + new_string += pop(line, name_iterate) + line = '' + elif line[:2] in aritmeticList2 or line[:3] in aritmeticList3: + new_string += aritmetic(line) + line = '' + elif line[:5] == 'label': + new_string += label(line) + line = '' + elif line[:4] == 'goto': + new_string += goto(line) + line = '' + elif line[:7] == 'if-goto': + new_string += if_goto(line) + line = '' + elif line[:8] == 'function': + new_string += define_func(line) + line = '' + elif line[:4] == 'call': + new_string += call_func(line) + line = '' + elif line[:6] == 'return': + new_string += return_func(line) + line = '' + return new_string + + +trueCounter = falseCounter = f = 0 +staticCounter = 16 +func_label_name = '' +aritmeticList3 = ['add', 'sub', 'neg', 'and', 'not'] +aritmeticList2 = ['or', 'gt', 'lt', 'eq'] +yourpath = os.getcwd() + +bootstrap = '''@256\nD=A\n@SP\nM=D\n@MainLoopXYZRA\nD=A\n@SP\nA=M\nM=D\n@SP\nM=M+1\n@LCL\nD=M\n@SP\nA=M\nM=D\n@SP +M=M+1\n@ARG\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n@THIS\nD=M\n@SP\nA=M\nM=D\n@SP\nM=M+1\n@THAT\nD=M\n@SP\nA=M\nM=D\n@SP +M=M+1\n@SP\nD=M\n@0\nD=D-A\n@5\nD=D-A\n@ARG\nM=D\n@SP\nD=M\n@LCL\nM=D\n@Sys.init\n0;JMP\n(MainLoopXYZRARA) +//CALLFUNC\n''' + +for root, dirs, files in os.walk(yourpath, topdown=False): + nameslist = [] + sysstring, functstring = '', '' + for name in files: + tempString = '' + if name[-3:] == '.vm': + nameslist += [name[:-3]] + for i in nameslist: + if i == 'Sys': + sysstring = bootstrap + sysstring += iterate(i, root) + + else: + functstring += iterate(i, root) + if nameslist: + with open(Path(root, f'{os.path.split(root)[1]}.asm'), 'w+') as newfile: + newfile.write(sysstring + functstring) + diff --git a/solutions_only/project 09/Tetris/Main.jack b/solutions_only/project 09/Tetris/Main.jack new file mode 100755 index 0000000..2dcf4ba --- /dev/null +++ b/solutions_only/project 09/Tetris/Main.jack @@ -0,0 +1,19 @@ +class Main { + function void main (){ + var int s; + let s = -1; + do Output.moveCursor(0,20); + do Output.printString("Welcome to Tetris"); + do Sys.wait(2000); + do Output.println(); + do Output.println(); + do Output.println(); + while ((s < 0) | (s > 100)){ // gets a number used for seed for the random function + let s = Keyboard.readInt("Enter a number between 0 and 100:"); + do Screen.clearScreen(); + } + do Sys.wait(2000); + do Tetris.tetris(s); + return; + } +} \ No newline at end of file diff --git a/solutions_only/project 09/Tetris/Piece.jack b/solutions_only/project 09/Tetris/Piece.jack new file mode 100755 index 0000000..3ca2309 --- /dev/null +++ b/solutions_only/project 09/Tetris/Piece.jack @@ -0,0 +1,473 @@ +class Piece { + static int lBorder, rBorder, uBorder, dBorder, st; + field int x1, y1, x2, y2, x3, y3, x4, y4, piece, direction; + field bool move; + static Array st; + + constructor Piece new(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4, int p) { + let x1 = Ax1; + let y1 = Ay1; + let x2 = Ax2; + let y2 = Ay2; + let x3 = Ax3; + let y3 = Ay3; + let x4 = Ax4; + let y4 = Ay4; + let piece = p; + let direction = 0; + let move = true; + return this; + } + + function void init(){ + var int a; + let lBorder = 0; + let rBorder = 511; + let uBorder = 0; + let dBorder = 255; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + return; + } + + method void dispose() { + do Memory.deAlloc(this); + return; + } + + /** draws 2 rectangles also checks if there is a piece at the spawn which will indicate end of the game. */ + method bool draw() { + var bool finish; + let finish = true; + let finish = Piece.sample(x1,y1) & finish; + let finish = Piece.sample(x2,y2) & finish; + let finish = Piece.sample(x3,y3) & finish; + let finish = Piece.sample(x4,y4) & finish; + if (finish){ + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return true; + } + return false; + } + + /** Erases the square from the screen. */ + method void erase() { + do Screen.setColor(false); + do Screen.drawRectangle(x1, y2, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return; + } + /** checks if those coodinates hold any value > 0. */ + function bool sample(int x, int y){ + var int value, address, bit, memBlock; + let memBlock = x / 16; + let address = (32 * y) + memBlock + 16384; + if (address > 24576){ + return false; + } + let value = Memory.peek(address); + if (value = 0){ + return true; + } + return false; + } + + method bool getMove(){ + return move; + } + + /** Checks if the piece can move in the given direction(dir). */ + method bool fullSample(int dir){ + var int size1, size2, i, j; + var bool result, flagUpon; + if (dir = 1){ //down + let size1 = x2 - x1; + let size2 = x4 - x3; + let result = true; + while (i < size1){ // for each block of the first rectangle + let j = 0; + let flagUpon = false; + while (j < size2){ // for each block of the second rectangle + if ((x1 + i) = (x3 + j)){ // if this block of the first rectangle sits upon a block of the second rectangle + let flagUpon = true; + } + let result = result & Piece.sample(x3 + j, y4 + 1); // if there is a block under the second rectangle + let j = j + 16; // sets the coords for the next block of the second rectangle + } + if (~(flagUpon)){ + let result = result & Piece.sample(x1 + i, y2 + 1); // if there is a block under the first rectangle + } + let i = i + 16; // sets the coords for the next block of the firs rectangle + } + return result; + } + else{ + if (dir = 2){ //right + let size1 = y2 - y1; + let size2 = y4 - y3; + let result = true; + while (i < size1){ + let j = 0; + let flagUpon = false; + while (j < size2){ + if ((y1 + i) = (y3 + j)){ + let flagUpon = true; + } + let result = result & Piece.sample(x4 + 1, (y3 + j)); + let j = j + 16; + } + if (~(flagUpon)){ + let result = result & Piece.sample(x2 + 1, (y1 + i)); + } + let i = i +16; + } + return result; + } + else{ // left + let size1 = y2 - y1; + let size2 = y4 - y3; + let result = true; + while (i < size2){ + let j = 0; + let flagUpon = false; + while (j < size1){ + if ((y3 + i) = (y1 + j)){ + let flagUpon = true; + } + let result = result & Piece.sample(x1 - 1, (y1 + j)); + let j = j + 16; + } + if (~(flagUpon)){ + let result = result & Piece.sample(x3 - 1, (y3 + i)); + } + let i = i + 16; + } + return result; + } + } + } + + /** Moves the game piece 16 pixels down. */ + method void moveDown() { + var int i; + if ((y2 < dBorder) & (y4 < dBorder) & (move) & fullSample(1)) { + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x2, y1); + do Screen.drawRectangle(x3, y3, x4, y3); + let y1 = y1 + 1; + let y2 = y2 + 1; + let y3 = y3 + 1; + let y4 = y4 + 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y2, x2, y2); + do Screen.drawRectangle(x3, y4, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + else{ + let move = false; + } + return; + } + + /** Moves the game piece 16 pixels to the left. */ + method void moveLeft() { + var int i; + if ((x1 + 15 > lBorder) & (move) & (x3 + 15 > lBorder)& fullSample(0)){ + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x2, y1, x2, y2); + do Screen.drawRectangle(x4, y3, x4, y4); + let x1 = x1 - 1; + let x2 = x2 - 1; + let x3 = x3 - 1; + let x4 = x4 - 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + return; + } + + /** Moves the game piece 16 pixels to the right. */ + method void moveRight() { + var int i; + if ((x4 < rBorder) & (move) & (x2 < rBorder) & fullSample(2)){ + while (i < 16){ + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x1, y2); + do Screen.drawRectangle(x3, y3, x3, y4); + let x1 = x1 + 1; + let x2 = x2 + 1; + let x3 = x3 + 1; + let x4 = x4 + 1; + do Screen.setColor(true); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + let i = i + 1; + do Sys.wait(10); + } + } + return; + } + + /** Deletes the piece and draws it at the new coodinates. */ + method void reDraw(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4){ + var int absTmp; + if((Ax1 < 175) | (Ax3 < 175) | (Ax2 > 336) | (Ax4 > 336)){ + return; + } + if((Ay2 > 255) | (Ay4 > 255) | (Ay1 < 0) | (Ay3 < 0)){ + return; + } + if((Ax1 > Ax2) | (Ax3 > Ax4) | (Ay1 > Ay2) | (Ay3 > Ay4)){ + return; + } + do Screen.setColor(false); + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + do Screen.setColor(true); + let x1 = Ax1; + let y1 = Ay1; + let x2 = Ax2; + let y2 = Ay2; + let x3 = Ax3; + let y3 = Ay3; + let x4 = Ax4; + let y4 = Ay4; + do Screen.drawRectangle(x1, y1, x2, y2); + do Screen.drawRectangle(x3, y3, x4, y4); + return; + } + + /** Rotates the piece clockwise. */ + method void rotate(){ + var bool samp; + let samp = true; + if (direction = 0){ // starting position + if (piece = 0){ // arrow + let samp = Piece.sample(x4, y1) & samp; // checks if the place at which the new piece will be drawn are free + let samp = Piece.sample(x4, y1 - 1) & samp; + if (samp){ + do reDraw(x1, y1, x2, y2, x4 - 15, y4 - 47, x4, y4); // redraws it at the new location + let direction = 1; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 + 16, y1) & samp; + let samp = Piece.sample(x1 + 16, y1 - 16) & samp; + let samp = Piece.sample(x4, y1 - 16) & samp; + if(samp){ + do reDraw(x1 + 16, y1 - 16, x4 - 16, y4, x4 - 15, y1 - 16, x4, y1 - 1); + let direction = 1; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 - 16, y1 - 16) & samp; + let samp = Piece.sample(x1 - 16, y1) & samp; + if (samp){ + do reDraw(x1 - 16, y1 - 16, x2 - 16, y2 + 16, x3 + 32, y3, x4, y4); + let direction = 1; + } + } + if (piece = 3){ + let samp = Piece.sample(x3 + 16, y3 - 32) & samp; + let samp = Piece.sample(x4, y4 - 16) & samp; + if (samp){ + do reDraw(x1 + 16, y1, x2, y2 + 16, x3 + 16, y3 - 32, x4, y4 - 16); + let direction = 1; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 + 32, y3 - 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 - 16, y2 + 16, x3 + 32, y3 - 32, x4 + 16, y4 - 16); + let direction = 1; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 + 32, y1 - 32) & samp; + let samp = Piece.sample(x2 + 16, y2 - 16) & samp; + let samp = Piece.sample(x4 - 16, y4 + 16) & samp; + if (samp){ + do reDraw(x1 + 32, y1 - 32, x2 + 16, y2 - 16, x3, y3, x4 - 16, y4 + 16); + let direction = 1; + } + } + } + else{ + if (direction = 1){ + if (piece = 0){ + let samp = Piece.sample(x1, y3) & samp; + let samp = Piece.sample(x1 - 1, y3) & samp; + if (samp){ + do reDraw(x1 - 16, y3, x4, y3 + 15, x1, y1, x2, y2); + let direction = 2; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3, y3 + 16) & samp; + let samp = Piece.sample(x3, y3 + 32) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 16, x4, y4 + 16, x3, y3 + 32, x4, y2); + let direction = 2; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x2 + 16, y2 - 16) & samp; + let samp = Piece.sample(x3 - 32, y3) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 16, x2 + 16, y2 - 16, x3 - 32, y3, x4 - 32, y4); + let direction = 2; + } + } + if (piece = 3){ + let samp = Piece.sample(x1 - 16, y1) & samp; + let samp = Piece.sample(x4, y4 + 16) & samp; + if (samp){ + do reDraw(x1 - 16, y1, x2, y2 - 16, x3 - 16, y3 +32, x4, y4 + 16); + let direction = 2; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 - 32, y3 + 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 + 16, y2 - 16, x3 - 32, y3 + 32, x4 - 16, y4 + 16); + let direction = 2; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3 + 16, y3 - 16) & samp; + let samp = Piece.sample(x4 + 32, y4 - 32) & samp; + if (samp){ + do reDraw(x1 - 32, y1 + 16, x2 - 16, y2, x3, y3 - 16, x4 + 16, y4 - 32); + let direction = 2; + } + } + } + else{ + if (direction = 2){ + if (piece = 0){ + let samp = Piece.sample(x1, y1+16) & samp; + let samp = Piece.sample(x1, y1+32) & samp; + if (samp){ + do reDraw(x1, y1, x1 + 15, y1 + 47, x3, y3, x4, y4); + let direction = 3; + } + } + if (piece = 1){ + let samp = Piece.sample(x1 - 16, y1 + 16) & samp; + let samp = Piece.sample(x3, y3 + 16) & samp; + let samp = Piece.sample(x3, y3 + 32) & samp; + if (samp){ + do reDraw(x1, y1 + 16, x1 + 15, y1 + 31, x1 + 16, y1 - 16, x4 - 16, y4); + let direction = 3; + } + } + if (piece = 2){ + let samp = Piece.sample(x1, y1 - 16) & samp; + let samp = Piece.sample(x2 + 32, y2 + 16) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1, y1 - 16, x2 - 32, y2 - 16, x3 + 16, y3 - 32, x4 + 16, y4); + let direction = 3; + } + } + if (piece = 3){ + let samp = Piece.sample(x2 - 16, y2 + 16) & samp; + let samp = Piece.sample(x3, y3 - 32) & samp; + if (samp){ + do reDraw(x1, y1, x2 - 16, y2 + 16, x3, y3 - 32, x4 - 16, y4 - 16); + let direction = 3; + } + } + if (piece = 4){ + let samp = Piece.sample(x1 - 16, y1 - 16) & samp; + let samp = Piece.sample(x2 - 32, y2) & samp; + if (samp){ + do reDraw(x1 - 16, y1 - 16, x2 - 32, y2, x3 + 16, y3 - 16, x4, y4); + let direction = 3; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 + 16, y1 - 16) & samp; + let samp = Piece.sample(x3 - 16, y3 - 16) & samp; + let samp = Piece.sample(x4 - 32, y4 + 32) & samp; + if (samp){ + do reDraw(x1 + 16, y1 - 16, x2, y2, x3 - 16, y3 + 16, x4 - 32, y4 + 32); + let direction = 3; + } + } + } + else{ + if (piece = 0){ + let samp = Piece.sample(x4 + 16, y4) & samp; + let samp = Piece.sample(x4 + 32, y4) & samp; + if (samp){ + do reDraw(x3, y3, x4, y4, x1, y1 + 32, x1 + 47, y1 + 47); + let direction = 0; + } + } + if (piece = 1){ + let samp = Piece.sample(x1, y1 - 16) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1, y1 - 16, x2, y2 -16, x1, y1, x4 + 16, y4); + let direction = 0; + } + } + if (piece = 2){ + let samp = Piece.sample(x1 + 32, y1 + 16) & samp; + let samp = Piece.sample(x3 - 16, y3 + 32) & samp; + let samp = Piece.sample(x4 + 16, y4) & samp; + if (samp){ + do reDraw(x1 + 32, y1 + 16, x2 + 32, y2 + 16, x3 - 16, y3 + 32, x4 + 16, y4); + let direction = 0; + } + } + if (piece = 3){ + let samp = Piece.sample(x3, y3 + 32) & samp; + let samp = Piece.sample(x4 + 16, y4 + 16) & samp; + if (samp){ + do reDraw(x1, y1, x2 + 16, y2 - 16, x3, y3 + 32, x4 + 16, y4 + 16); + let direction = 0; + } + } + if (piece = 4){ + let samp = Piece.sample(x3 - 16, y3 + 16) & samp; + let samp = Piece.sample(x2 + 32, y2) & samp; + if (samp){ + do reDraw(x1 + 16, y1 + 16, x2 + 32, y2, x3 - 16, y3 + 16, x4, y4); + let direction = 0; + } + } + if (piece = 5){ + let samp = Piece.sample(x1 - 16, y1 + 32) & samp; + let samp = Piece.sample(x3 + 16, y3) & samp; + let samp = Piece.sample(x4 + 32, y4 - 16) & samp; + if (samp){ + do reDraw(x1 - 16, y1 + 32, x2, y2 + 16, x3 + 16, y3, x4 + 32, y4 - 16); + let direction = 0; + } + } + } + } + } + return; + } +} + diff --git a/solutions_only/project 09/Tetris/Tetris.jack b/solutions_only/project 09/Tetris/Tetris.jack new file mode 100755 index 0000000..0d15797 --- /dev/null +++ b/solutions_only/project 09/Tetris/Tetris.jack @@ -0,0 +1,203 @@ +class Tetris { + static int points, seed, next_seed; + + function void tetris(int z){ + var Piece p, nextPiece; + var int i, x1, y1, x2, y2, x3, y3, x4, y4, key, j, randTmp, piece_number, moves; + var Array left_g, right_g, box, stick, left_z, right_z,dick, all_piece, tmp; + do Piece.init(); + do Tetris.border(); + let points = 0; + let all_piece = Array.new(25); + let all_piece[0] = Tetris.newPiece(16,0,31,15, 0,16,47,31, 0); // arrow + let all_piece[1] = Tetris.newPiece(0,0,15,15, 0,16,47,31, 1); // right_L + let all_piece[2] = Tetris.newPiece(32,16,47,31, 0,32,47,47, 2); // left_L + let all_piece[3] = Tetris.newPiece(0,0,31,15, 16,16,47,31, 3); // left_z + let all_piece[4] = Tetris.newPiece(16,0,47,15, 0,16,31,31, 4); // right_z + let all_piece[5] = Tetris.newPiece(0,0,31,15, 32,0,63,15, 5); //stick + let all_piece[6] = Tetris.newPiece(0,0,15,31, 16,0,31,31, 6); //box + + + let seed = z * 3; // multiply by 3, because it gets in a loop on some even numbers + let next_seed = Tetris.randomNumber(); + do Output.moveCursor(0,0); + do Output.printString("Point: "); + do Output.printInt(points); + do Output.println(); + do Output.printString("Next Piece: "); + while (true){ // The main game loop + let j = next_seed; + let next_seed = Tetris.randomNumber(); + let tmp = all_piece[j]; // initializes the coords of the game piece + let x1 = tmp[0]; + let y1 = tmp[1]; + let x2 = tmp[2]; + let y2 = tmp[3]; + let x3 = tmp[4]; + let y3 = tmp[5]; + let x4 = tmp[6]; + let y4 = tmp[7]; + let piece_number = tmp[8]; + let p = Piece.new(x1 + 240, y1, x2 + 240, y2, x3 + 240, y3, x4 + 240, y4, piece_number); + if (~(p.draw())){ // if a piece tries to spawn above a limit the game ends + if (~(Tetris.finish())){ + return; + } + } + let tmp = all_piece[next_seed]; + let x1 = tmp[0]; // initializes the coords of the next game piece that is being displayed + let y1 = tmp[1]; + let x2 = tmp[2]; + let y2 = tmp[3]; + let x3 = tmp[4]; + let y3 = tmp[5]; + let x4 = tmp[6]; + let y4 = tmp[7]; + let piece_number = tmp[8]; + let nextPiece = Piece.new(x1 + 16, y1 + 32, x2+16, y2 + 32, x3+16, y3 + 32, x4 + 16, y4 + 32, piece_number); + do nextPiece.draw(); + while (p.getMove()){ + let moves = 0; + while (moves < 3){ // one can move its piece 3 times before it moves down automatically + let key = Keyboard.keyPressed(); + if (key = 130){ + do p.moveLeft(); + do Sys.wait(80); + } + if (key = 132){ + do p.moveRight(); + do Sys.wait(80); + } + if (key = 131){ + do p.rotate(); + } + if (key = 133){ + do p.moveDown(); + do p.moveDown(); + } + let moves = moves +1; + } + do p.moveDown(); + let i = i + 1; + do Sys.wait(80); + } + let i = 0; + do p.dispose(); + do Tetris.completeRow(); + do Output.moveCursor(0,7); + do Output.printInt(points); + do Screen.setColor(false); + do Screen.drawRectangle(16,32,80,96); + do Screen.setColor(true); + do nextPiece.dispose(); + } + return; + } + + function void completeRow(){ // checks if a row has been completed + var int adddress, row, colloum; + var bool complete; + let adddress = 16384 + 11; + let row = 15; + while (row > 0){ // for each row + let complete = true; + let colloum = 0; + while ((colloum < 10) & (complete)){ // for each collum + let complete = Memory.peek(adddress + colloum + (row * 512)) & complete; + let colloum = colloum + 1; + } + if (complete){ // removes the row + do Screen.setColor(false); + do Screen.drawRectangle(176, row * 16, 335, ((row * 16)+ 15) ); + let points = points + 1; + do Tetris.shift(row); + } + let row = row - 1; + } + return; + } + + function void shift(int rowShift){ // shifts all rows above the completed one + var int j, val, adddress, tmp, k; + let adddress = 16384 + 11; + while (rowShift > 1){ // each row + let j = 0; + while (j < 10){ // collum in the game field + let k = 0; + while (k < 16){ // each line a in 16 x 16 box + let tmp = adddress + j + (((rowShift - 1) * 512) + (k * 32)); + let val = Memory.peek(tmp); + do Memory.poke(adddress + j + ((rowShift * 512) + (k * 32)), val); + do Memory.poke(tmp,0); + let k = k+ 1; + } + let j = j + 1; + } + let rowShift = rowShift - 1; + } + return; + } + + function void border(){ // draws a border + do Screen.drawLine(175,0,175,255); + do Screen.drawLine(336,0,336,255); + return; + } + + function Array newPiece(int Ax1, int Ay1, int Ax2, int Ay2, int Ax3, int Ay3, int Ax4, int Ay4,int p){ + var Array gamepice; + let gamepice = Array.new(9); + let gamepice[0] = Ax1; + let gamepice[1] = Ay1; + let gamepice[2] = Ax2; + let gamepice[3] = Ay2; + let gamepice[4] = Ax3; + let gamepice[5] = Ay3; + let gamepice[6] = Ax4; + let gamepice[7] = Ay4; + let gamepice[8] = p; + return gamepice; + } + + function int randomNumber(){ // radom number generator + var int multiplier,additor,moduler,toBeModulated; + let multiplier = 7; + let additor = 13; + let moduler = 1133; + let toBeModulated = (multiplier * seed) + additor; + let seed = Tetris.mod(toBeModulated,moduler); + return Tetris.mod(seed,7); + } + + function bool finish(){ // after finishing the game the player has 2 options to start onether or to end the game + var char c; + do Screen.clearScreen(); + do Output.moveCursor(10,24); + do Output.printString("Your score: "); + do Output.printInt(points); + do Sys.wait(10000); + do Screen.clearScreen(); + do Output.moveCursor(10,0); + do Output.printString("Would you like to play again, for yes click 'Y' and for no 'N':"); + let c = Keyboard.readChar(); + if (c = 89){ + do Screen.clearScreen(); + return false; + } + if (c = 78){ + do Screen.clearScreen(); + do Sys.halt(); + } + return true; + } + + function int mod(int tbm, int mo){ //simple moduler devision + var int val, tmp2; + if (tbm < mo){ + return tbm; + } + let tmp2 = (tbm / mo) * mo; + let val = tbm - tmp2; + return val; + } +} \ No newline at end of file diff --git a/solutions_only/project 10/JackAnalyzer.py b/solutions_only/project 10/JackAnalyzer.py new file mode 100755 index 0000000..d7f8f02 --- /dev/null +++ b/solutions_only/project 10/JackAnalyzer.py @@ -0,0 +1,410 @@ +import re +import os +from pathlib import Path + + +class Tokenizer: + + def __init__(self): + self.i = 0 + self.file = '' + self.symbols = ('(', ')', '[', ']', '}', '{', '>', '<', '=', '*', '+', '-', '/', '.', ';', ',', '&', '|', + '~', '>', '<', '&') + self.key_word = ( + 'class', 'method', 'function', 'constructor', 'int', 'boolean', 'char', 'void', 'var', 'static', 'field', + 'let', 'do', 'if', 'else', 'while', 'return', 'true', 'false', 'null', 'this') + self.token = '' + + def token_type(self): + if self.token is None or self.token == '': + return None + if self.token in self.key_word: + return 'keyword' + elif self.token[0] == '"': + return 'stringConstant' + elif re.match(r"\d+", self.token): + return 'integerConstant' + elif self.token in self.symbols: + return 'symbol' + else: + return 'identifier' + + def advance(self): + token = '' + i = self.i + while i < len(self.file): + if re.match(r'\s', self.file[i]): + i = i + 1 + continue + else: + if self.file[i] in self.symbols: + if self.file[i] == '>': + self.token = '>' + elif self.file[i] == '<': + self.token = '<' + elif self.file[i] == '&': + self.token = '&' + else: + self.token = self.file[i] + # self.token = self.file[i] + self.i = i + 1 + return + elif self.file[i] == '"': + i += 1 + while self.file[i] != '"': + token += self.file[i] + i += 1 + self.i = i + 1 + self.token = '"' + token + '"' + return + else: + while re.match(r'\w', self.file[i]): + token += self.file[i] + if i + 1 > len(self.file) - 1: + break + i += 1 + self.i = i + self.token = token + return + + def clear_file(self, directory): + with open(directory, "r") as my_file: + txt = my_file.read() + txt = re.sub(r"//.*", "", txt) + txt = re.sub(r"/[*][*].*[*]/", "", txt) + txt = re.sub(r"/[*][*][\w*\W*]*[*]/", "", txt) + self.file = txt + + +class CompilationEngine: + def __init__(self): + self.string = '' + self.tab = 0 + + def write_token(self, tokenizer): + if tokenizer.token_type() == 'stringConstant': + self.string += ' ' * self.tab + '<' + tokenizer.token_type() + '> ' + tokenizer.token.strip('"') + ' \n' + else: + self.string += ' ' * self.tab + '<' + tokenizer.token_type() + '> ' + tokenizer.token + ' \n' + + def compile_class(self, tokenizer): + tokenizer.advance() + self.string += '\n' + ' ' * self.tab + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token != '}': + if tokenizer.token in ['static', 'field']: + self.compile_class_var_dec(tokenizer) + if tokenizer.token in ['constructor', 'function', 'method']: + self.compile_subroutine(tokenizer) + + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_class_var_dec(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_subroutine(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_parameter_list(tokenizer) + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token != '}': + if tokenizer.token == 'var': + self.compile_var_dec(tokenizer) + elif tokenizer.token in ['let', 'if', 'while', 'do', 'return']: + self.compile_statements(tokenizer) + self.write_token(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_parameter_list(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + while tokenizer.token != ')': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + self.write_token(tokenizer) + tokenizer.advance() + + def compile_var_dec(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_statements(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + while True: + if tokenizer.token == 'let': + self.compile_let(tokenizer) + elif tokenizer.token == 'if': + self.compile_if(tokenizer) + elif tokenizer.token == 'while': + self.compile_while(tokenizer) + elif tokenizer.token == 'do': + self.compile_do(tokenizer) + elif tokenizer.token == 'return': + self.compile_return(tokenizer) + else: + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + break + + def compile_do(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token == '(': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + elif tokenizer.token == '.': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_let(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token == '[': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_while(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_statements(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_return(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token != ';': + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_if(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_statements(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == 'else': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_statements(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_expression(self, tokenizer): + if tokenizer.token in ['(', '~', '-'] or tokenizer.token_type() != 'symbol': + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.compile_term(tokenizer) + while tokenizer.token in ['+', '-', '*', '/', '&', '|', '<', '>', '=']: + self.write_token(tokenizer) + tokenizer.advance() + self.compile_term(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_term(self, tokenizer): + if tokenizer.token == '(': + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token in ['~', '-']: + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.compile_term(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token_type() != 'symbol': + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token == '[': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token == '(': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token == '.': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + else: + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_expression_list(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.compile_expression(tokenizer) + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + +path = os.getcwd() +for root, dirs, files in os.walk(path, topdown=False): + for name in files: + if name[-4:] == 'jack': + tok = Tokenizer() + tok.clear_file(Path(root, name)) + ce = CompilationEngine() + ce.compile_class(tok) + with open(Path(root, name[:-4] + 'xml'), "w+") as my_xml: + my_xml.write(ce.string) diff --git a/solutions_only/project 11/JackCompiler.py b/solutions_only/project 11/JackCompiler.py new file mode 100755 index 0000000..5782f99 --- /dev/null +++ b/solutions_only/project 11/JackCompiler.py @@ -0,0 +1,350 @@ +import os +from pathlib import Path +from tokenizer import Tokenizer +from vmwriter import VMWriter +from symbol_table import SymbolTable + + +# TODO add names to variables when you call for them, aka current_vm_append(thingtobeappended=blablac) + +class CompilationEngine: + def __init__(self, tokenizer, full_path_vm): + self.string = self.sub_type = self.class_name = self.function_type = '' + self.tab = self.recursion_index = 0 + self.tokenizer = tokenizer + self.sym_table = [] + self.vmwriter = VMWriter(full_path_vm) + self.current_vm = [] # used to reverse some of the commands, eg a+b need to be a b + + + def search_kind_of_sym(self, current_vm): + if self.sym_table[-1].kind_of(current_vm) is not None: + return self.sym_table[-1].kind_of(current_vm), self.sym_table[-1].index_of(current_vm) + for i in range(len(self.sym_table) - 2, -1, + -1): # start from the amount of sym_tables -2 so it starts from one below the current, + # until it is bigger than -1, walking it backwards + if self.sym_table[i].kind_of(current_vm) in ('static', 'this'): + return self.sym_table[i].kind_of(current_vm), self.sym_table[i].index_of(current_vm) + + def search_type_of_sym(self, current_vm): + for i in range(len(self.sym_table) - 1, -1, -1): + if self.sym_table[i].type_of(current_vm) is not None: + return self.sym_table[i].type_of(current_vm) + + def write_token(self): + if self.tokenizer.token_type() == 'stringConstant': + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token.strip( + '"') + ' \n' + else: + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token + ' \n' + + def compile_class(self): + self.sym_table.append(SymbolTable()) + self.tokenizer.advance() # class -> + self.tokenizer.advance() # type -> + self.class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + self.tokenizer.advance() # { -> + while self.tokenizer.token != '}': + if self.tokenizer.token in ['static', 'field']: + self.compile_class_var_dec() + if self.tokenizer.token in ['constructor', 'function', 'method']: + self.compile_subroutine() + self.tokenizer.advance() + self.sym_table.pop() + self.vmwriter.close_vm_file() + + def compile_class_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_subroutine(self): + self.sym_table.append(SymbolTable()) + self.sub_type = self.tokenizer.token + self.tokenizer.advance() # subroutine type(function|method|constructor) -> + self.function_type = self.tokenizer.token + self.tokenizer.advance() # subroutine kind(int|void|etc..) -> + sub_name = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + if self.sub_type == 'method': + self.sym_table[-1].start_subroutine('this', self.class_name) + self.compile_parameter_list() + self.tokenizer.advance() # { -> + while self.tokenizer.token == 'var': # create only symbol teable entries + self.compile_var_dec() + if self.sub_type == 'constructor': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('constant', self.sym_table[-2].var_count('field')) + self.vmwriter.write_call('Memory.alloc', 1) + self.vmwriter.write_pop('pointer', 0) + elif self.sub_type == 'method': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('argument', 0) + self.vmwriter.write_pop('pointer', 0) + else: + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + while self.tokenizer.token != '}': + self.compile_statements() + self.tokenizer.advance() + self.sym_table.pop() + + def compile_parameter_list(self): + if self.tokenizer.token != ')': + var_type = self.tokenizer.token + self.tokenizer.advance() # var ype -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # var name -> + while self.tokenizer.token == ',': + self.tokenizer.advance() # , -> + var_type = self.tokenizer.token + self.tokenizer.advance() # type -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # name -> + self.tokenizer.advance() # )-> + + def compile_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_statements(self): + while True: + if self.tokenizer.token == 'let': + self.compile_let() + elif self.tokenizer.token == 'if': + self.compile_if() + elif self.tokenizer.token == 'while': + self.compile_while() + elif self.tokenizer.token == 'do': + self.compile_do() + elif self.tokenizer.token == 'return': + self.compile_return() + else: + break + + def compile_do(self): + self.tokenizer.advance() # do -> + class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + if self.tokenizer.token == '(': # method + self.vmwriter.write_push('pointer', 0) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{class_name}', count + 1) + elif self.tokenizer.token == '.': # method or function + self.tokenizer.advance() # . -> + fname = f'{class_name}.{self.tokenizer.token}' + sname = f'{self.search_type_of_sym(class_name)}.{self.tokenizer.token}' + self.tokenizer.advance() # name -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_push(*self.search_kind_of_sym(class_name)) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_call(f'{sname}', count + 1) + else: + self.vmwriter.write_call(f'{fname}', count) + self.vmwriter.write_pop('temp', '0') + self.tokenizer.advance() # ; -> + + def compile_let(self): + flag_array = 0 + self.tokenizer.advance() # let -> + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # var_name -> + if self.tokenizer.token == '[': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.tokenizer.advance() # [ -> + self.compile_expression() + self.tokenizer.advance() # ] -> + flag_array = 1 + self.tokenizer.advance() # = -> + self.compile_expression() + self.tokenizer.advance() # ; -> + if flag_array == 0: + self.vmwriter.write_pop(*self.search_kind_of_sym(self.current_vm[-1])) + else: + self.vmwriter.write_pop('temp', 1) + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('temp', 1) + self.vmwriter.write_pop('that', 0) + self.current_vm.pop() + + def compile_while(self): + self.tokenizer.advance() # while -> + label1 = self.vmwriter.label_index + self.vmwriter.write_lable(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label2 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_goto(label1) + self.vmwriter.write_lable(label2) + + def compile_return(self): + self.tokenizer.advance() # return -> + if self.tokenizer.token != ';': + self.compile_expression() + self.vmwriter.write_return(self.function_type) + self.tokenizer.advance() # ; -> + + def compile_if(self): + self.tokenizer.advance() # if -> + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label1 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + label2 = self.vmwriter.label_index + self.vmwriter.write_goto(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.vmwriter.write_lable(label1) + if self.tokenizer.token == 'else': + self.tokenizer.advance() # else -> + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_lable(label2) + + def compile_expression(self): + self.compile_term() + while self.tokenizer.token in ['+', '-', '*', '/', '|', '=', '>', '<', '&']: + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # symbol -> + self.compile_term() + self.vmwriter.write_arithmetic(self.current_vm[-1]) + self.current_vm.pop() + + def compile_term(self): + if self.tokenizer.token == '(': # expression () + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + elif self.tokenizer.token in ['~', '-']: # uniry op + self.current_vm.append(self.tokenizer.token) + tmp = 'neg' if self.tokenizer.token == '-' else self.tokenizer.token + self.tokenizer.advance() # ~ or - -> + self.compile_term() + self.vmwriter.write_arithmetic(tmp) + self.current_vm.pop() + elif self.tokenizer.token_type() != 'symbol': + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # integer, string, keyword, varnname, subroutine_name, class_name, var_name -> + if self.tokenizer.token == '[': # Array + self.tokenizer.advance() # [ -> + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + self.compile_expression() + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('that', 0) + self.tokenizer.advance() # ] -> + elif self.tokenizer.token == '(': # subroutine_name () + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{self.current_vm[-1]}', count) + self.current_vm.pop() + elif self.tokenizer.token == '.': # method + if self.search_type_of_sym(self.current_vm[-1]) is not None: + flag = 1 + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + else: + flag = 0 + self.tokenizer.advance() # . -> + fname = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if flag == 1: + self.vmwriter.write_call(f'{self.search_type_of_sym(self.current_vm[-1])}.{fname}', count + 1) + else: + self.vmwriter.write_call(f'{self.current_vm[-1]}.{fname}', count) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'stringConstant': + self.vmwriter.write_push('constant', len(self.current_vm[-1].strip('"'))) + self.vmwriter.write_call('String.new', 1) + for index, item in enumerate(self.current_vm[-1].strip('"')): + self.vmwriter.write_push('constant', ord(item)) + self.vmwriter.write_call('String.appendChar', 2) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'integerConstant': + self.vmwriter.write_push('constant', self.current_vm[-1]) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'identifier': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + elif self.current_vm[-1] == 'true': + self.vmwriter.write_push('constant', '1') + self.vmwriter.write_arithmetic('neg') + self.current_vm.pop() + elif self.current_vm[-1] == 'false' or self.current_vm[-1] == 'null': + self.vmwriter.write_push('constant', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'this': + self.vmwriter.write_push('pointer', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'that': + self.vmwriter.write_push('pointer', '1') + self.current_vm.pop() + + def compile_expression_list(self): + count_exp = 0 + if self.tokenizer.token in ['(', '~', '-'] or self.tokenizer.token_type() != 'symbol': + count_exp += 1 + self.compile_expression() + while self.tokenizer.token == ',': + count_exp += 1 + self.tokenizer.advance() # , + self.compile_expression() + return count_exp + + +if __name__ == '__main__': + path = os.getcwd() + for root, dirs, files in os.walk(path, topdown=False): + for name in files: + if name[-4:] == 'jack': + tokenizer_main = Tokenizer() + tokenizer_main.clear_file(Path(root, name)) + full_path = Path(root, name[:-4] + 'vm') + comp_eng_main = CompilationEngine(tokenizer_main, full_path) + comp_eng_main.compile_class() diff --git a/solutions_only/project 11/symbol_table.py b/solutions_only/project 11/symbol_table.py new file mode 100755 index 0000000..7c62c3e --- /dev/null +++ b/solutions_only/project 11/symbol_table.py @@ -0,0 +1,62 @@ +class Symbol: + def __init__(self): + self.s_name = '' + self.s_kind = '' + self.s_type = '' + self.s_index = 0 + + +class SymbolTable: + def __init__(self): + self.sym = [] + + def define(self, s_name, s_type, s_kind): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = s_kind + self.sym[-1].s_index = self.var_count(s_kind) - 1 + + def start_subroutine(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'argument' + self.sym[-1].s_index = 0 + + def start_class(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = 'this' + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'field' + self.sym[-1].s_index = 0 + + def var_count(self, s_kind): + count = 0 # it is -1 so the first index is 0 + for i in self.sym: + if i.s_kind == s_kind: + count += 1 + return count + + def kind_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + if i.s_kind == 'var': + return 'local' + elif i.s_kind == 'field': + return 'this' + else: + return i.s_kind + return None + + def type_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_type + return None + + def index_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_index + return None diff --git a/solutions_only/project 11/tokenizer.py b/solutions_only/project 11/tokenizer.py new file mode 100755 index 0000000..aaaa873 --- /dev/null +++ b/solutions_only/project 11/tokenizer.py @@ -0,0 +1,78 @@ +import re + + +class Tokenizer: + + def __init__(self): + self.i = 0 + self.file = '' + self.symbols = ('(', ')', '[', ']', '}', '{', '>', '<', '=', '*', '+', '-', '/', '.', ';', ',', '&', '|', + '~') + self.key_word = ( + 'class', 'method', 'function', 'constructor', 'int', 'boolean', 'char', 'void', 'var', 'static', 'field', + 'let', 'do', 'if', 'else', 'while', 'return', 'true', 'false', 'null', 'this') + self.token = '' + + def token_type(self, token=None): + if token is None: + token = self.token + if token is None or token == '': + return None + if token in self.key_word: + return 'keyword' + elif token[0] == '"': + return 'stringConstant' + elif re.match(r"\d+", token): + return 'integerConstant' + elif token in self.symbols: + return 'symbol' + else: + return 'identifier' + + def advance(self): + token = '' + i = self.i + while i < len(self.file): + if re.match(r'\s', self.file[i]): + i = i + 1 + continue + else: + if self.file[i] in self.symbols: + self.token = self.file[i] + self.i = i + 1 + return + elif self.file[i] == '"': + i += 1 + while self.file[i] != '"': + token += self.file[i] + i += 1 + self.i = i + 1 + self.token = '"' + token + '"' + return + else: + while re.match(r'\w', self.file[i]): + token += self.file[i] + if i + 1 > len(self.file) - 1: + break + i += 1 + self.i = i + self.token = token + return + + def clear_file(self, directory): + with open(directory, "r") as my_file: + txt = my_file.read() + txt = re.sub(r"//.*", "", txt) + txt = re.sub(r"/[*][*].*[*]/", "", txt) + i = 0 + # TODO this should be a regex + while i < len(txt): + if txt[i] == '/' and txt[i + 1] == '*' and txt[i + 2] == '*': + start = i + while txt[i] != '*' or txt[i + 1] != '/': + i += 1 + stop = i + 2 + txt = txt[:start] + txt[stop:len(txt)] + i = start - 1 + i += 1 + self.file = txt diff --git a/solutions_only/project 11/vmwriter.py b/solutions_only/project 11/vmwriter.py new file mode 100755 index 0000000..5bf6929 --- /dev/null +++ b/solutions_only/project 11/vmwriter.py @@ -0,0 +1,75 @@ +class VMWriter: + def __init__(self, vm_path): + self.my_vm = open(vm_path, "w+") + self.label_index = 0 + + def write_push(self, segment, index): + self.my_vm.write(f'push {segment} {index}\n') + print(f'push {segment} {index}') + + def write_lable(self, label): + self.my_vm.write(f'label L{label}\n') + print(f'label L{label}') + + def write_arithmetic(self, command): + if command == '+': + self.my_vm.write('add\n') + print('add') + elif command == '-': + self.my_vm.write('sub\n') + print('sub') + elif command == 'neg': + self.my_vm.write('neg\n') + print('neg') + elif command == '=': + self.my_vm.write('eq\n') + print('eq') + elif command == '>': + self.my_vm.write('gt\n') + print('gt') + elif command == '<': + self.my_vm.write('lt\n') + print('lt') + elif command == '&': + self.my_vm.write('and\n') + print('and') + elif command == '|': + self.my_vm.write('or\n') + print('or') + elif command == '~': + self.my_vm.write('not\n') + print('not') + elif command == '*': + self.write_call('Math.multiply', 2) + elif command == '/': + self.write_call('Math.divide', 2) + + def write_pop(self, segment, index): + print(f'pop {segment} {index}') + self.my_vm.write(f'pop {segment} {index}\n') + + def write_goto(self, label): + self.my_vm.write(f'goto L{label}\n') + print(f'goto L{label}') + + def write_if(self, label): + self.write_arithmetic('~') + self.my_vm.write(f'if-goto L{label}\n') + print(f'if-goto L{label}') + + def write_call(self, label, num_args): + self.my_vm.write(f'call {label} {num_args}\n') + print(f'call {label} {num_args}') + + def write_function(self, label, num_locals): + self.my_vm.write(f'function {label} {num_locals}\n') + print(f'function {label} {num_locals}') + + def write_return(self, func_type): + if func_type == 'void': + self.write_push('constant', '0') + self.my_vm.write('return\n') + print(f'return') + + def close_vm_file(self): + self.my_vm.close() diff --git a/solutions_only/project 12/Array.jack b/solutions_only/project 12/Array.jack new file mode 100755 index 0000000..f16cad6 --- /dev/null +++ b/solutions_only/project 12/Array.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/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) { + if(size < 0){ + do Sys.error(7); + } + return Memory.alloc(size); + } + + /** Disposes this array. */ + method void dispose() { + do Memory.deAlloc(this); + return; + } +} diff --git a/solutions_only/project 12/Keyboard.jack b/solutions_only/project 12/Keyboard.jack new file mode 100755 index 0000000..81e4cc6 --- /dev/null +++ b/solutions_only/project 12/Keyboard.jack @@ -0,0 +1,102 @@ +// This 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 mem; + /** Initializes the keyboard. */ + function void init() { + let mem = 0; + 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 mem[24576]; + } + + /** + * 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 a, b; + do Output.printChar(0); + while ((b = 0) | (a > 0)){ + let a = Keyboard.keyPressed(); + if (a > 0){ + let b = a; + } + } + do Output.printChar(String.backSpace()); + do Output.printChar(b); + return b; + } + + /** + * 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 s, b; + var char c; + let s = String.new(100); + do Output.printString(message); + while (true){ + let c = Keyboard.readChar(); + if (c = 128){ + return s; + } + else{ + if (c = 129){ + do s.eraseLastChar(); + } + else{ + do s.appendChar(c); + } + } + } + return s; + } + + /** + * 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 starting a; + var int b; + let a = Keyboard.readLine(message); + let b = String.intValue(a); + do String.dispose(a); + return b; + } +} diff --git a/solutions_only/project 12/Main.jack b/solutions_only/project 12/Main.jack new file mode 100755 index 0000000..73331ef --- /dev/null +++ b/solutions_only/project 12/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: "); + 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/solutions_only/project 12/Math.jack b/solutions_only/project 12/Math.jack new file mode 100755 index 0000000..1730de4 --- /dev/null +++ b/solutions_only/project 12/Math.jack @@ -0,0 +1,143 @@ +// This 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 st; + static int division_tmp, f; + + /** Initializes the library. */ + function void init() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + return; + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x > 0){ + return x; + } + 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, temp, y_comp, i, neg; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (x < y){ + let temp = x; + let x = y; + let y = temp; + } + if (y = 1){ + if(neg){ + return -x; + } + return x; + } + while((y_comp - 1) < (y - 1)){ + if ((st[i] & y) > 0) { + let sum = sum + x; + let y_comp = y_comp + st[i]; + } + let x = x + x; + let i = i + 1; + } + if(neg){ + let sum = -sum; + } + 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, neg; + if (f = 0){ + let division_tmp = 0; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (y = 0){ + do Sys.error(3); + } + let f = 1; + } + if ((y > x) | (y < 0)){ + return 0; + } + let q = Math.divide(x, y + y); + let f = 0; + let q = Math.abs(q); + if ((q & 1) = 1){ + let division_tmp = division_tmp + y + y; + } + if (x - division_tmp < y){ + if (neg){ + return -(q + q); + } + return q + q; + } + else{ + if (neg){ + return -(q + q + 1); + } + return q + q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int j, b, d, y; + + if (x < 0){ + do Sys.error(4); + } + let j = 7; + while (j > -1){ + let d = y + st[j]; + let b = d * d; + if ((~(b > x)) & (b > 0)){ + let y = d; + } + let j = j - 1; + } + return y; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if (a > b){ + return a; + } + return b; + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if (a < b){ + return a; + } + return b; + } +} diff --git a/solutions_only/project 12/Memory.jack b/solutions_only/project 12/Memory.jack new file mode 100755 index 0000000..14305f1 --- /dev/null +++ b/solutions_only/project 12/Memory.jack @@ -0,0 +1,63 @@ +// This 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 mem; + /** Initializes the class. */ + function void init() { + let mem = 0; + let mem[2048] = 14334; + let mem[2049] = -1; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return mem[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let mem[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 current_block; + var int tmp; + let current_block = 2048; + if (size < 0){ + do Sys.error(5); + } + if (size = 0){ + let size = 1; + } + while (current_block[0] < (size + 2)) { + let current_block = current_block[1]; + } + let current_block[0] = current_block[0] - size - 2; + let current_block = current_block + current_block[0] + 2; + let current_block[0] = size; + return current_block + 2; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array current_block; + let current_block = 2048; + let o[1]= current_block[1]; + let current_block[1] = o; + return; + + } +} diff --git a/solutions_only/project 12/Output.jack b/solutions_only/project 12/Output.jack new file mode 100755 index 0000000..9132280 --- /dev/null +++ b/solutions_only/project 12/Output.jack @@ -0,0 +1,299 @@ +// This 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 address; + static bool half; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + do Output.initMap(); + do Output.moveCursor(0, 0); + return; + } + + // 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,63,51,51,51,51,0,0); // A ** TO BE FILLED ** + do Output.create(66,31,51,51,51,31,51,51,51,31,0,0); // B + do Output.create(67,28,54,35,3,3,3,35,54,28,0,0); // C + do Output.create(68,15,27,51,51,51,51,51,27,15,0,0); // D + do Output.create(69,63,51,35,11,15,11,35,51,63,0,0); // E + do Output.create(70,63,51,35,11,15,11,3,3,3,0,0); // F + do Output.create(71,28,54,35,3,59,51,51,54,44,0,0); // G + do Output.create(72,51,51,51,51,63,51,51,51,51,0,0); // H + do Output.create(73,30,12,12,12,12,12,12,12,30,0,0); // I + do Output.create(74,60,24,24,24,24,24,27,27,14,0,0); // J + do Output.create(75,51,51,51,27,15,27,51,51,51,0,0); // K + do Output.create(76,3,3,3,3,3,3,35,51,63,0,0); // L + do Output.create(77,33,51,63,63,51,51,51,51,51,0,0); // M + do Output.create(78,51,51,55,55,63,59,59,51,51,0,0); // N + do Output.create(79,30,51,51,51,51,51,51,51,30,0,0); // O + do Output.create(80,31,51,51,51,31,3,3,3,3,0,0); // P + do Output.create(81,30,51,51,51,51,51,63,59,30,48,0);// Q + do Output.create(82,31,51,51,51,31,27,51,51,51,0,0); // R + do Output.create(83,30,51,51,6,28,48,51,51,30,0,0); // S + do Output.create(84,63,63,45,12,12,12,12,12,30,0,0); // T + do Output.create(85,51,51,51,51,51,51,51,51,30,0,0); // U + do Output.create(86,51,51,51,51,51,30,30,12,12,0,0); // V + do Output.create(87,51,51,51,51,51,63,63,63,18,0,0); // W + do Output.create(88,51,51,30,30,12,30,30,51,51,0,0); // X + do Output.create(89,51,51,51,51,30,12,12,12,30,0,0); // Y + do Output.create(90,63,51,49,24,12,6,35,51,63,0,0); // Z + + do Output.create(91,30,6,6,6,6,6,6,6,30,0,0); // [ + do Output.create(92,0,0,1,3,6,12,24,48,32,0,0); // \ + do Output.create(93,30,24,24,24,24,24,24,24,30,0,0); // ] + do Output.create(94,8,28,54,0,0,0,0,0,0,0,0); // ^ + do Output.create(95,0,0,0,0,0,0,0,0,0,63,0); // _ + do Output.create(96,6,12,24,0,0,0,0,0,0,0,0); // ` + + do Output.create(97,0,0,0,14,24,30,27,27,54,0,0); // a + do Output.create(98,3,3,3,15,27,51,51,51,30,0,0); // b + do Output.create(99,0,0,0,30,51,3,3,51,30,0,0); // c + do Output.create(100,48,48,48,60,54,51,51,51,30,0,0); // d + do Output.create(101,0,0,0,30,51,63,3,51,30,0,0); // e + do Output.create(102,28,54,38,6,15,6,6,6,15,0,0); // f + do Output.create(103,0,0,30,51,51,51,62,48,51,30,0); // g + do Output.create(104,3,3,3,27,55,51,51,51,51,0,0); // h + do Output.create(105,12,12,0,14,12,12,12,12,30,0,0); // i + do Output.create(106,48,48,0,56,48,48,48,48,51,30,0); // j + do Output.create(107,3,3,3,51,27,15,15,27,51,0,0); // k + do Output.create(108,14,12,12,12,12,12,12,12,30,0,0); // l + do Output.create(109,0,0,0,29,63,43,43,43,43,0,0); // m + do Output.create(110,0,0,0,29,51,51,51,51,51,0,0); // n + do Output.create(111,0,0,0,30,51,51,51,51,30,0,0); // o + do Output.create(112,0,0,0,30,51,51,51,31,3,3,0); // p + do Output.create(113,0,0,0,30,51,51,51,62,48,48,0); // q + do Output.create(114,0,0,0,29,55,51,3,3,7,0,0); // r + do Output.create(115,0,0,0,30,51,6,24,51,30,0,0); // s + do Output.create(116,4,6,6,15,6,6,6,54,28,0,0); // t + do Output.create(117,0,0,0,27,27,27,27,27,54,0,0); // u + do Output.create(118,0,0,0,51,51,51,51,30,12,0,0); // v + do Output.create(119,0,0,0,51,51,51,63,63,18,0,0); // w + do Output.create(120,0,0,0,51,30,12,12,30,51,0,0); // x + do Output.create(121,0,0,0,51,51,51,62,48,24,15,0); // y + do Output.create(122,0,0,0,63,27,12,6,51,63,0,0); // z + + do Output.create(123,56,12,12,12,7,12,12,12,56,0,0); // { + do Output.create(124,12,12,12,12,12,12,12,12,12,0,0); // | + do Output.create(125,7,12,12,12,56,12,12,12,7,0,0); // } + do Output.create(126,38,45,25,0,0,0,0,0,0,0,0); // ~ + + return; + } + + // Creates the character map array of the given character index, using the given values. + function void create(int index, int a, int b, int c, int d, int e, + int f, int g, int h, int i, int j, int k) { + var Array map; + + let map = Array.new(11); + let charMaps[index] = map; + + let map[0] = a; + let map[1] = b; + let map[2] = c; + let map[3] = d; + let map[4] = e; + let map[5] = f; + let map[6] = g; + let map[7] = h; + let map[8] = i; + let map[9] = j; + let map[10] = k; + + return; + } + + // Returns the character map (array of size 11) of the given character. + // If the given character is invalid or non-printable, returns the + // character map of a black square. + function Array getMap(char c) { + if ((c < 32) | (c > 126)) { + let c = 0; + } + return charMaps[c]; + } + + /** Moves the cursor to the j-th column of the i-th row, + * and erases the character displayed there. */ + function void moveCursor(int i, int j) { + var int co,display; + var Array r,ch; + if (j = 0){ + let half = true; + } + else{ + let half = (j / 2) * 2 = j; // chetno true, 1vaa chast + } + let address = (352 * i) + (j / 2) + 16384; + let ch = Output.getMap(32); + + while (co < 11){ + if (half){ + let display = r[address] & (-256); + let r[address] = ch[co] | display; + } + else{ + let display = r[address] & 255; + let r[address] = (ch[co]*256) | display; + } + let co = co + 1; + let address = address + 32; + } + let address = address - 352; + return; + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + var Array ch; + var Array r; + var int co; + var int ds; + let ch = Output.getMap(c); + while (co < 11){ + if (half){ + let ds = r[address] & (-256); + let r[address] = ch[co] | ds; + } + else{ + let ds = r[address] & 255; + let r[address] = (ch[co]*256) | ds; + } + let co = co + 1; + let address = address + 32; + } + + if (half){ + let address = address - 352; + let half = false; + } + else{ + if (address > 24480){ + let address = 16384; + let half = true; + } + else{ + let address = address - 351; + let half = true; + } + } + return; + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + var int i, length; + let length = s.length(); + while (i < length){ + do Output.printChar(s.charAt(i)); + let i = i + 1; + } + return; + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + var String s; + let s = String.new(6); + do s.setInt(i); + do Output.printString(s); + return; + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + var int row; + let row = (((address - 16384) / 32)/11) + 1; + if (row > 32){ + let row = 0; + } + do Output.moveCursor(row, 0); + return; + } + + /** Moves the cursor one column back. */ + function void backSpace() { + if (address = 16384){ + let address = 24191; + let half = true; + return; + } + if (half){ + + let address = address - 1; + let half = false; + } + else{ + let half = true; + } + return; + } +} diff --git a/solutions_only/project 12/Screen.jack b/solutions_only/project 12/Screen.jack new file mode 100755 index 0000000..006a905 --- /dev/null +++ b/solutions_only/project 12/Screen.jack @@ -0,0 +1,206 @@ +// This 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 256 rows (indexed 0..255, top to bottom) + * of 512 pixels each (indexed 0..511, left to right). The top left pixel on + * the screen is indexed (0,0). + */ +class Screen { + + static Array mem; + static Array st; + static boolean color; + /** Initializes the Screen. */ + function void init() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + let color = true; + return; + } + + /** Erases the entire screen. */ + function void clearScreen() { + var int a; + let a = 16384; + while (a < 24575){ + let mem[a] = 0; + let a = a + 1; + } + 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 int value, address, bit, mem_block; + if ((x > 511) | (x < 0) | (y > 255) | (y < 0)){ + do Sys.error(7); + } + let mem_block = x / 16; + let address = (32 * y) + mem_block + 16384; + let value = mem[address]; + let bit = x - (mem_block * 16); + if (color){ + let mem[address] = st[bit] | value; + } + else{ + let mem[address] = (~st[bit])& 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 diff, dx, dy, a, b; + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let dx = x2 - x1; + let dy = y2 - y1; + if (dx = 0){ + if (dy > 0){ + while(~(b > dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b + 1; + } + return; + } + else{ + while(~(b < dy)){ + do Screen.drawPixel(x1, y1 + b); + let b = b - 1; + } + return; + } + } + if (dy = 0){ + if (dx > 0){ + while(~(a > dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a + 1; + } + return; + } + else{ + while(~(a < dx)){ + do Screen.drawPixel(x1 + a, y1); + let a = a - 1; + } + return; + } + } + if (dx < 0){ + if (dy < 0){ + while ((~(a < dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff + dx; + } + } + } + else{ + while ((~(a < dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a - 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff + dx; + } + } + } + } + else{ + if (dy < 0){ + while ((~(a > dx)) & (~(b < dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff - dy; + } + else{ + let b = b - 1; + let diff = diff - dx; + } + } + } + else{ + while ((~(a > dx)) & (~(b > dy))){ + do Screen.drawPixel(x1 + a, y1 + b); + if (diff < 0){ + let a = a + 1; + let diff = diff + dy; + } + else{ + let b = b + 1; + let diff = diff - 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 a, tmp; + if (x1 > x2){ + let tmp = x1; + let x1 = x2; + let x2 = tmp; + } + if (y1 > y2){ + let tmp = y1; + let y1 = y2; + let y2 = tmp; + } + if((x1 < 0) | (x2 > 511) | (y1 < 0) | (y2 > 255)){ + do Sys.error(8); + } + let tmp = y2 - y1; + while(a < tmp){ + do Screen.drawLine(x1, y1 + a, x2, y1 + a); + let a = a + 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, dx, tmp; + if(r > 181){ + do Sys.error(7); + } + let dy = - r; + while (dy < r){ + let tmp = Math.sqrt((r * r) - (dy * dy)); + do Screen.drawLine(x - tmp, y + dy, x + tmp, y + dy); + let dy = dy + 1; + } + return; + } +} diff --git a/solutions_only/project 12/String.jack b/solutions_only/project 12/String.jack new file mode 100755 index 0000000..4d936cb --- /dev/null +++ b/solutions_only/project 12/String.jack @@ -0,0 +1,154 @@ +// This 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; + field int strLength; + + /** constructs a new empty string with a mavalimum length of mavalLength + * and initial length of 0. */ + constructor String new(int mavalLength) { + if (mavalLength > 0){ + let str = Array.new(mavalLength); + } + let strLength = mavalLength; + let length = 0; + return this; + } + + /** Disposes this string. */ + method void dispose() { + if(length > 0){ + do str.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) { + if(j > length){ + do Sys.error(7); + } + return str[j]; + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + if(j > length){ + do Sys.error(7); + } + let str[j] = c; + return; + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + if(strLength = length){ + do Sys.error(7); + } + let str[length] = c; + let length = length + 1; + return this; + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + if (length = 0){ + do Sys.error(7); + } + let str[length] = 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 d, sum, i; + var bool f; + while(i < length){ + let d = str[i]; + if ((d > 47) & (d < 58)){ + let sum = (sum * 10) + (d - 48); + } + else{ + if((i = 0) & (d = 45)){ + let f = true; + } + else{ + let i = length; + } + } + let i = i + 1; + } + if (f){ + return -sum; + } + return sum; + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + var Array c; + var int d, b, a; + let c = Array.new(6); + if (val < 0){ + let d = ~0; + let val = -val; + } + let b = val; + while(b > 0){ + let b = val / 10; + let c[a] = 48 + val - (b * 10); + let a = a + 1; + let val = b; + } + if (d){ + let c[a] = 45; + let a = a + 1; + } + if (a = 0){ + let str[0] = 48; + let length = 1; + } + else{ + let length = 0; + while (length < a){ + let str[length] = c[a - 1 - length]; + let length = length + 1; + } + } + do Array.dispose(c); + 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/solutions_only/project 12/Sys.jack b/solutions_only/project 12/Sys.jack new file mode 100755 index 0000000..0eed65b --- /dev/null +++ b/solutions_only/project 12/Sys.jack @@ -0,0 +1,53 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/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 Output.init(); + do Screen.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; + while (duration > 0){ + let i = 100; + while(i > 0){ + let i = i -1; + } + let duration = duration - 1; + } + return; + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + var String s; + let s = String.new(3); + do s.setInt(errorCode); + do Output.printString("ERR"); + do Output.printString(s); + return; + } +} diff --git a/tools/Assembler.bat b/tools/Assembler.bat new file mode 100755 index 0000000..93260ec --- /dev/null +++ b/tools/Assembler.bat @@ -0,0 +1,27 @@ +@echo off + +rem $Id: Assembler.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo Assembler Starts the assembler in interactive mode. + echo Assembler FILE[.asm] Assembles FILE.asm to FILE.hack. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Compilers.jar;bin/lib/AssemblerGUI.jar;bin/lib/TranslatorsGUI.jar" ^ + HackAssemblerMain +) else ( + echo Assembling "%_arg1%" + java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Compilers.jar;bin/lib/AssemblerGUI.jar;bin/lib/TranslatorsGUI.jar" ^ + HackAssemblerMain "%_arg1%" +) +popd diff --git a/tools/Assembler.sh b/tools/Assembler.sh new file mode 100755 index 0000000..70db569 --- /dev/null +++ b/tools/Assembler.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env sh + +# $Id: Assembler.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the assembler in interactive mode." + echo " `basename "$0"` FILE[.asm] Assembles FILE.asm to FILE.hack." +elif [ $# -eq 0 ] +then + # Run assembler in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Compilers.jar:bin/lib/AssemblerGUI.jar:bin/lib/TranslatorsGUI.jar" HackAssemblerMain & +else + # Convert arg1 to an absolute path and run assembler with arg1. + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi + echo Assembling "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Compilers.jar:bin/lib/AssemblerGUI.jar:bin/lib/TranslatorsGUI.jar" HackAssemblerMain "$arg1" +fi + diff --git a/tools/CPUEmulator.bat b/tools/CPUEmulator.bat new file mode 100755 index 0000000..f92cf40 --- /dev/null +++ b/tools/CPUEmulator.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: CPUEmulator.bat,v 1.3 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo CPUEmulator Starts the CPU Emulator in interactive mode. + echo CPUEmulator FILE.tst Starts the CPU Emulator and runs the FILE.tst + echo test script. The success/failure message + echo is printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + CPUEmulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + CPUEmulatorMain "%_arg1%" +) +popd diff --git a/tools/CPUEmulator.sh b/tools/CPUEmulator.sh new file mode 100755 index 0000000..033d9d7 --- /dev/null +++ b/tools/CPUEmulator.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env sh + +# $Id: CPUEmulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the CPU Emulator in interactive mode." + echo " `basename "$0"` FILE.tst Starts the CPU Emulator and runs the File.tst" + echo " test script. The success/failure message" + echo " is printed to the command console." +elif [ $# -eq 0 ] +then + # Run CPU emulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" CPUEmulatorMain & +else + # Convert arg1 to an absolute path and run CPU emulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" CPUEmulatorMain "$arg1" +fi diff --git a/tools/HardwareSimulator.bat b/tools/HardwareSimulator.bat new file mode 100755 index 0000000..76baa31 --- /dev/null +++ b/tools/HardwareSimulator.bat @@ -0,0 +1,30 @@ +@echo off + +rem $Id: HardwareSimulator.bat,v 1.3 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo HardwareSimulator Starts the Hardware Simulator in + echo interactive mode. + echo HardwareSimulator FILE.tst Starts the Hardware Simulator and runs the + echo FILE.tst test script. The success/failure + echo message is printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + HardwareSimulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + HardwareSimulatorMain "%_arg1%" +) +popd diff --git a/tools/HardwareSimulator.sh b/tools/HardwareSimulator.sh new file mode 100755 index 0000000..47e7482 --- /dev/null +++ b/tools/HardwareSimulator.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env sh + +# $Id: HardwareSimulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the Hardware Simulator in" + echo " interactive mode." + echo " `basename "$0"` FILE.tst Starts the Hardware Simulator and runs the" + echo " FILE.tst test script. The success/failure" + echo " message is printed to the command console." +elif [ $# -eq 0 ] +then + # Run hardware simulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:BuiltIn:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" HardwareSimulatorMain & +else + # Convert arg1 to an absolute path and run hardware simulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:BuiltIn:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" HardwareSimulatorMain "$arg1" +fi diff --git a/tools/JackCompiler.bat b/tools/JackCompiler.bat new file mode 100755 index 0000000..9399b94 --- /dev/null +++ b/tools/JackCompiler.bat @@ -0,0 +1,26 @@ +@echo off + +rem $Id: JackCompiler.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo JackCompiler Compiles all .jack files in the current + echo working directory. + echo JackCompiler DIRECTORY Compiles all .jack files in DIRECTORY. + echo JackCompiler FILE.jack Compiles FILE.jack to FILE.vm. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) else ( + set "_arg1=%CD%" +) +pushd "%~dp0" +echo Compiling "%_arg1%" +java -classpath "%CLASSPATH%;bin/classes;bin/lib/Hack.jar;bin/lib/Compilers.jar" ^ + Hack.Compiler.JackCompiler "%_arg1%" +popd diff --git a/tools/JackCompiler.sh b/tools/JackCompiler.sh new file mode 100755 index 0000000..699dfb8 --- /dev/null +++ b/tools/JackCompiler.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env sh + +# $Id: JackCompiler.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Compiles all .jack files in the current" + echo " working directory." + echo " `basename "$0"` DIRECTORY Compiles all .jack files in DIRECTORY." + echo " `basename "$0"` FILE.jack Compiles FILE.jack to FILE.vm." +else + if [ $# -eq 0 ] + then + # Use current directory as arg1 + arg1="$dir" + else + # Convert arg1 to an absolute path + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="$dir/$1" + fi + fi + echo Compiling "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/Compilers.jar" Hack.Compiler.JackCompiler "$arg1" +fi diff --git a/tools/OS/Array.vm b/tools/OS/Array.vm new file mode 100755 index 0000000..aa4c9e8 --- /dev/null +++ b/tools/OS/Array.vm @@ -0,0 +1,23 @@ +function Array.new 0 +push argument 0 +push constant 0 +gt +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 2 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +call Memory.alloc 1 +return +function Array.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return diff --git a/tools/OS/Keyboard.vm b/tools/OS/Keyboard.vm new file mode 100755 index 0000000..a806c4e --- /dev/null +++ b/tools/OS/Keyboard.vm @@ -0,0 +1,102 @@ +function Keyboard.init 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 24576 +call Memory.peek 1 +return +function Keyboard.readChar 2 +push constant 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +push local 0 +push constant 0 +gt +or +not +if-goto WHILE_END0 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +pop local 1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +call String.backSpace 0 +call Output.printChar 1 +pop temp 0 +push local 1 +call Output.printChar 1 +pop temp 0 +push local 1 +return +function Keyboard.readLine 5 +push constant 80 +call String.new 1 +pop local 3 +push argument 0 +call Output.printString 1 +pop temp 0 +call String.newLine 0 +pop local 1 +call String.backSpace 0 +pop local 2 +label WHILE_EXP0 +push local 4 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 0 +push local 0 +push local 1 +eq +pop local 4 +push local 4 +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 3 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 3 +push local 0 +call String.appendChar 2 +pop local 3 +label IF_END1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Keyboard.readInt 2 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +pop local 1 +push local 0 +call String.dispose 1 +pop temp 0 +push local 1 +return diff --git a/tools/OS/Math.vm b/tools/OS/Math.vm new file mode 100755 index 0000000..b660688 --- /dev/null +++ b/tools/OS/Math.vm @@ -0,0 +1,408 @@ +function Math.init 1 +push constant 16 +call Array.new 1 +pop static 1 +push constant 16 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Math.abs 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +neg +pop argument 0 +label IF_FALSE0 +push argument 0 +return +function Math.multiply 5 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 4 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop local 1 +push argument 1 +pop argument 0 +push local 1 +pop argument 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 2 +push constant 1 +sub +push argument 1 +push constant 1 +sub +lt +not +if-goto WHILE_END0 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +push argument 1 +and +push constant 0 +eq +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push argument 0 +add +pop local 0 +push local 2 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 2 +label IF_FALSE1 +push argument 0 +push argument 0 +add +pop argument 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +neg +pop local 0 +label IF_FALSE2 +push local 0 +return +function Math.divide 4 +push argument 1 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 3 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 2 +push constant 0 +push static 1 +add +push argument 1 +call Math.abs 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push argument 0 +call Math.abs 1 +pop argument 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +push local 3 +not +and +not +if-goto WHILE_END0 +push constant 32767 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +sub +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +lt +pop local 3 +push local 3 +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push constant 1 +add +push static 1 +add +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +pop local 3 +push local 3 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +label IF_FALSE1 +goto WHILE_EXP0 +label WHILE_END0 +label WHILE_EXP1 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END1 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +not +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push argument 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +sub +pop argument 0 +label IF_FALSE3 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 1 +neg +pop local 1 +label IF_FALSE4 +push local 1 +return +function Math.sqrt 4 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 4 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 7 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 3 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push local 1 +push local 1 +call Math.multiply 2 +pop local 2 +push local 2 +push argument 0 +gt +not +push local 2 +push constant 0 +lt +not +and +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +pop local 3 +label IF_FALSE1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Math.max 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return +function Math.min 0 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return diff --git a/tools/OS/Memory.vm b/tools/OS/Memory.vm new file mode 100755 index 0000000..8c74b87 --- /dev/null +++ b/tools/OS/Memory.vm @@ -0,0 +1,376 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +push static 0 +add +push constant 14334 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2049 +push static 0 +add +push constant 2050 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.peek 0 +push argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Memory.poke 0 +push argument 0 +push static 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.alloc 2 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 5 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +pop argument 0 +label IF_FALSE1 +push constant 2048 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 16383 +lt +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +lt +and +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +push local 1 +push constant 16382 +gt +or +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +or +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +pop local 0 +goto IF_END2 +label IF_FALSE2 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END3 +label IF_FALSE3 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END3 +label IF_END2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +push argument 0 +add +push constant 16379 +gt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 6 +call Sys.error 1 +pop temp 0 +label IF_FALSE4 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 2 +add +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push argument 0 +push constant 2 +add +push local 0 +add +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 2 +add +eq +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push argument 0 +push constant 3 +add +push local 0 +add +push local 0 +push argument 0 +add +push constant 4 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END6 +label IF_FALSE6 +push argument 0 +push constant 3 +add +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END6 +push constant 1 +push local 0 +add +push local 0 +push argument 0 +add +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_FALSE5 +push constant 0 +push local 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 2 +add +return +function Memory.deAlloc 2 +push argument 0 +push constant 2 +sub +pop local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END1 +label IF_FALSE1 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END1 +label IF_END0 +push constant 0 +return diff --git a/tools/OS/Output.vm b/tools/OS/Output.vm new file mode 100755 index 0000000..b8addd7 --- /dev/null +++ b/tools/OS/Output.vm @@ -0,0 +1,1852 @@ +function Output.init 0 +push constant 16384 +pop static 4 +push constant 0 +not +pop static 2 +push constant 32 +pop static 1 +push constant 0 +pop static 0 +push constant 6 +call String.new 1 +pop static 3 +call Output.initMap 0 +pop temp 0 +call Output.createShiftedMap 0 +pop temp 0 +push constant 0 +return +function Output.initMap 0 +push constant 127 +call Array.new 1 +pop static 5 +push constant 0 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 32 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 33 +push constant 12 +push constant 30 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 34 +push constant 54 +push constant 54 +push constant 20 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 35 +push constant 0 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 36 +push constant 12 +push constant 30 +push constant 51 +push constant 3 +push constant 30 +push constant 48 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 37 +push constant 0 +push constant 0 +push constant 35 +push constant 51 +push constant 24 +push constant 12 +push constant 6 +push constant 51 +push constant 49 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 38 +push constant 12 +push constant 30 +push constant 30 +push constant 12 +push constant 54 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 39 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 40 +push constant 24 +push constant 12 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 41 +push constant 6 +push constant 12 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 42 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 63 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 43 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 63 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 44 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 45 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 46 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 47 +push constant 0 +push constant 0 +push constant 32 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 1 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 48 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 49 +push constant 12 +push constant 14 +push constant 15 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 50 +push constant 30 +push constant 51 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 51 +push constant 30 +push constant 51 +push constant 48 +push constant 48 +push constant 28 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 52 +push constant 16 +push constant 24 +push constant 28 +push constant 26 +push constant 25 +push constant 63 +push constant 24 +push constant 24 +push constant 60 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 53 +push constant 63 +push constant 3 +push constant 3 +push constant 31 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 54 +push constant 28 +push constant 6 +push constant 3 +push constant 3 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 55 +push constant 63 +push constant 49 +push constant 48 +push constant 48 +push constant 24 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 56 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 57 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 24 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 58 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 59 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 60 +push constant 0 +push constant 0 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 61 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 62 +push constant 0 +push constant 0 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 64 +push constant 30 +push constant 51 +push constant 51 +push constant 59 +push constant 59 +push constant 59 +push constant 27 +push constant 3 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 63 +push constant 30 +push constant 51 +push constant 51 +push constant 24 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 65 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 66 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 67 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 68 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 69 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 70 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 71 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 59 +push constant 51 +push constant 51 +push constant 54 +push constant 44 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 72 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 73 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 74 +push constant 60 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 27 +push constant 27 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 75 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 76 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 77 +push constant 33 +push constant 51 +push constant 63 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 78 +push constant 51 +push constant 51 +push constant 55 +push constant 55 +push constant 63 +push constant 59 +push constant 59 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 79 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 80 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 81 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 59 +push constant 30 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 82 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 83 +push constant 30 +push constant 51 +push constant 51 +push constant 6 +push constant 28 +push constant 48 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 84 +push constant 63 +push constant 63 +push constant 45 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 85 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 86 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 87 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 88 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 30 +push constant 30 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 89 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 90 +push constant 63 +push constant 51 +push constant 49 +push constant 24 +push constant 12 +push constant 6 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 91 +push constant 30 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 92 +push constant 0 +push constant 0 +push constant 1 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 48 +push constant 32 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 93 +push constant 30 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 94 +push constant 8 +push constant 28 +push constant 54 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 95 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 96 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 97 +push constant 0 +push constant 0 +push constant 0 +push constant 14 +push constant 24 +push constant 30 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 98 +push constant 3 +push constant 3 +push constant 3 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 99 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 3 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 100 +push constant 48 +push constant 48 +push constant 48 +push constant 60 +push constant 54 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 101 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 63 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 102 +push constant 28 +push constant 54 +push constant 38 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 103 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 104 +push constant 3 +push constant 3 +push constant 3 +push constant 27 +push constant 55 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 105 +push constant 12 +push constant 12 +push constant 0 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 106 +push constant 48 +push constant 48 +push constant 0 +push constant 56 +push constant 48 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 107 +push constant 3 +push constant 3 +push constant 3 +push constant 51 +push constant 27 +push constant 15 +push constant 15 +push constant 27 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 108 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 109 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 63 +push constant 43 +push constant 43 +push constant 43 +push constant 43 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 110 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 111 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 112 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 113 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 114 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 55 +push constant 51 +push constant 3 +push constant 3 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 115 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 6 +push constant 24 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 116 +push constant 4 +push constant 6 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 117 +push constant 0 +push constant 0 +push constant 0 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 118 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 119 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 120 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 121 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 24 +push constant 15 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 122 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 27 +push constant 12 +push constant 6 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 123 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 124 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 125 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 126 +push constant 38 +push constant 45 +push constant 25 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 0 +return +function Output.create 1 +push constant 11 +call Array.new 1 +pop local 0 +push argument 0 +push static 5 +add +push local 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +push local 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push argument 3 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push argument 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push argument 5 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push argument 6 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push argument 7 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push argument 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push argument 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push local 0 +add +push argument 10 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push local 0 +add +push argument 11 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Output.createShiftedMap 4 +push constant 127 +call Array.new 1 +pop static 6 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 127 +lt +not +if-goto WHILE_END0 +push local 2 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +push constant 11 +call Array.new 1 +pop local 1 +push local 2 +push static 6 +add +push local 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +pop local 3 +label WHILE_EXP1 +push local 3 +push constant 11 +lt +not +if-goto WHILE_END1 +push local 3 +push local 1 +add +push local 3 +push local 0 +add +pop pointer 1 +push that 0 +push constant 256 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop local 2 +goto IF_END0 +label IF_FALSE0 +push local 2 +push constant 1 +add +pop local 2 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.getMap 1 +push argument 0 +push constant 32 +lt +push argument 0 +push constant 126 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop argument 0 +label IF_FALSE0 +push static 2 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +push static 6 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END1 +push local 0 +return +function Output.drawChar 4 +push argument 0 +call Output.getMap 1 +pop local 2 +push static 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 256 +neg +and +pop local 3 +goto IF_END0 +label IF_FALSE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 255 +and +pop local 3 +label IF_END0 +push local 0 +push static 4 +add +push local 1 +push local 2 +add +pop pointer 1 +push that 0 +push local 3 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 32 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.moveCursor 0 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 22 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 63 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 20 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push constant 2 +call Math.divide 2 +pop static 0 +push constant 32 +push argument 0 +push constant 352 +call Math.multiply 2 +add +push static 0 +add +pop static 1 +push argument 1 +push static 0 +push constant 2 +call Math.multiply 2 +eq +pop static 2 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return +function Output.printChar 0 +push argument 0 +call String.newLine 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Output.println 0 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +call String.backSpace 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +call Output.backSpace 0 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +call Output.drawChar 1 +pop temp 0 +push static 2 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push static 0 +push constant 1 +add +pop static 0 +push static 1 +push constant 1 +add +pop static 1 +label IF_FALSE2 +push static 0 +push constant 32 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +call Output.println 0 +pop temp 0 +goto IF_END3 +label IF_FALSE3 +push static 2 +not +pop static 2 +label IF_END3 +label IF_END1 +label IF_END0 +push constant 0 +return +function Output.printString 2 +push argument 0 +call String.length 1 +pop local 1 +label WHILE_EXP0 +push local 0 +push local 1 +lt +not +if-goto WHILE_END0 +push argument 0 +push local 0 +call String.charAt 2 +call Output.printChar 1 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.printInt 0 +push static 3 +push argument 0 +call String.setInt 2 +pop temp 0 +push static 3 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 1 +push constant 352 +add +push static 0 +sub +pop static 1 +push constant 0 +pop static 0 +push constant 0 +not +pop static 2 +push static 1 +push constant 8128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop static 1 +label IF_FALSE0 +push constant 0 +return +function Output.backSpace 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push static 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push static 0 +push constant 1 +sub +pop static 0 +push static 1 +push constant 1 +sub +pop static 1 +goto IF_END1 +label IF_FALSE1 +push constant 31 +pop static 0 +push static 1 +push constant 32 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 8128 +pop static 1 +label IF_FALSE2 +push static 1 +push constant 321 +sub +pop static 1 +label IF_END1 +push constant 0 +pop static 2 +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +pop static 2 +label IF_END0 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return diff --git a/tools/OS/Screen.vm b/tools/OS/Screen.vm new file mode 100755 index 0000000..fccafb5 --- /dev/null +++ b/tools/OS/Screen.vm @@ -0,0 +1,806 @@ +function Screen.init 1 +push constant 16384 +pop static 1 +push constant 0 +not +pop static 2 +push constant 17 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.clearScreen 1 +label WHILE_EXP0 +push local 0 +push constant 8192 +lt +not +if-goto WHILE_END0 +push local 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.updateLocation 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +not +and +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END0 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 2 +push constant 0 +return +function Screen.drawPixel 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 7 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 0 +push argument 0 +push local 0 +push constant 16 +call Math.multiply 2 +sub +pop local 1 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 0 +add +pop local 2 +push local 2 +push local 1 +push static 0 +add +pop pointer 1 +push that 0 +call Screen.updateLocation 2 +pop temp 0 +push constant 0 +return +function Screen.drawConditional 0 +push argument 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +push argument 0 +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push constant 0 +return +function Screen.drawLine 11 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 2 +push argument 0 +sub +call Math.abs 1 +pop local 3 +push argument 3 +push argument 1 +sub +call Math.abs 1 +pop local 2 +push local 3 +push local 2 +lt +pop local 6 +push local 6 +push argument 3 +push argument 1 +lt +and +push local 6 +not +push argument 2 +push argument 0 +lt +and +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +pop local 4 +push argument 2 +pop argument 0 +push local 4 +pop argument 2 +push argument 1 +pop local 4 +push argument 3 +pop argument 1 +push local 4 +pop argument 3 +label IF_FALSE1 +push local 6 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 3 +pop local 4 +push local 2 +pop local 3 +push local 4 +pop local 2 +push argument 1 +pop local 1 +push argument 0 +pop local 0 +push argument 3 +pop local 8 +push argument 0 +push argument 2 +gt +pop local 7 +goto IF_END2 +label IF_FALSE2 +push argument 0 +pop local 1 +push argument 1 +pop local 0 +push argument 2 +pop local 8 +push argument 1 +push argument 3 +gt +pop local 7 +label IF_END2 +push constant 2 +push local 2 +call Math.multiply 2 +push local 3 +sub +pop local 5 +push constant 2 +push local 2 +call Math.multiply 2 +pop local 9 +push constant 2 +push local 2 +push local 3 +sub +call Math.multiply 2 +pop local 10 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 8 +lt +not +if-goto WHILE_END0 +push local 5 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 5 +push local 9 +add +pop local 5 +goto IF_END3 +label IF_FALSE3 +push local 5 +push local 10 +add +pop local 5 +push local 7 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END4 +label IF_FALSE4 +push local 0 +push constant 1 +add +pop local 0 +label IF_END4 +label IF_END3 +push local 1 +push constant 1 +add +pop local 1 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawRectangle 9 +push argument 0 +push argument 2 +gt +push argument 1 +push argument 3 +gt +or +push argument 0 +push constant 0 +lt +or +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 9 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push argument 0 +push local 3 +push constant 16 +call Math.multiply 2 +sub +pop local 7 +push argument 2 +push constant 16 +call Math.divide 2 +pop local 4 +push argument 2 +push local 4 +push constant 16 +call Math.multiply 2 +sub +pop local 8 +push local 7 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 6 +push local 8 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 5 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 3 +add +pop local 0 +push local 4 +push local 3 +sub +pop local 2 +label WHILE_EXP0 +push argument 1 +push argument 3 +gt +not +not +if-goto WHILE_END0 +push local 0 +push local 2 +add +pop local 1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 5 +push local 6 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 6 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP1 +push local 0 +push local 1 +lt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +push argument 1 +push constant 1 +add +pop argument 1 +push local 1 +push constant 32 +add +push local 2 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawHorizontal 11 +push argument 1 +push argument 2 +call Math.min 2 +pop local 7 +push argument 1 +push argument 2 +call Math.max 2 +pop local 8 +push argument 0 +push constant 1 +neg +gt +push argument 0 +push constant 256 +lt +and +push local 7 +push constant 512 +lt +and +push local 8 +push constant 1 +neg +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 7 +push constant 0 +call Math.max 2 +pop local 7 +push local 8 +push constant 511 +call Math.min 2 +pop local 8 +push local 7 +push constant 16 +call Math.divide 2 +pop local 1 +push local 7 +push local 1 +push constant 16 +call Math.multiply 2 +sub +pop local 9 +push local 8 +push constant 16 +call Math.divide 2 +pop local 2 +push local 8 +push local 2 +push constant 16 +call Math.multiply 2 +sub +pop local 10 +push local 9 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 5 +push local 10 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 4 +push argument 0 +push constant 32 +call Math.multiply 2 +push local 1 +add +pop local 0 +push local 2 +push local 1 +sub +pop local 6 +push local 0 +push local 6 +add +pop local 3 +push local 6 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 4 +push local 5 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP0 +push local 0 +push local 3 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +push local 4 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +label IF_FALSE0 +push constant 0 +return +function Screen.drawSymetric 0 +push argument 1 +push argument 3 +sub +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 3 +add +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +sub +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +add +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push constant 0 +return +function Screen.drawCircle 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 12 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push argument 2 +sub +push constant 0 +lt +push argument 0 +push argument 2 +add +push constant 511 +gt +or +push argument 1 +push argument 2 +sub +push constant 0 +lt +or +push argument 1 +push argument 2 +add +push constant 255 +gt +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 13 +call Sys.error 1 +pop temp 0 +label IF_FALSE1 +push argument 2 +pop local 1 +push constant 1 +push argument 2 +sub +pop local 2 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 0 +gt +not +if-goto WHILE_END0 +push local 2 +push constant 0 +lt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 2 +push constant 2 +push local 0 +call Math.multiply 2 +add +push constant 3 +add +pop local 2 +goto IF_END2 +label IF_FALSE2 +push local 2 +push constant 2 +push local 0 +push local 1 +sub +call Math.multiply 2 +add +push constant 5 +add +pop local 2 +push local 1 +push constant 1 +sub +pop local 1 +label IF_END2 +push local 0 +push constant 1 +add +pop local 0 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/tools/OS/String.vm b/tools/OS/String.vm new file mode 100755 index 0000000..9b7577e --- /dev/null +++ b/tools/OS/String.vm @@ -0,0 +1,393 @@ +function String.new 0 +push constant 3 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 14 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Array.new 1 +pop this 1 +label IF_FALSE1 +push argument 0 +pop this 0 +push constant 0 +pop this 2 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 1 +call Array.dispose 1 +pop temp 0 +label IF_FALSE0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function String.length 0 +push argument 0 +pop pointer 0 +push this 2 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 15 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 16 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function String.appendChar 0 +push argument 0 +pop pointer 0 +push this 2 +push this 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 17 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push this 1 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 18 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push constant 1 +sub +pop this 2 +push constant 0 +return +function String.intValue 5 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push constant 0 +not +pop local 3 +push constant 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 4 +push constant 1 +pop local 0 +label IF_FALSE1 +label WHILE_EXP0 +push local 0 +push this 2 +lt +push local 3 +and +not +if-goto WHILE_END0 +push local 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 2 +push constant 0 +lt +push local 2 +push constant 9 +gt +or +not +pop local 3 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 1 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +neg +pop local 1 +label IF_FALSE3 +push local 1 +return +function String.setInt 4 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 6 +call Array.new 1 +pop local 2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 3 +push argument 1 +neg +pop argument 1 +label IF_FALSE1 +push argument 1 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 0 +gt +not +if-goto WHILE_END0 +push argument 1 +push constant 10 +call Math.divide 2 +pop local 1 +push local 0 +push local 2 +add +push constant 48 +push argument 1 +push local 1 +push constant 10 +call Math.multiply 2 +sub +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +push local 1 +pop argument 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push local 2 +add +push constant 45 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +push this 0 +push local 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE3 +push local 0 +push constant 0 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 0 +push this 1 +add +push constant 48 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +pop this 2 +goto IF_END4 +label IF_FALSE4 +push constant 0 +pop this 2 +label WHILE_EXP1 +push this 2 +push local 0 +lt +not +if-goto WHILE_END1 +push this 2 +push this 1 +add +push local 0 +push this 2 +push constant 1 +add +sub +push local 2 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +goto WHILE_EXP1 +label WHILE_END1 +label IF_END4 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 0 +return +function String.newLine 0 +push constant 128 +return +function String.backSpace 0 +push constant 129 +return +function String.doubleQuote 0 +push constant 34 +return diff --git a/tools/OS/Sys.vm b/tools/OS/Sys.vm new file mode 100755 index 0000000..c186dad --- /dev/null +++ b/tools/OS/Sys.vm @@ -0,0 +1,83 @@ +function Sys.init 0 +call Memory.init 0 +pop temp 0 +call Math.init 0 +pop temp 0 +call Screen.init 0 +pop temp 0 +call Output.init 0 +pop temp 0 +call Keyboard.init 0 +pop temp 0 +call Main.main 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return +function Sys.halt 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.wait 1 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 1 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +label WHILE_EXP0 +push argument 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 50 +pop local 0 +label WHILE_EXP1 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push argument 0 +push constant 1 +sub +pop argument 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 69 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push argument 0 +call Output.printInt 1 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return diff --git a/tools/TextComparer.bat b/tools/TextComparer.bat new file mode 100755 index 0000000..a036d00 --- /dev/null +++ b/tools/TextComparer.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: TextComparer.bat,v 1.2 2014/05/10 00:52:43 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%3"=="" goto :USAGE +if "%1"=="/?" goto :USAGE +if not "%~1"=="" ( + set "_arg1=%~f1" +) +if not "%~2"=="" ( + set "_arg2=%~f2" +) +pushd "%~dp0" +if NOT "%~1"=="" ( + if NOT "%~2"=="" ( + java -classpath "%CLASSPATH%;bin/classes" TextComparer ^ + "%_arg1%" "%_arg2%" + popd + exit /B + ) +) +:USAGE +echo Usage: +echo TextComparer FILE1 FILE2 Compares FILE1 and FILE2. The success +echo message or the first miscompared line +echo is printed to the command console. +popd diff --git a/tools/TextComparer.sh b/tools/TextComparer.sh new file mode 100755 index 0000000..c8b08af --- /dev/null +++ b/tools/TextComparer.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh + +# $Id: TextComparer.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -ne 2 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + # print usage + echo "Usage:" + echo " `basename "$0"` FILE1 FILE2 Compares FILE1 and FILE2. The success" + echo " message or the first miscompared line" + echo " is printed to the command console." +else + # Convert arg1 to an absolute path + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="$dir/$1" + fi + # Convert arg2 to an absolute path + if [ `echo "$2" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg2="$2" + else + arg2="$dir/$2" + fi +# echo Comparing "$arg1" "$arg2" + java -classpath "${CLASSPATH}:bin/classes" TextComparer "$arg1" "$arg2" +fi diff --git a/tools/VMEmulator.bat b/tools/VMEmulator.bat new file mode 100755 index 0000000..1b15b72 --- /dev/null +++ b/tools/VMEmulator.bat @@ -0,0 +1,29 @@ +@echo off + +rem $Id: VMEmulator.bat,v 1.3 2014/05/10 00:51:55 marka Exp $ +rem mark.armbrust@pobox.com + +setlocal +if not "%2"=="" goto :USAGE +if "%~1"=="/?" ( +:USAGE + echo Usage: + echo VMEmulator Starts the VM Emulator in interactive mode. + echo VMEmulator FILE.tst Starts the VM Emulator and runs the FILE.tst test + echo script. The success/failure message is + echo printed to the command console. + exit -b +) +if not "%~1"=="" ( + set "_arg1=%~f1" +) +pushd "%~dp0" +if "%~1"=="" ( + start javaw -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + VMEmulatorMain +) else ( +rem echo Running "%_arg1%" + java -classpath "%CLASSPATH%;.;bin/classes;bin/lib/Hack.jar;bin/lib/HackGUI.jar;bin/lib/Simulators.jar;bin/lib/SimulatorsGUI.jar;bin/lib/Compilers.jar" ^ + VMEmulatorMain "%_arg1%" +) +popd diff --git a/tools/VMEmulator.sh b/tools/VMEmulator.sh new file mode 100755 index 0000000..48f4f0f --- /dev/null +++ b/tools/VMEmulator.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env sh + +# $Id: VMEmulator.sh,v 1.1 2014/06/17 21:14:01 marka Exp $ +# mark.armbrust@pobox.com + +# User's CDPATH can interfere with cd in this script +unset CDPATH +# Get the true name of this script +script="`test -L "$0" && readlink -n "$0" || echo "$0"`" +dir="$PWD" +cd "`dirname "$script"`" +if [ \( $# -gt 1 \) -o \( "$1" = "-h" \) -o \( "$1" = "--help" \) ] +then + echo "Usage:" + echo " `basename "$0"` Starts the VM Emulator in interactive mode." + echo " `basename "$0"` FILE.tst Starts the VM Emulator and runs the FILE.tst test" + echo " script. The success/failure message is" + echo " printed to the command console." +elif [ $# -eq 0 ] +then + # Run VM emulator in interactive mode + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" VMEmulatorMain & +else + # Convert arg1 to an absolute path and run VM emulator with arg1 + if [ `echo "$1" | sed -e "s/\(.\).*/\1/"` = / ] + then + arg1="$1" + else + arg1="${dir}/$1" + fi +# echo Running "$arg1" + java -classpath "${CLASSPATH}:bin/classes:bin/lib/Hack.jar:bin/lib/HackGUI.jar:bin/lib/Simulators.jar:bin/lib/SimulatorsGUI.jar:bin/lib/Compilers.jar" VMEmulatorMain "$arg1" +fi diff --git a/tools/bin/Assembler.dat b/tools/bin/Assembler.dat new file mode 100755 index 0000000..0f3be3f --- /dev/null +++ b/tools/bin/Assembler.dat @@ -0,0 +1 @@ +C:\Users\SQA-AGrudev\Desktop\nand2tetris\projects\08\ProgramFlow\BasicLoop\BasicLoop.hack diff --git a/tools/bin/CPU Emulator.dat b/tools/bin/CPU Emulator.dat new file mode 100755 index 0000000..1343654 --- /dev/null +++ b/tools/bin/CPU Emulator.dat @@ -0,0 +1 @@ +C:\Users\SQA-AGrudev\Desktop\nand2tetris\projects\08\FunctionCalls\NestedCall diff --git a/tools/bin/Hardware Simulator.dat b/tools/bin/Hardware Simulator.dat new file mode 100755 index 0000000..33d02db --- /dev/null +++ b/tools/bin/Hardware Simulator.dat @@ -0,0 +1 @@ +C:\Users\Andrean\Desktop\nand2tetris\projects\03\a diff --git a/tools/bin/Virtual Machine Emulator.dat b/tools/bin/Virtual Machine Emulator.dat new file mode 100755 index 0000000..729384c --- /dev/null +++ b/tools/bin/Virtual Machine Emulator.dat @@ -0,0 +1 @@ +C:\Users\SQA-AGrudev\Desktop\Hangman diff --git a/tools/bin/classes/CPUEmulatorMain.class b/tools/bin/classes/CPUEmulatorMain.class new file mode 100755 index 0000000000000000000000000000000000000000..2c5b68f26f7b9d44b6989affae2ac01270fbae8e GIT binary patch literal 1084 zcmX^0Z`VEs1_pfw8!iSh1{qEUSq3={26-+91qMY91|=>AWd;>?232+jH7*7Y1{rn+ zbuI=j5Us(%pvl3Y#lfJ>#lXX$!_J_~&Y;J|AjBZU#URL_&(2`L&S1#Mz-E(~msw)R z$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`aAi>UH z#KU0BV8Y0t8Csl}o@%84QmNn^5bBy+nv+HSD9OyvV`NYY&V*WA>>lc=kK_>N{M>^4ywtoBMh0n*#N=$S zbbek*QGQNNY7vsGI!G2-Co62_QQO znGG_;nvsDY$={#|U}O+LgqD9&R%&tyicoN6aYP8b?M> zIJE>RY8e?SHGCkRgL_vW;dA#;Piv?&B6T7A9jpLk6(mtW6Dp>YFhxLV-UQQbkXzu% z$r_tB21N!@1~CQ@U}9hdWe5gF21y1620;c!21W)323D=@42&B=@(i2|QVh~i=}ZQ8 z1{MYehET12EK3;pHZd>>F>hmFSy2x~DLZD$Y(-^jqoAjTlgAjiNC GvKRnfi!EgU literal 0 HcmV?d00001 diff --git a/tools/bin/classes/HackAssemblerMain.class b/tools/bin/classes/HackAssemblerMain.class new file mode 100755 index 0000000000000000000000000000000000000000..b9123917e497a7915222bd03a2ac91be5fdda503 GIT binary patch literal 1098 zcmX^0Z`VEs1_pfwS1txI1{qEUSq3={26-+91qMYf23ZCrb_Qi;28IR(E(SIR6?O(y zE(T5pH4X-KE(Q$-O?Cz?b_Q)O20jKE4h9`=23-a{4hDS?Z2(el$j)HI&S1>Qz-E(~ zmsw)R$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`a zAi>UH!oy(7V8+Ox8d{u~o@%84QmNpPn4IlcT%4Mll#^Pd5UrP3oU4$Rn422Q&S1{N zV8LL?!(hc=&B!1FQm7ACsSo19c_0gH7#TD`g8CsviFw62i6!|(#b8wkzH3EtYC%b6 zejX2lErT5+gHdvRu3m9zo*u|0dd20LdFgruIf-d{<(YXY`Q^oW;SkyyQTacfZnpeWeAeNMwr=O9UQ=p$% zoa>mBUs|Gs4Dz5*K!h8Tfs)g#>mo z2r@Bf3kmIH5N2Wk8K5o1&dj)-LBw}CgAkH-kS!Y-m>DD()ETrGI2kM$Y#AIFco`fS M(ik!sI6;mD07icrqW}N^ literal 0 HcmV?d00001 diff --git a/tools/bin/classes/HardwareSimulatorMain.class b/tools/bin/classes/HardwareSimulatorMain.class new file mode 100755 index 0000000000000000000000000000000000000000..5786077f36cc03c74fdac38e8e31074e7b9ac3c2 GIT binary patch literal 1182 zcmX^0Z`VEs1_pfw8!iSh1{qEUSq3={26-+91qMY91|=>AWd;>?232+jH7*7Y1{rn+ zbuI=j5Us(%pvl3Y#lfJ>#lXX$!_J_~&Y;J|AjBZU#URL_&(2`L&S1#Mz-E(~msw)R z$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`aAi>UH z#KU0BV8Y0tA6lH4o@%84QmNpPSd>zpSd2hyrnT%MViu2+zgn5I{rnU|7ZUaS`mp?&i6vmNtN z+)`6>*cmK%7%V}Wg+ZDiE_1C&PAw?O%+F(F(12T9>>lc=kKr8W{M>^4ywtoBMg}8- zO7lvJ@^f-hi;y%Kdn6`jV;YMo;#g3SlbM_dag}6JW}ZGI42tzrQqvMkb4onI^-3yA z7#T!Cav7;P1^OA~;E>eID9O!16?aU^FD(I!gTmg5kwFgZ4Cj293-v*K1ecLP10;ay zDohcOf!2%+q8K3sia16F0YoVKCuOB3m!Jp*R~DC~<}xxcrxq14GKfMFOJ=@)Kv8C1 zNpML~YGST6BLgI+P=y&8*b6|4a`G4%L^U89QBxTsgDA-E3Vm?8&=2+WP0UM7Pc33( z;44loK}r&g40APni1jWajNC&#t%=qKRt$0uB*8(m0;aPuML@aA1nNG7<>2^&r$1|K z+87iWL>a^wK!AyX5tQW^7#SoP7#IW@7#SED7#LW!wlgqp1j#dSGDtBH&B*eUpfn_;^o7TQr4EjQ>I~drOGqCvVX5fh2&cNxjn}I8GI|H}x zZU&x69c>|AAwD7g?F<5b%Nay>GYCfRW)OsrAf=uh3|<@z-XJw*Ai@Vk_<{&O5aAEf6u{09$j%VN$iQZknU`5&$H>5}p&7== zz~Y>rlFG=ylAD;B$H*Y25$%(eSeB@tlbDyTA6!zDnU`)2QpQu1nwwvi8eEW=oLbDt zpr(OE8Kw{qgBpW6J3}xJLkL4CBZEO`abkL^l>*2Hg^<*W66gHfg2bZKA_beY%$!t( zyu{p8J7hLHLl_T3I70*vLnK2KBZC-7qkd+-zEf#hT53^hN>FNIN@@`!gAh!@Ei)$- zA_%fN0z^bJG6=(@J^fuPl2Z#xGV?)x1&bni6k;kP1CMiJUS58QLViJNo&pa;3_~mr zLmWdq4?_Zo&}Pu#VMqjdM>aS$IX^E&0qpk7Vuj+2{GyW7A_a~7yqrp~#w11tc7>eG zywqY%c7|jgh7^WWMh0n!uQQAD^Ayq&GjmFdQWY}uz{(UD85pe?8D!iti;7Edn9Il@ zgqbw&nJ=ls%~6a|nsl5_HlQz4R!46;a; zr{<-krYIDbCMTyB7pIlxvP=taji%U{-85x*Ui;5T-L?H3L}FKR2nIstu-MI zLK1>Ry)`2PM@c>;)iW}PXke-XsQ?AHPi9^!BLj1OX$d2Pw1y|9Lb!oQ0R=OdEw!*T zF{c>KgOFgf){J6gUIt1~{vFGBU6wXCxLmLVfPc$iP{gTH*{9V%6|; z289Ml%m=EArKBh`mqC$1g+Y}81eh5ZLHUt^kwJrjfkBXgk%5tcfq_+PI|JiJkURq? zgC>I(M4E9j0~-T70|R5a);`wx4E&oIn1qT;@!r;r^Rfvje&0)13y$FToVgalP@++EU228%~-X! zF$hHZ9b;(J-N7K}r?ZVgz=}nZqS(2d!BvuF2ZNv$ zi>@TgHU_a-45moB#NoOm;JP+32HiHf%f*7J1SQuCt7#RGS?U>D2K*6B3ok7k=ltp_R zgZv@}J#A5zZ43$m3JVxGTUZ#E|9>ef$}*pUPg@ouv5i5og_#j7b6#6^8-tQIIG&U@ IfKvhk0OEwC>Hq)$ literal 0 HcmV?d00001 diff --git a/tools/bin/classes/VMEmulatorMain.class b/tools/bin/classes/VMEmulatorMain.class new file mode 100755 index 0000000000000000000000000000000000000000..aa6b7ff524757fcdab43088e9e2a8d7d48d801c9 GIT binary patch literal 1073 zcmX^0Z`VEs1_pfw8!iSh1{qEUSq3={26-+91qMY91|=>AWd;>?232+jH7*7Y1{rn+ zbuI=j5Us(%pvl3Y#lfJ>#lXX$!_J_~&Y;J|AjBZU#URL_&(2`L&S1#Mz-E(~msw)R z$iS?j8OF%K;+&t7%E-Wyo0yr$$RMT>?UR*QmZ+bTn3t{}TvC*omu{^Y#={`aAi>UH z#KU0BV8Y0t8Csl}o@%84QmNn^5bBy+nv+HSD9OyvV`NYa&V*WA>>lc=ALa{lhjV^zL4ICpUI`oDP{kdS@=Hs=;-HYUVq}m5Ta0j%K8TOtGBQYk1dyDA z!~_{(&B(xq@GmIb85sl+f#jc*m6}|FA{1O%T#}m0$iSRhRK&<23W?>+eEoo;%)FA| zlA_eaTx&)KNI;_sGcvFjfE4BAF*1m1Ks2Hz4@L%2klhvf;Aqtk_4G~5OH5BKVr1Ye zPAx%-QAUPx4Ii-25PsE1Fx^8vts&9~zae=XEDf>TnH;X}Eh;;`8+j0gLpWO@`k=q$KeReZ&MQ&%{ z_TA0E6RD#u#4E%n#J` + + + + + + + +About Assembler + + + + + + + +

+ +

Assembler, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The Assembler Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

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

CPU Emulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The CPU Emulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

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

Hardware Simulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The Hardware Simulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

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

Virtual Machine Emulator, Version 2.5

+ +

 

+ +

This program is +part of www.nand2tetris.org

+ +

and +the book "The Elements of Computing Systems"

+ +

by +Nisan and Schocken, MIT Press.

+ +

 

+ +

Software Architects: Yaron Ukrainitz and Yannai A. +Gonczarowski

+ +

 

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

Usage instruction and tips can be found in:

+ +

 

+ +

The VM Emulator Tutorial

+ +

 

+ +

Available in www.nand2tetris.org

+ +

 

+ +

And in relevant book chapters from

+ +

The Elements of Computing Systems,

+ +

by Noam Nisan and Shimon Schocken

+ +

MIT Press

+ +

 

+ +
+ + + + diff --git a/tools/bin/images/arrow2.gif b/tools/bin/images/arrow2.gif new file mode 100755 index 0000000000000000000000000000000000000000..c744eabbbb92a178b85e66ff3666976727741cfb GIT binary patch literal 1073 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 literal 0 HcmV?d00001 diff --git a/tools/bin/images/find.gif b/tools/bin/images/find.gif new file mode 100755 index 0000000000000000000000000000000000000000..e3f4c9d8ebefe041d8c3cfd9ca05aa096e551f24 GIT binary patch literal 1014 zcmZ?wbh9u|6k!ly_|5|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vhL49pxd9vc=omNPujj5#quk)fPXU|06? zb9Z;QGpUBvu=6J~lrr2~nf?93Tu%mN{Z+yoo9^x^d1E!p=I5llR+F^tFEJkwcCcyu zSjDtpy0LOYnfO!39*y@4&opvep6Y$wkima-(8?s2isHGumkah+mF_Hk=F^mRo^OqX zv3m4m*T_rB=6p}iGdRB9rR*i}#Ci$C1I}rj{;DCB4Z=z_H?FL-S;26wS3CS`){~P7 v*6XargEh{do%^s=Hd0W>sY}>#o=DEck_Xp}#H-`9qF)3x@8D)*VXy`OvYYiC literal 0 HcmV?d00001 diff --git a/tools/bin/images/hex.gif b/tools/bin/images/hex.gif new file mode 100755 index 0000000000000000000000000000000000000000..68a851b2d7aacbf14a139744febfa79a70a4b2b0 GIT binary patch literal 1422 zcmZ?wbh9u|RA5kG`2L@Pfq~)QzkmP#|Nr~ak?}7zOzJ2@t?c28xA3nZ& z_wM!U*H525d-Uk>g9i`4e*O0P_1i~}p4`9x@XnokZ{NOq_3G8LXV357e{ko{-J3UW zefjeB@85r)KYw}g;^mVkPjB3~b@l4?YuBz{x^(5^$4@U`zPf(>=H<&*&!4~e>C@+r zA3wf*`}Xwdv!6bF`uzFxg$tL?oH=*m#HkM-K0JK*=*pFAM~)o7d-vYOiRKRI>k%&}u9_U${k zefzE(H*W6Uy?4u&?N_c`J$v@tp+iSDZ{EIP!waI$gxyBq^i$15G2%j7f?7&NajM(wt8`0zm6 zkwHL7z*b?Q&dHq|HC7=nKD}k(;8Y4wh;Dr1$}A`r5pkwsWAp^^e{v2Ej)#2Kun8qt zOmIBh#w=r1QPIPGpq-mt!AEb_mu0V*`5Xjz6_Z#p8F}KYV+F@bvh_&ao&J64S{Lv)`e7RP1N~udZvsFBsczBYj zJ_BQ$q)Nt)4-JdjdZo9YZ8%)YJEyFH>51utWCb5ZAW=do#m#b5ui-@O( zA?tK+AI-E0AteIIf*EoQuA*Tw1xH09?tD`X)GH}yV0RLl%G&Gxt+GKZBBwB#JLOQv zi)PJ~LI!cWl0pZOxR^o)vG|6<+rlydg?A=s${b)3XK%^=*et5{WIAeM=CUs8XZ0?LX22GNt28zxS0dF=qOJ%Kjs3x5|;o&jqf;(=l?5;-y y*UFgxDR7a>JmcstTUPK|cSrf1ZP)ky_!b)A{^#54_xu0Jv3xkd!YnGlU=08brX8vP literal 0 HcmV?d00001 diff --git a/tools/bin/images/keyboard.gif b/tools/bin/images/keyboard.gif new file mode 100755 index 0000000000000000000000000000000000000000..823aaf868cd4e59fc747f96434c944f081d9f601 GIT binary patch literal 1017 zcmZ?wbhEHbRA5kG_|CxapW#0P1H=CP`|IoL|NsAAU(fLWKSRSP7!84u5dw-oSr{1@ z7#MUw1Sn51a9m?x`3}uovR+@*y%;?vYsH@0va(?k z^E|P+UZSspnV6UouFfi5eSKZR&Rbi4iexfu&e*)ncJ;QmH&&=-pPK8v{oU==5r^wU zcbmVzyTbD(SDg2aHCK0(3E#H$X<&%oJ7KHYy{a7_61HbD%ZHtrsrUF;mAZe}sp&?M i2U_PQnbqvtoZSLCju0k+quO|a(--h#Ka&h8-myLs3jj!g?r zw5xdY*}M!~>dCGYyeoyFc(Kn^6ZvaG@~jy1_JSN!RipyWD{-@c7! zLeS$=)5PK@P084#e0rvl=d+MV;iqm42AQ+IR9;9qJ(n%p&Sh4JW^l7i_AQ=Wfv--^ Zwy93KYFVOvZl$p!6R-ESHOCqltO2v`IX3_R literal 0 HcmV?d00001 diff --git a/tools/bin/images/open.gif b/tools/bin/images/open.gif new file mode 100755 index 0000000000000000000000000000000000000000..f69a024197318aa70fff927d760c14627d438536 GIT binary patch literal 930 zcmZ?wbhEHb6krfw_|55b-oMg!@nrVl z9UgmEsUBU$uznK5c0Q|+5d|@{)emn4`sOH$*|Lw zVVWUBu_{A=B*XtJSN?C@_`k33e|GkN50C$5`akobP;06X$-2x43YuZy!D@9(jA7XoeW9S z7`%!Zi~=yc^`GJ2KZZMZ7(;q*=MEh@v~AnARjXFbn>TOLq)BaUZB;M1%ia%Kx85kHD zbU--)lqVQC>KT|hWIQ%3I8glhmS)cOa}N%-FeotAdDahd0=OFqbhVwyV^J0(5ZaX9c(=RRO rn~`S1C8`-*YPVV`_LR`-BkL0wSq^Y)T63sb^zy3E*Bf#{+0YsQ*n!NC literal 0 HcmV?d00001 diff --git a/tools/bin/images/open2.gif b/tools/bin/images/open2.gif new file mode 100755 index 0000000000000000000000000000000000000000..2b94682b19d1cb5cf5c6aad7c7ed1af371fabe39 GIT binary patch literal 969 zcmZ?wbh9u|6k!ly_|5k`583H63{$IKBf8)mgeSQD4v;TW|{8v@|$G~uhfng^D!!!nlVg`l)28RDv z9{=BX{D0r-|JnWjJ&OOUhW}>>y~E(SlfiZxgJCg)Y5;@e|0^H@5=w|WB)yN z{8wG|pJCM@;MUrpiz($q<0yt^W)R=sv^dt^W+3cNlDUG8j%{P%UPV48Z2C{|uAvFjVbi zNSemrRm@-%fZ?tG4FCQy+_}TBb0@>JX$-~13;_XG{(so`|54xnE7|{#dHml2_SPzf zJChi8RxwOVVkq`v2r#!;@xNI0e>ek1gkAZ6W#j*iegFHi|7Uyr z_fY+>is3DW$N#S!|G#nd|GxhJ*~R}o!vCv=qI-+s!~ZLf{%^eUzwg-p>>d9-R)Hf7 z)msezF(M4ZTMVB*eR}rn*{xf*&Ye4V=+L2U+qSJ*wQAnHd6OnhYHMq&s;bJ%%S%d1 z3JVMK^768?vokU>Qd3itl9J-%n!-54%8X6k@GcYjxXZR1M{)1Wn|NmF~$pXp) z3_2hZlqVcGmN77M$ari>a4dbxpiyujpy_ZszpM+xg?DqT7$l6d?sRNSI>g51q{Z-H z-Q1It)z33dIIv;q>FIo$Y!=)3Qg@d==Ml1*Ua+v4%|VhwR;wh*f1+KyS&u^FBiCtO zQ;nutex7r6b;RapS59tKINKt1_u-wa3Co=pIH(t$c@dcCy`|uy6f3u&X3#V@Mw<>T i(`BA}YZA?Jr5A2^c(`5t#FNa;8+|v$?qp+Oum%7YQ{a^V literal 0 HcmV?d00001 diff --git a/tools/bin/images/opendoc.gif b/tools/bin/images/opendoc.gif new file mode 100755 index 0000000000000000000000000000000000000000..e84f0d69d646eab20c3c8d0d0dc0588207790a37 GIT binary patch literal 1094 zcmZ?wbhEHbRA5kG_|55b-oMg!@nrVl z9UgmEsUBU$uznK5c0Q|+5d|@{)emn4`sOH$*|Lw zVVWUBu_{A=B*XtJSN?C@_`k33e|GkN50C$5`akobP;06X$-2x43YuZy!D@9(jA7XoeW9S z7`%!Zi~=yc^`GJ2KZZMZ7(;q*=MEh@v~AnARjXFbn>TOLq)BaUZB;M1%ia%Kx85oW* z=zwwpC{HkO{A1|kl(7(KIM~b~C=_#IgMx~OvYh7}iT;?~Wgn%oL^vKK9_bX)?mE09 zP`RP_x!V+NbH6#KEB>E|WC@s*=-#2={O`7BU)tFgxnjGflb4^nG4M)h1QZxOJvB{F z-^(=1Xk`R5w{K;JlpT2uEyh?vxbR1EikL~)mQCHO9XH1YMuRc z<>_7j52)o%xc)3?pOEnq*2?J{?j24$J9Dzb&P}POE9Ce0+Wg#^}Kfix} K{a;2#25SI`hbCPB literal 0 HcmV?d00001 diff --git a/tools/bin/images/redflag.gif b/tools/bin/images/redflag.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b1a6b1881b227026310fe680ea692d0e7c0e004 GIT binary patch literal 1100 zcmZ?wbhEHbRA5kG_|55b-oMg!@nrVl z9UgmEsUBU$uznK5c0Q|+5d|@{)emn4`sOH$*|Lw zVVWUBu_{A=B*XtJSN?C@_`k33e|GkN50C$5`akobP;06X$-2x43YuZy!D@9(jA7XoeW9S z7`%!Zi~=yc^`GJ2KZZMZ7(;q*=MEh@v~AnARjXFbn>TOLq)BaUZB;M1%ia%Kx85n*s z=zwwpC{HkO{A2jaDdVwW!NFz@VKJ5i8y4D?^NDKZ+_)g?()Lb8DCGFXN4?S}PWKXa zBsj9P30a%PY*cdV>6iD^o6sPn=suMva#xF`kb~ze2EJ9hPkd-QEn!hm6LRp%@{^Or zxbLZO9awRCiTCVjJq%M99Bm7WZClb9@{(87u>Mkr`G-Yaixsm^?41?L>bXv0uThQm zw6;4^CFjk)c8WV3+vYm+-&Ak0%xm+E8>RltiZ~jx#%JrSBNaOo0uN4~nzn8C)Xl!9 zLLHObtUswcZ{xCGEq3;nX21=u_EXC|B(lOz*1Zy%l%ZwTiynGp&j4$m*RfzT#cpm-`QIe?Pa|&cc)P_G|w9ikSTl Qi~f0Djc<6!%EDj`05$<3%K!iX literal 0 HcmV?d00001 diff --git a/tools/bin/images/save.gif b/tools/bin/images/save.gif new file mode 100755 index 0000000000000000000000000000000000000000..7b5d5b9ea9a56f094fc5c2f731f227deb670171c GIT binary patch literal 1257 zcmZ?wbhEHbRA5kG_|5d^G?AX1i zpnJ(d_mZRTWk)>+q2%Yq$+~+Yj(+aZc=IBlQm=bps-=#sYwQjOaUt|HMjTjhpq`&$aM7F zJp0;DBCD7j+Gc9!?_#+i-0HvFf9|>ltE($7@<>d2)WWfK_4V}{3<(meOEWJEYg}06 zd%El`CxiH-X|5-)yzJav@%hzW?(lWKZSrxq?s`k;GjNNGoH=XxgN0M5Ptm?lMzW#l zbSm?8-|FullZEGbHvG$x{2V_a#?oEx;|x>I>+2YOX3ULzdh^_R_ZRohR=4DE2#Mt% zyIs}7A$Y7`*`AM~>GQ3Xo%`M7oLo9yU0-WnUpGtd(0g{p;}#78)y!c$h5Fhv9>nZv z{{G>ybwrMx^PMBp6*ttMKfu`h@Bh#1@s*M{rr%3_V|o03J&&13e4}^+`#mP+d14W@ zkvE?(vdfgMIM~i0qoBkfV)Q|wDoXH*BD+FY1w*H(R%v3RhsyCCT#&Sm~ttAiVRy~h3RjXF*-o5+G%(OFS z&fL9w_uad9|Noz1U|{&p!0?}m;kiG<3=1Yk1_o^gh8YY@EDr1p3_o}oOinP=GcZIj zFbFX)i0ZOWVEDnnV8Y2*pQ{{kgCU)PA(NLO?M48|&N>Fce~cdgm~Z@NU}zL(U`%9W z^ypyt&hWiTu*A;uK!ZjM1H*S-;r}O+o-&ji;ALP^VYtiS6TtADnc=?!!!rhk3mFWo z3=BmKx*s5J5@vYLAoyp>_wNk<|1-RN!7R&C&mh6Tki$^I@c#hA*BAyL28RC(3||=- zOc;JJGblPR7&0-i@G&rOI59BP|6us9$obz;@)FAgkO7PgFAW)FLl_t;|1%t5(2ZgE zFU;`5i;?j^gVu9~gc~4(UNA6hQIL3{z_5ow=0Ahb3kH!b3=E76N+3A_RmSfO66FjG z*$jGrK%xvFKMON3>|>BmU|@W~7?7dDaE?JihLeF;f!tn@W8VlF+IG(LJz$7B^XSF|MTp7{wv{z<#$0);JpxF$Y^6=DrY#$ z!*E20fq{vE@g0N46GjGxN(P1lVhk}13>7v^9t;f3kJ%aOzcc)=1cl(G7>1W#46+Q6 z7!ZEJwC@8)0w^YjGXDSnzv538Mg|6M1|5(;KzV|JV-kZn2aCgo1qYkiSoum0Y*=`> zosU5yfFVKgNH>qF-;x~+3y(KTTWVdA*tFzi2bcA%7)hb09z6!JdS4_29gZ~_SsyzR z@lo~QY&PjfZ!!y?J1??ozV?UHWV!ER_uyMgPMT<3S{~5qwU$#P{qpKa*{0A{B`Ys) lh>BliyL;QC|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vgT24)T!j|~eBHZm~WS#fZ~!`>EFVZ9oT z1_hf|Qw=T_fyIeD9gKQqDL*D89GWO8ZuBSOqKf+jvG{FwItrh9wi|HndVFKUG52z| z{7Ebi@|Jtew-i37Q&FhtyPSFUt~V!))Iui+*$Un53{pNc%Wn6xE1YJ^7n@B2vs$&T b=-gN(U0t=eV#_g~&SYn;Gu>jj4h+@+l4{q1 literal 0 HcmV?d00001 diff --git a/tools/bin/images/smallequal.gif b/tools/bin/images/smallequal.gif new file mode 100755 index 0000000000000000000000000000000000000000..a1db606b601fe57d8fa08e1d272b5706496f90f2 GIT binary patch literal 898 zcmZ?wbhEHbRA7*0_|Cxa|NsC03=rVP2%#D5xfvKlhjWnf@90Cii1FgpW?e?gI*!QurQ0|OHS!;tQcY#oEiKXd>H~5JQ;i#Tp5BGf*ITyLK!?6Vi-Ibd>I@W+!+`y(hcmWB+DKFU=;-~*8uYg4YSeAi7=Or711_LLQhf1k{ zJclGSV@5jz8v_T!A>AM41t0&E7ftz59x>%dIS15_;4t|PiMt$bE(Vr2Y~Ta{@)jfr z*csNmM2+h`P`=AcHU^tlYzz=tb_S3hkkxDq9891z0J0ZkKZE9vau)^$2D?`fl@K)` z5`yEPDo7-y_>%=3;yNJppgiHg5zoNLA>*-O!NF#BR?V0b8x}gZb0~XF z`LSWq(N1fC16=xSZRw~J^ELj<_#BK2;9u5X;0A`8jA^-pY literal 0 HcmV?d00001 diff --git a/tools/bin/images/smallminus.gif b/tools/bin/images/smallminus.gif new file mode 100755 index 0000000000000000000000000000000000000000..06492f570f9595a21b693ed5ffa2581f742854d8 GIT binary patch literal 863 zcmZ?wbhEHb3KSM#o1O|rxCj#Ew zXu0tw;KmJ$9XC{BKpIBzXb23K5K#Qd!pOkD$e;uA5GYSDaM&;~bI5pXSa7hJLs%>3 z#D;~3+XX~D=6D1?I?yE{sv|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vg&49qMR&(FoSG;s*d6Fw2J;2_&?DVGYD zjY_Tz@5HQFK4i2U?e90p>S0(Iy}e#d(M5y(!TtS3Z(NK@*cF;wCWxk5ZILW|q&&@_ zluISEDE`z`hDlmyErc0bY6S}7Qg&@zd}XB+^M#O8TUQ6nGE=S)JvCuP;MB(v`+7V@ zAMLBvyT32@!X;JjRg7oKf-|?zxxYIy)2`JZZ;to$*5kFMTvO*fJp7+a-){S*kB<*` heY|92erWyEL+$G2dhYAKJU|DXN;zsLXos{j8n{JX<&XD7qX zX$;ef8HxiK0+!dFwxe=N$&yoeYN47*vZHBm=N{>p#P!I}BAj8IqpVKf}L&40rA@ z?A*yPZ5l&yF+)JWmH!_${(sc>|4R1%V;=u^fMN?H!mj*(yz&3>zW=MU|Mz?RFIN2@ z&VUhNSN>nw_3Q5o;`bZ>(;Gv=gu8EbZFbQZL3zT znm2FWq)C(7+S;nBs`B#kl9H0b!os|~yzK1kjEs!b)YPP;r1<#w{{Q~4V8N1xhKBzP z3=IDn{)4IiVAlWt{}q3-fbsx?4u}Nh2?vfU24)T!j|~Zq6$~XWvsfACIkc=T*;~cB zdf~x#2A#M&6@rV_b@4GPw3r4ybeSL%%vG}7@PJjzJDw^V&I7XElh%uctrnY@<}s6@ zU{Q$YmKA|hIpVkaSWZ@In9dNUo7-iS;o0_Kh2Pd$n?wDV+w&KF^(=W3u-L4B6)y*a FH2|)(%ZC5} literal 0 HcmV?d00001 diff --git a/tools/bin/images/smallplus.gif b/tools/bin/images/smallplus.gif new file mode 100755 index 0000000000000000000000000000000000000000..9030b0b323d21671c1dcca90bf03a818ffbbbfdb GIT binary patch literal 873 zcmZ?wbhEHb#=yuSCIfG%4K+iFOo^ujY z&PhzUra0%C=A3()OYa#jeQvq-xzpD7US3{ad%p)A`yX}g|FL7o{*Qvu5ExV;@cYAp z1xp$l8vZjdF#Kou52pTuS^xk4SNzGs$iVQ6K?jr*KzV|J;~&FUP8p943l27O2y4Zh z*s#!%K|tBnd$=;2I0f4+!9Gl5gdid$7d@j?sMt7vckVbK+&Ru!BneZaj0QLtd(%X zso6qNPHScz)HuJIeRCNvXW*KM4PN3=3};#0c6J@dLI)WxrwGda7cBWA93yY~jo;~cWqPRILft-m%_2RdYZ&6}3&_4d$e zW`~z0$=7Cm*w1eh8N9gk$Ggk?@$(HAH!u6ksxiMxR5T*NSxjX`LKBnjjs?yFZW<3; LM6^T%7#OSp>|#zc literal 0 HcmV?d00001 diff --git a/tools/bin/images/vcrforward.gif b/tools/bin/images/vcrforward.gif new file mode 100755 index 0000000000000000000000000000000000000000..b58d649fdf4ceb25b1558a9ada96747266845a22 GIT binary patch literal 1021 zcmZ?wbhEHbRA5kG_|5CIfH-zgJFWqVZp&>4q>gB6B`r{ zvoa`o9eEz0$iN|};uEldf#GNuyT02Dg~nvoeg)pR7K6maOtNC6o*z)qyV$b<*d(BiE*fu0D-=|af=z7zSqSyP*?%tk% JpOKNl8UQK$E_wg} literal 0 HcmV?d00001 diff --git a/tools/bin/images/vcrrewind.gif b/tools/bin/images/vcrrewind.gif new file mode 100755 index 0000000000000000000000000000000000000000..e55b4d67df125da7a480a9cea0de193024c97c23 GIT binary patch literal 1122 zcmZ?wbhEHbRA5kG_|5CIfG%4K+iFOo^ujY z&PhzUra0%C=A3()OYa#jeQvq-xzpD7US3{ad%p)A`yX}g|FL7o{*Qvu5ExV;@cYAp z1xp$l8vZjdF#Kou52pTuS^xk4SNzGs$iVQ6K?jr*KzV|J;~&FUP8p943l27O2y4Zh z*s$<$BZHFHlok1lT-yY-H7=|OY;@rekg-TOpz!EWk7&@ckOzVeEEAMGXZc8cbYh*Y z7422=QelY?g9&4dgjGoD5l-vGzB!c!N^RT{^Tc{rI5=IJz&Ar`jpWwVzNZR!gicA5TqFHCBhL$sJ5GYCZS|t9D$!%7+Lc~-v zeI0=+;SDXv`WQEa%q%*Xa!yu#{*^r!Hyk@J6B%}NPUYsT-Vp1oEvI%VWnLAIXbPS1 z``v?!VX6wQRgw)?H+W{di^$FS`RQ4HqgIc^!d<0%^wu8^;bT}*{$6mugZ5Lsy6W%m z4eR~c6*lel;1IlfTu0M(#h;0hH+TQBrIU^7VfsQx-JxMJ{;I#Km<)p_$)R O<6(=4k%#~TgEasss9CfC literal 0 HcmV?d00001 diff --git a/tools/bin/images/vcrstop.gif b/tools/bin/images/vcrstop.gif new file mode 100755 index 0000000000000000000000000000000000000000..abe2082b759dc281a72e6fd2d8f3e09917dd29ec GIT binary patch literal 972 zcmZ?wbhEHbRA5kG_|5)q5GH z+~e5#|Jbo(|3|@S2n?YR`2AtQf+YT|n84#bM*3qumnXOce(vaX=XD>J~iiL(UL>G`suHFA}>EZH{UjY+Mk`q8BTLtN~K&oOje#*%0Anw zmGkO?D=R~}<4R{ueQ<3_EPI`*RM>-v1-h-z=G#xL>W?&qV6X-NnY}BK literal 0 HcmV?d00001 diff --git a/tools/bin/lib/AssemblerGUI.jar b/tools/bin/lib/AssemblerGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..c40d4552654ad467da6fa5619f893f87d3c847aa GIT binary patch literal 4470 zcmWIWW@Zs#;9%fjSU#c5lmQ7SFt9K<78j@HCgr3Sxrch{I|lo@W#**1W#*Km7U?DD zBo-I{JH^0|8|WQ;IY8u}p0B6;^dPOZ9buaLE}03;*Op0>2v}~sR!1Ushmo(os?V&1 zcdoDe3m+fa%6-@6c&oSgKaJzX&SJ7{DMfzg9$WXn|MU0zYjXy6f3JuGSB1g~*0S_n zWm-4AfZ6x$&Xxc3GB+-B_3r-4ls9`v@*};&e~j(FTs3n(m$g69pltC(h4rs1AGsLn zME*_w-u(K<#LtKLkA(f!WtQjuTC>VUD_pvHSat$)ebux(U1Qw!vhCr-8-w&Cz7Tme3}nrT_=icG@gAV-8@O-chUL& z*5!+SB%c!57_isEcB9(8`MVf-1GcA?-IkXVHcCCGA{Mt(IM%RW>8n;{!@Kq>*Ve}E zcK_kfl3Y5aOkuNzf4h-(?DC$|6}qce$j|MpxIUFh*XkeBm*j>_Ezhu%QA%e$o?F`= z*teXsB=X9p4{XmSDBpdhHsg28o{w993-4_F%O1KrP36S$eKLDBx2$+S$#K5W1%o$FWUGO+ovA>%NY2SJvJ*gLnGsspp%2@CSIa za~x;xUigfWf#C)d0|V}Kqt3v9mTq8)$T>f^AU`iPuSCTVl6+bNPkSA95V769eul*D zsLWc$&@+p+b-#!b^b*tz5pmgWl!wr)ujUrCDwt_Gz4+N2 z>(3v5e&aiEbXTj5ms*iVbcD;%1CttOHKsZ__V2lIQ#I%7twNpVefo$xdW?uO+_r<@VKYrP1n!cb?-$UbAw`H z!})SAQ$_{`7K&rS2pSUsr@fdR1=gI)zFX>>r1G)VMX}w6PdiRjk!_-bgX0&i$tfn% zX2zSW-TvqtWUu(Z{6}MBd9R$y2?yg~->V^|^)>tUGJn|cQlY!4m#2$wTHvM)Nehz_ zr%o_dwqNyDsI2O(#-z!03Wq0mulvqzRaLZlYDn7rg!%Rw#*>c8Z}@N^e4nMtl~=`6 zd%c~OEpDF_Ai(@MyHxFPwyfWi2?1-rA4}4*Da^OAOx<K90Dp-0+}m>Z3e`83KY`o&E|}ddqLgpKesl`I~+Bv$Arer^ofjZ?0OF$!J_i zl1LUjwb(j&%dTI>8rv%WM)FO4tabG9hg@YlO+EJR!i2g|3H7~ZED``Dw#CK(oIwa-6!7HLy!ws`*G#m|l2 zR!WsUl#;WJKO7cwnES|2Cf?Tty8dw|HmyrO@KtKlj=r1u4_5{PUAEw>@ow>z`hHJ>&mZt$P=G%(HIvWzYPfCYqo2aLeND8?0X4 zKUFq2jrrcOv$t=~E6-@DRp+h{FWx(Q_Va*?U9+-_5;1gnNHu? zGk-RJ!R7^z%6OY|9_Za!lN5NEv1Wq0{G(@ld3I;cy6^azVQhD7@9|gm>mCaKQ0cc@ z`slKj-Qq`^xuTwgs_vaIdy5b2b3WPY>0f`YF;1Ux`DRSu{AqhOL?3+Rxw;}~dusg2 zQpuZ!TjJ;27*?oEm)+*oXJexMmieGm<87{K^WO7Iv@MN1wR2O&whzn~nI4+nZ&9pu z5))aow)JPoF%~unzU=!E7wy!Z-}UZkO39t3={tSF%L`%i?UEz=w%mLmwQ-~ABab(R zK8N>4I3_Rqy`pJZowk1F`M#3=$ZwoU5(XYFT8~ekkP4f2v)p)#ZN9}X7e~I(GMR`S zVY9xT&=iWC8^222)3;h<+k(l7i`V(Ss=2uKT#u=Edfr^aPey(bwzAWgB}6Z~UG6ij zQ#JgS@~*d5qVf~>XRLqzVw>-*KL;*^RX$ePRWNPgTE(n0o49JNa_tIhl%6}EUoCt` z`>W^m4QB*1{Ugf)pNZ!1nJ+!RGt$z#@Z`5&6KZX~ZQpLHrha11(jcoUS$DCM{bt8^ zm6y!e?kJz@>yXrCw2*D%{_X!0bf5S!$_g{hPu>uAcj1BOj+Q&?b}kW^;S%?N`^TaK z(?6s(N=h)rKYUhLvFAYeN7F|22VAU5^Mu!I()dt%?C#MC+8(W;|8_gqUDLg|q=?O`Tx)@ncF{7=D@}e3?UD5g zADsVqJUG7QuX@gL|H>yD@^8JKSF?Mf~)oobVl zcTbD*HqL+eoN507eb&0xc3SKY8uzR)cH!%9lOr!?+LM)Wi;Kmi1(tK zDrZsZyjGSKi`$ZYJ}j9zm1XOO+?TAbX3M4tygauh_2R6lds$C?H@UtsaCM6Rv3I-N zZ2iSzCPY3v^*ZjGR!sPFqZ1#^tc;z%Pd3>XAGE|`#TMtb$6k~7?#i7RC8OAM!|K-> znFRu2=87KIRxJ5-IMY4YGXF@J>ArbvJbM#-wO{nDTp< zO%7@I%M1B!`Ryg!aZi2g)y56kuTL&;_g^MA=j-fN|LirUhKaarBV5N&7_&- zS*_t*2^%b(SikPxYsUWfdCZ4hD`c7uUz>CI_|fV2efsRvp4@!=MPgCGR)NI*Cd<-a zY*~Mb#m(UJ2D^L_@1uc_vm}LHXa*{(bQ&a`*7S5Yk)Lp5nbs^@le9Tcyqh@wIUidx zW2f>iP0K9PK7-i127kLI#(Bj$ehWS1*Z*trmn&ffl0q2|qI>>LGx;#}-S?7(zisc{ zs`K|}e>MAuuESrcM~mIrw_Y~6?Ow8rwIJ}k(v*)zQeqc9VuK}DSLHb$YCaXa>!vfe zqDhohI%8ADpS9mERI&XD{*fx!^+sVT@0IP}a`cmVowrwexb1i>dUZC((N)1Lo~BhE z!S~(%-r}fQWVc1L#q8(;RuSh6_1uoF>-j~u7w_*VeVlS;r`$DnnY7r4oI<-AfAPIC zcMDi;x5coA`8I*m^RADT@TxMcRo~kb@4FtV z@;LwP2L-Bc9bog{bEPK%R}-{EAmb(Iy}MW+{wzC=O5?p|6li)E#dLP zM#~tp4K3Pi7VE?|+MY8bRCYyPHE@SYLFzx(Kg6CLBF4$p3c((>n{E zr5$fxs@UxnaXvZOI!@(|MUUOG6hXnMpScAJAN}ooe3`|xIBW0TgNlm5pGuS-EiGQ6 z^{cO^`e1<1H@*zt&DUQE-V;BlA-7!igwCnSjc2^BYdluU@-Do=@9%o0bcw^{clPXG zGZMOdCy8zn^Dw^j^Bez$_nAzx;#YO{^hrMPFt_GRvr}AO`}U7Z-t}M2U7=Tno&?AD z-4lrlS$=XsKgWuRc^m7j558F!dedV;zNuaE%0yL-jKlgG(Y$YSo06Co-~TzSbp674 zQ)irSJ00qs?)Zltlx_;mV;{U^WMH@rZg(;=i7+7g@W{P1P#+$tOOKw8aP;T{yirX= z?rng2cL)dsTV6jLm_Q&bR&_28k7+c fMt1R{8Hp`h26(fwfwZtPurkbJWMDYN58?p;BfhgP literal 0 HcmV?d00001 diff --git a/tools/bin/lib/Compilers.jar b/tools/bin/lib/Compilers.jar new file mode 100755 index 0000000000000000000000000000000000000000..9a78b05898628a46573810974ba601a1aae83238 GIT binary patch literal 27094 zcmWIWW@Zs#;9%fjSUjQ3lmQ8-Gq5mtBqnF;I~EtG<|gH&79m)!70IauC7JnoddWG7 z#l`h2|A@M` zWWfXG9|4bgM76hB9G>&^|2c#7bH9(DmS*5*SMyo(`i8;6gv$-OwUM*B8drTWm5sLA z#(697$l^aU0!sDs4PdPVZ}MM2nP} zORQOxADp##v?eoAyfjmaWvTWh+c&~tqYuQr?X3;AiBm;14F z)w(wU+?S_(WL&uW1$XhKEvEAW%A4y~OjHkU4Jds6y2c_xEO?qX<4Hq~-C9P`Pr5!t z?KWn#tq=9s_w6kI!Y*Emx8WMsg;$iVJP@?FA?>x&i;my}KX!Kc2Y9n{oN_s?;J#i01~M_7iawu|3LTa@i#4)2GGx;Yge%_EaW+MRDd(b!&>CRp%VX9-RVF0r|ZP*xa!+K@d*D1?LR^r^BVOU{C>>| zuFbo+|L98K)R#FBW$;`&H0=#o!>v!Q3Vt$8(2drRVO*R?I)V%t87)2bbo9 zCoOw^o0NF=Mt#r`k+e!{G6>kr!~E`#d;M|!{GSi2b}ma1Sm)orFWn=2QRu;h{kK+k zFXLKdu+8Au1CNUxWiD%9UUxkcup{T&QGdR?2g{o4cq}B`PhO0kUGRZ{U)DycqDP&l z`T6p_cjBUjCoP*QQFJUc$$#$7sl4&ON>x)r_wVZ}c@S(<{9#UlP%z&z&$AC$o&Rl( zzpr!t=*Eni8$zGv-Hf~e@k!9 zuYAOE?U8x#C)2;nN^f5O+Izj+Ph0D6uU_nb-Wj%T&x5#U{!G5%9mgG;e_Y6-TWVMJ zdYQx-Ea&A8YEJUH;4BvZr|47k^zyH(BN^)%K?#-D&{83giGg7rGrokXgqcu5#RR;R zfF#hV5u7z5&r9q5tyf2eF$-}saeG!Al)2y5Iv3;UFAH#W%LH1vEU5vH+Zlb&U8cUaYnMKo`zo;|q z7g!el!ax1O-!JJ}wW>a$U#<$&`aWCV&iJRTrq74s3zwA$p(rsV2>_7L#Y@_%i2UM8bcPJfU+>qdU&2g&s;VrFK z4a(A5EOZWN86@%QR4(J$tY8}M?7NQhV@{+?ilO_AGomd~lFv>S)rrO*E!`Bu(7PjU z8n2PbsSO54!cWJEXnj*cesgZJKuOqc9q!fdnA9ZN_+E$EOg3?wA(5jMzT8MNUAH7_mR`!9?D)@e zYN^dLTRI;4Dsv{E@SG_*`{lCJ@;g(@Wv*PdP1ljXJeP_`CVNZ2SjqZ$~k{qb}}j#W*k;AKd>+LN^$GP1F_p>4*D;> z>pX+WS5G-d@?3~pqUBj(d5ynr$2OE4f1&j?b?XA3q=@WvVa~(bes6l|`N5L2Jhfz* z(Xm}VMa?tMI!vy7nsQgZ{al=Z#G*I}7+v^B3T=caGY z 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
Qwx zbBiu3zpz~32aUw&gTFc6hZoHIFr$gPrJGAm{f`jqbdKqwZv^HAd{BAF%w^|M;dQW` zBYx$B)g19_A7pdv4>@>UsBUJ{dgX=3qh5WHIQ5Th{c`r;Z{}6Dd#g6tzj-)&&%Ajq zH}5M|&n>!a-f-)>a1}GtgZF>8UKB3*?Z0SM{bA0K^9lmCeFt>1b}Y7g@m2AiwAooF zkJMz>%+(sVwY;)jB{L*uxZdy;f4Mj@%kxX7$rqc3s^pV8Qmf=#9viMwcd!n0lKsya z6zjf+OMdCERV(a|YW5x8G5yQyAMzj0%ry27s2BXYd}X}zrfEwgc+W1-d{w2tx03Db zWrNr)I-Y+&@ouiTB^x2iTao9prb0qHz3>{(xp~K)WlYeOPTP09n)7&R-Y)(L&&>6* z>~<&ZW6qB{Qj>S|&okG>v$daXf3UWD#(B$EGw*L(Q5kx)M*ZHqnb$Av+fX@kyU3ld zp?5n25~LbmoyvG0v1Nwox}9D1#xa}A#ItU!x$AcP!=8V_7WHhWE312!&p&eN-vQ1w zvyZaYPRdMN=9YTRSU6;+hOy$*n+JLVW^&KWoFTp~FzE9mGtaEJgw;z9X?^AKbPahm zbJD8NmFb>d;VaXb;Xs>Dp!{Tou7Us zXzDGcm1+G}&)#0Y`|oJY96h!C=gGytuevqn9t%reJ$=d98)-S8zk2t0*Zd8792B2# zeyg^2_r|-|liki-x9;JK@0Tu&e{W({Tid?z@b%q2dhz}eobmTF-+cL+xA^w;$!?df zSNF)p`%7xZ`%AyvIrYF~P;b_6mWY`E2LpqM0KVphJVvW2xH2~>KPMzHDF?c$xHt55 zaCE4^|G73Np9U?MGJUE3TV|oGoZPp~LEg?2K6n^#hP-Nyo5bxao%iUhukOB8|G57? z=~*m4^W_i5wFi3U2HO92w|sZ6T1d}R;_R85w!44d-dtVw{m!4i=ik>ebUdWVky<7;d1H>!R1u4N8C^>!&CIDXoaVcfb(co*>Ith= zR!gtm6=`torJrQuxvfocXLfJ3O+9=?yYl4n#)D+&I(w!B2>$>iA!c~^%C2Q zi(Jn}^rz`;>kpLGx*EDUWGh$Oy9F^_Z_;LpbghgIyJfsEUZq>`xBHgm3@ zDw(xuzF6Yi9G0d}VM}&}8gO09ZM^sJS&G{GAMiR=B!A3f)HcWG;_Go0xX^Wf|Mb1lM^tCEE0ul~Ule<|4hg|Tzc z-uXQH);^N63-~CyNo(IRV^QN7p&xnoEj@qE@&1`-$Ff$=xEj_Sa%A0Kr=?-?FD<HkD(8~YOlmU}MZ`yeirKcVKD>U`y&d%X8KeA?hGr)YWS zfqdo%`P>itD-OgzbX>UiP;l~R?@967cDB2pe-^H~+;h`UQ_agPxBe`9l051Drb_jr ziy{?%>3M#CasI4xjoBV{!M-;KgzH$}f0C=Q{_sAZ`S(+vJJt zmF(Q*BjNbR#<6Ml3zchbZyeeZH#Y03-R;}oet+Q?d-qB6e) z-9oV7R_{I7V_n){paT>tyS#z$v}MxED~?(jskYMOg}>!$YP-7ogKTirPkIwZR<={Z&&4pZ!ehjK5Fy!>u=v~+q-v~`QFN1izZLL ze$Fs?{_gI5?=L=+zkg^+ZJ#o`$3CZ`_W$Z%Zv3>Yl7HF$=C{SB=_y}De@$1emiSTp zBHj9ijIMm^o8_kcOL%U3-+8>HiobbxMec6SIfo7@K6rdqeSiO!oFhDrKb^MQK0dxv z)I6rw!tu4vT8_1=LrPASH)MIQne9EJ-fy>pXm-pqy$OzC^KSdjNk4TydAsh}Zr!u7 zrk{hni@$G^vG^r$TH0=!=lYJH2BO6s!tq6_cFx&8aS0)1ua3mOn0fz@>rD;Kc~kyQ zOj@4PuiIxPCi$NUR2Y}MDg5cc%D|A$jju44!6=Nwe8Y<}OHzv~0Q=0!>Q1MNjNv$shs z^t852|Ni9r+q&74|NQ&>Se$`Xe)5asK1|^g{FB7^Q)fJunD|rhcygb*%x4*H8GlPP z3pL9r7V}gu_DS}+&YW&BEj4c9L(AjbeW87(ebZ%L%Sg+te^eoRJWVE=XKlR9;j1!j z@2)a`-MmV|>1F}X>AT-fRWhaVo-TMUQMJjp^CFY;>82Z(C6Zi&r)auw-XszF{hNf) z(^GjjORp^Q_KuvjZkN!NKCM+JFD$c`5}mWQ_G;3DWnp^P+XAmD<+@B*ze3gHR#Nz> z-#jySu?KH0NxiHpT~&Aa_8Bp=wb`q7ORc?qm*sQKt0eCU{EN3d;jLJiBpT~{p)b?D zSi5iQi;lxbCnv31F)J;3)**qsB?b)#E$%G|m@xUZQBLwKo(q;sBYoBH-x6e{?i?I-;w)vnEqJJnNE{Z3jb)Fpf6 zQpUbH4Mm2}blqI6!d$bPPqG;l${R}^D3G7bogieFrqkg0YsN>0WoM83uo!5{8%rLT z^V!ggq4?f$pNDC4XF5&!cVI(G-J;s(60$G3Lzf(X;Z+{=V)dfcU3v3=h3&8sUbnCJ z<*urhEuT_fd|j=7?dt#TcP-sjv%223b?cdm-sQHx^Yp{vyZjYD_S!vj{J~e7X#GGR zlnWy6%GK{-VqjRxhA$Urz;Z!YW>HCLVvcWOazPpueNxPpuySe$}GVy%1 zW6f&Y1bX9q|8W0f_}^NXRvxW!C1dj3ndQ%BzW@HV|Ni{_j2@5tI099gJ07S^7F1j8 z<7a5O_JI#adZAv!=QH{SJ0+T$HVVu7{X`xYk6qS5PG1$&R102 zm(j_qA!W)Zb*En!kp}s*kit(X1}X zyR{!AWbNY=>pU7AddqJ`wC~Y(%4bV9Zppf_ZRd+er{<{sTQIf$fZnc6UCldICE4!^ zk#X4GC8ze+r|P2mg5>3!o3gc*6~;1zoJj~f%ByB>xLm36G1IsAUpzvmO*=EG%Or2* zi3etHQyh+RW-zs-_1u~Kq-J4Cc+b==6RTr3oOyDlrs~?F(9oi?g&C$(Csc09d6tuY z%4F5U`s#FFr|lOrBGMx)Zw1Uz`xW13vTWUH%Dug{j^H@jM7cyZIrcvIcmuIHD( zu1LKbv2w;t)o*ihU%oV-A7uJe*8K3>3Z1(7499NG%GBlZ*s{xNcgVXN#|=F4)xFO9 zxAkB5nbdFo_Jdsi5OG$&@;U&{M%Cn^fw%pUIiHa9pbS=Jh$;r?Y z@(1n9B)`P4op4o=yZKPbbYZ(qiT=XcBe%C-cx3hOuF`~SOA8EEpY}PzQXb;mapdBAju%Rqkzdbs9=_=0$MsK`b+6R|hxnQM(!bb# zH&|cV$=s=*m9hB5oo8xS-b6pysrHjs?jNtgTJJleo{xDmwJc`Pg;>Uf3^^0&hX~`9gkI+85k1rW<719vR-g1^bDik=|8Kb-6fCTpPHJjvo^O< z=4e@-uuQaHlJib3O;*paoIu%ir7cr}Hcz|0Daf_xY3RZ`>H4QGPLpHFz`46Z){FA)UoW`++6nbk;v}tbVe_&J!)s*M4d>H~Kba!iPu$=vR%7yig|AP$ozu)f=x4gMS^zvt>R_{St=*GOElPB~>VAG}_Vsg#nkgn-E8jG+8Py)!ae2mS$*-qk?q!9&o+>QW zVr^z!$h_@1-|O6FS(%SJUaxrAx3y11C0_Q0d+=ShqAQIPHeJqD(!bky+ilmxQ-A2`3)T%F8x1y|HzQcWS2SuG`lx za;7`q$lW5jF4N$esh{TKD#KTEwX-`v>@=#~o_^>an_0F$^L#7$JJz1pjPBWbUQ=83 zYHpyL{<2HmZa=^64BDExwI}MBMt;caXLph`Cm))SwmK(N`s<#|hk5er%BDCeUyL~X z#^ZOymNi+qc^7Zo+R$@#R_8|Lc{jc_9<<$=8g_10X?M}~0`Xfn^4t`YxV?L`?i$Tr zcdy)eYuwhnD+|)CqAne{FJ~QMxOR$l|BI3@rsq|B?iz}=Pf&Tf`xU40#dVcaeAmc6 zk22i*S5&aK+E`;#vU`e^+})2`gYJ6G7F`^6>PGVa`RDRqTC^>kmvqeL+BBoqwzn(U z+{<2NEjLoi*~-P6&LV5a&;R0s`(IM$N8$=+Rq=nyW_wy zsd;w}`k8**tuwjp&t|^*#{EeL!m>rzmkR&=JhS}4(k9zqSz=GG8D77h5me30`adl@ zn>lgw#+8owXCq9rHNvFAnC+LZdVT!1f70I2@U0K+vS)>@?&SZsDRA}60{%N|5C07b z&tKap^lhr&62qezVNq{eUmjHM`*_Vw)VzKExvffvgG97n6v#jQ{?Kges?;pw^GT+Q za_X~^RcF7QdhubL)Vur-<+A@6{~yV{uvbk^b9>b>oy!_KI=xIziXHk|lY3iGeVg{h zw?btB3zu4Ma%Q(~`@a6sp%v?8UWFV>WZJ(rrhWYdVFSMWCiBO$|LJ~N%Y3ivkJ+*7 z%KPVjw4UH^u#fTQ+@5@wI`PNl%Eu*+PZaKXK5=r7zmmQ|oQt1f9seiap35gBk3~L_ zd93kRI7?>Sf@Uo`b&-4o*;euevdrsu2X zr`BDaC>{Gdb91)+-HTi2&x-w>*}bv#PEw8fCw9qtj-PtR74p6M&F{V6{@VSn+rO**1LysV zHx7$WQ2Vg%p{-G|DNw^RZA46ADbfb=+cf!C3zr79=m0dBpWo@of8rxWOU3x~@*)qpY3s}9t3MU|Ug_mmJzc%4D5Q6% zTk^RZ6TMz3rZ#D3@$whDu6?KyekIAL&~@$6z;!LYllm%`luqjVY-#`G+|P~Q7+XKj zJ(O-(7c|X-4!eZP{|~_af^K z9{wP@`-8Ft@2~nC{<(r%65gd=Fh0J{N#OavHtq}3cHei*{T%vZ*4$zN@fr7GmCu#k zSiS4`74x_)&HMT8Z)pCWtij43Y-w^Jl;ekf!~Wwhzt7Ioom{5-*l)#lvHj;ge~Q)I z_LJOPeLeHD%-3rl=E`#Sy$dn;!w+gt|Cd;vP{Yo^uvUni_B3kq8q%K5?LQxM$Uxwj z`L->t0gS9)Uvc`^GQ5A`c$}H%doD+=p_-|0tp&dw1OL+ zU+O#;F0?4W)-ahCb$HcEZpO_&AM@QeyqfW;Zlv&b%HMh1p$;FUm(Od<@3+el8iBQDMW-A2NI0z49lzMCY#8`WUsiw?9< z49#aGG(@@Ly?a_ z1f6$*F!Zo6enZ`1$3>zWiF~*Q=K4LWvZOsF^amYh#pji!s>jM1IU57Epfo>S`NCjwA4q@2c z5Ol*($LP>aLhg8>M(pEos7a^=G1hSobW@Q_eo&_k;l8+NVoZg1;m{36F8NTMYn+VT bU{u#bs*wP1RyL561Q-MuOh7AlQb0Tao+5to=9TCr=Oh*v|2xINuy&Gf{$&S&w)>fLb{R%Ag!A@rX?Dim^t`g;Z$8^aAPuTO<=?dS;Ix@y%`US{(`@8h!=Wld$bU){6rjBM&Vtpexv zm4}ti*uQPN`$h8M)SFc=x7%BtT~Tl1k-F#k@ythWPSuIbf8%3)t9w_XRx{_rlYa4S zFT2g(^=%Ql`c{}HG*0StM7Q>LfXYBTG zPBbL=o_+l1-OmZ}kFK!lJ=|pE$|zmhm^y{UY~#}8=mgeq&exk;gmf<0I=z+G`9J$W zt&KoMhx@CW$C<7Ns96N-nek0par}0st5VLH2tPf)NuM&6Ig)0ouoUfVtKBc{XW;Zy zf05v+dK(py2rhl8Be~b=Zf=Qc|97FhN~h`buLl9!g7@t^&>_wCX~qO&-SS5gr_IYM zHg_zwI`p*ffK>T!p)1qbHJ{#ydl)NdDc6v9-Q0b_`D7QyqdXB0xhv=KvaM3hZP{tu z_VwHhBNMp;i()tKR}fzl=6>Ov!Mhe7?ZiIzfCP$rc(Zf7nfV~}B_jjF6J`bmM0#3)mY!r77_g-$ zr_y3bvgr+u^%r&&vE6*PY$*@Nltms(7jfJUi`oBydBXax0B4cQCz$oqmL^BG+)XRz z{wG?;xPDRsubssFnh)-h@6VWBn6WBnlX3C;Io0oGR;Snf`}K>rp>?WCki<&|`E{os zx~aPr2CqA2Wze_LV$u3ZEuC{3YbNbsW!`Re&``1cw$Y(U@2rb_7Sf6+r#)<_ow|%Owhg7{M3ADX4{dT$5sz@4sZC$ACouNQNK#mkug+oQg`B+ zGh4eewk{Ic+sGjvlYX5~_Pp-(mK6dsBZKBN7M!fQYxaHD-eB>y>t0^6Oq^u(viti! zj%`z}&6pYeT;c$8U)>T*wT~ALDEA#dQD8Ii*p$Z1K1rLUUOBg`w{1<{9lH97(DL~8 zt&28&DGa{ygwukpur=|IO^}A=ah+!t&o&;|*r9aXSf|kDxY1#U-%Z9T|AWIL_w!bs zI5JIk1@k7}wuAe>^*?0#x*)RZaM<1jVSV$SbMV-vf35hM7oBtJ%kOQAL-tJ2+V#>) z#P9hq~VUy>RO@%RGJ&BF_dO1iytLfGRemSus`pjZDg~GR zOkTS8uGE^U`dOMi>!N1XICkqNPCFIi&~riC`{M1S3r~(N2%U3{d56p6)J>b7T+i@( z%59(UqWwa0{DDuc=P&eKS)B68$mHN&6JyVb_HEx*?zC<3DX!je@~Zpojm#yUS1xdt z@Csh#SSO@*h;50oH>74#fooVNJH&l>w4HY+~C`9V9mcuVTo&(B%leb^;s zNonfb+|q1|gRZi|nR_Q>E>OSb@Lq7K_v8aQle}`ouFqoHHO04n3GaSJQ0hH@(we`7 ziGg7)3%=AVk2CeUhk8O1u=Usc>vn8xY_)88Wo&$9Y<^{IdTwmf?)=#l;>H%tJAciQ zO)h_rd=mQG@aN1Pq3kz*<{a5m^7p}{MQ8SuWS=!~W9xf#WzvJDD_2AocuLJv5cKRn z@+7DB`JX#YmnL0V)No|cq@>#Amy*5*_`9(&wn+Z-j9htAwTH(mVv6$ThF>=%Bqbzg zG|Z5EQKcrfz?WwY50AsF-bPuCLm+Rlb1eGxCT|u41H%ml5Fb~euZrE9$W;Kuv%LXl z{SG-u%*mZD=H)6FC@5%n(LukKp||s(i?7d@MeKRnYXbgV4ilDdRsWEqBxU=9!EVaO z+gvJD2k)k&?Z5joP5u7!>%Z9<#8tTq*Qh2W#X9;OY;&F9pCrsG9Ie*Hv$9Q`XZNFp zw}k#K5W#_H(XE(C>_c-C=-HTTg zo_T9Ye%bWOXqHjWn{TJ4ehv$K05v z@kToa9pu`iwk=mj`EbCT$0s*j5&M4VZBWSfN6U0ymuxk*=g`0S;E_qVYz*rH;qd$J zIqo?Pf%`-rDuwR8kil&ET=dMttWEPjC=A{-vQY|7B%F5Wn%Gk`@*gBseGMLcyMT`C@ z{eSZ0(xNLOZfv&DAW2sdJ*r`|q3ZgkD|>{%In{a5)ZZy$)0aG3DrRWJk)k?H_0@Bg zXG>rIR!?23Hl5+_krM}wFfjG#^zfYF(NRzXd+v4F_JRrq28Nv|84x{cwTSQ>B363? ze7z4l2-HqKzs+s!)m80P0xYvDPVfip5xMB#sCeV|Ej?A!WkKc#<)6B4;E?;n_)nv7 zQz!f07kY1ISLUZZH&FhRHcf@|+@tF&!q;Wsb8v zS2-zE>SghUU;oGtGnq5*-xaHhhbJwRt4n!){o+P@rHJOAExZ5Lo4ORP%g-0X&uhZTUSCricEU$+mvLZ+LAa+>*0WD(YR6UY%V(*I-ZWX` zv8}K6UdP#NqaUAiWItNCaUT&2`|;J{^$V^8oPBYQ=QaFSuD@2*AKJZf?bij{TLjVyP3nR70dC~B_S7AL&0Ylmvm+=N-Twxx#i9$%`qRkms8 ztBKdHU740`a;0|F?rE_q9XV3V9!}#pwDa&EyXvoHmWytIO`9R=n?2TiUg&&)4P7 zD4p+;A8?j$QLBvor>OZKK-mU7&sekJ(P3g^%s4>u-Hu{Z zdp*u+YR^+6L^`MMb)21J9MH9Qy1PzboaVBsuYc6veK6q-o)hzWL-L-*afR9}fvxF;|^@SxA!UpHc3Swzj{^m+2>F=I>kjdBV0gF4kt zdluiAE}K|e?Y&9JK}}oWS$cX1D_fnYUMlk zRZ*OMLI}UoSA~h4IKuHR&AJS={epJ>>GSRL`-L7vW`d;7u?wo`NKRC4|Y>fmjZk@ET!)vmq zq{-<^mm>>zCIvmObP5(*vE#x0Lp6_IX4~tXjy=TeYVapH@aAR?j;vigfA=K{%~-)K zwO0IAMh2@tC~%f+KHRp4fq_90Z#fGZRq((ZNI=TQVTn1V*z$7d?_%Llk$+~Mn_re? zW@@tfb~|oRiB@R{kk<{>SnAU4n$)ekZ`;Y--KsaI-1W`<$f&jNetuxOglzhc(DWRu zj>jK1|8M=@QE~2_n(t+v{xeVJ{QmK-{G9FgIh+6g`TqPq!=xXcjcvnwH%M?4mN#gO{Lb2tkHp>@q3fs&~DRevb**D`LH&@&dZ?1*$VGEMGT-%mMrU@7= z6U{kzk|QnR{3ZjX8OgQN5-r6l#nj|AK4iol+o|@Z;pm}fsqL;4mvbA%P28xF?0Kw` z^X#EbT-Q1htq+Mz(_NUG;un8mvg`2^s>fZAX-3ovDODbpxnAt5=;-x1B>v0twc8d) zpPR7K|EbHjDS77%R8$wb&bYaC^;+X;`%12CxUQhC+VY$Casiu4%cIGig+a}&I=QWn zC%-f~Z~p4$n}Ds8g{mGaAOCvh=92_P`}mTU(n&EJuAjNX?96?rq9@r#ZzI|)A5Tmva@wAC@u0=~m3bEK#xobGZW3CwZ}B?y zvZAZn(>-DzNbsF2(&3o1{00+$M8Lm)059}Yw11m70rK`%lZ4=ucM(chpdh6g?^N~7jD>a zJhf)QBj=hWkCLC&Htqe#QmtBY#qP_*M_){qyIt}99I-FMdZVVG@tGOM+DT%^HI_XJ zt~vIon6uHgytpE> zw14(F=|8*nsOEk0o%2~vsa#lEnV^bj_dcr z-tsH`6XW}B>=kpOpKr?USHBj&;NR`F)grG>A9?;gbyw!CXpfnZ8$G6*b?=Ds({>%rJEB>k{pCffyTuVjE7yG{^R=Z8NzOk1s&B!aX%__i zck;$R^m`1{YMr8?pAA55ppyiD`B^WDSFYjZQlCB6w47HLn|@|weEjlzze z3D>FwPiI_+(!Ueq7QwCKoF@2F_D^!x@tUq!7eOW2Soe!3Sz=4})U4qD`)}ddl&Npc zvg#GC1Un^57Oh}<`9ZOZKhSTw;gw%CKJt-iw@<##n028lY{5JZzLJlPLS}!Osw=OA zI(_Ed@@8LKFJlasS9t!vXthOsk**?Z1Uy|#glw+toVMb!@~e*>Ojljp4R*XsdQz0l znVWhdkmu)wJ@2>pb@;Y>Y~jyP%}LAVwO`y>`XiiY!@C_#aa}LOx?Wt{R_(P;o>$f7 zw$`zX;d|d1Lod@S$#@~}#mvhwPbC~tTy!}05 zMKAwJ-zem@R-JP3cz%Cfg6P~slkKXc?@qs%%UiE0>}aLb@7Lnt>Q?`G;}^jX8-M?O zQIZ{a&hpekj^_d92g_rZRadnwnj3pvfIl>6?uv?Q?{D9FE&C!dyHWeb!Dk-swM=o( zRDYF+8$PTDmAezC|Bn-8Wnd8I##bp>5Ui9i%3XNPR6F6K*I@&Zw*NbB`YeBKCV!|( z(KUbXl!c9rk8bFdP2cMN@=cKErl$4JTKPA$3;DaZTXnH~QdR%|e|~{ky!?EIq&c1~ zLbaWZM*u{f3hRS3X1XNhmdtT^{BYU@ zE)nn8yi}Icx?7fMy$Cs(EmHn_%b!gx5Sjd?WS_(}?UlZ2r!3o7oA~jx zbK5QbWp=xw<(_)=PV0gMj%NFR@yWdoE1sl2-G8&Jj%QV+^NNF-8~fZk&o(jVgTf`@ z_j!w53=9lxDB*(Mos!2MF23Li0!a6}HN?AE+Ew76+v;{z|2Y7x;Zr__1vG%n4M1!F|I1;(a>_|`y={~`GW24O)jo} z-!9xW{`=MZuC49w>-PKYSrZmdJIr$L>_b(ZO_wq$=kGOO0fgfAB@s9`v$!q(=nGOjWY`eP6A?dJc z@#a|Z8F8^6SKYt$^w~GR-AkKx$6erh8=bXV^3C0dVlmcB-e2AJmbxaKE1B1?8}?#F z(PlUIxs`&~N=;|2WG$M#D)i%@ZM(d>m%J3ww2sW)Rl8gB@x>qw=dvuFb z4=4UlyLG2P_E;Ln>sP0EH+yVd&gAN_S1Etio++INEH_(dT>lq(r88#1KE*CwSyPd) z=4J2i=etP?KlHd79#`OBdp#`C`zp()v?IIsobJ4tT9zGMt|hA#AG-KbNlo7BxZrj7 zrp!2K+gW*L(^D^>N1~mYKHg6PC+z6o%A+MDW;gMN$b8Q=$F=|NKX>npu& zTs!<fu{-?axB~;PxvVQ^-lm20cNypp%S$WDyt<7xmkXQfD zljb>Z*;O4y-b;_eUizm@>Yr%Br?95xB|~TY0r|zxlfKw&T;k#XkCr~Xg8>wfE(=uGz++7tcC4W>Ape5D}0GG8AO zhYnr7udr6#;##WK!>x=yC-bzvyh{4c^s!)_@ij)bo~1U6>yFIu>pAlA6u*Y_d9GLape4#UhmWMog{BY97^e&YUpGVv|34Ym%+>@ z%t3b~Zssl7C&kQvz*#Xz+oM5Z&E~rK?`yste}3DVq0#Vo$K#I2GZIx!8wIPJ-Lk1K z%ZMlaWr6W> zo&1(by&_)M{FDA|=#muwZ&4I~_{5=5Ufrd)E}UO^-cv%N?9Zzo@{eQdEvp)?FA43d zyAsQ@h;O5K>Heqe7GL~oz_SSYDdr!(GcYie;4LH7@C75vBNM<-`uxQ5f%U|=XmPXu3*eGz&_fAsb?6cN7 z?>1HH_x!Fn@JR8n*w4Jqql*QmIalaB(0?bw*?0$+k>!H-cYfRp;CZ#uPgxunbUGwDgv`x8;6Gb`nW{O^p6!SR#pUE~{ zv(uMRH}Xt&mb=i#CwtUO*eu2wDSLXtMqBaY5GVxZ@lGI83Do=$-{kC>x9N4(c~ zADKAef}x^ed&_|*``I)myb_qS_QJ&*g=cD?@-4i3`tglNeoY_O9(&R3dbrG5B%0~+ z^9rNJj)~{j&)&9J>y%K$iyh2w!_wwY@NL*__xH$zjcZn2T{QDs#+?M~r&a%1zCH7; z-ku_}q}y%jf((AQb8BYIJCPUNtniktv`_Pw9s7&j-<%(-FPePp{nM-}=}UqFx^AAw zPRv^3VgJ(6_NT1kTV|7bUZ?rq*B<=l`B(U5hPbV-4&$Z6YhQd+T+3E(ec<@&M~stF z4F4{%D`)Zbms4C&@AyIB;*vP`6YOEJb|%3WFU?u<>Eit0qkR{A7kp5x@?cFWb%|>5 ze6@qIW0KesOULi-=WAOlq~29(&DEZ%wEdXk#<$5QHh!1Li0#Qd{vy-p^1Z4HflNi3 zdzUXbE3$dVwS`Rw)X)2Rzu%eO(Q;S0>g>`*ZNDrhN&0_XvYq$fd)|Y*@)>Q%x4nLm z&G^i(sHa-hMVjGcgVnEA@veAKL*nIY)~^?t7#P0c9ZbAo_b}qhU z_9cCig!HQEXSY3MWy_4);xFvKkmF6!(kaU4z3k6MCw__2)ba?HWU0!$E%obC({i8H6A&9t>yZ?(MJwt45n)jG~sFF3t2eY@(7Feiu1 zhnFA2U2FY17!UN+NhaU;D6qIMS*Fw`FZ%&IC=3@KHk|&Jfq@|vrJz}WHrbA&ph0P! zLfT}#6YqO5If@+Hf73p1ciys@(`G)~&%HH4egVg!ZXqs~lily8m2FshXX@RrhumKp zHhH{K+VyVXBIA{=3NLwTjN3n3r(4{wsoA%WaYKM{f`V>}cY9yYgf(q%EkfQ%h&*x0 z3wMq?Ea&{@#@9P9S{4T8$IrQKULJN@p2uB~->OWYHSBo#-VW>OH4oSyZ(jW^aPjd4 zTWZ>kW!6ModfT-q+o#nsYf6GMFmE)`L_F8*D=$rrf-Q+*1#@K{2%SbgG3P zBLhPZ6TTW1M=D2&A$TfB%v<@Dv6;c<9o9X%G6^)7Jn4#(8=Dxf|5*b!wp94Ye9(dd zhonHyjdm`+UHMsgb%9H<56~+&^N95p$maC$^zisNoZ%^9QRcp2#ulc~%?NHF{NH{; z0yJ+m9c8Q@z4fn)J=3Ci2c?2rJLxVc-5vkGc=x(>v*l-gOPt0wF|Uz7fn}qMBwN!H z*K%*`9PgdlyI;5VUrJ_ayy9AN*V#2aYOOT$;%5ge=UDEyZ2x(F&tCie3>iu8u3V=N zi3WKjx$aoh6eML7cJ$k9 ztdgbiG-00iXEqil?=n-@y(!9>(J#|>xAm66iu?Lbvs7Oucd9mOc}%{pp{?M@rt$0F zL6$cUg#`~>64AK0e2V5OmXNMXEE^>!JC>cgBB0FN^-KBD_Y;8=;uNRPpU{!mcDdQN zP*Bn}a=t_7sUP6znw#hJJ%o{gK^A2(4tjLq=)_`+E;16KF78B_T98$hmlfBED=iv{ z{e2;I6TX%~#Z7F%U7j@#V$5LA#V21?uV-LjSc;Ms(F;FC>}fG5H9fPq1U41i8XOyZ z*+Ini_7Y8A?I1=$E|0Ydvla>Nw--1PwUCd$PqyNLuCsE=8eKI_<9{M`jrw*kcrILI zm#_WcZh3F^GBe|l6Nlg3wM{?2bNBaW-{;HQGe%UbRc>zTOPnDidRavGLqV~?_JofG zvoE^Jy)!77UisZ(*ZGUgeR4*>G+K{q+IT)(>G0{my6rNIfuaFr(d!PpIks!>=X+YF z_HVW`9j{KVZp`0XS{6G$EPJ-7)e_yEyyg*NGmOtEhp%qcW!!pY%|y?CF;yOEh3Aev zyr>b7=4qc%rLsV3;T*pUV$b(VeTZw-+;nZtv9if-s!P;tkN1~kEWPNsNpOZa*WaMd z^;Y3mZJ*0}zPad?B;zd<=~MK@Cy8ge>a>lM4i$HX?wO$RaOn}9BB9hhlOztVI8u7X zb4_7N!InPJPOeW(H;wN(9eC9oCM9yqy0Q8}i+Jy1Chq4kD{3B?H1ST$-_V$r<9^g| z+u`juH~;;Rdt}>zGdD|xB(`L4op&wi{-J-@ZFD{xXil+R|MF|fuD^nlYPDVb<*)pW zm}|PKct+i>i>t10w>oPRQvCPtuD>g{q??z?&Ns8$7NdUS&ib2;&M%eS>mAvcrcY=% zmAWY2=V{fYHJATcth-?0xLW4zYLot%N8>$K&R?h%d^wk6^9{F0(m#@arMT?(YT}&b zUiHOniiG9CzrqvqU7oCov}wzdQ>^Upx%h`qmvLSYXNl}G16kQeQ&`W=S~(}-fp^RK z3B~O4OG_e44uotv;!!TTLR*#qi6!!dH(t=649~NZ4kW zF{!QR;^x(~g zYS`T#l3G#XmYI`^v^XUfwv3^FS?1zxTd#IE-J7KGhJQtcW*4Jl;7i+W-X6UxkL14X z|Fj@M(B=p8pTI{ZoEkG?XKep`@6DdXef#X~7&&sx6Bgwjc1RaB(=E~c!tpidm&lUj zoeBXC8!Y#RMb2?+Irmd#PP-E4We<^<`2p5lmm_3_W4`y-6k1PIzWV>a;)gbtWCL06 zCSlLguebNTt_o#4yJ*!M&+@$o9GRo}UTu)Qk|6l)+@XteC4An?r+KAKPh2K^xxYA7b+DklbG!%%7W>)#SE5wlwz;L%oVNz~2HXBL zmrtnQ(emuQ-opJ!r5xE2`r5a9j%57GzYynD$-I^;vi@A^A8={Mq;%5(w2Wa5-lm=& z5y6aW2?Kn3|J|ZLpB`M9bLGjTDiNhwXgdeYGD&KxS{TmFv*8AFruZVzK=lJ>$>rXH%Dv*V z*IR!+f5!f1UESV#h6cvxQggBbu0QB;oXOw*{fE~2*4}9xD!X17@3^v-PkxVt?)jN# zRezP=ncleZ(pK>or>5?>S&*89?_=3aF-racN8NcK4 zGRbeJST&;Od0TmI^6K&Ny)yr?u#|2Jr?}*km#dYJ3D53JnQ-as@_+!D8z=tGXF2Qf zB1`Y&?Q=PYm>oARS$9TcTKC$=GYwB|_&b$n@629b;U%2cX06IQ_FE@#@$H?L-S=B_ z9rc!1Yc6Rpo8~);iY5CGOu2{HveA- z`@&u)xdlp73j_`}?>3OX|L)8i zquuZ2_181-yjguB$@xHo#{r;-!i1wPj^@v$yLo?Uc5dvfzLGyk(j(S38VO z&pVUR{;}J<`q_rm%z%l)6RvOQw&e}I!trH)b@qzI3l}z&GATQjiSC-`KKER%h|iB# z{FR%MTz#!3EO@ZvVoB2Z-O0D*FLpHWa4xxcM%Chv?b`gvBbG;=DfaKWnH_2IfPYS_ zgiuFE%i?3Zh2E>iiT-_2!T9Nit64?A@%ty1h7+y1e< zWOR*tV!mYcr?bXJnlG+K)iSDHdngR*et1dy*99;#FtngV8F~W{$2v2N86jvVF*v&T zQh>leJ{BdDy|=o#_6B52CkeivzHM8WPV24N&2OFK=WuLXa;afL#ZS#YO?KsOuOBo& z-n{>K`tseLUWLabQ`_#^?!I4_zIpfa=kN3HGcNh4)FrrNvBa^n9G%fQchd^nkH$)V z-=*-_?zr5BuLdmN)$3e8augdqySe+oBg1Z2F>jvwLrF9H{Zms?Y=k?~u21LQ8Lt0X zTAN8p|H9mrQM}RH-^A{HB;mMBv?IcA=_4zS5CIPT8PhWLxjbIQ6-^IW7PTl~OJYUl zX|u#DH3xaMmS!zHEU#q0d+~2sKhLx3o#v0OcYi@=Vz4_FewRzVDh?c2{xg=|F?FLe_A@r3tK&tXk2=I$;xq zXPkU_bo)!6uN$7-aI1}8f4g^!_l1{>ibPZ_)X$4#&zSl#=Ae}s%Q3z$->Y^livIm_ zkL!mpRL_f6F-t}f0UOR)X zJ74*Cy)>)uoh|<`G1b=K=G%p>r>mMhma^nN;?T`y2ruBAuITYuldW^NV_8d$iS{Jn z5~&3d4J8rXwXGK4#O9?LygVMv5u`TZLefWJmM!Nw%nWUAwLG#~qU;i*{A8I|llg(G z*A32Q?qRYEZCvrgQ@2v3_!j3OdxiXENgu`ZSRCJZ2!9M&)0)9>OJSGah1!-2bEaf1 z3~ykrWt3??nf}u8`;M)v-g2wGWU7jg_@?*byZ(ol=lAt)JAB-Kg4hyv+nV+L`3vK> zT-@SjXZ5f=>xA?7xf{0|2xJ`2JX=$7DgVw2vENPIQ;ct@T>W{{Io z-Dql>CF{f3Rf<(JR=Vhwm8oaMJU0|CO>1;Hw>^J;+x;A_m7zB4OB7dBB&@aB{&;rp zqTg+H@f|-p&#!t^nY<*9D>p08yDmDsT=DB2-OAq^rWt;<`OW_C@K*_mZyHu#CdN(A zYh<4A?LpMt_Vlg&%&VDs*7n`{v*GMtGy6k^rH8;x*ctNCQ`i|97-r*bpC};OCwV1B z`8heMMfy%fsfpPIps7+w`I0*UR1b)>o|Kh@ggTJVthN5G@G6Bb-L^JvbQziQ8UK7$7H4jj!BWi!*#NDMwXZPK>R zTw!aLVztNKmG1?m#Dy&<=P4ZCSUvejorRs+lr*D?q>N+pWbRZtGkxVe)+zt%q~^l| zaep!kFTE7}l4tT{&Z`^VRh7x7--(n?yKJ1fw!=+1ELt@q&|}4q{_8(|EADJhSeSXx z<))LXr>J+!x1BORck@Kl3Po7r-pu>>bvge;d9{{X`A@IDJtD1g<2k$GkCiMYQ;)>Y z;_{yR`3A3mxbEh4AM*O2H|>48r+Lm{OOxjrd=EP;zl5)Fjd0bqj!jqpHt93lTh+r~ zopg%sI2a%1eHV1&$Mkzz4}Qt-Yx~+%@z?U`5AeK0G(YPuGe!mmDU{M4y*(w1B@UeP zb8{2(QlJqq<#ygJP(#Yluw8flkE7E z3q%^jSuV9*%DAc;e0A-rTNxf_gPE2%DFn*y5})_BDtGt)lMgR+2;2yXUUtoB?RBr% zfAW4y1sZu4slD8kx@yg#vwT-Y52q|OXiQNs+?|~fdNK9o+GSd2EnC$mtiG1&xjk*y zK{l5Q0n<$*XIYE6I`6E^($zLx^C>oW;S`H)Ep7UouN(UVuZrfLb5~F}arIWrUCvvA z|2K7e32inDJw4@X+odJ7%V#?%bgzhL)6DL1OSl~{EB}L(ut3T%!q*pu>cjuluv<{Sv3;zuuWw-jm5S^(pgFvsq!a zmkSm;Xb>xzV{`ovhwvpm~*CpEG`NQPU%DWsu#gZ=@=zgx?) z%APw*9zQS5`@1&1Wqotw+j)XFBF;RBU(8!=alyu{kh@5rQNzsGtzGERiPt>bCpg=)C{HQKqXx}zrhdrC$ zlVbw^_$C+X9&A>y>c6NM6TCUY?1Q2W7t`e(Lccn@?G?V5PLMx5S=8ve?u7Y%ms6Td zY$hF9wJB@|uU46rv4S&#iGhI`@2EdgZxLQhK$ECzMRICENoIZ?G_3}l_B!k! zVr#zA(%J`HSzzZL66=%XW8WOKdqDb-^mrML?HDwQR}r>*X@#{=3?)wJoR&UD{K%QRnTXOHnQX zS3b{OCFjn1RwPFCeyHr_Z??}&dxYXHny$7Jc4z6`k#&B{?vsz3o-N4@Tas^8w)c@l z*Ur8}8SlfUWQ%=md2pmBxhd$9fsd@l+FglNq2Bw_`8XXX$KAZST3q&ax$Nnnb<>V3 zPWO#{u3zbN!Kmm2lhv2=oW5LM+Q0wX1vjPr?uzs*^>-#^l8uD$#M5+Vdtfr+kCFnRV_SBX&oL1?<-X3#6VzJN`C!Ut^K= zrd_(=R?fEB54SDwdA4Y0LEx!t6V~6b%;4yfH*>nFEqF5JW76>j5_h9c`g}{uY1($e z=Yn>ZYDTje>)I*JfBP%vw0+odIm@)~X24vtTZ&?LeT#(5qJOR{n#cJ|b@SP48KUg@ z5$op#nK&5=mAKAV>1uYD>~9qAIet*MNBv-M&+>!DJ?RHMj}9 zmwKijye_f6VZCu2>-~fp;hOG`xgTVYl^>Km7Fp2uQR;`>honMl!`zHP4 zta9G;+_HE1h5I}1m`nY-V=TU+qSNxz((GmSpk|@Y8jGX_ObiT*@RmkM%|ci@*LTi` zF~Lcm;F!w4BTpus`Ln0t%AzfQ7Tvib;>IQlA6MBkY0;lKbFL_mXw?!;m|O#bzN{Aer7+V-(8Vbpuu0>gno@sS* z%FPCcWOisYD=`aSh!RL(aaxe+Fp2ksFjJQ?W2TwzTkwW3Ey#wjoWnMoIv5xj*5LJ? zGT!nD-f}OUoE_gz(?MW)NAl8hFP2~EHQg}#P0Hqw zf3xI4o28CVeseQU;~O*obKCrTODxaM-@m_(*@0ob_lHd^>uqKvC+=9dcD`Ax}U zEh=DdHuBQ<%)o6QD-$Mv6mS2gbu+w@lF z@&qgBe6 zrQWMgf9`!nnGU&$r1ceE<*zg_$EXZ1|aO%MOXoco+x z5ci#R`dV@CWv;7I_SG%izVG@e<7c=3e%mLr`}u4G5jTyKi_ZS}^+72x?)n^ARWFap z-|}pXmAGbEcrM+&IVVZWx?{)epW8R9C%0esu;90yu{GLD(0KRrbzGHtwI`C+xn_H3 zzNs*n{4Zc`qw<{ZxdD--`8oESGYdOoZvBp8P}`O}+l~e`?=G2fY^mrc z-j2sp(nZ$I(wG!u>Zxm0bu~Qk=0~ZR@;#2fd>`pP z%H8pJhtnSKJ?>vRO&`@hVt%CcQSqaop@N;7ouZwpowA+!z6~rtz|-|d9RFS}1ocAk z7B|>xSkRUU$AW^K%;ZEw+h=J=Zt!IXfx2}|_6h|##;sKn3DntQs`bb_P+-D#$@^(q z=RO#=EEe{e>{Dg&!~V}B{RhT%8cN3h80x1yjG+@iNz*koJd2;3>)l)^d?HQ7{o(-~Iq8Zf%f3ox z|Ijx~Vv@(|{Z~nzzi|Cg*(s}vc^@C$JJ+Y>`o2y58*`%f#<`Jv&h|QKJUS0&Hm07D zj5x@1*dt_P)GDtsQzg@-`YesFZ-h0w_;(*!y*Bnx%8L`LPNn`U;nLWq^~CL}R=4PJ zQT?@CrezA!ciErr+VJ%K$!V`OpImBRB_ir1rnuDp!i_^8&t4bN&lFD#ORj%xVJG^VpJjw>zeN}Of$NF`YP#r-qSx!ff*vf96f zth+Q_VY>zEV|7qvBh$_6S;@q}pocdtn_wx8L1`ILeX6)67MHl?7nLU#rGz9FXG5Cx zy}@_$gd8PonWMw6v1WIN-R`=w=+L%9*Y;-|QEPEJVv@j+y-56Q$;>Uc*Ew(A9r1dr z{=>QDd)IwzuXxD(gU7D>7w?P(hAZc$ocnHk|L3y;Njp4F#wxU=9iuaTK^)mO#xGOnlVc>bjaJw!OkNeAh#x!!_UPkKB=J4trO|;(X=3=b@auvqw~x`Sd*Q z>6^pp&C1OsRybF2>)H5EO~;?6EmU)U_` z?Hjg9>F#qs^Q*x_zU|scdx>4k?(3G7(aGNJb}_YS5%OrX>ySnag&45H9$N?7DMuz>oFSn%DZ}STLHsK>uF~0Cx;yPpyDa($ z?wc&k3@vo#+EsKt2%A3Nc8=)zxR%# z^xy33y8Z1uNB7@Ni}n)S$|QGODJ??!gZn$Sn0vdg?``}b(rj9Ow`a+dy$!3@{)=aB zK4|NIWMl1}C1JO?qn+*qE>=I)RMjNnyT~U$L-o(ebR|hCPdV+B^_SL}9As?!%=JvB zZ(`NF1s$x{mP=%JowS;2xFzzAQ=*i9@RW&WbH$f>?P0NS-B6SL6OJZ zzA-I~k%1wM3E!G0;v&zlG&i*#S*cyPx)iLWv*y zIOe*LxgKt5wu|Rw*ar;_CzVG(U%#xf-l*{~LTIh| zF1Ak^5*H>KZ)jW7wyM$jip05T_6emfHNUrSVwdBU?E1gDciR-DoS!ybE=M+4J~)5p z(VI4mER6-UpjY6tCi~R;7e+8fb-t-O()EfxMrW3S^RE}b@lr<=hol1uVeCf6e>_F!KKjiP{FNW@&mDh8jdCl z9+s)UOXyK>6HxaM=$ZUf?;y)T+olu&O`l7zrZi?U7qdN+w7N3wsY@`Aa%<@3J(JH| zS-R=<)>#`SFR`7O#vx+wu~l_S=(Wo3X4-`vx6Jcs{nS;K^|M;`-`XJ2c0T9P z#XGb2{F^p$8r$7f7VnN)3$(?VPcfC9y7qSUve?8IYa-5V^uM~bdA`cj-0bkVr+7D} zpX>^Meunk;nQG0=XKT+*jOCR&-T@=f-Ol+cn>a%4T*y zUAfB6eTC2AZLJ~erpLU?@{HfIVc&M1@Gl$}|F3KfQ6ZfO(?udG#Nr%yw#g53F16&%O06uq5)gom%X*js1p6>;`=Woe!t5&#Kta zS#DPN?vry&-v2jw#U1M=hlZE#4nA-GMNaX_;rl`9D;aIuOK%$=kO!4AiXGoKx-&5_ z?7=&wgS2=6M>>TxIObY$Rzx4YxcPUAePrFfDHffNWllLhI^j2`+rh6OM_usi#2+38 z0YXQs`dm{^dKB?_X$JI(X@u{5#Kalys_?Yu>5PJHGPtDZ-);r+Gbl&P_afqG&4*d&j@^{_XenX&9y!2bH zc*ut3D}JjwRm?n4Uh*wg+$VYci#OGJA2x(%{0N=9_gPcqo8MO|V$oPe8hTkz;SppBZA6-C6mZ|Ol*xxOh;L~3PR(&zMPtK$Jh38iQPR`#W=qOJs$oJdOuv$=eMXI z(dO{ER=Je>Q4QDGd0tyH^>$46Up}k-0M8d;=j zxU+EwV?RoX&p$6Nu;S`ZC#78-7sQ1loDwt}g*kPU3xpacbLw3G$t50hK3r(=YK}G6 zeoATi7asKe6C%Fn=<5|bubq6oGRHymNw43&bFA+_SgFUa|IF+6PWf$Bn}kL01iRK# zr)SUE6Zu^CO5W1koF%u^R&BMc+Euk7b48#0 zFYihhJ{_HzBW?Kh`p+`;_hko<+B|rq_Fi#Av)Y$QZhIVVI8OR*$x`;p=1G(IiA`}2 zYFQ3R9oU#0(tW}1H|HF09=Fb|5?3E>Im?*!Zqc(mrJcu5et-4H=GNnMkLB|gPW(Lg z&t|Lr4$tQoAH2QgSo9w!_5B{t#b5vVtoOsRbnjvP!cX3wk$Q`bckP)_-&j9UE#C2g z7gMc7^mPqEOv+yZNE4;%3{t zZ>Re{O*{8&Yj19J^!41_`!{af*syi;(d!q_HT;wix$1ss;|_b7`)~MpXH?9Y;4Z>) zYuCAHzxd*_xtZ&pS+PyNesyd4n(W-$LD#QsC^cad($4&_H9u$7>swL#7p_aKO}3uM z%*I-(yYHFRp~Za14&1%8%amQ~_*7}B*Mi$KwbwNVONiuU*z7%*C%X3Q)+<{}Z@%sN z_RH-4vA(sXyu5ac`h`VfWwPJCxp8A=bxu}o_UB`}%;KxFz0Z9tN+~F@|F}Z&yPe2< z{@qs}@$NHwlVf#!|LJ(?PwnMbwjEzw!K6L+Pa@mTv!%=PbC4Fmvf3WMy?ZgC zz9!ZnWs!uc`9Tlet(PZ6u|N9D{86l4UTNy;eZM^7_uEVLxE|VMZ?C3dIKw0>cPHB= z?GD!8Y)=0wRAzO%W^Iq==!nhQcq4yS9ptS?+nc021Z`z1feol5~Km*#u!*U0)dyDp|g zq326LWBGR_(L0_B68y)M6WNT9O=vvS*)nm%zSHu#T*oGyl}zt*y5Do>=k|7=%$pst zJ8ZLlm49UYeG?O*^Bj%BKSrCw|;G zNAK;C$3>HqXDLlT++QbDw0N1KW%(_!+iZstMHr=myh_UA7n;m)yP_#l5Lj=rN%__L z+Yk7UuAD1x;QVi|;ijf3>wX2EWlCw1jAj0GLek>m%j43!tCe>o9C-7Qzs2Z`b$zHn zZw7Dk($M1@_g;+4yqCt-SCv@&c5!;T)%5?JJ60F^Z@=m9-dugIf7Xf#JA&7C9h?mnUb3ZaKIaulPwrcM+al4mm2rQhu>9&hb%CE(eb3Jm_=6);7 zZ*}tJJ^E&2XQo|4%EiQQUl-p9EGk~@#%*^zaKYT^Uj2dMd@J5AJoa>kkCFzL>z_uk z;_}^}{=QpvM*9hmlUC=fj3mvUkM_Cv*G>~IOPc@T>x!&UyIGO5a$j!JKKy2iJ%`8s zSNx_d$vYnJeX{P%k6R_nGjo;hW_N`Kt=n42KTm3r-l;|_FY%xwOK&VnH$(K^?qoC{adq7Tzsi!@Ki(2DG_U<6igGp9p5=sL@FvMy&~OWleJE` z%FK1Xx8q)aEB>%!iTB6y^2HC*^<#ESIJoAHo&HskV6I!=+aB*tv$-*M*1i|Qe)h_y zsfNBArMxdmd)q4-#%G=CeEE6$QggpW$GRR1OIs^!)|flTuguc4NXA_(GI3$6rs6}D z=d0dL*pbXr#`?SI;69H8-Pt)COy7t!n+Cj%5;Kdiy}E7lS+>u@H@qIiNWDm{Smd@V zEcpIWw)z(PF88@>j~PW7|46iJ(R$A5awei8?@sb0Nokvtd4@Mi-&8fvJ@u-@F6V=C z4U4bJ?Jd05PMJx)`TRzx`R<84r?2O94Sow5{z!f!W^=qhFhY9j+%waRXZ-))H6`PG zxnvHv_1uF^|Kn>?Ht2O-o%V-+ndwIXK_R^@0Cq^^5y^xGV}c|B-Cox|y%Jer~<<^Yc=FEdT8}7{B20Zb`=f zYFP}wjdmY=a6idh@{g-s(uUKWPqt6A*gYvr|KoJtf3p8#n_UC?e`vGpbAJ%Zw0>fq z>84V)-BYq&-(+i!bz8;8_BxT9_h0S5T?gwOTJ99qx)LEmvP;XI{%(>Me5bOr(2^}&0}^ws+y@` ze5~r_63OfLBO{*wH~3-ybAQRd{O0-tY&`$u|0&*!Oz+!wlILH%)wkH3?FYXJ-0*&2 z!!%#9z^?JU(2j<;VO$!VKRy_4X})vZeTm!hiTaJUQX6(8m)3ffGI*`E~YPg1pa{y;|0ue4$e=Z~D4KT2wVJ zO=fNB(>|}Bl!;U3x)jOH^X*Dma-S!C^}OR3_NYwB+ETQZ?e2E7`xnGAwzh4Xa6oBo z*mW`KTSB=j*UinyIL+~0C0Fy+Ri+w=9R9YzU|DVh57RA^KYCr5wpjae*aW`k)vLtx zEehuy{Plvt)I>Gb`EOk7taWRbDNCrh-gAGw&Tvcc35H*-`rB-Cb>8(q`h5F>-&1+1 zC|TXT(;RFUifSJYp15|Q>4Q^m7iU~G`6K~2dqf3MeyQKQPu;w->NT6xd;ab^vA{%7^QVCm?=R;_e(xzQ{X(Xh zjT5VSmYqFWRe5gJr>Ax7scUBTf4*M+OJkXwY*%`R=dv{SP9x>LO%DzCP7a=A`_SU1 zjFMN*ixX`=S1&p5R+d=4JXSF5^86`JHSUNkoKmBG`H9)DmAMxd2k(sjcwyf3$MdH3 zEMMrm;#8w*-){S?pnHyQwq4;7uB(n(w%n&|t+zkx%TpB}TRYAK{Bpj>U0OKP_rpmW z$J(lE(P?L8rkHQ)G+U@1dMo)mr)>s5YwLaEkomi6LpS@XuHpK4RKJb&?8hPl=gS3; z^<16SWuNu%PhDx(z3S?=%Q~y(DmE5fow;{b>zs|o+l30*T5VJvv)zvEQ(v~5jVqng z`59~S!OsDGtZ66SINzLfNaiGT5DAo;ImTPWV zzVTC|#(cxJB@a(t(X4FR^KC5$wbl24{@D$6{_%cCq+WyKF z^Sd|fRleuFpOZJIf2DVd(^P%-)7qKZU*$JX{Uf(kWwrZG#p#BZ#rygvZv9gGDC9-j z>)5N3{B0MW&NRIBPH$$6v#k-6#P@GMonl` zJh7uB^2(d;H%5W>qFU=_To>-S#P3!Sesyw`M|ztPU-FDD*}o#6TMxBJNOdeMIIZ+e zv#e`RoWfz=ZMW=s7v6a>Q(^VwAc>X1)17x+5VA7AH1SKk__3vvCcY{+yX6|S{+Fw- z+LyBx&6?}@VpDyKZR9rR8wNG^++Xdd{7xxR+w{e~#KM&Ck2$rxPaC?Q+wl3*wH{9E zOH*xg75-Lk5!ZJsSv*U!x9`_X!Sgr2d|!K}?`W#IoY=9rk~YC#t(#74v(h|zD1qmF z;>4-9wAXLi^>(92hC-g#N`EQsQxn}UZ`^)=%55+22VTw6Uss&v+OdRv!=zO%YYxhP z55CZ`ar%ci)`-nLyA7t)&7N?1DktBJgI*Du8EblW-n58d5?#~e%XUobsQ%aB4YpH# zh3!+4&*+?z%zSLT(N=q{t@Lg6C0m~-ROgA+g^K;#qf?VFR#z%k=PUN_&z5gYGkW+R zx0Y24ZWCYLtAFs@r7hn&Z^TVA{lDZ&jRh0mDfTYIn(A($`8O8DtUYD=Mnp$;%4U(b zTRr+uRfU?Z*fepi@YAYoj#KQe*3Z(iKRU~$GruTs+os+{ca|Kx9dh%W)sd>XIh!-` z6PI^y>Yl53%J^pFqCY0q(Nm&D@0o@E3f&ny_3on>OI25w%vGgTSN@fC)atv<{IW^m zQ1OPT47{Hdcv`@un`A$xaz_XG~ zQ<6DiJdSMT?@rY4k@@}ma7B#n1=jR~CV}r*`hS>DiQ6V@-srRV#;4BAZH+V3($cE3 zI~FfCSk1jVjsGBL#C+$kJDmeszgC8P=W{f@mc7ERoJ^=V)0yQR;+#N4dvY*y{t`}(Xr)7fq& zYr&<#iQ_^Z&&mZ| zQ~q$wImNhhZS=zxia*z`U02ZKVC(mx&w*Lgqku&!)mOf;G-9!n z&6Xrr=_V#7zo`1D;nHk^R{Q%+`DYUADd9c7Ey^tC4)K0jzp6w=;Po8SiZ`{2>ree*4tP^KU;D*k zw#?O@r>1&#+~Z^pnLVlH#$|zg#b+0oc~lawbGf%Nuiia*L%O`qv0L{XR~&z2qq_Z+ z;13?IGqrVHFV7n-oX@#Js=0ivSlwF>|fWf`y=;gK6{#cm(H#8*f29BZf3&dm3y=f-U+GGJQx!aH#cFxZ|)-@BGGGj=YjJeg{rxeORWr!_u^A>g=V*?izJyO}nL$ zw`og({gkTRB3W{~oE8;pz6@ma^ofeBoVL#UtXsc>)HY4d-%Elc`i?%Zn~@mn@NWGA z?j!r6Cl}1#)huLjw03vU^lvI}#AVq{3`6b|iP*%xvu=O5Zutuquin2WcAkxqdR}rh zHY}=uVea3=9f|T&1h4V-9gx(Rbo=9ljo;mF@vZT?Eq$dcvXwo-Zy{^^291OUoUz8ttrh<-gzDh zf7#`yFyVRG`aMQ%4;FmdqVYTE=z)WRJNlhZJ+}_fKl%9m&-m**;&*)LF?}cB=)CjV zjqLRw`EJb?K7IY=gZKue!i4z6%)zU^9}uwdIK5k5s;zzYR@0J~c0ZoXEwG*%EH2;X zzUI{8+iPw;%snj=R;$5zvgr6-C;OE4u)gij3YeVPR;Rnh?Oe>nuPk|jTlchn`IP7E zDaAA6l2_gnTr0Ewec~M*-kmGgo-TX&(^JBcGokdfs?@JVYfC=%%eNhO%l~7O{dkSI z`MO{MoQgs$TS|GzVMiD)Wmuby>~_SnaTWzgZ-CI z@ONJyJ8!vsneh>i$5o=<<%*=sD%iuC8I>3Y_u&A3u0V8M8ZF z7dqslx@?B{jcq#T?UwUA`J{7%<=)TR)1EFrZR>yX?!qVY=10Gi-#c%Twe#~^Jkk$4 zw=^76_IY8v?bX@vSGLZXxAuxub9~heezjZj@rwKm%P-$+W}lF8P1)2Hd*qLh)}6V@ zXaB9St(H8u?7vo+%#qnAi$jv${C%Tv>|%)Tp<>DDcQdlYZ(K=JP(R|mb5HyH|2I1I zeu?_T=H2~tsY$oOTy5giCv_(-^U1b~YquO(dV_gpE(oWx_;mO{jf~V z-iTMO^ZjkF2n28ZD5SV=i)!H;-s6g;-f>6t!sgg5`}Q|9s4nJ1>dSBYm5+ui>bJf> zb(?X2xZ8tj39$v*wXHEPwLg{J(6s%x`s_@*=UWAT>~pE>oe;lzoh8$H{-lEb@Cynj zzi(CCadlr{oxv-&i5J}pi(kD`D2?hh|Fq!k)TJD$^93H zYWG_5*vkm5i<{HVk#kcZN9a`1gjH`BRqemy)OOE-_WfJl$~%WI@bMRE|(}j-(ml@hs%#_ zQFHC@32L#N+#T$B;EbBk)U7YhFLB^M<=U!zzVdB=KnU~JNTsJ=;uX8*#vS!z-}IU9 z(tpd1#s3ZVSo7>xIH+j7UQpu9lb632SN>Z149PLw?$erd(V zi?epQ{^XkdsU-E$W09wmul9UBbwKc^m-J7q)|$kpwMjaBpZdRS5!?S&>)RYX%c!Gn z4{U|*v0a^(_CuO&Rehq{|NOWAJSG3`5B}R_9N)Eh^^NHw>Aj~O>iAa|KK{Kh%0}*4 z$ZdW0OTT^|k{0XIs&W>5yFYW{o>{SrJ@O8%eI}fl+gmZ;J4)SOwq@znl83?vMJr#- zV0-aTPC$Rc#~XKieSa#PEM6nH{`>P~QF5=Ne(wxxeljzFt#V39q2Glk7gt@L)6k+8 z)f0PsUAS?$R($yEvh5-Mg5l0g%N87*X3MnSJ@5a4{sZ!cRkbYtTy#B8IQ}nP$}zX` zx3bggJN0>+bPiqmu-}7szCtnUyYITb>d~3UV)uFR*Yxzto}F^tAwBMoK%RT^(+yoZ z4A*x~yu0MuPLE}w3;1vT$S$5$c(uc%Io!_S+N1B=YZrtoUz{a&I#H%yzDV_z;E(c> z-z7`mdpq3YVwX%Y-Pd$Z@Xd}F_s@w~t2(_~vGrZO&61Q&=k2Clp0ZST!3B~1t)4%g zFW9hp=1-^ZK|5zB{s?E9^Wv7Q@06%nEb0!TRt{R(E>Z^_|Ib_SVqJK4)VAJT)p0J&vvw@%OG5-U{E#?N^m{lmfJNB$a zc<%Wlsdf|Gcy2rFQ|P=D^Jm$E?X#FV{;NE6u3E5SRZNOq+{^#I9qgwfes8$pZ@4F3 z@BIDX{+rV$JaI3o+~=?B|MSY{kJWtp`9D<4?&kiudV&Sh`|=xhlKVG**llq2{JO*M z&HnH`GHf}dE;iaI_sN>r_B%E z^A(h8OXmDGYg1Z{QCU=F4@>nSYrb4(v;R{Q_!qcHPS$^tcue?>+0{V9Gh0}8yP0)G z?fERbB>k2_aYxVcId}WLLzZ)>M9xcEZFN*^ZOD_7>|sJ@T+?Gm>x zbITRsg6{Aq|JQ96s*UvA%<@L=^_pFoC1-4I-!$13l>062XWw#`SEp38H{1wp*6R1+ z`Y%|jI+HuUF0uA<@WhyzFJ?^iy1BsdWAh(@TXs|ZHE!DZKl#%28_bpyWcX7RY-dcKG|ls+qR0l9qSX$r&)SSxKJ*Cv#3vUDZEc&%a;CE^ySJ@ymm@o>qpM9fAFiBSa3LW#C=U z{*mn-&jZ~(x@@5w(~d+sc}y;S;FKB3qbaG)XyPb5JJfK^$qUUHu2DHgNd_q?%o)e6 zjm{`oC3g1ew$0hFT`$@Bn6Bh(p0B&oZrU97?OvFg6&f49*fRR^;$oXb>1UN~%hqHr z@iDdC+RmLL@od&K&)#e`=f$g+NM7{xeZC~1+VOP8H&?d$iiAE#DdS0V9Q_Kb-Fz>v zGPQZI>P42C=-jQon_RL=S!M)(l~MF-)n*JWWfI;lWRsokc5G7N?3@Tz>A#^lAsf9| zUQa$YW1`>cnJUg2HJhb8j_o$Ox7d5eolT*am#vtvd}7bEu-4C+&)b45)Xs38^wB%( zt817!gC!wDkL`S#rN7m(X(w-Sx!PubT9ft3^XewgWM@-PnGbyW@%@Gxei=T#v6n1c z_v_jOw5lEsY&xp(W!9?cfs3biOg(X$qf9hYZSt&ukgtVjPrcGw>Y?i?D_8raDE!Ki zsFE`$ZY*2)`c6;R-!;?Dz0_LDy|BYQ!2C+eowHJHY`gx{1nx6w_ZD_Lvc~Y`uUXHg zEnT*wqWu)N9@mmd7j|Ze6*!vCJfp65IABN9y?aGTbJO40T>F~!Y0JiQ-@o*y@I*)7 z(>e7epkhnMiK|OPS8=&-Z-5raNX$@khbTq2IKbG>`u%qssdnN_{e z>tJe3V1Z~Mo5l~8a?zTuYM$f#oO?d}nb~ySaM1(q8qcpk?c==;hX05XwWIB|$PQ*aDmgQvp7Y2{Yr9plC&VH|9$|D%_ zeWHub(d7ZJmgX1o*RHd^$ZdZ%q~*)}CjTpnXD4Y`%-Vg><>n;|huw8fL2nmoZ(%TDGAw5sGSd$dEYW zPzmFs#q%5faCNRRd8TO0>T#l(#pcAspEhl?Hni_-k^04$F1IjK@sjD5=4X=sEm!&q zS>4X~IdfBMSnig(H~d@p-Y+`azFX+_ukY{oYz+SxCE9NK#2}==Vz>UY7d8KWUGdiT z+`4;-71xq1t|eJEL33SJt)3(DHS>H#d$9b19h0}`{j%QHdpuU+ANZyr+c>qiysQii ziFnVD#geR8sV!;=!rX(+{uWKhWi{r*#FV<8^xT@4Gy&Ca@!EVY%*<%wt%;Rs(`8@Z_@AS{C4vT~zDmm#~(48v1WM$bbZX@N`bv(6P zF{+PQ_g-w*xnDZ*WV_;XZM~3(zxIkZPD}KfubV!tsPVAMo}+Olx|+e}w^q2HntI@A zm=bU0(Ib)hul~ET8^`UAH97a~*4-uB2OFo&NiC1N)J^>_ zuBr&z-1|A;FZg;0*?&*kKQW*m`-#426KECFY{-ZLFPe+v~7{K-+)METLqZ zrR@A`XWd)Mev;W`&jt>*JpwIF(--_eSMQ$Y{t&3jJdyN% z*8|S(zvm_dNTxjQxDe6QeD1;_DILfEn>PPGsq$#jJHeg?%gjSc#}C=fy0nGEE53!@ zLd8P-;fr(9DQg}?&T_l6`%&bX!!Lh6);QIzlHBs@{O|oCSEur3CC+ot@p+;D`(TsF z`!nh$cOS@SiQJ4)ymIHLjePE!F2&PJ8=i=?#EMVUO>(VRdwX`{JUe5R`#&BX4>-zp z>#n$lx$%m!rANG0x1_y(bV+!5%g5L*e$WcAnwSI&8Ab+%t9ZAZ%V1d~9GqN~SpdDE zvNwXWM&zpG|F~~6Zk}aGJjv!HG*d(Iq?%%bkSU7^r^af_9H9dqnto;NDJlIsb~7&C zdadjG-NRBgPA@mEy%iR9Ga$G>Zrj%BTc@wh&CPvVd-L~^fBR?NJUb~T;8XSe>d$-M z|J(O{?{=H&KOfaQS43{9()1FR>$>3B`EK%yI(^HRjQW-@9Nql9N<0>Q_bj>L9XD&j z%fB}D4$JsI{ZZ7fe8JdxDK099^QS>`e+8plk|e)zMaw~V$(o*n$5X39mMI(6IxX`z zdYa7BSG97Uk&*AolAitcs+S-8*q*Jj)4eP#WP4J@|Kt~w#dgY<(|`UhUi0g-Q0+nQ z>=%+V_nkNsKk3EkxT0H%sS!5uf=_>+*e-U%RK5UADJa@_)+9_?)l% zQ-AgQ{Ga-=-bnU&@AU_38@^|^JP4hrA~UIgE9&Cix{vSvC4Aqu?px!%eRt>Xy?ghq z?de;&-ubKc+%R|%>y}fZqq<^O_G+QlItP_gdqRINP+Cm780qP%a=QTk<-+zR;hkztVo=u zr#$o2Tb+~lPbP{--_Tt+@rTSq!C3D(8xpzSGu*M3GEXv2TJSq2KPMT7|8S>5B58DRnh`8!3s21Hg!Cw61DwhS?6}OUC$;tZmuC_1_ z(<;1i=FP)DE1V}*WUS9p@tqo_B6NR!yJ(fVbxp&%;1+)!!I0aF)q|@dw%!O;aWG|F zq4BuJZO0Aa@W*KzR|#I(n01v)Wnc3;XRq6#yR%m)>K^NH{l1kSLxW9*)$2s%5}fW$ZqP&`Xzc%W0uOsD8aKyygf5yAI>y8 z@#)&4b4`NU1)Qrn^yCk_W-d7vn6&djZ0PDmTXLELwyB=G%-_HvE#n!s!B24c=b!85 zsAlhvOy8#AI_IEC_hyqyxt~EFcW}-6ShFOnTv&E`@jXGWr>1fB*H%lWX!o(|M6K@- zD_o{@?$PE7v*}@xiS~Xge%)Jm`oc7pxn|!((xz96ZaK1V>qW=4eA)MI=H-@zJU?J6 zw(H9C1#9kgc02eT)#dpVXFi=zgxhUPO8K1pm@Pk-RBFdCz2Ow+=$jyRZ~0NDU8RCE zw=h3mysLEKmwxy5M}m{L3NLx)dsLsNru>1-L+gzF^M5=Pu<6`+ZWrITZHv}@R&n8; zv_U~XK2BHWp3p_hgPY}S!=9{l=l_ytzfrPxajyHr#%UfIj~D*XIAs>lU>(7bdP-~c zYmGJ8iZ=TK(wpIrfe~8c6V%C@F7^wWYN>S{FZA+ zTXq~xwV61ns-SQG%_GeV;qHhg$pntJ#3zDD2p3C(%7Gq1D>)>}qz zZhCcZf|9X}++D3z->%FlxOK8EMLGQDIh85Frgd9gJ}MvZeJZlpf>Y{fxL|DGdzX9V zLd@$$iuazM_mRsueb3?_=`0x^w;lR^^+%Vp(*GSdBxfiIW>|Q+Hf9#__)RX}kk}Oy z{KU>HXjWL6|77-v_YXuwe^24j%{cHum*vETMVeZbTshqvUs`*4r%hWr;gvm8tK6z3 zqAJc8Z~LfsHSA;)IInSf!lKI`qs4!_ZtXKW?si7wh3QTe*lr^nQGykd?l)=o%0%5rkwDU+Qwp*cS^BM*mLnB9EC zFZf?Ll;_8DiMFnZ2X}BMGp$>(_FYkV+bZuT&LM$?6PBFf3}V_Btf=OzZ+Uyp>`Pyo zTp#K>d~7LJ4o>mmdMQvjNB5k`(zE^^H5cC7aG379?DJ^%g8bCg*1qP?{;X)cIBnx< zqmb;G^Pd+;f0-I0mr`50tRv52Z_2D!?A|uPA`Tk2FO`__MCCu~(!F!clP4xR z=K~h6*A!Qk{<%R?IqUF)MJtbG9LzWp(YcXv@ya`I&s=zA^7GVPz2b+O<%bVn71-Dk zn|o|g$*gNUzm{r7b-(}eG0Qq=UPHd@l$p;omsNf?k~QSD+&JUIovo{@ly{zCS;yP( z=ZoI)W2f5G`7bYOJ5_pq!gGg-9{ay#Jryo-^KV{!GO+RtSI6eet|&QM$2X<|F-QE1 zqTkf6=utXT-leClkRIh)d|;iV{;`=7&lBeKU+gx_kuy4^sB%L2R^vwLowlpBeWMNM z_x_AIvv$V$LwguMOP$G`@!BB&$eN^kEtQhbiVdbG*oklM*|~T1!U-3zKkr%RsB_~* z(eEQHb7X|R-MIQ7!o2^y`5wly?|}9c*>)~} z;-4VT<0@;9Z>gLVmb|NCQkLOYf2B<~FWu+Ttm|BDXK`6ND&=y|Rh_R*V*U4-odcGL zC!N3aVAqxRjfax2Tvb}Wa>rHa4_^~5>)$_LvUeHJdfmf^pT%4VdZRy2l~wv*Qgqk! zr4Lx*j|A;Gci88LT5wO&C9%yD?3RVhC~`b-{rr@!mH7;()%F+9vSK@Zx9+6=Z_)kb zUE99O7j%93*lv+IDfB5{RbSk)@DoSR?V^F2`;?>}oA!|70_Id@8W^j^+fHn(|$9AjdPj_ zW8cj=KK*vweeq1W_`LHQrPQWnOh5Z7WAl2wJF21Ij$Q~$yn1F`%;h+t9GW0Cj8iBsM=B)4su^NA^{ zeN)t4-ep#GGCwjUALMNPF*AR)Y(vny=h501w(i~>UUrj(byJpFrfcZY#Hf1_r3Vys zQdZnIGx~e$v&_>~&1>vY|8wALh8t@x8kz_BYc$+hj4ro%vyQ62 zi2ai1@GP25?^*BDrUXXz0bP0{oTfuS~*&NAuCKsF5Ce zCNb{VaxJ^VO|VXYIE(w>o;@m_*d^+|}=-rdj8Q zNZB}TG-9iK6jxVbR_}knndef-z5s!umN(2-mCv^;sIrAhwD?R>w6isq7Bc*lXz|ps z?Z}l)8?$&qcvjm46v$rI;{Um;dx`d~tFs=?D7`&vW#RFH+;&B?oTz2ihYHM0OD}7z z;|bWaE;(H5j--Z&?B-|ZZfV~!+W+WWzUd@)vfvX!?4^$C)w4R)%(iiIX$b`xVN=wTe!14t;})AB`&v-)1GUScYy9kabh>$+z&kDpVp(DXu2H{Zj;0ouFD zrzhEc*bvMkS<0&?BgxCVy29%zxADBZ5b>SGhs##E75}U%tL8nbw)#s?Xyvl!C5N?M z9#*cpxZ#WII`db1mh3JIU|x59@1mgN=li9nrS7)oGBVelK7Hq6d(*qBcR76c-@N~E zyU%D#tL7OUz2HO%CC$Psd=a~f;eYUsR&Cq2<9V)w!YS$u|CXU&y%dZpIT@>VYuVqrNyHU|{kqL&Hi&>UTnlk_K z?j@gO?q51|*gjb1e#iTT;{1E;;ucO^Zs^{8IYVXf$s61!w#*ednfs{kfPL$aSqJP} zDgqw7cV5H&C%NM`%RP>d%}e(5tz5FHk5llH{vtcc_clKZW%-k=s}}|@+IOKVEzSYHgF4I5o z7}sahr5`r1Ffg3rAg>5S8{+B>^aXFicHX!)LbUqm;b{=Qr zS~)20ifjGwjB9&i4O7 z9*%{MOP_e#-~9ah;DLT#i5tpKZXMe7`l#cS2sW)7>KT1kIa};`SGV*W*5@{joUb0D zzxUqS+gz?f?TaVM@4mb8$D@tU-8}`koF2a3pT8#QbXfsLntEe{W;<|ll+NTmicRD3+L`euJ?#nJBYzcV_8&+IvN`L)g7ga7io zD!LEe-gC=3ZqI2(XQg|O8@@}{C_Hi&RCk>t^l@TGziW-sqhP`Loj>L%x4YITKJpff z@3hc;)YGxvwMO|-wEnrOLcazP|1B-Ir4My(%Xn?Z=;Y$y>EXZB*E03pl&y?QCzQDg z7@YjntvYL)oAgXA0fVE9lx`n7`|-p#j~!EAIx$Yp-DP=CuFLHBqcc?e@> z>DZp%Z_<`2s^oNW*|c5P3aV|a&Mh<)>gN9Nl;d_~cJ_{S3st>3EmJ2ptemsZFy{Iz zqoX&%a@e=GMIS1iwmH1P!zJ2w?U@LX2dXlBSKTFl&BEVX8>aH>*Y`nA1%lGpx~mv#nk zEqcCSj+anu#7VoP?UT-$Z7s^&$FyWk`(3Wqi@LLXQkwUgn!Qz4dS>FOcjcK%lG08; zOND27+gi@9yXIB(q-1iQ#n0Ke~%p(`#%ybny)_Sxfy6ZWHRAw&apU|%xyIRV={pF3?_VnZT+1n!I4Sutqc^WHn=4jmH0@?kS*LuCG{n9k$=`y=# zOIBu1UbnRO1(ViExw)~Xu4dD$7c^_VczgY&V1V?t)SgAgx@J@AT-A~%hHhwKDZ6;s z(&sTpZ>q_QFfQ(loMn#N<5!3p)IU0TWX->#p@Hett$_iS7_hzBJ=%|gKnptIyU3v@$Cjzl#6o$Q&kSt?VDmWr8eN{)b0D#ziArz zzCK$K)NJ%$Jx4lx&RY-t(h2fjTe?5HeA?&Zf2&J>iMdijXSLz(gTCJR%Ppcc^0y`R z-i!2l-nZ6|YpwE~3F>eEM{#h!VBR|MUsn2s>p8+%iV4Q`ksDe+*y`2jKeQ6R=VkHa z&~1)(^&|Q71?um&{P@NBQBZu}{DNj~bD_MVhiQib#q$*ZG;nVh>f2c`hwbm`2rJtF zZ#5ZD{acf&WjymQP5Le4(|>-_CS_}#NT;1I&v$KbdLd!+z<*kxDc8bRLR>;u7i*k3 z5L_xZPf%o|LgX6{{nH1I9XKY~F>RN{28-42INzLHRn1&2TgtM}%DsU*D~w6aI7u&vk!b^0N8P>9x_@|0(Wl zeBwLFc=aC1DPcF`4nCHgvN5iVG1yo`{#f8~qh5i`%b8R96OM)cvIvh?kLPC(?@tJ0 z+uSa=TB~f*)O3S%2}O0Q0;T4iOV07?*tAx@oAUVY=~Z1aHs6_^-Sm$7?eNz;>hJmU z-}qw=_ul>$zHxrqyZuvCsy`Y|na}#4<%`qlWIfx*Gk$-Xm7ac9^F`&E;?2+g?YWp5 z`T20A_v#bV(w>-}KRN5Nf$V1|t1vVF;%(DhqYrvk*dG2Mk`^v~Le%)G=kq%&S+}_} z)(6S<+XtrPYs5Zk?F`g874h80w&J+z8J`L_$L}Scvya|6=`(Tm%9Ld{&g!Hdd!4pw z2Ir4EAzNL4-o0Y9%*A~3og%5}fAqSgrtdwrXj9|!Ip6r6+>%~2{lMGIhS`m-;k2TLt$YYS@q?hD*82xEn`FSKrV&#Yx* zV7SkNuYIA;z`y{Sc|x3AI01IB&r3a1ZTB;aMH@u=Uo2st#bWCo#$D{-mRIKWu`MZ&TU2C7Z(Am z|C7VdUtVdznU$fMvDkUVocSs@jyI;ax4h$(x8FE1?Ai+(@wU`E9{(nEzrMavW6hPW z3xD4JYG+&d-{Og@;*}PI2;=PaEn%N|I5%F^cFI`#)GGX9+;szI@rk#mnis`2$KPMJ zdnv~p=Hq|MFZ>mnx|y}f?dr(`N13F(TRzV(hn(nnk9&>I575;djQ9dm1y5kQfzMrm zteQy;xaoH&KxEG8umepUn=}=6u&(m7cSvSpUBc9;~97j50OXq)!hxAXg=lR3;^D^E9GR8W5**t%SA z^Ld3eJ8wSp?p3@O^}%#{Y2KM9`%=&K-ZX7~KhrJyzHBVfuu>@1UcJWDFt-NQ) z?(9lEG3DQL(a_M-&RtroSE@Y{c&_xVP(i7ALkG(wr69f~6H`u@|9s-Pj9IsM>FZgV z{5vh5C&y;zxF7xZtNb{3uG6&bA##g6){8C4cDiELVjxlGQTd>!b4SUPFYCOId%WLS zGDquHU)HlX+a6w-b~$?4QS&n|W+)%hS*d-Bt%LiL^^B6t!^)|-6-(#v&Y$w(<_B-i z{k;dI&F+KeGo#!xI6(I+aNupr!RIr<2TvC3JLjY(7J=D%$vKI|#nxZ*uiLS)vDLB> zab#od|0Qd#JQ2zU-4-VH9C2i$A^5VG>zl6ZnUqxfe9o04N(Ry^B-d=+qGHUh#C`Gn zf)fW=ws5mZGzw&}Oh{q=)Y9>MF8OMbO6Ffc4cIj|A^ z@&S1A1N#BlKR%!vn(|;xQ-r_D%Gkon*v#D6_C1+%<;bE1R}Nje@@Nw1OwCMQd1QyD zPcWI0yH@hp35E99bLzq?EcLf`U|w{?lEJRbEX>Sdu*ty4z<5K$46x(3{8;6j&A`CW ziQ;(l$$a$4a4jmzM~;l#{Z3<+nWl=V~)c?}`t9K4ZSqhWnE(w`aF`v4=Cu z{l2IB@Q~waS3y;$@6PA;xlULek$z~yF<~pV-xn`_nlkU%=f89PD}`-7PBY8*-SAI( z^X41Y8lNK{t~y@Yxb+$THiiGG%-OsW3%YLo44geRqWhoznyH- z=$1RgB`$DULVqP%*_3$;?EC(wfp(zx$TB9sA54wgRHvoL~jIHxZQJtbd5fR^->}(%mhYb3(TX=-kQrKrD!e1U!82YgUji^8&8eX z!mHxO58ISp?Uc3TTNF2S!l(2)mG|@A=WHmHb7|b85OK{b>-WO<<*8f$?Z5S{qAvNz zimLB5mA}g$tV>-lomucMX+he}QsGLOnK#_7x$v`){fKj43$J4=LJi) zaMvmJKF?>()_g;=@Pan|*PXS~mV7%IBga}-E)i-m zFJ*SIpS{Dmn=+isjoQDlmHxP|p=bO#$5XT5-o%R7OVu~xowM}~d*eZ=saEAWj~gQc zgAm>_5Wa>6ONJ}sMJ`{;C)RUEk&_s zEZA2c6qZ%Qc|p#NO^r<;Atf;-AuWN?5PSmvv+7H&pi-k3Z-O#~C8&_1#Jpng!qj4Y zP2c5;!?(aK3d*)-eLGcd99X=PjqaJzg^tVa5_*)6j&PU$qM z*AJ!?)YNJo-YJn5^wMRP$z>(+us=NkyQ_oJq-I(?Ir2H;=(8q)l51&Y?kz?3b6r}3 zwgv1d-=!?hXCrR5%IsUro5RW-rc;|5ucS>#>o=Osvvi)Y)PIrhUMn?Ts|UUI5T0ec zbBfZ$SB`gj(gQO%{(0?+)lfao8ULohH{0oN-Bm7kn=@P$JTi6vIF3nuN-eZlVO;+6 zN?M%8-tvI=PeiX3KUB&&^!w`;iO!9;svEzyU7DY~e8rK)kL|M=!7GF>$X+-l!N|aH z9&cj@e(D?|s4;`SG$+S7Ker$=ClNGQk2t-oH8|H_*ioQvns!XJ?Mkr~KbWROeT~|( zcF~U@7hmN|OWc&E^4CSLoBi#<9<%Myt?^INh1Oi-2c5TC_$}jzOS1mVxpPk%8=pUO z=iiT?Z><}Q=0$rv3}U*xW6lB5nBHW?PFJ1Cl$5U;Fuf=X9^`JGm*d75SH(4>g~X`qpCeYM#!yiycZ^KE-gwd}s2{HFz?2 z#N>Y33P0DR;<~YVzK|c{fABGo6CNFy|=GG)cMz$ugm0FYR)eY)ahO5 zkev11R_eo!pZjW}mp^@SY;nc`UH@-2bzi(ZPTqD=dTerT$J-SbxNlu8uZn*e;BnOX ztNV5yvGUliGvQiWbevgqZ><(SD4e^nY}ellOXpZFFYt;y{%tD9cFler^P>xIeW@w* zGS^f7Qr6ojxbf(J_6rj#S8si~)!L5Jx8%}F_fp+ezjx1!)cO-{e&Uk0XX7`gN!R{M zzm$BD-;^R&oRa=xnqqYInn&Ur9-T_}k#W~(>z*N>Xl0<}v$>+FQ&{5V48tQ!7<2gy zmR=2?F@M9g3*pHPM>s56juuq;A8XstJ27z$Pl2A;Q;TI%nmPjaD?&>yw}yTzh#TEHFYr`KjP zsyA8%yx{Jb-r>DeL?!6cf!o(2gSMvySDJU!37(&NYN^c!#u|~NZM?lK6LYfljjcAP zmz{e9K2?unUev#rH))UdO^vp0m0OXF=TeG)U&;www8;OMPr&ReDOcmx z@Cy}I^v#~V;Op)vaqla4WL%nL{w^^u-JgC`eLnl|ryPdi5INc^|G>S|+*NbOO6KqL zs`;Pqn{j^qcYX%DvK)~BO{IQUX}xJd+jA0+9-7r!>U8jn@>|xHzo&}@`TmwEP3dcu zRK4ZjnOWzgu}yBuOK;)Umt(6Xu7Qbae$ z;>M9_&AApWhb7%J*#1C%^aj%n0B)QivRSRKz6!&9efbIWP))N*g z?g)NWwPwnTV|#AD>p930-Lmk?Eo-i(|FU()Yc2Vh-h8wdaoBL<&X*E5>6fQBOnp#b zcRq0H=P4Vd*DpABklV;#SoD6^r~b6|i4u2@85`xFu-jB6^t5j4>P+@yHs@C{-3P@; z+T!bX3>X<0MDR9T-~;g?IBR}LFK(^`cSUsS*EvtNnV)`l%QSj>>oy%}=_N0-rEe#s zN|(f1zxuW4W!Nswg6Vg*C1wUqF41RXZC|uvg~B117T&ds9$he9D#E74$0#ZwI)9Ih zKC6iQ9+793|LgPPcuQ`)KmAkw`=95v=j#92{Wv$bopHgrWfl(^&LtUCOEm_~J6m{2 z*W!BP=Q#l_d7}OWP0Y`YG#;OSYP0&m%}%Xz&x7USbP_g9n6B=7+;zu{gC{S46#4S0 z-HXlc-s+%@w>b0GBwmRUeLW{YPux2s=2gqjqK!UBgXeAt(3`e;$05${LREdgxOOIiS-WyumoDF*24-`sMA2=l zZaix-y>V*6-9}lyH&2|OuekBF#cj^%=YM#1N#-QInjLvr?wHl|>3ey$8QeJapjoT# z1gEUUbn)kwA8O?E9~|D*bvuN|BGGvB?G{Hiw#VN-u9=_C%;R+CfsxnbwsJ$DYD?q5+cQMm0x(zTaD_kLz?dAZ*VHT@|)$o-Cjq}ul~WR9&>Kh z+oSqM->&u)^XmVW{h=ziKJ{CC*hee&xc3KYb3U)P_{jE0EBW4uRW)Zj%^#lS`S$r9 zBm2EW6F-)U?tj=)YjNm-*S}A`Z1;;EtmXS-=D$AagRJQO)sJ$u>imy3Yu)P$xFU76 z`QM8IorIFtAK!9Bd8;HHkvd#ulXpb0YxdWQMV3;xR~~N?T6jXf>q|Rt{UM1-(wk?s zAAWf3#e)EiHR?_mJMNU4n*Z2+KL6c|SD7!O>i_*(cC9UrCC72bMTy=c!c{68Bl-EI z%NTBJbF^9~FKiKX*2vu(aDU`yu|mRk9?Qw@8n+#?6$mx(#)d9<)a{)%k6v~JfAKc%4SXJ>yYO|wbecr7Dgx1fr1 zPU6%eo}DRLY2BNA{gIVurQxn+GVeb z$Vo$nR@JvlLlx6jJ5LNq(miDJ{>g`okNGR_^eixOYZh@hw=9-1x#MKOp*at2=S|4` z=&yE4B=)bHlhmTj@IxI(S~E89o%&O$MDO7`_3joWr`8^3t=fr_29wif_eR9bn0P+$ zgon1|+Jzk#1vt&z+Lbw5EGxIHx#Q(FcV45P*xB}D(-M*c zkZ|Pj6r;%BM{6f1HLf|fZmW;k_1F0~CtYXvv-J>@k-4HQV$>C`5iergcBtxr$6Nn? zewXrPM?&}L_L%O~H@-FJWt77&-j*h}^eLz0EBnqQdOR|E@~Bf|p~x{FEyF#s*ULB5 z{xarSRH41|fMxUHX6L(snHjnQW?v$tSFZnld6R|M-J3$3QoDC8j$JZAF-HB5?xyYP zQn&q>*767X&dzj|znZd4wad`(>=Dh6X^S~nJ6rE_NHb2{-F3?#`g0`&E#$Sj04jR;$oW}Jm+f~ByH62475yrwe-A2 zsUUavG@VGN(7IF2kItCL-3 ze9*U8b+O171gyvm(psQxbSiaI?*+W^2br0uSEPNCzb+5PG^oMNlPut78+dZ%D+rPW# zh?{S-{GomUzrXf*`n+{K-xaUyJ^$LPdH#Wkj|I$rH(h#A_e0b5?~>E=wknw4;cYi{ z*^>FgImG0Tpd?@YnFn@k_K5{82mkWaoqE8?#=q$L4k^OR3H`fI%FbP<-j8|+>A=;h*=#|(;gQE7*=eiZ*4&+8;#X#i6jwt}?ZwwQ$|S2MSnGu^ zlPa1#_d_(VrQFBwKiGNypP2K%#XsYRirvzOmw)g)KQ`agrt5r`0av?8MIY-wX=387%0(|Kl8#Ke^ZsSGE4%HopMD9EHj-yM-0#@9UEs+2VDS7U z_n9Y|-`<|D_{sibv81oj_ox-0zH_@ikeAxmpr7?YeA-)Aw)LOn^e1kXjZZo~b;j2F zlRMmO6K${g*Hv=HUHg#wsB!&+`zC*^=hwE_e$kTu&HgXA`TB!WUe~V`%`4BGx?J@< zA|h{7>;JU}-+rj&z4vT#G1J9|1pzER4LXwymS~#P^#0u6mtSz+cY60GU6GZG7f!1( zi6&HA4to)c^7VX#iN-p8?WyRUC z&E*l@=@Q9t)mM~%J8QbsoZx8rHL z&mX<)wKB!!#xl{${4HO~--nc^N`>-%G`)B6yWU<&$-M#cQbM{erFJcz(ME?~OeFigno(x$|_YSLl5-odFogC0Gx#gN$)V5hG zqbKX^l(|w<)-H4>bncVfllSMO$j)$N-?VFKg2uV6m*-#nyz|W7HRdNuxC6h`7@rB9 ze)HGajeSqHtzVhE$aGGoOU1=m7kzi@vTS^}>6gjP-^X-UpB8Uvc2d75?8URkyCE<> zSVOOKN5-9>v9tf`EzEZP@>e}tm&3pDtCg0op-u6!I zc~9A2`qgPHS(CiH!rj8Qzo_!aIrY+w6`^xvU&(V^?pH0JWhb`K{Cvz4PUER(w0UiN zkBH<4e&otMxqiEAn2J+lg;CIgf`c0?y2X16)=r-9KPhzD{Ima64ZEz4n8(bxKkKi| zO!eoV^W$1M_a;W$NG)@^xUx8?V%aL$C(%|{Qul5D)V`!bP|s=}m*(jtXN9jpaq9Db zzy8`X@Av$sH4nW0hv(!iV~9O0m>6l)y@`SEfNnzj`orc4EM5;;e(2p{GV@3OVZ0&t`Zj+i}j)wuqiD9)ikSeC+EU#^Ut@4b$WQ&$^szTz!- z#9~o(JRvGnXwIIeUsMyVcs(yf)rKY;98TXa-Q~9MMtI!BmYI86OX4&`*RfAkQ{B$| z|F2hpYlN!Bzgtg!sC?93^3m|wi`7!B;ZyTv(rzxul1Wp(uxHA%Wh_T3_zd?kKlA$b z*x)?dKF)&gmtG3HE$n&r)MmXzt8k{>{O9umBOE@r+Sq4`h+V8H%HKH5*4yZEexqhnaJim6ryU@H;nQ0pz zZ@v;HQfGO|>EZN7iTdNp7C%`%By#$aq<)@%XZ3Z#42?T4W^J>Yn{)Ku%425t6(jat zbC-)exVh_r*QRg12D=~VrLW(+XmR+%Sk)UB!)gmA34F0x6nRUUYk!FEH`6Eet;bmR zZQ8x8_mJ1`TV0#}rp$HTuxU}v=Q!&=nd+B-ZRpXS((!NMdd7YQIA>e?M5#le}&-hwq$RkH^p5X7t{U z3f@qhao#OCcwNHlKIaXkmQ7EMf_^ZjNWJH}G=FcopkTI&(`)yIoxNAjBv{_OP|C9H zV-559;}3I|%vs*ud85YRUCxr$8C#+zXJubX^S!m!bFOJ*lCK7b?tYu>mHq6Rdu2@G zj2UHBLej0TX-C8>9DO;Fy;iJsm1j-%8qc>X`<|zKc-p!8v>jia^@&*yEAQlPS`)68 zARJjtBI5J%d|fQ?|l_^XVq6n5#H@qe9t=%DXeBQ+-f`{a(2t-$pwyXvc|~?A|+8d zi{l&W98WHq!~W~#Li3$B>*>HBr@9tYRjg`$y)%e>~OT>ZsVeo%15gezO7 zY__;^ht+6SPC$$F#<@zJ$8`-ROkQ)o^Tny2?azZhmT}E}R-r8{skw7XO8YbpcBRiw zW|FrSrf-b6xcJ5y;eN?|n^l)4E&R|L^zh`*ui>v{&KZ4vJ;PtJ^=-<&4JsSn-A&3a z@>r^rxot*C|6v8mIa|6etePoXUtz!I%f}Y;X{w61qDonwU0RgM)Ml|}*6|02r|j4$ z7q727g4$J6T9~YMAv}PE#eFD`mT$M;~pm z_4N6@RR3m${vq#_c{%d?SoFKEYJV`ld}a2Ep3NttB6RfDwdc1<`kdK1+w&ve>Wwwr zuQ%?=G0t^aH@#8i$k(YSfB9){NSCoQdbvvR$M+E5crVrl?$1eT(P4Q)#mhUU{ycSB zWns6DyY?S`;m<$Ztj>iWnt5|#sN2fxYU|r8uZr3gIyJv>eda;ukg8$OB zYOK$E$gSCKvGd1X=C(y|g`(z8YUz&(eIKv+h<~=D<-v?HV-52+%MT<2!rx(Ta9k>&A@2Nsi%14p;8av*|1h5t;-_c?6 zdRWgp>y+um6VsxnUQ$-B+q^ikX1C7k+o>~(j%9z?<+-VS&CzeSG<1J`)O_E%&C@PY zY4hVrM(=*T@Y+0M&&2DGGu4h4zg$|h@oq|zV7;;Ho+~D&OjdV9JAMpXb!e{l!ZTj$ zmd{Sqzw17Iv+`HNA4eo=ibU2eX!{VnrO;K#&X$Qg+PJz;J2m#Yu{2}aHU_cO={djt zvj5BO3Q6iZGX3qT=4BT7%T?l1!y2W2XPtX~`CIULuQ#rGQ`c%NcDOOQ<@^*)@tD0; zPi_P+OPTiQ{gM+q&hD~R{@k|dLf=L4&TS1BcJNFoVwfKIrHKEg%k;PD?_1B$+^hEg zzpbdirYw_PT+wT9-`;dA^wYa1VRyb(o>r+@S-kt&ZLfsa92&V{!sQb@ZY8R|v{smL zBhYZ>msviubn5r0vzG-&n=U;ienRK!A#bnQC*&?}@$Qev5#Zi%A!YONnyW4^-iTlS zacXiwX|tE{kUy_4$ujBlJTnOsC= zm&tt2NNF$DPPngr&&}*|poQ+$^}EhqQq^nGip*NKQ+@dXmGV;soh4(AJaCgQ{ohR5*|8{S{m2-Wo6y2|C+r3-0?@ZN`>cXAt zlmjOJ{9?t@ol*Oj<;~-eC=<5$hXOkiS?(=pj^Fy?cgK(3eNtJQ{?+?^>5*ytyD7i) z>ryMDa>rFgeF2V&%kJ3U(f?&O{dM-W=>qEOw^mQy`r7=dp7-fmvB?J8#g}Z?&itLG z#nt2}^ey=AIR~4IPEQ2(^vw%C-!bX!ftM>L=5O+5wCyR*%bufnjZf!Lk};c+cKcuJ zLyN^O`7D~*opLmgYb8spTJrSB8{9`X+t{bK}ol1fBzfj2h)myzlqOLFCwe=SIDV*n-m7*#B#^ zr4G!nYmlDIbX0ZalnYJM&+3@4sH#r9xcrlo@L9F$hsw{e=iJo9H?{y9tI z;(z~se`Y#xBv4MW=CopOt!d5m!Uc<6B0fdEEk4d?bN`*d3b%-L{)=adOnlRQGIvFx ziD1vNr#~Gpzm1E!+jc3aWy|y3vRkil++0_CGwZnDtbmMfGU_XKi_e{w{8M-P+Alnc z&m(KCGj7aV-?C=ayKlQntqWqb`>t9}mN@az z7(H&;7XDW=lh3JFbl&v%VD#Cm$=*m@C?+M&_k;Sgtt{(5pD*veUSoUJ@0;1iqmRRv z3!6+S>Z|G z2~X!9ulZ*lO}et@ijo^!gSC_JpnyS->oT<<`*_yN^lb3=9m*@J@N^5#cS= zt4C`wPCvK>J^dhnh54Q)tNwH|-PMW0mo)ZGGuPArog=X$`)HT$yG_Qw|KHcK-u+%) zKcAsS=H`ZtnMtSH+H$$qok|te5?iHp-RI4W8>$lOF(3X+3HZA1-3{f>$!f>`mCh?P zu=G%(mZr*B*HMnm*UI$1QN#3%P?_uEx)lvaD{n$F{OLzV@taaBeC; z$@cx9@3A8)X_b?FYf{gAJ$hNet9TxVQ)S(G{qXN0i`l#{d+>1XP1TRwkS5F4vP=A* z^IDskmMvY|Bg7Z9hW@;nm7(xe+Gw5kQ?Iorb4qpvU-%r}`bhfzABkOa99DnkdRxYI zS64J5Q^X)9IB!>x=!Uw!N5Y`Q^gV1tixeXR!(F_yof?Eg9e!p<>!j%7AVY!U-!pXg z26~I?csfm3YxCoFCSLfqL)0%gcHzfKXBBU)oAsjcvdQJgNvF-TOy)&giJ!4e z?e)X*+s~Np&#lea`EuPumfok6BG;ubr3%a1ZJbzq)113W>7{G@)O|(C{yU=gIURqf z_4(REjcUK*XXc+~E;_qB?(5Yf=avR++IL`GanXOVbOgo-0w0+ij*$K`Z{#Vy@AKKfS5Z7O)optvAo`mnUcLk@-zf;A;d57VD_L`l$ z+e{gbM;|HGV9h&__CPF${hfnl!SssRpQ?{=yy!!a@Vw*0V9*6fS8OWT!cYWK|5YNfcD?@i@omhK% z^LLh-%*_k9Tc*i9``VQ|<5JLvr45Tjx0%jdE*xLeT*$obr^9q6=Z`lZyOi{=nQH!Z zRfD-H)99H(5U|+hXb*HD$r!{26+`Wn;Bpgo+B!c=A$Pw7kIYs8(9YnuqHg{!E)z zKOt&$)+MdXZIN4p_7rY;C*t#?QZLaxkb51xqUvb^_uA^bA#97^T>2++)pWA)WR?2K; zys_coF442IbXJ@&u4cTl=45jJ$)G*K)sMy3J@W`JEm?b~)aZuY$u%Xml^5QMzum6& zvO~@3%{BkkHcQVIMNT&pwevW-@va&Fjc<#&o+?Lh|6$3z)cpI4-Q$dayzDD+h0Y3h zx)nZNNc4@@+*Dyyd-VC{IX^u1Z+=*@E8i#L|ITGo*PNMVvbrj2vqt3pu$3>?tlU|r zWV`KZmUtj*&gQwR_aD8r`191WzpvO`vRwA!zBKFqkY8#O)E*v;-ZHDD-$r4QMZ*bI z=?^9ke1E+9@b~3{WRn^ZL)T`JCvInV25xkbWq$p5f1=4pk-GDGe)0|{U75DX<|uqQ zFW5f+L-3c00&6^G&3tP1*6?)b#HSzBd-ggUzMNwgKXI;FwMSWx-~At7C9k}ZYdc}@ z81}T|`1t~(*?$i2bV-mh*89kEk!#a(NfEm{t``z-e1Et5f<;>F3ya9Mc}Xwc^IiD= zgJXunC04%OC)r-+E}vA|a(ja1oc9HleLD`VFI)KI+k@8yu|MP=Bl@7OV-KHJi*~x zy65JB41Z}+cb@lwskhe1Jz{-y@8}D@b6YbO=gmA;)NOrs`nlTbv*M?#&py9c+a1QBHH-~+lHWt4K?CACQ%x>E97-fK5K4k@f15U{gj2> z_oM2|`L|t@jH_8urk1*9@q4?U?|&%Go7`fMHD{&usCj6OJX$_Idb#!K5;uAYeh!6qWS~- zW^;w@&3L{fTc)^sYH8bTnd0_jA-@L#eijZ2#w&QNoaGOT99CpZZM%FB&S!3QJlNK> zTPQ~Qv-#uILPtJr+nMk7IZaVGcB}VJr?i-+{B02$x6=;BnSZXH#&SOIWAN&bzUA&J z7Vq>tKg^SAb64GwywmC2yeSWO_}6$(NblCHI-V~6d`(K;@iY1&-qu2Tt^Z>)7es!X zwl?OVPVKg^7_A#Zf6m4wvwddw%)Wk3Fpx9rn$?Qq)ftsb_vLwC7>8;qkeGa-jZ8do*evppBz@{ ztmeBd^-ghpV$0Fvd3-|VHfIQDA1&z<^O|Ht98{;@Zo|Lj_x+4d<+@$k!xwiUaNMH-Y|I`!e% z)!5A;+gA0Ks&7uqoF!(YI&bQQtn1b_r!M5adl%I@rRCuCS-Woi6jHpZH*eVs4)ghb zv(=X@TQq;&ONIM7EFakPF2C)Y^sHfiNtXIr=9*6`p`R|Q2<~&8kL`&>YaNpgTHRVl66(t zuUb1YRvya^wT|pLVYnq?!?S7AmHk(KVhcKPA-rqng%V-rXPbO3xfY$0e4JF2JPtP>D^yA z-)C!0Nb;V*$BeQH*MA(6oUEP|s#Yy`sPD_1YZ6sGdP2$m3)mxlTQ|)Pc`vp0>~W3> z9`=sbyU$E{cXv%CyT{yhmEy1Ny)=F=>G|B#u=$e<$*;X<+*L^U)0)H3;S8ln-Kf4 z#k*7e&Mql`ja_p7E2`pc7ViG4>2&mfBInf!4u_I0A}V-ix^^$zbb)7X>-iVS7qfge zW(Yev#Rgd26;O0itm3$RwDJ(&Mei5lG0TI$2$yw+bDZzwZn^s?^iabN4+)X!9L|qS z56KCt+32%zRJ*GD<7rzr?_E>p?o~Q>L+!YxhpjHXb9D{Z(~7otw|I|$SB4&bKgM+r>2C-P3aN9ycM!;^8*~i-ZKXPte$-K48{njndp1T&lm(6l-ec9JYqz~X1}IRt;<~={=$6I&s?jE7bbl9>-Xq=>SuQCzZd=dW}ft{-*kEYOMR)op^Nu> zKEJ>82mj3H+uZ(dxwQYy6!-tr{>b$6Oja9(P;;4(|?l4;^amo_yc z)5NPS%Q$DNy_t35Qj4?j%~>Zd9+B|1SnDL7a#!r_+t+ViicPt_!E%#s&>hj2_abDv zzLu5cuMwLPd;9WT@$Qo2QA)9Y1AU)7GI8`zjy|#fn!3ji!v&>IS-x#-_gr6uJ?3w} zHLLdEwrk54h$~sL?sVGfIA8z5wO8NUUf=q|_>|i-ec^(Sh3Rw8?_Z^NX0HWrZ+G=m zO&@ugOYt20o0qpuQ_J=^rJ>RN)We;{>5G{E23?VFEQfRD)|)l^RT(eKDTNx(0}d{n^!)skQ%UP0mIfUa z_0{s;k#ty8SSRv`>h4KiJEkmE2~%3p!=9qOa*ns9*Qy7XBx1@}Gkoi9xeJ8|X4sUyb8u0mm*nNw$l&CHxSJFGP` zbk?<`%d3pmsup@r{+vBa^>EtD4UuL!)A(n18mF?>tmXaJu%7p`((}UUcd829+h*Br zUA99yR;ot(Fy}pGjpEYcrf*!ESg+0#7XPMrM_XL!-0y>>zP)L?m?fI_v_Gm42sNn= z`+2J^Sk6h*>rp1(W3JEaPWu*AE>aHIvyUzQhEHwCGQO*7A0)V9BPT6*JjqMA#3?AU z$SL#qoK-884jxne*Bvt9LHApz~ZwZDp{n z=B>p|YUWp5Z@t%ylYRZ>RZpqg@2$<<>cDY_FcNLs0oH_mB*Nbzv+R7Rkyw$rCJJUOL*3+g-cZ;K0BA4)g-ft-NdA9oe zNArFkTfTk!_ne!zd%U`FC*~*UX7)qZi+mZF;ub zeV6+;1F_{+nKfgg-u0FW8=l21_V}Bpy_H1u1H@L^SPd~NpUHYH057rX)40RJe>V3#NR(+uQ z=GQ2ud&hT(?3w>jrH0=?k3l}ghP9^SW5|cZW33OAdzLr$8_nahJ66H=!{YJG2f{t+ zjs8aSc@cl4JHvhr%c;^GgW3CT2_dIVrZ#a+N?tBH~52nYh54wB04^EfRXWBpc z?0@G6<%V_UKN63m-`TsFJ)^CbW_@lb%bU07yV^=5Hk9`XNT@D`F&7riPch-`BJ0HsjT;vt{vGn2e zy51+p-R>`Zf9x>V)A+)gW43)(bt34c4qxWcfDlT&0>-bQYU?PcHVVc*66)`3;hqHL-DY;%uqPct^LY3Z`=>^nWB zx$mZ)_t8z-A_b9i=DDBfJbcUjKa|11&xH~$#T+LKwRm@#eBv+(T==XUE#}x+pey@?0NXr<(E?ukCs^FM*Ov! zYq%!YidW)V+1ztd*ZAh1lf33P_nh>#TB}%tHNQ)Dtvyl?OFX5Dk*=H12g$y@QRirX3&AHkzi z8B@dzE^z(Gz8O1tX{MQ4G)w%~`3>&zzYaB@%dp<4{8;$hk5%XQe5jW=e>Z1=%1fWg zGpoRA-n)ft&DTix?hXnQFrb7UopZspEe_v0@EUsQzWaRtr3 zSg6(*=;M95`chF?)qef0{BDJO@~2Y6j{WgCruE8VzC+M2`6H|=&%V^~{JF8EMrmue z)icQ}UYD~%B)`S&$-TR=Xmw-w>9dh*U+uX%BT-^y)Y{1Pnb%|3%9kjXNbAa*;V01)AR0@y-i5FptNxJn^oER;_s{09$0&u#h0(q z%l&S)Xt>nDy$0%m9wuuRNIi<`}k&%$kPubTQd z&0x;qD`y?054Svyf9o#3T~%mV?2^6r->6?YpB?x>qc5<8xMPk^ZRA*Z+BD#g<_xCDJ&GGz&X>f9?@-h=|G4vjxY4mhnM8^A>3Ri1 z`J6SK>#N$MxkP_RO*^2=xqV{Nj5(X%JiTMuRNeS|Taoy#%_~Dh37lv|ityWMpd6_^fVs*3}NJ{L1^gAO6<3IJq?YT~{>!Io3_=OCO$C zw)@e2MGvQach=eWU08l-L4I)0KNFLMZqvPrSbWZjuU&uf9fQcFhQeazGk09x{9>DO z|3H1?AHzL;k0++jQYx6#e&!2Xh_UkY_=A^UU-;LuZ^GFvg8hjrxqD73_BL30Eu3JZ zcK5pBq&#K8!^|q?hF&+1)JUjp?%TLDE^O9$j+_Zo{v1;(klrmJ=a!e5GH>cZ=c31f zXIPErp3F=5ez=48Y}J#SD*G)?=1;LXzijuM?Nq;p}L<#Y|1&o$~xA z`~^XI-zUVHmniKqKY#L8C$n@b^g=1DjiBPO4jG zP6=$&Zs~-xpd+l0|DSBKtTXWPtSkC99n(#?DjT{K7F7t?ba3rGTCy_wcJG$%9|3YA ze;D{dhgkc0ZAdCj{I-Ad=h<^-{{2x?%|0RFY%A-1M^;nuQk`2IIW1;VEbezQ7rGgR zxBM#9-|IWMZq=@nE9Jbd<_e~jEtym`UBK<~!)KNYH_b0+DbAeMDeZeh$8x56`zHOU z`joAlj^Qu%7Ph^R@rmMC^vvY_!Gn|7r9-7p%Y|+5im>3vs%dL|vxJ+(2@ zQ02$ua6i3jrN_sl>~9CXd@$Q|aT4GE@>r+P73W?!y;@zrEI+yV{}m?x^JyZopXz7V zls))lcRH^5J#UzK9qZBP^9FK(I!*06Cvna+h@AWO2j?;FGrxsq9(U@z647~8tE0V8 z0^Gqp!K9|5!N|by0PmCze8(|jd@eX6GYuZ%w*7m(m>osj_TT*PYnFD*$zWqguZkHr zqxNE!+&4^Y>|(1;Z>k6%cAFG>(CIUuW-WuX^i~0v8U}fs&?|hDJD}H|N`SsiE z4FZc8xK-uV!eXYx7O?$Ks+xP|*<8oT2QA(jS?Eq(l{5d~8grHAQj53hJgcX_jN!e! zu)p4(}?{oH->^By_%&V~R`lZ_ziLzkX;e_)&gW<)%tr=)1r* zA^Fp)`B#J;x%>TXk$JxPyu=ShTla5X@Mp$vxu*XgBmY?#JoX$-?&SD|az*H>pc->@zUoI&?{c%U@X_X0b|^l=h;vfnwYz#3lCI9{_K| ze;Cbu&yJCSVH!9d7@0&EL>M?2I2b@%n%~TP5c-mlf#C@=1A{383j- z)S`gIqLN~L$E4!?oYIoifc(t7lGGI6)ZF}{%HY)WT=?GMf2TmTE5aJk7W4Bbt@%rs z7#P;FFff239AQlW69eqzi`)W)HBP0)koq>j8`Y#mzux4{Vqjpn!N9;Ek1&RTfq{<| zmr3v`L1e=~zCW@^Wp6Me1A_+>1A{7xVPCNuh8z~y-KP`jvJG@T03#yCUWeCzb@NeP{F{!u#o{O%TJwEP>(z`&5hz`y{S zCq|fmo|~ZgSd$1SG>&HReDz^sVBltDU@$-!$-uzS#DmpT&%BbF+rz-XpvcI;V2onA4nHZTV|6|#&?ip+A1BJnz#z;G%HPN~cnT1*AS^Mbln6h} z=O|D8$iTp`m63tL0@((JgQ6r`;SRfT13C48;vwPpd5c{P3=C|H=dZ}U{fz@&6|Iw$~PWQZ&t^H2(9^x#~0*l_w=1_p*yMg|5=gnP`MY2hEbD~kh46F`XoRP}?FULhR1LYuIe_$v-pu5-$^|7D)@37#J3@qBkwMtgx90^EaM65dU_6crgP5!yE?m zsQGI{&`A7QAm^~nrVa)MhBX*v>}gxPMx!oqL=S``j(;x~f)Xh!0|TgojfkdIcKD3N znS^Azc|9wc7#Q?0LN&(`(?C%7#j&6uCo>s*?g{qD7p!*L_=k~!!JV0b!35zz1_lNT z7wkql=fffk`=K`Ip}^g~F)fUdfgy~EfdO<}3&N6VZUk)zPAzfF%ghCPz&Aey>4Xe) zYnJ*ed<|!0V2H%9CfI`*Yy3)cQ;RZ_At&S^&WJ&`MzQ1jMt3F#hCM9kO;$lK!q#Nw zrRSsum!uZpwgCBNOwuDeKhZG70T=0CXcw zkWP9=HB!F?myrYtUF5?yQH|W+ipxl}m7wUZL_Ts7bV?^8^Y-^(8j0h~PIN<~kPb#f zP2zWYaT^NBnb?y!^3jB-G2Pt{H4$91ARkAFX%eXMihNEWs@tL`;4%q+3BBKv3Q8+{flNIEXQFV-~ctukEtvbtiW})7U7!sg?zwvgBMqmJZl-%QYKoE0qca$(fM zs z;E+CnVH(o>Ho7^;lQ^htC&4oq=75SHP)8nl#thv+^;ZY#?uV QGI%oVkzimDIuGIj0MVy<-2eap literal 0 HcmV?d00001 diff --git a/tools/bin/lib/HackGUI.jar b/tools/bin/lib/HackGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..22d4ff389c3b46addfa05ff1c2fbc6048901a6af GIT binary patch literal 96666 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

gyOC*SS3Tkl4EA3J;wxoxZf? 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 KQ!pa~0|NkfE!J58 literal 0 HcmV?d00001 diff --git a/tools/bin/lib/Simulators.jar b/tools/bin/lib/Simulators.jar new file mode 100755 index 0000000000000000000000000000000000000000..72b5db7376b380f7f79b27851b996e7ec97b12a1 GIT binary patch literal 81810 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 literal 0 HcmV?d00001 diff --git a/tools/bin/lib/SimulatorsGUI.jar b/tools/bin/lib/SimulatorsGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..4d36e646cec99860b95b683cf28f1d5cba97cc48 GIT binary patch literal 68492 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 z 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 literal 0 HcmV?d00001 diff --git a/tools/bin/lib/TranslatorsGUI.jar b/tools/bin/lib/TranslatorsGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..f29f926b0158193d525de0c62864176a47467d22 GIT binary patch literal 13643 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 O2r*c(F);kr1MvXkb^g-; literal 0 HcmV?d00001 diff --git a/tools/bin/scripts/defaultCPU.txt b/tools/bin/scripts/defaultCPU.txt new file mode 100755 index 0000000..43b2720 --- /dev/null +++ b/tools/bin/scripts/defaultCPU.txt @@ -0,0 +1,3 @@ +repeat { + ticktock; +} \ No newline at end of file diff --git a/tools/bin/scripts/defaultHW.txt b/tools/bin/scripts/defaultHW.txt new file mode 100755 index 0000000..bdb2261 --- /dev/null +++ b/tools/bin/scripts/defaultHW.txt @@ -0,0 +1,4 @@ +repeat { + tick, + tock; +} \ No newline at end of file diff --git a/tools/bin/scripts/defaultVM.txt b/tools/bin/scripts/defaultVM.txt new file mode 100755 index 0000000..dbc64c4 --- /dev/null +++ b/tools/bin/scripts/defaultVM.txt @@ -0,0 +1,3 @@ +repeat { + vmstep; +} \ No newline at end of file diff --git a/tools/builtInChips/ALU.class b/tools/builtInChips/ALU.class new file mode 100755 index 0000000000000000000000000000000000000000..03f95dca8c34632f9f1752ac76ebdca0cb366bb2 GIT binary patch literal 1754 zcmX^0Z`VEs1_phGG%f}i1|2R2T?Rc6q0i1>z{SAApu@=^&0q*(8G#66E(Q|@Q;?V$ zh%o13uwbwRNmwy6FnnMD$y#$T*l;n}GT1RQFg#!Y$=S0rIB+pIGB|;>ID@pfurs)F zFt~9sNHDmwGkCBwcrr3DrO1;`I_KvWR9#68p#ZWAMen1-fLR$^JAeqwovK3v?Ik%6-)6~rwqNo8c42b zOUx-vbu3|IVA1f@3}$5Da;->CEhx#%&nsqR;3`H^z^dUHtQp3`pva)a&fvwv;LYH} z!{E!{$H*Xs+s`}>QbE3q zXJimaD$UF(@yv71$Sf!Z#U&$yERv~C5LuAn;h7~F?xCKH4B|-gAc&R7pIo^ zSBVu+D}Rm0O0lnz*nQj1ed7#Y;Sw!^~*S3+WB(1KY{P%S9UWabr=mIP#il7vt+ zva|j2Q&O!N8Ti50LVN-e0_6sfbC@+iNs1>uwZyfez^M|FSVc90p=mQGF)v*|xTGjE zFWs7vK>(ayk;E7o*is8i6LX3g8ALT8sTnNmpOlrFTw<*m1xcXJ`MJ4?c`0a$pvHm% zM+)q^(2~rY%#zI1Vttp?G*BjjCh_F_+=9}QR7amsMh0$;;NU1Q0J)nhzqADIZ)R}# zvSF zb_T{B3{2Y?m}fF5YVBrViQLY>x|M-VYYPLLK!70Qm2C{{Aoex}4y_#woLd>VHZp(! zBZCTqD%3DR21c-9tRRIOK(Y*s3~CHY5NXCD22KWU1_s7Btt|}P%tqT7cx*r{77)u8 z#9{@p>_99w5X+1O#AF9EK}K?OfSDjCaSK3HfSklF08zpLvh^5)D2QT~-p0TSVz9_; zW8jq);I0s55#Xw55M>qMtY{Er6X2+55M>u&uV@hE5MZllFyqwP!oVfUDa6+>c^d=2 z6_+HJkia$u!I=y~PzfQZ1jx{13_Ku8l4~1-@Nx!LD=ujnS(XJ1>@3R}SeQjw5KLAC zlMTUSM=&|y%pDA(W?WiZ7{r*3M7g#xh=Z6cMxtD^pvF#yim@7ra?L>%V><@%D=SDN z??whjhA9kZ7|t_@FfcGMGN?0XFff7RT8x32fr){EfonH|M5K`9b_S{a;5gC*rw&F2 Q2?j<`35TSb8Lw&v0H(B(FaQ7m literal 0 HcmV?d00001 diff --git a/tools/builtInChips/ALU.hdl b/tools/builtInChips/ALU.hdl new file mode 100755 index 0000000..e5fd1f0 --- /dev/null +++ b/tools/builtInChips/ALU.hdl @@ -0,0 +1,55 @@ +// 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/ALU.hdl + +/** + * The ALU. Computes one of the following functions: + * x+y, x-y, y–x, 0, 1, -1, x, y, -x, -y, !x, !y, + * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs. + * Which function to compute is determined by 6 input bits + * denoted zx, nx, zy, ny, f, no. + * The computed function's value is called "out". + * In addition to computing out, the ALU computes two + * 1-bit outputs called zr and ng: + * if out == 0, zr = 1; otherwise zr = 0; + * If out < 0, ng = 1; otherwise ng = 0. + * The 6-bit combinations (zx,nx,zy,ny,f,no) and + * their effect are documented in the book. + */ + +// Implementation: the ALU manipulates the x and y +// inputs and then operates on the resulting values, +// as follows: +// if (zx == 1) sets x = 0 // 16-bit constant +// if (nx == 1) sets x = ~x // bitwise "not" +// if (zy == 1) sets y = 0 // 16-bit constant +// if (ny == 1) sets y = ~y // bitwise "not" +// if (f == 1) sets out = x + y // integer 2's-complement addition +// if (f == 0) sets out = x & y // bitwise And +// if (no == 1) sets out = ~out // bitwise Not +// if (out == 0) sets zr = 1 +// if (out < 0) sets ng = 1 + + +CHIP ALU { + + IN // 16-bit inputs: + x[16], y[16], + // Control bits: + zx, // Zero the x input + nx, // Negate the x input + zy, // Zero the y input + ny, // Negate the y input + f, // Function code: 1 for add, 0 for and + no; // Negate the out output + + OUT // 16-bit output + out[16], + + // ALU output flags + zr, // 1 if out=0, 0 otherwise + ng; // 1 if out<0, 0 otherwise + + BUILTIN ALU; +} diff --git a/tools/builtInChips/ARegister.class b/tools/builtInChips/ARegister.class new file mode 100755 index 0000000000000000000000000000000000000000..ab9aadcb61a8f5c25c9b48436c623df0d86bf24d GIT binary patch literal 337 zcmX^0Z`VEs1_pfwDJ}+f25wFUHU=IJ23{@(J_ddeA;8Wc$j%_d$iQZknU`5&$H>5} zp&7==z~Y>rlFGxt!NAGGAj}}b$iU=i#m*qg!yv{W&ch(VAj!xemQ_0)$caL&&y$j?j7 zE3sx|ki;p;$iQBlTH=?Oo65)_s^OEBSeB@tlbDyTA6!zDnU`)2ay)l&YKc#Na$-ql zejXzOtA?kiW*CDa0~-T70|+oOFoHbBz{tSGz`&rxz|6qNz`&rOwVi=cYYPL@F$QrE YCB(dqfd#~17i8SEje&I|NGk&a0FTN_rvLx| literal 0 HcmV?d00001 diff --git a/tools/builtInChips/ARegister.hdl b/tools/builtInChips/ARegister.hdl new file mode 100755 index 0000000..23aee73 --- /dev/null +++ b/tools/builtInChips/ARegister.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/ARegister.hdl + +/** + * A 16-Bit register called "A Register". + * If load[t-1]=1 then out[t] = in[t-1] + * else out does not change (out[t] = out[t-1]) + * + * This built-in chip implementation has the side effect of + * providing a GUI representation of a 16-bit register + * called "A register" (typically used to store an address). + */ + +CHIP ARegister { + + IN in[16], load; + OUT out[16]; + + BUILTIN ARegister; + CLOCKED in, load; +} + diff --git a/tools/builtInChips/Add16.class b/tools/builtInChips/Add16.class new file mode 100755 index 0000000000000000000000000000000000000000..c3754ce2a82e66b71bd1726feb55eb164119f8ec GIT binary patch literal 343 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&|av#f%I> z(LPAZ{PI&$tr;2k(S#TonA1~Bz-|j>WZ=p#ErIK2E(S@kXasA9F(@*yF|ad$022cv z$h{1V3|tHh41x@d42%p646It)85lQ$BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA&d49pD73=9lPT3Z;Hn2okEFx!Aw YEFhMx))od9W+Q2ty2;xZSRr~D08h9+Jpcdz literal 0 HcmV?d00001 diff --git a/tools/builtInChips/And.hdl b/tools/builtInChips/And.hdl new file mode 100755 index 0000000..d2c48b5 --- /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 100755 index 0000000..4c71874 --- /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 100755 index 0000000000000000000000000000000000000000..1e5a3c457c0abbb4801757bbcfb53e08bad62590 GIT binary patch literal 416 zcmX^0Z`VEs1_pfwMJ@&o1_4e6b_PK%1|bGv5K9C^h=RCc>gXC8>-I zjKPcyY&MyBnI(3N49psuVT=qc&iN^+j126_Ir+)ip#_W#oM4tqet8}b12+Q?4}&Cw z6gz`74}%PYEDr-G0~Zg29D@`OgFJ%*BZELvX=YA|XP$FLWaafq{{M3FJHm1_ovZMv&7P7#VmO7#IW@7#SED7#LW! zwlgqpWB>sc20jKJsI(>nGXoO?1B0yA76v93qiqb#HqtB$7zDIHd}a`TD+3Em8$Vo| b6ay33R6eaO46MvXT3Z-cwlT0l)G+`6Uf4!% literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Bit.hdl b/tools/builtInChips/Bit.hdl new file mode 100755 index 0000000..a0a76bb --- /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 100755 index 0000000000000000000000000000000000000000..49efcf1ae7958520030cafe649d65bfb433bf2e7 GIT binary patch literal 401 zcmX^0Z`VEs1_pfwMJ@&o1_4e6b_PK%1|bGv5K9C^h=RCc>gXC8>-I zjKPcyY&MyBnI(3N49psuVT=qc&iN^+j126_Ir+)ip#_W#oM4tqet8}b12+Q?4}&Cw z6gz`74}%PYEDr-G0~Zg29D@`OgFJ%*BZELvX=YA|XP$FLWaafq{{M3FJHm1_ovZMv&7P7#VmO7#IW@7#SED7#LW! zwlgqpWB>sc20jKJsI(MVIRgWqmev*qCT62;49r^@SYYb-k<>APjp5VU!obRGq_u^C LWg7z&VFyFx=I literal 0 HcmV?d00001 diff --git a/tools/builtInChips/DFF.hdl b/tools/builtInChips/DFF.hdl new file mode 100755 index 0000000..c66b796 --- /dev/null +++ b/tools/builtInChips/DFF.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/DFF.hdl + +/** + * Data Flip-flop: out(t) = in(t-1) + * where t is the current time unit, or clock cycle. + */ + +CHIP DFF { + + IN in; + OUT out; + + BUILTIN DFF; + CLOCKED in; +} diff --git a/tools/builtInChips/DMux.class b/tools/builtInChips/DMux.class new file mode 100755 index 0000000000000000000000000000000000000000..8cf4e0b296eb714a06b45276662a37aeb0dab49b GIT binary patch literal 365 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&5c+85#J|gcuo^(^E^pP77va;L0y8f$L{321&4J1Z##dC^E1yurq)F69Xg2 zxeSa9Tnr2hf((odj0_A6tXkU{7&n6C8CV#&891TRt_(~J%nS?+mRegFn3#>WF)-VJ sSS%oxt=1L>7G@)vSq$vb%Nbahw=uASL|DKg%*z>Aq_;7!LX2bp0GcpDZ2$lO literal 0 HcmV?d00001 diff --git a/tools/builtInChips/DMux.hdl b/tools/builtInChips/DMux.hdl new file mode 100755 index 0000000..80153d7 --- /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 100755 index 0000000000000000000000000000000000000000..ab72a174054b6a3d615a62427e3bb128d111e293 GIT binary patch literal 408 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&B;Hofpi=z?ENG0@u%643c2c2-XZ^P-I|ZU}pdU zCI&{3lNlHpxEL511Q{3^7#SECShcn@Fm43NGq5mlGjKwsa~PNzm>C!t61283Ffki# zV_>!cu~BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&B;Hofpi=z?ENG0@u%643c2c2-XZ^P-I|ZU}pdU zCI&{3lNlHpxEL511Q{3^7#SECShcn@Fm43NGq5mlGjKws_b@OsFf%YPY|z@mz{G5{ zje*$)#9{%lY_+y9urM3R%wk}dUe3V6yp4esB*J1O!?FNXh}B4j6-|iENQMnfh}}qr e9ZiVCNQMJVNPx{qMgU!_0K1Wl0J3I?PZ$8Ky;*|* literal 0 HcmV?d00001 diff --git a/tools/builtInChips/DMux8Way.hdl b/tools/builtInChips/DMux8Way.hdl new file mode 100755 index 0000000..c5536b8 --- /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 100755 index 0000000000000000000000000000000000000000..74a713d010fd8f6e39ea4d2b8bfcbc497026feef GIT binary patch literal 339 zcmX^0Z`VEs1_pfwDJ}+f25wFUHU=IJ23{@(J_ddeA;8Wc$j%_d$iQZknU`5&$H>5} zp&7==z~Y>rlFGxt!NAGGAj}}b$iU=c#m*qg!yv{W&ch(VAj!xemQ_0)$caL&&y$j?j7 zE3sx|ki;p;$iQBlTH=?Oo65)_s^OEBSeB@tlbDyTA6!zDnU`)2ay)l&YKc#Na$-ql zejXzOtA?kiW*CDa0~-T70|+oOFoHbBz{tSGz`&r#z|6qNz`&rSwVi=cYYPL@F$PHx aCB(dqfd#}6WY{9exN92&>qd}f1_l5z_)BpB literal 0 HcmV?d00001 diff --git a/tools/builtInChips/DRegister.hdl b/tools/builtInChips/DRegister.hdl new file mode 100755 index 0000000..6c9a254 --- /dev/null +++ b/tools/builtInChips/DRegister.hdl @@ -0,0 +1,24 @@ +// 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: tools/builtIn/DRegister.hdl + +/** + * A 16-Bit register called "D Register". + * If load[t-1]=1 then out[t] = in[t-1] + * else out does not change (out[t] = out[t-1]) + * + * This built-in chip implementation has the side effect of + * providing a GUI representation of a 16-bit register + * called "D register" (typically used to store data). + */ + +CHIP DRegister { + + IN in[16], load; + OUT out[16]; + + BUILTIN DRegister; + CLOCKED in, load; +} + diff --git a/tools/builtInChips/FullAdder.class b/tools/builtInChips/FullAdder.class new file mode 100755 index 0000000000000000000000000000000000000000..2ed9eadef15d6454351c107a83ac11391786c4ee GIT binary patch literal 380 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1rTrP08CV$@7@W1XFfcJ2 zZDU}z0kK#>EL#wZ6~wZWmPwFJm~6(PwS|F&*+`UywP5l#238P{1;on%@gRmX007EZ BN1p%y literal 0 HcmV?d00001 diff --git a/tools/builtInChips/FullAdder.hdl b/tools/builtInChips/FullAdder.hdl new file mode 100755 index 0000000..a4caa56 --- /dev/null +++ b/tools/builtInChips/FullAdder.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/FullAdder.hdl + +/** + * Full adder. Computes sum, the least significant bit of + * a + b + c, and carry, the most significant bit of a + b + c. + */ + +CHIP FullAdder { + + IN a, b, c; + OUT sum, // LSB of a + b + c + carry; // MSB of a + b + c + + BUILTIN FullAdder; +} + diff --git a/tools/builtInChips/HalfAdder.class b/tools/builtInChips/HalfAdder.class new file mode 100755 index 0000000000000000000000000000000000000000..e7741ed48866ecbb8a9cf92178bb92a33eb10368 GIT binary patch literal 360 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1rL7s58JIyqrL~2DiP>ly m1G5c?#R6j4YHeX)VK$PMX_~x^ffdAIF_M<4192b*F#rHIn?u9^ literal 0 HcmV?d00001 diff --git a/tools/builtInChips/HalfAdder.hdl b/tools/builtInChips/HalfAdder.hdl new file mode 100755 index 0000000..1591b96 --- /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 100755 index 0000000000000000000000000000000000000000..b5b2aebe7bb4d4e7e8ec8d59b79b8302b123e9c7 GIT binary patch literal 333 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&kOTcamW@O;XFD-%VXD$XwuxJEphA}8IuraVRfB+K% zBgnlBj0{{13=Dz{j0}tn3=FJV+Zh-)g5()k7`PcYq0%Z0%nVEn3=9%lTNs#_jkYl` W+h}cJU|}|rW=WX5je!-Sg8=|!B$zTd%nSls%E(Qw*OAyP7 zi@}<~21M9`l-Pj?doBhC21hOiNd_m7gfmE;3y5$9iMg>exN|Uga50E7cycg!u`_tH zGx)GG_%bpuXQx&&GB5@+GBBr?W->A;`UGd@mgXduL-?$ z=)=XW85y{;Q!4|CQj3dIQy3X!G!TkX%Tn`7Kz6!<7}g-uxwBI%gHm%+6Tyl(vQsNV zDhojRxYAQg!V+^zQyohf8CWztHG>%$xLhleQwvHm^Ye-s8Mu-&Qj@bi^HNePAPT}5 z8Mum(G_h)U25W}#Feor6vNQPcF!(bB@Gt~21Tiwm69@zz1~~?K9)@6s5FUn5hA?)9 za2|#ThDaWUD3DRnAfsY<7-AXXco<|DWO*3k84}nT5_uSs7?ODyQWz9@7*ZM1co@`6YvqK@_e!vsj@hH8DjYKQE_}kwG-6G&85fGtW6Av!ECh%;2bHWROL& z*a@Np8r2~H;-iFqkGAPc3S39drFxI8m2UEd2i(TRaPfhohtz?Ybk;+?RQ56T7*KR~h%zH9(W z+4-d<1*IhcnV^&{6pb8`e)%b>){G4NV7Gu{Kp!N;$iNJCBa22bD8RT<%Mx<}5{pvv zN*EbHdB;1o(l0SLm61Ugn|HwhYYol6If;4c`oSednR)4;>|YEHdPW9Os77RIkX0PX zIjM<7-l>%giVTtrQVfg?(hN)tOrWg5z`(!+$~z1U3>*xMpq$6R$e_f)z~IEd%)rRN zz+k4eoq=%&1JgDJ=9vuITDuuoBDXWJZe?K8+QPubF38BSje#A++{VD6wT*!j!sOb> z00N8*$_y${^8^_f!RE1oRBQmrGB7fzGN?hNT^X1em>3usEVXtpaBFX4;MvN+tF?uJ zcOHYL))odnW+M=18w0=AHU!>;5G&!n2qXiBMrfRWMEL$Vul!o%@i(> zDccx?VcIp|+Ihi2!@$4@lhS0+VqgM?jTqEqE-mTp3?d+xtpR&Tn}LCWg@KVll!1vs zhd~#rS{mv#e(9MEyt^4hBZb7aGl=hp7>m%t$e_od57i>Zz|6qRz`(!-RxSZjj%EP^ E0L6`vGynhq literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Keyboard.hdl b/tools/builtInChips/Keyboard.hdl new file mode 100755 index 0000000..26ca5ed --- /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 100755 index 0000000000000000000000000000000000000000..75c66452bb093e5fcab3b770331d2b3cc81b6af4 GIT binary patch literal 356 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA(E3``6x3=9m0T3Z;Hn2okEFx!Aw jEFhLGh{XzG*=cQIU|}|royEW|y_|tXW*Y-5#3%*;HwHlH literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Mux.hdl b/tools/builtInChips/Mux.hdl new file mode 100755 index 0000000..a0eefbc --- /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 100755 index 0000000..676d1f4 --- /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 100755 index 0000000000000000000000000000000000000000..b2e2ed773d8437a2fd7f69d81ca6300eac2b0702 GIT binary patch literal 435 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1rP~;oz}l*`wlFX;8*O7? zwgItNKrCAjixtGO1F_gZEHf4mlO4=tWj13IWnBd}(-cfHFfcPPFvv47FsL#xFlaL{ mFc?aku`Op1mI0BxvLKROl*NoqYYPJlvymvBP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1r5`acF>o_5FkI8x!ob9A zw2gt;2E<|kv1~ysRuIb$#9{-n%veB7b}*9_#N+@o*+5JIhzfQv8=`~*%!a7pWH#dx zfq}t^fq}u3fq@}_fq@~Mfq@}T+Kg*CgT4%i)RYC0 q%AzbFN=B3wM2U*Bfhayvb`Zrb%3;Q(wS|F&*+`UY8v`rEzYG9LH(KZb literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Mux8Way16.hdl b/tools/builtInChips/Mux8Way16.hdl new file mode 100755 index 0000000..dc16861 --- /dev/null +++ b/tools/builtInChips/Mux8Way16.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/Mux8Way16.hdl + +/** + * 8-way 16-bit multiplexor. + * out = a if sel == 000 + * b if sel == 001 + * etc. + * h if sel == 111 + */ + + +CHIP Mux8Way16 { + + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + + OUT out[16]; + + BUILTIN Mux8Way16; +} \ No newline at end of file diff --git a/tools/builtInChips/Nand.class b/tools/builtInChips/Nand.class new file mode 100755 index 0000000000000000000000000000000000000000..4b429bada97350f1438428fa168bed2c8096ccc5 GIT binary patch literal 344 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&5c+85#J|gcuo^(^E^pP77va;L0y8f$L{321&4J1Z##dC^E1yurq)F69Xg2 zxeSa9Tnr2hf((odj0_A6tXkU{7&n6C8CV#&891TR1`I3=%nS?+Dq33@n3#>WF)-VJ bSS%oxt=1L>7G@(BX_>l|$=euMA-Wj=L7+bw literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Nand.hdl b/tools/builtInChips/Nand.hdl new file mode 100755 index 0000000..ae0204e --- /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 100755 index 0000000000000000000000000000000000000000..4726b678408f6fb87b2a44060bdcb07ce67d8fa0 GIT binary patch literal 331 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA%i49pBn3=9ksT3Z;Hn2okEFxzNt TVPIi4Vv$anyp4esqJsed`Mo>{ literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Not.hdl b/tools/builtInChips/Not.hdl new file mode 100755 index 0000000..5b9d897 --- /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 100755 index 0000000000000000000000000000000000000000..ff3e68f6b9766669c35db54e79cc853dc9a3628c GIT binary patch literal 327 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&@kmV0)^|@VNd@Ui zNwsEV;71c;WMEEDEdjeKn2~`izqACdpSc($!J-kY8OETfrZ&f OnyG2>HU?IR4h8^*oI11s literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Not16.hdl b/tools/builtInChips/Not16.hdl new file mode 100755 index 0000000..c50dab9 --- /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 100755 index 0000000000000000000000000000000000000000..a5b64f9419c5dcbf1a9b30e44d7d32cfd0cda243 GIT binary patch literal 340 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&kOTZ2bW@O;XFD-%VXD$XwuxJEphA}8IuraVRfB+K%BgnA~ zj0{{13=Dz{j0}tn3=FJV+Zh-)g5()k7`PcYq0)K`%nZy73=B$ITNs#_jkYl`+kjXs XAeODx76uk(BWan2$=euMA$l1A^#wib literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Or.hdl b/tools/builtInChips/Or.hdl new file mode 100755 index 0000000..4a3f14b --- /dev/null +++ b/tools/builtInChips/Or.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/Or.hdl + +/** + * Or gate: out = 1 if {a == 1 or b == 1}, 0 otherwise + */ + +CHIP Or { + + IN a, b; + OUT out; + + BUILTIN Or; +} diff --git a/tools/builtInChips/Or16.hdl b/tools/builtInChips/Or16.hdl new file mode 100755 index 0000000..6c124e8 --- /dev/null +++ b/tools/builtInChips/Or16.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/Or16.hdl + +/** + * 16-bit bitwise Or gate: for i = 0..15 out[i] = a[i] or b[i]. + */ + +CHIP Or16 { + + IN a[16], b[16]; + OUT out[16]; + + BUILTIN Or; +} diff --git a/tools/builtInChips/Or8Way.class b/tools/builtInChips/Or8Way.class new file mode 100755 index 0000000000000000000000000000000000000000..104804b24118329fc4c994a065abcb49ae1bd0c7 GIT binary patch literal 340 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&%*eo%Us?j!&s+?WV9^NH3}aAaU}Ios00AZj zMv#LU7#X-27#IW@7#SED7#LW!wlgqp1j#e7FmN+)LZ!7Bm>8HC7#QTVwlFX;8*O7? cw$a+cz`|@KJ&S>zc{u|M%j9hgtPp(+0C(m+`Tzg` literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Or8Way.hdl b/tools/builtInChips/Or8Way.hdl new file mode 100755 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 100755 index 0000000000000000000000000000000000000000..1e6ada1389a15401a6a660b935e8cc6a7f5d8f92 GIT binary patch literal 1899 zcmX^0Z`VEs1_phGA}$6w26HY33kFLNVa3j1&BegNV9v=P%V5L7U<=~dfe3pL;Q%5W zL4*@Xfio9_3xg|&0fV$I0FW|NthSz^b?z^tJe#>l|poS%})$iSYQlb@U&TENJ_31+$Em*+7u z@TaGixQBYewKFn^X=wUnC6*=XCzhA!!^N!`8F;|XaL!1~OHWNV7=`Cr267L`3EZUxDTyViVGw_?Xas`<`O-@>-4iqOQd8XWlS_*k8Mx9@OTbDT zOBfkgG(0tf85y`-E0R+SN;32FKnjvGQj@bi^HNePAPT}58Mum(G_h)U25W}#FsLx7 zvNJ^RFhnv$@i0U)#4s{Q;tVhz1|`7DhGZUw z6oynDhBStBc7_ZdhD?Sm9tH&lMIHuI1~VRpY=(3mh8zYxc7|LYhCGm5K7%SFgQ#at zPHK8$jzVHeN>OTYu>v^gco+&m#_KZZ@h}vE>@a39VPud1xlG?Zu_Uz^Ou{|P$RHWu ztdNmdtdN(lkO}g%o<}YtQ=$l#Bs&GiFt|XAQ|rT)Dq9U;*!L? z! zVqUs_a7j^SUb;0Xm9Q427N?dlGH@5CmiXi+CxVg!BLl03rzc33J252%;aWrDk|az6 z*nEM+loZ#ZqWmJ5C?kV1)EIF3E!GFig4r-7V2zxac?G2<0hyqLDHM(Dd%ygYRBJ{C zex$Gi34t;%$S2Gi;DnuDS_0S44ECZ5SObB$VPxQdWfMjQ;pCju#3HZ*VQwpCWDv>A zFUd@+L>J~tElbP^NGwXtD`8M%kY$i#U}TVIU}9hbrDp~P1}0EOU|?Y2VqgSiAO=PT zH3kNTAO>azMg|53H?8dqj5`>ZwlOfzWU$uS&A<}5oq=^L1Dnsc26YBisQD!f%nYmy3=A1sTNrqmjkYoH*??Fq zAeJqN#R_8Cfmm!HmKlpE3(EoqZY}1m4E)O(6lB00X)s4vmSq70pH}1+27Z==$y*ut zLDn9FP|R9e82Gm_2*6yR0e68E0~6SXd|F!=1euK>>VzQb7#TDfw4g2(WMBlVV+EPI z0pt$`Mh0yL9jLSu12Y3N0|SGZ_BIA#Tdi#jA~LfXxMT$D|1V*X*Af!l#vlgLc#J_D zM8TZ1oPk42W;=s8#5yJhT?RdFo?M`ys|6v@n9oL#P&U1}1Pwa6>FWcn_hR0RV-^ Bta|_e literal 0 HcmV?d00001 diff --git a/tools/builtInChips/PC.hdl b/tools/builtInChips/PC.hdl new file mode 100755 index 0000000..f102d99 --- /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 100755 index 0000000000000000000000000000000000000000..e17050f0cbbb0bd207174db146fedf32ee3c7ce2 GIT binary patch literal 1928 zcmX^0Z`VEs1_phGGA;%=26IjZSq2L(21^Dj5Mj;EV8g}03K6yivFt#EJ&14s5so0j z38cxHi@}A#6~uJ|aos^&4-nUri$Rvbi;KaV!3RY6g1CMl!XHEgfQUeLh9C}xU@itJ zh7fj!PACJW3Z1+%4{eb+; zypq%uU$C5Wer`d2UTR*6H6sI?O=ezZi5(*Yi-xCW7$XCVbAC!HBLjPKPJVKBXaOSw zvj#|*vnUm$tF$DQk%1E|=aOHZ$H>5+o?7A_>Isqqo5;u@rlIMRl~|UjpIBa^4;Qy) zWZ(fi(>WtCFFiGdkwH@f>^QKJ(vsAofW)GbVicZh8OVts+qp{%QW8s2!$AIIWMI|s z3QQT$iU@Vk(^pkl9`_eQjnaHnw;&K zmy%k+$iP($SIxtq!l1#!punKW&Je-F5Xlh5!w}67!^j|qKm2$Ylo*tG7-AXXco^at zRCyQ@7!r9Hk{FVC7*ZHgc^J|d(%Bg@co;GnvUnKG7z}tAvKi8O7;+eLc^L9Q>NOcO z*ctM97z#iN3K@!c7>Yp-(FZ9l0kKROR2dm0K(5etPb^6-29t0vF*5La=H#TNC*~+* zf;VZ(?3zI!J~)J+;I$uec;JFFBQwL0Ur-63duMtr-~vGmF7a zbPx4(%}Y$m0VNA&4b3P<2JYh266gH9lGMDCVo-!fLn0g$W0}R7Nja%O`Q^nBWj^`I ziJ<5ODf0v;VeZ6~6ogX^iA!fN4c4HPC6Jhs;#yRcUj!3nWKf1015T91`e0cw8>R%T zkux)|ptK|)6O`D5qLIDsm!Fbq&B(xy6mTFRMh52e)Dmzm10~k{(h|6S=340h2P`{4n9yX;tfA@2$RM1YlbTor_65uXp!|_qmY5TeSd^Mq z!pI=10m;WXiFxVz!6ikRdFj@gVJwOavJ7$zj12M&ObjfbEW^OSzyit#3=9n142%pa z45|!_3~CGv3^5GM3``6R3;|l(85p&s_i%1yVA{dJyp4fnCWD>UZU)xK?F?*N8Q8V9 zfHBiH1`ZHYfMXj2Cx{`)uuOn!8v_@Jt+kDT8%pzRWB>sc26YAvs7>w+%nU3H3=Gy< zTNrqmjkYoH*??FqAeJqN#R_8C$*?S7kkZ=1z$7aj1~Tjz0}qIjmEOj{4>ME~Zm22L z`I>M8K!yr18-YxaHr>V`2-18E;x6fJ3_>s?wBSYvGB7eQGB7Z(YHec>hDb9qXfxDT=(~_0h&L9pkjfp{@!2qgU zhk==anSp^p0qi~*WFJb)Y-8XDxj}0ig9Jn;BZDE_nY;`PU}rMIq>LDh8JNIvD8ax4 zjzbFo@XV3SSPfL&?=j(0`|DF!A6QwCM2dKGA(Nl4FT;E@KY-?xx~cQ=Dnq>%J> d2ATa38xVRKLB%3euLRTsP`jiN-bAQp002NJuHgUx literal 0 HcmV?d00001 diff --git a/tools/builtInChips/RAM16K.class b/tools/builtInChips/RAM16K.class new file mode 100755 index 0000000000000000000000000000000000000000..2f1e3feaaf03e35f6ada3dbd8d47cccfc5272dbd GIT binary patch literal 390 zcmX^0Z`VEs1_pfwIW7hc1|CiZb_QM!20ktZeg**$AqXOb*cpV`8AKQv*laTMGE3|j z8JIOR!x$M@obyvsc^EhuM0ps*7{nPFID#B~6%5V1t=JhPco-xZq<9#lL6R~IvWyJE zNu`-NC7yZC8JPve`azDqhGyQ33gXb5nEkiz?kiJsBAkd^{49v)w~I z^#k%V^GZ@ve8FE(S&hZUzPh3kGHeMg|539W6lzhV2ZDT3Z;Hjxi{JC?V!;3@jjq0Q)uu TRuF?-kWqab1KUQBF$@dVMYe_AV*&X6K^Ya1`!?xQ3f$a2BDJm-wef@1w3 zM_&_fMg{?NK}H4^4Ns7XoVlsF`9+oPp`MHk3O*i*$=U9qp85g#nRz9tDZXGi=ltA) z{Jhk>5^F{VIs7UZ8Q6VMYdyAV*&XQ$r&wb_Nk122lnvMh4-e(#)I^&phXh%z|S5 zAV*(QLnB580d!GD1{MuZkeQshsk!+@mF}UQj0_4s9*N1>?xCLg0r{DEC8;UCU^(af z+=BeP)VvaFMg}?jDi|5qi&IPd5_3}-8ALUFvJ%S@^>Y&Q()EK&iZb)ktu@0K6d70< z*cd>7k%5tcoq>aak%5zefkB0ViGh)Ufk8q`kcnYC1Eba!2Bu>SJRnMlc^d=EMvxW; F1^}D{Ly!Of literal 0 HcmV?d00001 diff --git a/tools/builtInChips/RAM512.hdl b/tools/builtInChips/RAM512.hdl new file mode 100755 index 0000000..2a2f433 --- /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 100755 index 0000000000000000000000000000000000000000..a1fe78ab90af4332d0a4dae904dd6f871d6cad28 GIT binary patch literal 308 zcmX^0Z`VEs1_pfwaV`cn1};tpRt9bk1|BX3UIspP27Y!10Y(Nko6Nk-5<5l)W)00S zMg|t={FGE426hHP9tI%>VMYe_AV*&XGZQOz1`!?xQ3f$a2BDJm-wef@1w3 zM_)4&Mg{?NK}H4^4Ns7XoVlsF`9+oPp`MHk3O*i*$=U9qp85g#nRz9tDZXGi=ltA) z{Jhk>5^F{VIs7UZ8Q6VMYeFAV*&X3oCX85grCn1~Enk!KBj6oD$DG=ZwsPV*MaT zUkgSC0dz4&1{MuZka?WBsk!+@mF}UQj0_4s9*N1>?xCLg0r{DEC8;UCU^(af+=BeP z)VvaFMg}?jDi|5qi&IPd5_3}-8ALUFvJ%S@^>Y&Q()EK&iZb)ktu@0K6d70<*cd>7 zk%5tcoq>aak%5zefkBypiGh)Ufk9kLfMYuYqt+G%reh2|AWDdN8w1NmkPZe00DmJw A&j0`b literal 0 HcmV?d00001 diff --git a/tools/builtInChips/RAM8.hdl b/tools/builtInChips/RAM8.hdl new file mode 100755 index 0000000..c08d62c --- /dev/null +++ b/tools/builtInChips/RAM8.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/RAM8.hdl + +/** + * Memory of 8 registers, each 16-bit wide. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = RAM8[address(t)](t) + * Write: If load(t-1) then RAM8[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 RAM8 { + + IN in[16], load, address[3]; + OUT out[16]; + + BUILTIN RAM8; + CLOCKED in, load; +} diff --git a/tools/builtInChips/ROM32K.class b/tools/builtInChips/ROM32K.class new file mode 100755 index 0000000000000000000000000000000000000000..c4320d8ee7fd27ad78ca3ab43a7e45f107a66d2d GIT binary patch literal 3469 zcmX^0Z`VEs1_phG+guFx46)1%3=IsN40a50TnzCH2_Pboogs;ffsG*+B%BOlrGSW3 z5Rt~gkPf0VKtv{p$N~}BAR-5(K9`Fjk0Bq#DgdzxK@vq=48;s391Nvg3}p=EAdw0X zQOU(%$4~_#szF2z2SY7LxQ>gVo}mFG(#X!x#KoY@&B;`* zoOu|QF)Zg{Sium;*v`YSgJBB~!%l`>JPf-TBH0=C@G$r=>}6zN)yqgs&Sq!W$HTCn;Q$ZA zL6GT(Kqh*EOgs!Cjxe}0GI06iC#GcPrR(YG@h}`^@MUK>#=~%&;RMJWUq%K+aBMji z7pLYX<)jwr!&&fH=3zJqQhf?!_Gt!pc7`)N3}-#K7qqDaAUK zrlqA8@i1IvxW>b9o#6%}1EW5Oag&GP7RYF|kc`Y?h2)IP0)>?P)Z#q#5{2T@f`a^_ z5`_}53@lLyCzWRAlz8SjXJi%>gYu-YkvAiQERuJeAPPXf3ePOba1ZrlWY7W26G+@X znZ+fkd8tK=3<_Z7;1rLVbr4F#!Ad}uKmxGXH!&|U9i*8%J+;I$uec;JFFBQwL0Ur- zk`XbLS~D^TW)_1z;vVYhnwOZA1IoF~8k$jz4BW-3CC>SIC6MrB)rf{ep=B5^9 zCcEVqGOp(0&lFYP942v@|Q&QoIR6v1- zQe$ALKNuM}V6_5-39Sm4H8edL8MI(|1s?XeVglsCko=I;iV{%p21DyoRBv#X z>3$k93eD-#;lUHMztZ(^g1HXU)ifq8wIlV^nBxN26w0%Oc|INm>3usG_|%c2r(ONV-U8{+QJ~h zY^1e?fmzyg8-plF?=grK(%TrsAVx4UcrkcGjSysD1bc%Oq;dnu0tOZa9|m6rCa^E# z8JHQE85kIXwS}0NcQA85FEow1jlv<_dz0 zmj$_B)^r<#F35O3xbaM&dLL@M4m7wFKx(CB!a(|RF+9eGN4ovmY3^7pk3mBLgSQr=>dbB~w z&q&C48-vMAhBEDatn;B(nu4rE3I}i$?q)EH+|FPQ&Mp?)7%YXXwlP?1vlwk-u-?XC z1CCXtrh Ct$y18 literal 0 HcmV?d00001 diff --git a/tools/builtInChips/ROM32K.hdl b/tools/builtInChips/ROM32K.hdl new file mode 100755 index 0000000..929f824 --- /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 100755 index 0000000000000000000000000000000000000000..3958fcd4ecd31f6dc560c2c6bbc0a9594988cc26 GIT binary patch literal 423 zcmX^0Z`VEs1_pfwMJ@&o1_4e6b_PK%1|bGv5K9C^h=RCc>T35dhUz?qp>P+Ag@nODrnAQbI`q|7frCDoddfgeqXk%2iqwFKLAeJ|X@BtCN>6yhPsYTBDxdr)o zsd**Vj0|ixnR%Hdc8mwl9wP&PdTNP# zs3%-IBZHWRrcYL4S)zVod5Jz;+?tVr2kZ>zjKsY3)D%VrO%1Rkz)DI>Qi}o-i%N=7 zc&=q2_kf(hU0RTmSdtnB@dt}WFi4Ouy)@H3F*7eU#VtR%w3v~BD?POYti-W|k%2|S zQ!|*6fy=cbIkli9Gd~ZcAUPv7IomTYCA9*gAdHcLs~AZWtA=N=W*85H5`!{3LkJH; zC_@+zLpVbOBZDN)0OMg$U{GXaUvpbCpYg^a{vg}i))Opy2V6hezr6<|`)u^=x+F*3*`m1gFY zc;-20WEK>|<32pIB*Q(_laWCd$r>k!N|2p!c^$AkC{FQ2m=7pD<)s!eGKhnfgG_+9 zy4W`{FEJe?!=0X5;+a=ml9-pA%E%zCp$SO}m`be~83Z$n!OnFL^>ockOv(YJ9cB&9 zC`JbM;?xqq#N1Ry22l-2lFLcVOVePC#N&YF-J0B7-!83>xFa$C%GcYnRFt}=MXJFjHz_g8lc_xFE)@}xt$n6ZQTN&82wlJ^> zv2SDG05Jp^wg_--W8eg_w=r;mD6MS_+)$clBLfJqFsL#pLyfm%U}j)uU|=xP+QPug zY_yGm&j!R|0kLdlSQaoyYe{cq;0GCS3_>w$ZDHWw#vlMQOAT(86ay33seD>n7zCL? zCh~7%5Q3;|V3dK-g~);0z)kio|oct8}hG~BI>47zZ)@-i@h z-M|Pjn2|w`L7#yM9O7b7`?<8Fw=;-?e7gqhMgwphF)~OnFfkZ17(rD_L!H4dJ(GcV nH-ki^kmPm-sr?XR5n32Qg%VVYI0F+n%()>J$iTgaP|g4VYU7R; literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Screen.class b/tools/builtInChips/Screen.class new file mode 100755 index 0000000000000000000000000000000000000000..100ed03dc68a20edc3acb9b47e7f9458a680de3e GIT binary patch literal 1322 zcmX^0Z`VEs1_phGU@itR25n9TQ3f3@23-a{5TVb`V8F$|3K2F0v5Y_pjJX(07)(K2 zGZ5Dt#I@jJ5M{6g5mq3=nw`OhgTa=IL6E@?#J6W>aA0R}WMp7YFU@3RkoO7B%q`7H zEXgk_b`SN`4^A#hP0e%8&n?K$OU)~>W@KP1OUx-vEoNk3iVkLEV6(~0%Pg^DWMJ0N z3}a+qan4UkWn^Ga&dE>C4lQ70;4Df7X)Y~EWn|z4i@M~O=P@$yr>B;oi zh-qm0WF?j*>L-?$=)=XW85y`s3sMqGQo}&jGBU7gcm{)P;z~~~0Sh^nFfy=ccxnbS zGH|(8B&QaXWaj4;Gcs@`XQU=)d*-F2RzMVlF*0x!!!_|RNHfUrFi0{;u`@XFFgP=~ z@G!VCxG^%w;tc>E25|-n9tL*?4;}_j1}}C7Zyp98245ZqEd~`H20sQb9tMAg03HT; zkl}$KLW4n*kwL;EF*#e`J+UOU7)-()%E-X$nUj;6o|vPM334jPSwTDu$_y%u48lpJ znK>n%dCnP`1;x;qU}TU*GRg^}0Ay}>W=V#7s3#+XIFdX_qS!YvFEKr}h>?LiJ+;I$ zuec;JFFBQwL0Uu82ZvH?Mh3ymVz9ODp`NaJiAg!BDc~rMVr1YhPA&1tPfi2{GdMat zLD9jPnO9I+5|9ZBd7)@zgZ=VTQmq*o_>t@a34sz^Y6;j-P|W3*mcaEh7lR~NG$8Su zT9%j-kXV$OSHj33ssTwNIf;4c`oSednR)5fnqdrz45AET3=9lR3{0Tt0kb3-q!<_& zI2jm0@yx);Aj`nOV9vnIz{tSBpslr?fl*6Pfng8lRtBaW49wdYSY|SaYwc!Wjoi+_ zwv~ZhYYPKAJL@(Ej*Sc;z``KMAOkhToq?Hwg@J*=T5AgfC$rHu1}+;Aiv`581+iE` zEIS#N1q@PJTNs#RrNcm`9b@1DQL@t87`S1E%EJv+V_;@rVqgI4-~<~0GL(ne2xNk^ z={5#lm>vbV9zh01uy0tkwlVNQq!}3$8I+*zL`ZL8VBY}p1p^Z(T|uRF7?>HD85kH8 zz&6MryHQ$Z8v{4UP_1nY{4j%68PphkwQY-8HD#kY(VH`1mz{DUJ0lxp>|2j LY-bQbSI+BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA&d49pD73=9lPT3Z;Hn2okEFx!Aw YEFhMx))od9W+Q2trpenFSRr~D0C2xPX8-^I literal 0 HcmV?d00001 diff --git a/tools/builtInChips/Xor.hdl b/tools/builtInChips/Xor.hdl new file mode 100755 index 0000000..8452d73 --- /dev/null +++ b/tools/builtInChips/Xor.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/Xor.hdl + +/** + * Exclusive-or gate: out = !(a == b). + */ + +CHIP Xor { + + IN a, b; + OUT out; + + BUILTIN Xor; +} diff --git a/tools/builtInVMCode/Array.class b/tools/builtInVMCode/Array.class new file mode 100755 index 0000000000000000000000000000000000000000..c76b652c52cea0217b34479ef7fe827c780e64b9 GIT binary patch literal 436 zcmX^0Z`VEs1_pfwX)XqK20;!6Aua|s24M~c5e^1Xb_Owa2609PHk-`6%o00B24)S- zFh&Lz=lqmZMh0d-*KkG#7L8!dU`7Tm*NWuSf|AVqykd3+2}TC?l+5CS{NhxIf-oKi z4hBv}2F~EhV!hO&qWmHr21y1fMg|_=)ZF}{O1;FKocv@)20kb^CDjokAe>a1nN#AK z7v>AHQ{S*EP2^C$S{INIxXCC^s`N zu_QIjH=rm#y(lp^B%>(5JTWOJm63rbIWZ^4tu!wg3Lv19P|#i_{JV<~3loybKHsEDVecd<>in{0st6T_R9j973!h LrQr~B5o#F#px{?b literal 0 HcmV?d00001 diff --git a/tools/builtInVMCode/JackOSClass.class b/tools/builtInVMCode/JackOSClass.class new file mode 100755 index 0000000000000000000000000000000000000000..25df72a4693f8cfdac9990c7b9c0483bac190cd7 GIT binary patch literal 1782 zcmX^0Z`VEs1_phGa4rTu23sx$I|h3W1_v$%UIs^Y1}82CRt9Gf;Q}IDnHd=V|L0(E z14+AsL_F9TJlPq%7#XC3BZK3^9X&(h{aoE0Lp;M=<6T07978<){TLY-gBclko%8dG zOA_-+!V+^zQ<)hU7#JBDq#T2S93$iXT*Kr2{QUy_gFV4IgFT}_RxvO!G6?uOhIqug zc!qhpxW-4h2Kj?@GBYv=fyILZgAf*iWLOv(WPM$I{evRo9esTKov|9r%E%yvqR7M5 zF(BSQ%r(f($3Glo3>zbZe6VwntE*qUOORuDfMVh0y zJVU__gNJd81EM9;{!575aAHlAje==AID&@N%5|}0U?nf6+)m; zg4^Qh7ZUI37aZ#5=IQL|>K794>=@wa>9HyV6(~0%Pg^DWMJ0N3}a+qan4UkWn_@eN-RqZE-A{)OApESN=(j%utSS8 z^U}k785u-1d_XGna}x8?^&xWBn!$_=T&@+#sRbpO`FX|c4Bm_k{2)~j`H+0iyb>M; zQwB431|J>Hc41!QY5(^4a^HM*EP2^2V}Iq6I?Asfi}8=kkq2w%)G>s)G*(GqWtut#N3dK zqWtp2q?}Yn1_7|!k%EMgfh{LBFTErK9J-#23_Qt+IXP~ndC8y85!7CEhx#%&nsqUuwrE3C`wICan49Af--$F z^FaDFf;EE~8Q4LRo_QsV416FKNSR;0YjQ?DBZCM?0Hio1-z%{!F}S2CGcTQyK~y7H z(qT!HI{#nZbpTK@MS}XI@EaQBi3@Nooq*Cp-+&3^I%iLdYgV zY-VH-LuiEvIhCfRr55opxH7o$Ft{^#@Gy8Xc=0fJGx#tvh$WR~=9GBmh53SlQQteY zGATc?D20(h5>>)0F*(~m*f}S$xR{Ya+aobKTR+U#HMcY;u_V7pKP0s%H#0A>BsI)8 zpeR4RC^0uAqbR>TF)1gNk%0>oZoa9x`9+nC3@jR+pkU@nPRz-1E6qy=MGGT?mDAbd)A?(oN%)In4Ur^vnpyyI zlNTrcX_371+9 zbhTWd`~fxBl7WeVnSp^pmD!rvMtUX#yVOhuDG>(F9Sq#d8CZOGFz{MS&HVpT%4Yfh zC(>&e7#VmNgcw8_co-NM5I*GsSSQr=>I)wPZzS_;eAGw`Dzz5;+NLxXM zhWQMkGJ*_^3mEjYw=oE^q}a*M{{IXqL}WlA0@b4}yNy98eEI)lxa4KFF$jk*|Gx}f OUV9sZ$Og1nVE_QB%px`b literal 0 HcmV?d00001 diff --git a/tools/builtInVMCode/Math.class b/tools/builtInVMCode/Math.class new file mode 100755 index 0000000000000000000000000000000000000000..71aef914e8bb27f1170510b1a57819bea5c904e3 GIT binary patch literal 650 zcmX^0Z`VEs1_pfwMJ@(522l>2RxmQK6c-ki@G!75a4<4(23HpAr4|+C7x6I2GRUzr z$n!9WFeorG2ql$f=9GBmh53RUpzoVllEKIzi7M!on4Ik&?3|NWT+GOz?U9(Atsmy= znp>KaSdw3)ACg*>o0*qbk{ae4P?Voul$aZmQIubvn3R*s$iS1Fn3LmHnwJc6A|r#C zhEG;vS)zVUVqUs_a7j^SUb?j>$d7yoVTco0G+Z=Y7!(;;8Q2&=fP;Y%8Hq=1WOuOomDGGw?AmfvuN;N()HOV&D>DV%x#M94;lD163)& zz`(%5z{nuTz{wy4H&Ps`hg(W|2?M({vc1AM6iF>-V3CH|F2cYAwOyWp3G8`csW~9q Q*}=BA?_gl*!*Bot0673`&;S4c literal 0 HcmV?d00001 diff --git a/tools/builtInVMCode/Memory.class b/tools/builtInVMCode/Memory.class new file mode 100755 index 0000000000000000000000000000000000000000..e9bb7ad3ff815685aab0771a85044a2f062fc3e5 GIT binary patch literal 788 zcmX^0Z`VEs1_pfwWiAGG22m~sHU=>eA>MB(*3vGcU0uHOx1lC_lX@F*hWmD8D>0DJPYYfxEmYvm_N}E~|#8C&;~AMX8A? zFhLd#Pmq^*k`r@s+)DG3L4Iar5YzCTn*AFf!%FIi*_S6h!P-I|ZU}pdU zHU>tJ{}>n zq@=MLDFipNo`IQxnSp_!Sc+v41D6mB#|{S8a6t|R8)jQ+LHqxU8N{V`Ffd2jN-bjG zm1arU!N6>@{QnD()Di}6Ar=8Pka`&@)`TStn$l7UtO+twDXb|w7?`A`64(+TIzT*@ z1h6cK$qXV`6DDJNK$t-U>VZH8W(HOU1_oCt)|AOMASc*D%(9aOyNXv9O+L0)sm<1H*p?5X%EZcycg! zfoN|K;R7OkL4+R%gFgpD0Eig~B7)c%g4r2DxEMqkoH!UlL39|12nP`nTnr)%ksu-p zL_~vZ_zz;murtK6GsH16u=&M1`}+hlGBA2FGVnU*=M|SE=9Ppc=9H!~GcYhXfK>$f zhX;dr;*1Qu!6A-8A@PnbE;$lVy?zGIJ z;u6oi@cg0_Mh3EO*XGEMjC}(eMO`aJg0_rxuiC=I0f&GsH78aOLKg zr8<`u73UW*GO%g{2ZI!G78GUXmB93Yg}A{&!6ikRdFhM{9AKVjUI`-uJD8c1$H>5$ zl$e|yT#%TY%EMs5V93Lu!=THb{-q@ar6r6ElBmL7 ziOJdi!Ol5}plH?hNKDSw5A$`+EzJSBK|dt5C^s`Nu_QIjH=rm#y(lp^B%>(5JTWOJ zm63s~C^a#~H#IlEs1g!k!Hf*tjDU1v{Sd?gD7zYU{YeoiX4Np9>93}aX&}U>2(ZEz^&B!2% z&AKo~23Bwe0H<(gMh5oe(xReNQ2JuYORXqjP-IYGP-I|WU}unGP-0MKU}R8XU|?Wk zP-T!}P($LYGe|LLAn`RBI6#Syfq{VoloG+T4udY3)??6TU|`^4U<9RB21W)W1_lN} z21W)(1_lOJt?dkq8yP@=lfjt55F*X7kAVjy#IcEGGXs-=!e$0$=FJQ&0`&siM;Ta| zHZ!m>3)rJWX679X>;ekR2msM>0IO3HFcUBn5P>NMDOF|`5E2j) zut$&(BUQjg7_$k;2^a_%3&?>D0clWWW)@HuFcy#y;1OUGFcvU`s8<842PrcXkOo6D zh=e*wrvMwWof=ThYyuF-BOn1$t0}-Hz#||5hddyCAWOBFnVG?^uosXMFlL6R)&>dk z2=EBlgRFoG>Od_52??-)eXR=?60iqTAk*}~EM}yD(Pw5BP!KSHxQmSiV!i>`OU42) zC?~)JkuVhC5#STx2U`KMp9f?%$Y3Lo>)^%+7{kOt;b$yhAYdRM1160H{jJpfnpSJiyTlOGNVp1s3|1E47T_1)2B&X(h=d!m1RKo# z?oiVOtigtv3Ftsndw{thlR?ITXsA0qAvp*Xs89@z2rmH}aJ)kjJt*fuBf=YMlr+N0 z5IcO>zyR5iz5CDW~=rk4pl^3A$3*@{EkVB*e%%NsO(|RT-ZkYx6Kol55?aTr> zhFQP@M1e8Pm~45e1n6a;}5` zKiI)lAYpp}X=wcnEyt<_EWmNWBft)&Eg*iWfpQ^13??BGwFs3^B~ahj38)F^3P?gy zDOfF}EyD$Be?!_b3`Gpg;MPpqCI&VsBW7uTFwG(Zp;=`iG@B?3guyP#3Sn@FvOyRE zY@+N?7P}}1l*J*+31xALazR;KqTK#4`^^~48JNILtrP|p237_Jh6pJEg@p{9QUdi0 z8CaREH!(2HWZ)L!uwk}c&cG$e@ZUy&!v_mA_gr%2L@4=1PHl~L8klM~5?W4VoK_*;#8-uKn+A zK@DrwO$^L}j0vE?PJuSAK`m{NsQiHi3>@GlH>N?3aDyVjj$~l)1t%kiO$;pa7{ox~ vnzESz9IhZ^moq2`$V2$x@D-Flu$h4wWC^1qNFEfk%Nf`~HVY_ViC_i*?hBET literal 0 HcmV?d00001 diff --git a/tools/builtInVMCode/Screen.class b/tools/builtInVMCode/Screen.class new file mode 100755 index 0000000000000000000000000000000000000000..8644e094155ee50512caa7dfbb3a3ac7991ccd18 GIT binary patch literal 1921 zcmX^0Z`VEs1_pfwGcE=m231Z5ZU!|j25ts*5TU`rpb4V2K!i4k&|zj^`2Qco(q(7R zV`tE3WMECoNleaWWMGV9WMH$&%*!mXV`N~~&6nuHoqkaRV1f);Y5%8KjgA zWQb-M4+B4g01pE%10N5AA%i#%gAs!2Z*OwRTXcFsvGE@ouV_DD?5)(`V_%`MGIEXgm@ z4@oV`&CE+INe%N2D9TSSO3V$(D9SHSOai%%ySyl~B-J-HH@~Qok%6lyH8BOoVbSo^ z3}$5DNlwhkaVyPB289$OgP4X-R$^JAeokUux_)p;QD$DcwWnq-z z49pD73=9k^Qi2W)3D#0O7+7pKF)+vl+Og1sNF@ zGH?sA3b5~BU<;QPWMasWN?@;IkrLpqtJuN7j&3&>gA9W#)KCis7O)?5WM(o*fDFx$ z25FUsYF*ACO4vM31~~?KhGZs;nISd@4EG1?vveGGLtfH(SE^CPyt0;>o>mq0XnX!qo z&1B$^m0rleE6O&DK|)4q5reRl8M}34IHk?FWX#y5Wf9_{oT6N!Y&#e@SVdVgL|IbI zxIqjv9#I}vQI?DpGhR_nQT9a)`l8%(7W~@S-;J7wp6XF!$ml5EvOQ|tqmljaS5M@a);}B&9xt>#$a~6Y&D7z?Iof#L% z^k`8IFmDF~yEIF}WSbTah2{TWf@B;;IYc=V%(z53K>lZM;b0Wy5an9LARx*i#JPh3 zB(VJddysaRUQrGK1yRnF1T&81{|}&hk_%MgK+*@p3I-N%W}X9bH;XL9@gNshKpZa% zbv(q)98yp}aKb#pCCV|2K?)S|qHJ|L7}!O*V18K6;3dil3Uh8zPO!5fvB%!R$=JdL ziUjUOAdO%Th;o4`h}81`PeJBE4a1UOI2n`~RG{uZ%fQOO296|LnUDt@H8Lr)8Kk9T z62NI)NE*cDk(Nn-r*~eEDrP$wGZq$^6f;(7QI-^GQI-TL*%T?+gdGfA(y}SivI$b6 zEGbf=EFb|<7TF~XzM$M7Aj--ro57ZlV8*(fK^VjlWl7240P$N`{O=B1ZpFfy*fW)CHgBclkQ;QOdQ+*PP!Ri?q zI5P7}!V+^zQyCf9ic?EG^I)ciF*2~{rI!0-=7HR)0k$P6F*!T9ATc?Wk%2oUzceW) zHLx_lB$bCjgh7;%fit+WSTD7xD8Gn@!GXb%k%7lIH8;PgQZF$lCqJ2o!HL0{k%12? zmXhiS5p`j3Wn>V`N-Rs%&q>Tn*AFf!%FIi5DosmEE#hHtV{qqT@L=%dVen$`W@KOh ziTHpBUv>sR9tK$ke;x)oh5$wek)+bhoD$ExFkeu}LQP?0kVF;sN=(l74|dK;EG}kb z(Dq17&ejj}b0IOt!#1A8bw1%@L zhG~!xux4c7D9ML}2_u7u2Btb|Mh1S6OCV}O^1(4Eip6yx$LU}b$8EK=h9{PX9h(EAqHUv5a4BC1f>uLMg}nk1_nU}Mg~R(1_oBG?F@_?LGlco z4B`wD3`}5YeFkO*CI$uuWvMv~+(JwOd^;GJ!-ZI+SQB6Eq#0zO#)vR5fo*Jtt{M1VW?VmDVBsC4D6W3$}z}8 zjn!jdVqj)qU{Hc6wUwUDz#%QO5bRQZkUdhY3DO`#CSjVQz@Ug^3Jby%JFqFT5K{!; zrpWAIV8wK{5`!|-6iWtX29PPbQac#fZ6OY_la*Njc8nm@7}*5r9Sp2eED5q8zp+YT zI!gr}W}48TmxY*RBRvajln~e`mIP^*6s#^%g$JY^)I~wZ#=s}N zje&m~1GlfvHU@#ocAyY2V-aPMT?BTqFx17eI~Z7*%~(ZQWfw6>NUq@ CKr_w& literal 0 HcmV?d00001 diff --git a/tools/builtInVMCode/Sys.class b/tools/builtInVMCode/Sys.class new file mode 100755 index 0000000000000000000000000000000000000000..0c15f1b9fb855912121996b6ab5892b4b3bb8bea GIT binary patch literal 1885 zcmX^0Z`VEs1_phGd@crU1~U!@b1nug1`7@bOAZDr4hCxu1{)3rTMh<0kgz=mg9C_m z|@4hCNi20so4e-4HK4u(Juh9C}x zU=D^54u((;hA<9>a1MqD4u(h$hA4K1Xf6g-kmWHTIu=C4u`|T8GbAuFu-RnhWtP}6 zGB9gshA}d*IOnINGBU7$1Q{8)Tq}}O3raHc^NQIS5*Zm-G7@u27#Uc~6Ei`SMleVV zYidzZei09Y4udWu1GjH#Zhldv9!NhALlQ$WBLk;zVo3&AfRTYaIJqb_H4nz~FD)r3 zErIfQy;Ccb@)L_vpnOi>#LPUs+{Da0Mh2aLqWtut#9RfB#GI1U6e|U|oI+Y=US@Gd zYKlT?MQU;>$gMmKDGaHM41B11co<9>OxPLHco@Y&Q()B&_N>Yo8 zN()L-Q{et(WDtTnuAnG0uOzsnC^Ijek%8GYD2Rt4lOY-8w=6~meq=?Sc_oYtk}jo1 zi6B=f6DCC!=7NzCnmoqX*dgkP$rYGho6l7MU<|riR=NF}9 z=79`iWRQT#7P)60v2a_yHOvx-QW@J$I zO{~bwEzMQPNzF?y$$$q^UVfe~%&UwHQjpkC$jnPgtx(7>1&2jaeraAxF(U&XOtM%Z ztu!Zxk%1o}keXXiQpw05n%d11bwyrmyp zSKaSdw3)ACg*>3yz8~U#LAH8AbW! ziAg!Bj0`-^JQcZ!{Pu>kPFxn3kp*6 zQWzO@u&B_)a5W@otr;0OO7bCAFfxc}V5+lbP-M_z&}IMuRt82;Da63YpvS<#AjrVT zz{tSBz^b*KfpH^9o`I7=pFx*_2`p^}mSkYi5@OoHz#J~b0w!6(BpaAy2a_CNl5+1Jer>i#0cFC?&oL2w6yP`Hq=6o_KwX2ub)XXYdn}^jXf}AtdFqoWV&*+Gja~jgXAbat1RYS)b($210T^%NewU

gyOC*SS3Tkl4EA3J;wxoxZf? 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 KQ!pa~0|NkfE!J58 literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/lib/Simulators.jar b/projects/09/Tetris/bin/lib/Simulators.jar new file mode 100755 index 0000000000000000000000000000000000000000..72b5db7376b380f7f79b27851b996e7ec97b12a1 GIT binary patch literal 81810 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 literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/lib/SimulatorsGUI.jar b/projects/09/Tetris/bin/lib/SimulatorsGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..4d36e646cec99860b95b683cf28f1d5cba97cc48 GIT binary patch literal 68492 zcmWIWW@Zs#;9%fjSURE1lmQ7SFt9KLXXcjXB$nhC6}yLe>O1;`I_KvW>#{biG#Dksm-5Nk$)aX1LJbenpp=Xv)Cyg4tCUNI4|_kQqoSo z#VPtDH_JYc2i`3Ed>*`1Xj(7uEtDx1L+KA^8LEDWwf->EtZ6^-Ug(G1$9?`c z_&o~T+T__D#{3Z6cwXRJGLyaHr{yg36xYrdteAG-yygjgjz5zQtWWt-D)8!|rDUCO zi`%B`mit0KWE<~Ke#5`yhx?&<>L1jV;wL=R4>}zh&iHq7)GkMbjp>#`Eu|mISEe2p zJb3TSNZ#t14=wy zx6Y>Ax-{up+1VLaK5w-6slyg1v@RjQ&ilsw>zSw9o}X$fOHi0(Yrntec5X^Q#_6c) zw%o6~B{gCv?mLlCKCQgXabxx#dkiW{lcFIow z^njb2!*8!Q&17G*%uH9d|K=awh^BK z<0JzOhv{#ZB`%X#aZ}2IJ@$mB?!w}|pYB-L-s;E;s5}%td#2RYi|)C7w>X}g-E_JV zcIU`W|LHMvz0Hb^Cd@J62`s#5@vby}TH0<2kLkxI7rr)P`?+w}Tb`P?&osQIY{{z> z`MdC7tjgLgK~YAz8Pm?OI;+iNPwNObG>J&Ro|`daTpp9O$sD@_4YPW1G&~`^oF~1+)b5Ot`W7maM$A`G?Ir z&K&JNUb6b`5#3((jdM(zSu^I_?qW2aw`B!G$m6ZsmTlhZ_H6Cd`Iic>e@I#)E8JbC zXXKG77<|P=?%A!$K_6S%0t0go`MmPnvW_R!_|}|DYR4XLG`Sw~^QX#}5SwRvm@?mc zu=oqTf3(!FdHzZ!`G(yWPW}mxZY)34%XP=)fkb2Z!QL58@1DAf=PYD;-!@xv%GtfU zxb85$4}1{Dv|Vt=+yh$;79Mz9FrBIVKq=Q9&iCn8)~^!XG5xB>8nL{v8%oO-)(jp)iF5OPsh?CnvV9ZRueOW|3Rez%N|E?z(s0 z0p0>xxi@okbKV6+*k&gLyzM$xVtjE+r2i|;vl1896t*mG4P*G~Tux#oX^;da;ig~^=tP2L9Q z%&s-_?%TfdYGUHP8&{^!m^@A4^Td!1Tlq9|X5@ZXyDI4a;-twonbx-n)}msmiaDj9 zw-%j}n(cQs!KU%;9i!lvXAe(QD|xf?%g*mP4&JYB99y+(_oxSIj=G^^WJSj<^r5EQ}BrT8( z>)^9`^UuudycZ9{eUA4tTW?raxo96-}o=cxSLu8Y?b;_kJE5AzI-V>+0viIe;!pln!{9bH5eUZS+ za~F3k{U{#O8M1w5m%Q2JX=z&?X?Uvrm^<~QklUPBw@!$;dreiJ^1GmN23P*J!-5kT zG;@*t?3-jLH7c+^l`ss2s$9t~2LC(?M9iq#3irw(vyyEl{6Yovm zjtFc&F>PvV8t2a&Mk~%P&*j~1@|)uv=iXColT$sd7D~GHAGe8@J}UCM=$xO;FW%2n zykw8r{qoZ`TerJjT9rx#pwvCzXW7Ku1dvprP*$#94C zJ3-0N#AjcW7aPP_vvMEmUbf&)*r$Vg3+4wzwR%R(R12|U(7Tsz9%7H`1N|H#MjSr4rjam)v(dn^Q9{{XKn3-(`GmKpR`;r zwqKx5e4+h)&lQg9$16SS+BKYYUf~yt`@D$vJ^+8Jc08l|FK1zO!0R8d)dh zvWeY%$fCx1Civ9xJ3-sJf~?|qPdWPHi0)A}7tQYUo&POroOaYRq||A@cll_!x2z}H zMltI{_Tl{ZJaeSioXW|01jYZGPdo`HRYWx#D#{ zIV)VA+-cK(x-Bf{*A|l)-UIs54*!?HQ#U3LUwhz2)1+T zuPtRV#g?y8Vite!Z|wp7CpjM%f0$8Fud4R!aOrKO#LMZ=_f}prYyTMSU%RmHQ-;I& zne`_<_B>BUCZZyFu=>SN|!KIYL_cj*9av4{&SGZ~1kvs_whg z6ZNKxe}Z=GwtuDFYWz3QzFnyB*AAbxP7`h_TlpQ?!hT-!5)C^1^7jI%pQ1vX9BBz(13P8wpYF`Ene?pcjA6&d*PT(#oiQ^S zyIt(&Y!~b7?lfn9z36Fyr)7>tdoRcGL}Aa^GVb*4Pd3~>wQ#Y_E`eJ)>B@F5_pR}* zc(WxudxhfkuFdOLpSAo^kb7?BdXXo}j~>XCzYDk*ykmJq`zND^e|SogH?RIWx9NmP z4rj9ejyttKY%O&UwC~!x<&@-$#ieY&7Oz^fE?|A2xX)n+wrxV&b8c%&Y_aBv_WZX~FYSrn>ysN6YJT?7rVO?+ zL8WcWy<*jmgbRFE*`vq2e!Jn98r3A#)ZMw0g%U5VEUWbKikU2Q-9>lzDYL-2XR`u! z+nTM)UcAf9HFZ{Q@DXpdL_vOyr^&2S4^7iL%xxkh7Tl(6$39VJ$qh#@8JE%tN_}&h zBG}vtm%X|eWVTRlUYo6?1b49w^W$%|dJU4>)%BhSGbTLbIkGsldU@jg#RZBFx!m>3 z=3Tzu@bCGIhj;!N{}E;S&mQ2-&Y}0rL0~#J1A~W?^2y|0P~-058J9M4S_D-7cWzjip?z0@Jra3-a z!an`Fo^!+Sw%=?&BQ>szEYG$H&TZjjKOH#zS*TIvpWtfNtFO*`*c=l{WW8w_Jjb}~ zEobL1?n(9@hI*-DGS7c7fuccdN6CK^Mh1qDjFd%#5%y@9AJihgOkDb|n4?#Vf{4f6 zV_WIctq~cqF<|2cuM;mDJF(6`NH6e4gow~@3^{tb{ZT5sd?D*cB zxz{>H_}NDGw;wwX?w!nHIk(0;)*_-fG4bG`UERD-dehd$zXe6Z#7XUM8(anZIgTDt zP55-qdcR~*yzr`esdCpPI|GF-eckc-RgCeWY3G-mZ@w0ht-8McY`g5{k8574r7sfk zPt244=sB}sgG6~&oakhA``++?#XozlBs&RCn=s$-sbsSGya`$R6#h0(nH-dM(z8z= z6cO(7oOx!93=CiKMuak<`~Z!H>FgCTM+F~+Dn&;ntb8oV~-5(7Glf?PFwFQ@&`fmm>eQ#YT{x1Dvp&0)L zi=&T(b>vbE4=J5bnsPK#jDKUrjH8lb^HV-@bh}5^oN79rv!ZSCogXIM=OaGc6sS4Z z_VR@Ax*O~WpU;OP4(m!;&pF4f1;iyYL{QjY(Sbf5K`%OQD*?*^t)jxa|pZi1l z&)o1o?Y#O2>@C;Te|)k3@CW%H`n&g>c%;gGu#L|pD}l2+NGx@VG0z5$O&S|7Y4s;u25C=?T6(3`Yi(FoZ&0=%lTGc)Yp1uwt^3NgHau%> zq-4uW_GNt!}pk`wJ#C$?H%zx{gI&C{>*&!ujT<62l{<6Szr`$bvM z-MmXXSoi+hmS>iA{O5LFi&{PY3p~+h1M(iGC`~R6&YSh9ceO*&O_xoX>u=BfYSFUE zC9T??>D}_ByM#2=ZLhppS{>81yY3EG?56FWyhSl9?>J1Keed3Fo#Mt^k=wsqv?lIl zS-2(fVVu(T3R^v=BQIZOUUyWObNRx(i4rGNWut62SNca^?sLh~Uw&%Gn#U`jW|kkY ze$?l?+N1KO%lm-eHx767%)UEK+Titc(=8v52z>RD`Cf8jp56ZTL$4N86gAuWUAtPF zbl`OAooOkHcHe*NIOFbuq9-zE&33xq3E7sZ-M@X4rZV@}-Ojt)*>09UW4W(=XQAQw z4wdb4-YGXD*Iu4=YFB2STWaz2*(Gz&-1yM9W%k6g9BYltGJ;RbbIHBSTCAfSaqdCF ztVu4?XWlHzp7So}koVhy%X{Oh8umW-=_qV2k>oB;d-!h_#|D1Ysyk^r^;b-^d?Fjl z%b4GETOdpAKSRYAKgRZj@eY%YGIWb@_a9a0ejTwSG9@A<@=1hDV&RmdhGNb->(W0O zRaiP*Rk`2U5PqnaDX&TTrSq&WyB7pxmYb{Yn45Wu$KvFY>-(4JU-Vv>)Y}k#@GOUM zS8Pb$l-s%mn;Whl$QDdGI)7qA^uw!6b}ZXD*BrHKyj;juYd<-^WM&nk`2lT~Yma^6 z>ZcvJY2p4LW{!LGhd1}z5B#j?YcM|`E$HxIXGHSDN~ZJ2S(&5@79MbmQ7JIgyP%(* zba&$irbh1#o)3az(jFEyY8Na$5L&VDz*P}}bq6Jxu0L`WTPM6@9`kOAm#fvvA8=0R z+QVbck@M_$t|H_24LhdKmfm>vkS~*YaWc2wh7GsIrTtE1lb=%`G?(Lj+`m9;r z9f@VKe&DC&^H1)s>(3<>ll7LTZa-kVBm9Bgo}dKvcj6TdWukGd;g^re%~##38NH{` zQQ!5Y?ewl48Qy`rq9*axnoAy&6{+Bj`(3|0$WG>s(2d?Lz4wp$m$BRToX&jv)Yks> zn$KS^|BxiLr8P( zqE%Do-R?7ae{Nhe8 znb2Xiy}UYCIBvsD-7ivW>?W^WP#t^DGiZUMl~atL!{3yY|I>_WPbp6f@(ii0+7_U- zQg&Hc`*iQ}-A8|)sK357c+RXTg|mEgZ!u@?tkh7vm~+cBRin>0uDs8QFFnJ&G~HZf z@~PVG&sBf_wD=;Pyy0DJx=_@G6{oHq3yvtj^ zxtucHzDQO0TUXuY;Mge|k8*Y!KY6-o&hw2YSLLssyy&r8?hdbeA$zX=t##e}^!EKH zg;iR|)QXQ=ePvy-vBLSH0&{joMfY^S7=Ky6B4?wE(}P?OEc$yxP2Wc**0`Q^OIR-B zVf`aQB8$C(LpDD1tqYc_?_HevSnKAI*B%Eq%rUBsIk6|cykaIxyw{b>t2W2HFZ@5{ zdAI)gdGRqOU0s{Kj9r)JIVLxro&RW_iJsY1?XA3N=5wAd-CV4>wrNAbojk)ppSYDf z@4fL&5eg~zVeMrdTXg=g&9A3d-R-yYIWnb9SQah%mqG7g_tY!QQOmb{+ah=6m(|+K zQR!RGWzD_(tK*vcR=Z_iCtSOp?YrGzU;TNwbpx_*WX$spJJMt7n)wHQzoS+(|T2T zLxN6IB-deoPybENOx7&@s`??5xkmlY(#FyynZ}o%1$bKWir*~^s+#)YXh3!8rD;!7 zx1UN)-WV8Ro_F$U)=8T+&)fI@(Bn8hZJqqG*yLR=6ZIp{dtZ6}@KUYO40Rua_if)_ zq?%n?wC9XeRqu4xzQaYAq~)3?t?iz9N9SZx;hxrc=@P3_)4QYc4Eyy=k9jY+@Z=zFUVHIFqj z_~*5)Ro<{x@biYbaXvRSZ%k~Tn{zT`Q{vM^@z=%|E=F?tA9dQ8u_jBT?0F)8d2rCT ztiAmu2h>@36c=zZx>hXe5V+9NpvF?`bU~nLmOw~Ldl!eJFGp6>Q(+zF4JHSJS|+=) zcnjv|$CCi|T^} zL4{R}fxH^u8K1HRtYdsCv|%#`h?WX?$gIV)z=>H)B_UZ5M4Ko)V@_fdxZE&5NT@b`1)y*(fDqtmJp}c^3!w$A1stI9&3hNjPc~^X53}p*g$`~pn zpv@GL=`fY;O3=f7lT80!PP}w-*_;;_Zf)I|S@fvxYW0H2r=EpY?wB>Jv?@;a@At|I5s^r5BQ%|yQTY5&LechQNzPOp9GIi~itnWUa|73aPk?{Ui8+-B- z7GH3EziaozxQKpB-?oQ`Z|$69GGC3+PVnppcQwgn%$IoXzt#_3KYdle^u3Q#?Os`* zTkJebcD3}&PnVSs_fL$uP~>q^;&3d;=iI1!*Zl3FWlPu`uU&GrQn_p) zU}Q40i-PLmX81S zNHpxkk5&APw|~rP3AQu2b?UXxy@XH8`cFg)-TRi<{kFPY_kGc&?-re|_tHN#ipv+Z zO^%!M?U6F4{O=2W{u2LIww%AQ^+?Lib_2Wg%%k1@q z+jNM1ol#`crZXw6*$^s!&!Oe@C!c6@#(V#8JG7li`ZwFLMX`&U4+jfRymzsVQBZKj z+l#@H&YqHwy^L1xV*D=JxQl7ie*K~a^;6EQlXxiFsC%(a)vP)}=aS_bwJkjhmsNk+ zS!ug;SBlP4uO7{e^$dQ|xB3A4 z=XpUptk<65%+ZfY_P8F@CM6&6{L7al%K-I+*P)v2?Chr;LcVTYu9T&B*oXE-#-|LI24A-Rp6ywx z@0>kpmyo>IYtGeb_O2GbXJvw(g;;GdT__d%aYtH4m6zwYteHQTY?8Q|%q7jjw2;qw z^`?Xyb07RJ@G0rJ*R`kS`MG%uH}0#cjgh`Op}n*?F_%?Bbn4Q>?Nhc)e5jS1V9MzJ z>HN;EL0-2ro3lA;HhfrcTl=7F`A4b4vCK?wr>+nDwog^DnfbMdhn)1Yhjtuq*37y7 zvPAHr;wTgHX|=_RQ>P4`k>e|;Wy%t9?=(h6mx zeTO3(r+s}Mer)lK6oc=JQvV80`zRqN&arOyP9wg=fMWua5BofdDRW+0IsGHcyeS(S zG$rppW|!nzmU=`&f5pwFSuY;(<>|edBj}N5^KPy5sUjdW!0Yk62b+`&8wvwxA%q@$ORvy%hq>%ajtBzkuDRi9ebo8%Iov}o`XqU^3@Zgw` z$Sa%K&KC>j-e#LJWm3T9u$Jj<#ZKMQ?rZgZkHnp+3-y*+8qj%3RJiQ*%@CX5x|)SI z!#4F^EB*Rpg_->-IrE&uJEmP+Hu=?teGVJvO_+La?UBrh)>_vBFLfS#DS0Y?>9e@r z4E2yV3*;C46|iWK+Oj}iaFYB&`C@UtNpiXu*gZwC9~U&cT5>dR>lIYg@1AF4^|%g4?UG zbFyX|dp`@_uM_;EUQzq0Ja>sy%#qcSn~ophV;9n%a@k?d>5oQ7j`&GGd{lZ?*=dR4 zqNxJDjj?KFlP}2ZI4IWCDD7GBX;p=lylBhuu2p+`zIpEdvD|J)+l5veoyNtLGwkbY zM3-h2+>uJt+HqUvyUrxhJ95Wu+e28lKiN@wCcNOc%y(mt@Pg}>?|6E+-l-j*yY@w1 z*`4EByPCy6*~S-C>78><+HN5%re-BkEcx){uh=?qfBy?d^$3U9ypri{Ciz1*1pL$}#ApF5eG zck3Lvd*{M0GvV(W5}fyj>CNw~&MlkYx@Ug%=@WZ(B23L99HfrcnpGcQvODoPQT)O? z@zrZ)R-8!VkM7Wu6Li~gx9+>>e(ki#-G_6QseRkw<&6g=~ zIl8E@3Ac2=+5yQCv;p)|`3Uo?F_! z_uOA^x1S;6hWUhp%lb^X*tTtu)pO-l<+Ya5Vv)4`~0);?h?absbOfvGpia%kMD0xKJ*g zxhd+hHq-$0Ms+tQ#k&ZMtE)kuBEw>JhmjwX74GFIS&3_v3I# zD6>otzP;SZz;Qx9*Y7F(Yghl9v2)UbT|V89IZuWtIc}2FTD4xwJ)rRM>FitIZ{D3h z?eyuU#O4*N^G|6koVCg6#)?mDhbD$hYh8Knbym2Olkb6y+J-H+@;&yrh#X`q;$F5R z;mb8`p||BK$twT#Cv{CM`mycP%NITIpeXuVaNacIOj)nO_*vECfS54%+qDzCZip?Ch`o^Y8Ct{!n<^RaDy4V#kX| zLT0fs$EIqnn^kev@%TaBwl2G_(DLbt+4U0Ytxv2@UtRosp?ra6`z&|;W}V8ZOO>vE zm&iK2eWjg{Ro{wFb#spWVmw@yUzk~cWP?abd(%QgL8}uf6PGxKEtz%j-B;%}tEKZ( z)l>6Q{i+TLYel_p{rflh->l!0mJ8Rf_-rwEg2MC)Wj*eV?yhg+eu%$*`6I%`txP$r zal)sEiEDmF1no{eT=Vdt^L1z5b*VdOuCnYTCb!HK&S$rLrYk#@7V7ZyjF2?c?tT`J#OI|y!*_|kQcGBeq9@!0BzwA45?(9Zx)iC**rmv#k zG@mUIyXJLC%k{J1?yY|ovYb!e%VN&4sdw3?!_PFejKivL)h|1^L8tm!-RTv}UR>ZW zmHojAN>BHzMCZIi+C`yKTo5*`s^I*M4|VD$(I!D*0({dE+hNQ{Oc{ zt&{)pO73u*t@V~`sVBA^+Lxfg-%@p~I%rGF6o1zX;uAamDM-G%ZTrDwnetJibg%NIA1YNov`3qT40jF&gY#o z*cLl3E__}uRWqkzMa|2ym9|r6EiAa?<}C30{m~tN%nl#Ae{|Az_4X&ab5a^hUnsIk zn07~bR5AYYzIaKLJ{HefiHrrCCKy-~;+_4EwRx-)w3gtSAoem16 zME*{clY96uaGLG0E02xlC0tgY`B@~`U%P_s{HITra`V<7;oj3Op1Nnrg?Dk!j%tTi zh^{v*om3h({bO5G?}<|t!N;PF?oHcZuvpUV)>R|-U0dv&O}G!g5J?NWacJ5CHQ(SH zXWO1x9GYmbx^hll`&7}kmYce3bFIHE-&M7H^2;aZLbCIp-($|?3<`28-JEK*E^XJ{ zSrf%mrIm1v+j1 z(oj(Il-fbxuac7&EZJgrKlo_a-79zB3Y|*gy(^@2R;2OUD~{^fgib!sd4iRy4m zsDOIJ>6DhoYjSdOmLzxiR{Ht!E`7C7tM*U{d+X}-kT(bXM9URjmm2?62vOM>?NqXe zpHupue`~>l@{lcya+6Hr+mF6qmEqRi_19x%1^@fiKN?o@UtIb~#4hNgq2KBsEtT^> zeURjzzqv&GR_KzMznIdU{{J)F`oc2NYFFx}|HfMTj)V(M^Y5(R%d+B!)cqAd#O|;B zA(tNd<-vk3`45X*Dz9ti@qL=ywfo}AM>6M5Sge1ZbvNg~Tr|Ezjs9uxS{dfloY%=KOwvxNTj{Gnl!PPChx=L0Fg+jW@^Ns(eckwGk)-c&k4~p=9ci66U?Yg{v-%ES$dG^1~mf2y!`1o||?7CB@ zG8~J->8quQdF*d#vFON$Xs(=?~6i2hO}G(!!Opbt9+Kw>URem4ypa>eTPAZOhYHoIm^Q zg2zkx*Hz^lE?e||L4R-Nj>-SNB>XVhnpwXr@7?(;^?zr^@%%GTl&%WRc(Wi>TFHem z`jPSsF?rX>^BhWtHPkmXc~nXWO`K}0vQDba>C2aSKU_7G1KI<9??^sBXwO-_!Tifj z7rURr8iMhU6Q6~KY?$1=;+w$J&Kaf?b0Uv8=d!QAUNuAXyTR@U8TTc2JT)=iv2%%9 z<&5AbM-Jau)p=vp+@uTtXiMhwhJ20pQFEGy~UG6#e?f#f1G~tXuDg$`^3OK z8@_DV@nGV;RTq*?Tm)7goVs~miIjcA!Y?8z@l}%!_a}6KGkR@;Nk!w-)F_+DmX@O67ta1Bc%WL{9 zz^`(8=;9kEtnZYZ3txF;?~Z<-$fasN!IttN3j6GPuDCpQ`m|x9S2_1u?aX^#dsO$y z{0A?ASiHP%rwbbc!%~!<&$0=qOU|`1>!pm$0-yZEl++@(%$!u`jQsrK)FN2tr#CRx z`>=tC?alDqwYTTw__>PA3E1BLYO_*CprnXM+di*5i_X3g%G}gx@BM+f<^%hW#YeWB z5&xJduJ`?3f#12EC$E1$uFfEz&DXW!hQ@+d34*5F-eOW>(>T4X9{}-BMHHP%7IO*Gn)XKc#$NS>%F8P6PvGD2;Mar$pVN}w#|VlrSthWE z-nt&s#XarLsgxsZEYfinON3utc7MB>Q}~wsDFyY+{1tjKCb1DSHg9;8B$}FB#dh_Y z93#h_bpkq^NvlMHS+4qMFMD*(e!t|VeQFW^!|k4U86Q?TQN8m2T1geoS)cw@tl27Z zz5d&gWj|XNeGE2=^xkfG)lJHBGT*b{^~+US`%tfoe&srdI!cKX`C68iFy~rx{%ZjgsbE+OT^sV%l-+KO- zPsV?X_Bm;L7w#(9@aE8=o>o!u)icbOEf2_jE8KA4E!V+I3JbjqT?0;U71Db5xBE6@ zx5>d{`#&j$&yrMgymCX&5W+PiLp-R zOEccTEPIxvJtR^zY@Ta0S)TDX=;b_?w|~KfO6QN_mrkrV;-7c^2e|zvxmlythLM4R z7jL9!5|>XPO}O5$o7KXhBL977r(JsKFnP+fP>pISEn7r1`FkTW|i3?niCh@47C9I0$}!dzL-E_R~rG1MfdO+NMuaS$eU*W@hnu+wbMm zs^9HQf3|%8`B(;l!{-_A=p^cX>$;)7P-c6`qbd!bT`nc;6DBDn>7T#KP*w3p^rCuV zQ}dM>Z^SR^D?ahKBs7sx%}TiWq(Zcvf+F+eLb1tfI+}&j5<1k|XYh1e#I#o3(Ryfh z=bTo#!OqDiV;S$9eQe8k=d@VA#}5AQ-4zaplx$9DyE9jG9Il#iQrV}kt0Lr(k<8``1f~L#2w*gTB4|YdHu`1(p!2OW}fu*D*u0M zZf8XIw6MpuZHcR9?l3gSc(E#Pty)QVn0GYiUAN!8|6H~&;zN2RpjYPb8 zH1=xg8|;g|xcllBW^ReUuQyLSn)6no_iW#c51X35Crr&eyCo#{>f94`dMp+$5$)Q0_S6Nju>R>AHgYb@daHLT|HRcR zJh!XmHt*9|JvsBC`?-trp$QZn5&b#28*0)*9 zj-TLJp~<*8CjHa|(O~{dKabAJ@i6|p?X~35n{xRJu60K>kox5jau+hCk zw~g){+|9J?U%KhZ3jX)qKOBy=|L{1LIcLI0L+hU`o>ryXbzW&6|GGM5&ciu=1+NbX z_bI3+g&bRM;r(^K{TbOU>RMa2oVqw?a-rOOPL12!T#r3}^Mq-ifWdxW=@ZLDZ|y#L z@#ya@2bU~da>eIj;n`>{hLYz(R;|+h+RIkX%K5aYNB`s1)LRj5M| zXy4ItqkZY0nCqr|6wa?>zr}K9FHiA1v(M?bCoQa6o~2Rvct?ZkF2UUV! zgl(m7mtQW>+jQCTpZs;r1aHotPfey=()=*h;y4lMCF{A0ljj+Y^iZu+!+i9CGpT7kcu`rN2p zH#6@%cDel7c%scQ-nr|hZjHU@8Svcl+3N$^UB~|J{xRvv(kY@wQ$pH$*QCBT;V(>y z7M;7R=klMU9!+&;HlC|eUcFpn!bw-FpSz#$(c!q7C-Jf@cS85^&YLfD-o1QYEw`UP zQdP(^?wIX{g^H`JmZyr}b1VM0cx8WO`_##c8rnPx`}UMqyu9^v$L%*xt2!(=S3FuG zd6!Fid4S1f>n$}G15O5-hF`o{;XT7QUM%}%v$u<+dHthPJO1BR-db9nQ|6v^{o9U{ zvMZf0YXmzlDrdjA)OFLB^~W6ND!H-JYkOKRNIM} zMvV@_?g6n0%}3fgc>5QqS#^1SxpFDETJve~S+sP1Fr8NI`T^9x?hzi*TM_QuPo*-xw1JUnso@f?|F zRTw2iX)_@<$iN`-y*~Iqd5n}*u;CLhP6+BB9PoBr`fJO zGc{#{@echRW;ZgFr(0c0l`VM^{&d5fWsYpEEvLK#RN@YJ~gmvwf1 znS9&RwEKHoi%W#wGj&8C*7|p}b#wL~xkr!Quh5hBtccw*=hcnRmBIJY_f~(Kd@N$F zIon@}iv|m)9sIerpsgNU&8_%z@YMu128Kjl8Hz zjSRmXCh(7i?WCK)Z3itR!>WzU}oI06dQ5Jwa+D=KTT_y7M_^WGgn;4 z1J^T}Gr~Uzb>C0CARAU0c~JY!%qbtUSk_kb%A2sxG}v^)(5Gc%gH3ezo)>#`J}xq> zpDC`~BswD}(kLu-kKSU1g?hVJtiN|D>`2A22^UQEEm@l>z4Fnnyl275kE7fqY=u&y zzcVt{R2`mHP-I^dm2>0pE`y@fF78R2+os0Oi=3)();r)7lh7kQ>(q=Rb2o9TIPSR> zclXL$X`xlZvYUmRn#1}Q6b0UBcA0Wvj>Vaz1&28NT;?3Hsa8tuKT*ka*(#k^^^(k5 zO^zZ#uNhIt1mf1{Ef@bjFKfC{<|@~tmtQQ);xBhwTKFR9qs1;28T(zrTJsL1iiTH6 zx^3@L|2U;fY2E4_UDknb0v5fxCH(Jq$(GYMLN>OV zt279N9GU$h_@mf8H3{=obEEIX=~*vbdwb<=rR-oi=MUU>LqGD}TU!1kJoo*ykMp{| z7y2J%{}FJ^UCZv6x|ZG1bS=B|r}_p99(mU+eUx3J{5V?l{=;ff`v>lvxxv4@PF~1a z9UwE)bGe&I^pdlz*%zWBxB4XBVy`w|IkU;_<((DNV*PrvTJP)%6KHfhpsxG>PK&kM z&rMgSys#)L+Hy5C@ls^GO_mGa&OL6z{u_1AD=StBxMW^8S*)TaR`KbQ`?IH((nakZ zMeQ#WV{UKp3Q6ydXE(q9`R)}TU4PF?hNmvG>T(Rz4`|KYxu`{0bk2hVF*U&t=HJq} zm6UqHNat6bv(?tFXBmH17=(tOe{|(VO{1|##u|?Yi4iu((hs(qC%BJmAd-A2(_V!gvmItn0kRKRf{EOE%f87q| zptVm|Z0oDt`t$PT;ESI-&j@`zk}dD)`!ZT3YVwC$6|0I)u&r_O6KUJ3<9kKz>NH&r zsnv?syETg9e4JL>yQlgc`}+IJyiYqTZWwp|Z!A0WNGEpn^cTT3J?rjh?Gt;ke^FOH zTlsS919#W|u&({}&Tl&7+r&o~MV+(xZNDy_rSl-Gh&`xCJha$)#XYx-^J^40PxGmi zJ~dBLt>#Ji2Y)C1b-#<2Yx;`5W_ljzL`=yr-x{vb~oIf7BcuSABTJ*NS`=5-@ z37hTdW(%@Ewyb$YbA*jwck?l>-gKtkxcJ4Vmupvlv3h34dMAE`Tvv6Y!%BJPeL?fr zm&_FS`a3&wXaBRmtrba$`T`xiY_hq^n(s1{m-oo4^BjJxu65u%+k-H98D$^e69+wy zU8-BfBWooU_11YcbB1XA54$h&C-lBJ1{D>|Dp*+2-Q0fThU@E?EqYq+#}}Qows^dt z_vsDk$!UwcOd?5>Dkn=Ntne^ zz~jLqk7EKdLRy>)o`$Z!^R-PzBR@iQq1P&l=y`u_v%dR?3Gn${t@&G3yLa#W{rlya zITB9xR{e-w;oRL6X8uO(^09*1HyfJD%;)Sl?8AOIw#~1tI*+CBelPorq!(!~5?`bq zb#Ak3bLZ*5xp;n}!@&hjimZp3LOXd6&$w_;&D>~ll$*bQHs@W1k4IK*Te+8W$@WK` z5eavue4FrN>cl%%*>Cl_SdT1fxFhX<#JHBJY<+&5gOrb3X`_*@RO%f z&ehdBTHHjZOS&0&Wr|#q*1U4U@K{KT!MaDB?z0nS90_I()>`(_=U`7)q)oWtaf9<4 z5;i7=wanz*+@#QyCfc1L^x@30>t;Nn!a?3^-g{jbD@hRg>B2u@`U<+mHwr9zG=#~9-G6@ zPVq+ixE%0IQItEoCZh59mx>(KQQIG3TH14dwO;d=E6_QvaJqHel!d%sv;r|7!+ zsjSI{rhih;WUZ$#Uro8){CaQfo4-E~{H%4dT|W8z^+Z)Km$Ts&n*$QXO)tA`(S05` zd-axWFEqse7Jq$q_>R_>ebbu?-rrukZ}v60)3-j`Pu%n2sgkMCQ;(-%%jf3oIPdp+ zndU$6C=|!a5=M4r28NBS3`qN-(3>5K7+K20#RoL}tswEOS0#{QNn zvrwfebs|PNF+P^&%;qwd>{{OrUo>-WHLz9Od&53dGwbFqmHx#|uEOP(?+!lN(UdwX z+lI$yi>1|zq8k|nIZ54@Z+*9vd!Tq+*+imCzq+~fZoJVNxgYA24}=El#P4}$Epn0Z z*OZRTxVvSqP8h#>Arp8&+I^zPM&sE>(!-N9es6ky{Ltb_^1-V*+Fl*~*lG5$?h%`b z_TMf1E*3$Lw=mCiwX~cP`O+#i z#w{n(wfTk5k=^S=GA@1zYueo7MfFjNfd17hGO6t<~JHUFKz&`N2Et zPkPtioqyu(&H8|?*=|iWuTEc_?bQ9tK=KPGBk!eLvll8e?r&Zl&3R_-v-CA4Z&_HA zf3S+~&fMc2;1eKKvOo3i>x>jtvCR*QwtlJJ&2Ya2!p>wxF6BUErNdNwE-_D{x3%j`}} z{PTp5uW7~WeOasH;$2y4bpj;$Qm)s_wfvL5`I$9K^9rvjf7M`SqnCe^ zhQ~ZEk+s*N8P~40=`v%hi~F4Vy8iCYvZb?ww=A}r#B9=c)k?}kPUYP?u1hmlU&*ky z{IhslW(b3=enhJ`I>CVc*L_x?d_Xwoy8XGANO_c-jV*uPHx7H zgagiI+$(0TSgf{TpZJ%yg+3uR6&v@z-8W@!|M7{*rZ3h>&MZrP($2KHr|h*R=3>Ve81AMuJGEd%&DO}XYOZgGC1n1?=U&3KjHb!=NWR3Ppj;mHCs=9=|^$U znCuqIyB;D;3=9G+_zEaJENQJMr981H6<2y|4d<*0Nf-QIzkBwcyJx*O?Y`;2#OZEv zM`cT(K-TOoCdN&rniE-qGPc&nb(D{e#JtI$PX z_w~ya| zrVj}w45IT>K525!=Ua5=T20%@^vcTZE$3MS8>?0BNV_b}-FLqK{O3n1`p5nl%lbl zzYFBkC4Mkut3?{0{5P4ghWY*zVVft%w>SMT+jqG8z1NR8f!7~u{raJNhkAX{F!FFd$#c0G^3+Wbe5O) zoiv%Osg`bezu0HlOdmtb(=+EM8=Xz*IvHtq!cy(B&$1a4-j)BbegCba#ocnZ{f9?} zVgD!k|KON>++y{xiA7-up*)i@M66&;@JE?_IpCsqlztYV;Q$v*js8)lqZ`F8iC*|ofj?CoEA zW}V#1&GPkOjGRvP%sE*pQ?~4#!WQ(>c9xaW28)X;Rroj6_g7hL_w`~$}zI4l*fGEpNhu=9hvKp>led`j}*O2ma3$A6|KQ4aHAv51=>6SUmF3*$Q z7VYG(wML-hLZFU&s>=0iOS8kyhooJNS)V7fL_v0zqCi|9i@xj+X8P=-Cu!C8Vrm5M z{+tdUqkoOdQ|_F3#kG66?B0W`ytXUrEIn}Pzwz=Ep2q@TnWbf>xBWaewMS59*}Rka z$um=94g@oOE%x)5jC_)oYMg!SM1^Xc>f^;bVvpGu&SB#{%O?5%kSpi^X&>ePgde+H z(PnjQSIg<|uiI|rzc@T|ipyKQmJcTmot_zT_KowZEgw!U@|kklY0-m2=T#J%Casvz zs-u+}sJbduFi9v)XybI#oD~mKd8IpCT-WM|J=mcmR@7q^sNe0Hv{6MW<)X&46GyaA zYm3iJjg;b23NXJu<=M%F&+eQ*_GnRi=Ib&INh#^JuNJ41KUU0X-d#z}{Qj)lc#dEj&>8#q!rXNYy1XgLy;?A6_)^$A~_>Q3Q*K;p! zPJ1tKOSw$5?eSHy{rBz`J~#Q+Q&tucIp^QGeat0G-=5w4{qg03=a-k;r-dK%ZuVWU z^ox%6(k05$uM}0+E`7nKv1lQmrqun^rBi(qSLybc#>ZPZq->j(H{p(XvFIk7d)?d4 zZC9`S#ZfZ%YvKD1;?-}pzGSVu(;&Mz`06kABC)n;HOm|ck^M(P*3Qme5!8QU@hqli z>D%rmd@c!m)tkqVV<^cpT&=~yB;f#nW=it^|5xJ)aG^c_AGC{6`Hr* z?D^*!@3yO*cCRqEeEar|-btSwD!)I<4_;W8vvTuyzZc3{rccxI(#*4pPpWBL3_rK| z#kIV^jdSWW-Y=hj_OHZ(`Omu-JY-dsB2Vv<>>eG%jZ;cadu*@a@l{!;Q210L zEb!Cn%F|-P=O5+D$dy*eew6sQ%wu!swCaQZS>h(^J1yP1%>Me9s6FQlLj}_(FMld` z{9DzYgBx3Aqb1wR&gLJP?KNX{?C06uvy|8U)Kxtjc)dm>UpF!C>8$&0+ou~`-}$Wk z!Ccidz3YC){;awZw0XnK^;WNpFTT3=^zKr{drBv&y_{ZYoRSj%bnlWtzTlHuRmEPB zr$*vMYfO$rv+NXpU#^hN>Gc2nkymZW9D--c<@L-jnq`%)(*N`(xPnhNGS775wXgpf z>|Xr1emFfh(6X_#`tYO9fTtGoUW>hR{!tL9T-hc4QrRMJwu`DOhk*DN&zpv;7c+0U z{wq$*CuhS=(Zv?0-=9A6xvaw6Y@KDTxZk?WnCwTVR@Zzj`L(()Pb2wWU5WF~t!YK2 zn|A$w!FKYJapk_P--5sNZv7`Lq4JP*>m|-55zh7cdrnSYrEA|OXLjMfTHJJ5clYl6 zGg+NyC$D&@vtnAbg?`u0qbJ+qa}J!!sC_RRXZY*P&p(cCf*VXY?HujKKTbNLC-&*$E1#0vYmOhu`_A}DIO&a?*rywA!h6kjpF0xweP-cNzr^{SuOnw2 z;QeBBuDvO-U*=m$?_*W9xKl^ZI5QPH&2jrY_fW4|UQ*}6dmE1PRL|#e)m?DukY&)* z-w_!_ty$q6JDjeFO2r<0&b2z`;Cn7cZ;opHHd{|&&+V&UnD4n9YHoG*X72Wrr>+@C zq}e~zGXEU7ra1oeim!8T*07z9R$puW?orLOjY{`Z);{*QIr|}aAJK&B-d)Q$85o2_ z@wEW0h-m@ll@#UY0HAv#tR=Pk-mgE5|)oS`*XT%=7QxuKZt7%lshWtdm%!u%w8N z&Vr1Diw-vr2qn6G-Lqns>y6y6;^`G;$O4k!6OHXrFUJIQkB5t#1YT|*|LvCyDrYk?& zu(9Ze$Kkn)S&D3aNo`F`yxG z^=+4$AS<0SN5x9Qu9aR|xxe96ulf=>A(2G6ot(=|4$k=MzC`N0N4>Kb=hQgQpvS_X z7Q4XaBitSs>&4NB6v&J(=%NaEe661$aXTvWuN%MZm2U!?P3*1{l%iH>i0nOeYh9W5 zrim%DADtKa!@&QKp?=Da&a2H8E4dG!!BWi~G$pcM| zU5&0ze!MObch%mM>^da9)90sSMa{)BzlaO+n;ZU@MDGh}e7`Fu{oY*togvjMo2&J& zHfUeG9P`_WtJLAf+Q02NuP05&{8{U#v01XUCok(w-hS@p*9qT6694*} z$_i>hqHDS3UZz7*{WGdhJzcSONBP&+>Kj&WpK(>F*ve~TeC_NGf3Nn|n-TlYY3=f} z`YIl<_hZWy=O(2yiuMPms7q}A*Aenq@@2k<<-$v^J+f-R!#_V))g5zTWMJ?_>B&^ZpMZqCks2OdYUKD_99*z%cU`Vr=jlhUN;?7@^{sfar>6Du?>y{& zOVGK=n%(e8!H>|a!-p2}GGAt!mZPKWJV{MG@Lm!_^W6!PHp%fj3mQFnbWv{l_H!>w z{kNDNel#@&Q)-_SpPLCAb49_ST9}_tyvH4er%Uj8l`5uaSuIio1kO;H< z!+6${R+-BL7GbBom>mVyoXfsj>YJou_p$JVqFTEsXGH)D@1n*ArwgllPG+d(q#b&v za`3!RO#{3AfqtR%>n|Ml9BEA3HT%`9RWHByUpHrvyC$<_;^v7?_YT@{iHYgxL`5j2 zl!Uh|m33NsQ|Rx)^INzMT|V7beyr)-4Awu(qr-#PPkrBc@)xt}&MUuJc9-gxPS3t* z7Q^nuRqJs>`+s}R@2&}}R`aPpiHPP_)vqX6-DLM(!0hx{IcdZG-mS;o+1|+>oiO?0 z^%dOgr}cEsL_`#B>{_$YWN$}MFGJJq371N0#oBCCo;+S&tM-1+=h<@k*@u43&zhxl z<&KZgq^Bp&z5Bw&A-ykYZdEu>Uwf2x<=@x(8&bc`FjF#CUUe7nQ%P)qa86AdTD zd}YhE^cQ%2|6lN0VB>lCnhz1iT2qN05Nx0yRi{nlIG32j+wf74`7Kw+$>N0^eO^kZWM zo!6;l=a=5LeW9&-^y>Q9gwXqjYdzDph$M-AD!R;I(FJX3K%(nv*NcViH{_I*ssdPa z7qvDyU0l89ZC3E5SkG;m|8x%We|W(E!M$^Kgl)(4T?TK?e0cV@+8P{PF>4}DEJ{#n zUesDSg-1tXg+zqPlaTw|*|S^TmK~Swt67#JFfV4yonWyq$8;Xp-(4o6HDTZRQnNji zo4B{S8-Q9GJ3sB3m3?1$o|VEItN)6(cc`Sy+H{ zv8Zy%!*_{HmVNu&aw8%(B_oMk~)qYxTV;p`PMR|V&(pS<(aOu&qnMEaOim5MKjrMlL@w`)2&}Xfj>C^t=>4P}M z;9HO5I6rCmRBv@zKQVKn`QNaD^;2Jz8mZcze63p5?9=^{M1^Yh$nqa^|Cx_CY5OX*C$3+5O8FLSx?^yHk!m)w~~Ut~-6aeuO%@V@yD z_b2AgI*nla3o?s#Cx1~s^KYYz{lu3Nd;W<0o$vXjcxIoorssZ!pG$rAFZwNTJihsl z+oJnkU#vUp^j9e6uiE)exN2ecokAby3teX%O{-sh(*AX+{cK^hwb8=J_B|VI*Svjk zGnhH;TgU?4Y~d`s7aEOg_v!5NHdepNS*n%m|LR!Au6!Tas|E+srX1*5F3~L5pS!{I zcw%XFfO*lgB@23I*45_NthZX0$}Dmw{YGz^?1j%!-#IUDG41wMW4hmNn!M-y#beKY z*^BTTu$O7;>SXZK$U3uWWe59_rDvjce*d+1*Fx**T&sMy#%r!vcl%6c(<95fVeOxz z^sAj$^lZ5Nf}i)tyvnEd3N%(UdpdSoC^auD?b`e8MUV2#qQ)hq#=Jb$57s+w)wwEh zmCeWa{?biBcf=DMn`R|w8mG^XeRyEb+nk0C=9`xGI!5$I&C1QTbX@zCv$%IwX~|`a zRguceOxapZ?Ho!kd1edGdbs5KZmqo!Vt1^48X1zAoc`Mb+%pMi(BQZ#>of#lLkP=LYk}J3K|UcNbi6R`|cD z-usJutK2arw}#LA=lpT%kaE4!W#y`qFmna_M292=ZpV}fI|4*DdYEV|5>z?Zl9$4- zq&Z9F;+l@55e42?gViz=r`>J)T5RFk?Zmn(?1F3Yw8c?7J+EH!x|DahK*xCg^%>II zGuWP=X?xq$QTSbw&HJ;~^M$;Vy+t;L=p3FkO*@G-zhMRIj;RmAI@Mg)uwCcc#I}U@ z-|Ib}%k2!TDt#>sa_{}Lkr%cW*(jzFwd!6^)2#MV<+Y3RmlrbU%3gKfaHW)MuFAKa zIs10cJYW3s!q*qcvl5H#lzZg^j#Rz*!Zx8-L41ShM$aYZ@>#_Ve`uVrIlky}^UUR+ zdrtY;eGHtPW%pY1ciZuE*FPNX$`F_Bx}mep9DqGEzpBwkx_R;H2dZnVzj$Mt>TYS4O?SW;E z@6?Bz+5N<~BwX41t#1w6t%!=Q^G5>YbTqZ8lfm*(AZazanbd;?k%I zPgweIPx>_dM*SBHrS8=yE7fj)J``};Ti}Xd<$^;E+rouEZQNwa$6vOlWX+AhWuG=I zT$AwmZ==<9`IT8&5s8P=S}NDxzvy*-qm7Z#OzqN~<2t<>(~fa#^=if~W4Zfd!_t*Y zzgy>to9JGjf4!Ka(z|kjjo~Vbs}B~piT8(F<$T&2bn7(Z-G{d2M`NFfygv3(X;t6) z9WCK2k{8Y5H|AqDe6u_}*Cc#eY>s-Q;*;A~E*(3=nOi?k|A}hdhEFlumi(6OzWQy4 z=5Fn&m0ylu=`EUcuxhFMjBT%ZcWPtpy{=6MZ%_U3HF%4r?WL(}3J>ca zJG8eyBl){>?3?-$tBTM6Czf^{Hhm_`9DZPGoaclD zM)3+|DfwM7E1HE(7KpQL(L8SLdQbUkkeuB1W$p4e?GpXIy~w&JBYGw7>x59oj??*5 z_*WeJ-njT_fw;kfkm|~*rwu#5?X~>fo@;FXE@NKG&P1zUCteyzH`#8T7#k~i-M!6! zlm0QE?4S1o`m(uuAB8k?b^d>RZNZ}A=)3tpUzXn9bHDGWu6SYI>DJ!cQFYnBb+6~& zG22|Lr#{oKFyH*Dk^7dV$!#vjWkV*fS?PUEMmI>e{MDkltV_@3w#;8}Syg-WO{+C3 zk?Z$u^AOr@m?zG*>UwDS+Rve{l~(z$U8VIq>~Y{~|JCbWMfbLcy$<01y{h(Km;OUh zZQ0FRGBVnvmaUwaZc-+qd2o?R_pD_rXS$xXMAEZ~GThpI$BGgo`BO_aN(c7DhSK zb}hUqoONvRGTT6XmpGrS5BE>_x4iy4BO>Sffq=_TjY|q<{n}C7@%e4x9MwoyOxT(V&<)|CF%_i*RS{R|FY#5W9b5qaF&R?S^TG`>PVQ&s!bI&2Cwyb&#AZl**|6c7VS;2=!p=%No$#Fz>-aWaQQoM%;YxVI%Jm0=?w8DL zXH{GGZNr9Zg$b2GET?rXU?S$N%srZC{Gj?WIn%k*+N&-dF6TH=j&aV^($Ni<|o|p{JN!i z&wac7Z@=BH+i&}9`|-Wcz+-W|{GY=GIT;wHpp3<#&-|-nG`qZ0E0gjQi&8KK-dZR6 z`ZE~{wB3K0eK%Ek#9^4OQ1FCTJ*5s!*shWnHD?l$~+#!)Bj99^lT)v3G2I zQoOm#E@#evxo2`+-QIeJ4;vmUG=@qSrpTmh6w|TfuH=>$GvnmE`#JPw!-nfQKM#Lw z$g~Xly1K3W;PTv)Zg*$N*m)dmwNtvWcI5@zb$|OjZN9ax_vcvp>Cl;@1bcj~^%Y$)JM&Ndt!Ho+Z9DgY+5VHe;Tx|_$KK6Ynf~YA?d|vLcIV&Uch&y?zn|g_ zGIe1ELYs{~dCmzJI2^;JZlIs+=xCl688Ia=U;8f~@0z+Wbd*>oeYzKHGQh@TMMfk)DNToLWmmC7lkk zm_@Ak_#sVbSCj9Zgfm-JcqB_Dm+^QvRXM+zqI-6onASAS#QMVE+n4g5&dI&I<|$X{ zTD1s6<%R7H)3@x35Z)fc$$qOqyrMWx+-+)uCet~ynCUOuZYLfzOWbw-#jGNP)9fpQxQW^bd!l?LRz@9^dnq(=PO*q}_Cb zeXFiZw>^v6ws}L`3Efur-b;3cU0&-FW*s^wJ?k+?du;8(N061rm!#CM{*0!q#EC1C8d{nNRWFWC5bCt|X6`5*>mPD4o zWz$WAC4~6&h1~V_@39k)a-ViY$#Gc{Ph8s^%?tgfRa~n#zqzvTcmB$iFXH|r1#y_B zXQeiK>rdQys`|I}mHGoG>zb^+w;O!w^S>sZ`&9SvBK8ZRW*T{%%ty<3r~bEFWVPOU zUpk-d7Ku}L_){Or^=(?UyJwk~YUagFUt>S5mVC~$H|^TrE2>6yQ+_M8U6nm9`gMZU z!r9VSirl*9UJ(h@S6}mVl|`d#?(r;v&l%nk2k*I_UGiL{<#;BiT+|J#Md~Ncb_)v6 ze8jAGubnsJ>Z<>@x~*K(iufhp-{G6Za9_tSO-Su_(Dfy`J5QZ{>btA@{vvJRm=_GL z`*ON@6K^ltwd#G>x2Vp04kc$8E?-N(#+|6Q!Z}EsXS40Zmk)ma+kMocR^Bh@_6(;v zb}3idUoeY5?t6UxN?eBDqk8Q z=V=k$sk>h&&iJMMLw(}gk`qQgZwzMz-@HH3=H0^WoRxY-CQb}xOAJ)*UT>P&X|Q*n z&wmHe$8i#?{&vDjIn^>Pu-Ye=D_1j)GCpuL}&OP_1(UbqC z+UcGD8)fs`Gw0;aI$k3QS(;Y#@aWF9EDQ`EIPgstVeYE+P0h_Ostis|&rQuMDTY^5 z&{A+}Z1LqVfwp+nGL_p#o^x(26A4ik#NkcP@$N zw4}_zRNng=KI>YCo5ZBXUfgi1%J*>jn(L-(Hintp2`Dt~&J4M^|L8Nb+15GNZq}T? zxH~5+rd+wZddK;9{91A;g&ecr*ra^+INGmO7ZkwpChd6H;RV-ntsm}sdMjSzMtp6S z?e@4C2m2nIos}-k(A50zBV;q1<-F>_&s?7zGg|%jinWT!tXmiPHU0Yg&@<6x$3NFk zZ4_O9`D;v6fOOUE)zNQ%bgp@7o~$muZBD|4&4(Dzzbi@3Pr6w+_rs>9!sLJZnyz$R z->|amGT-BGA~FWg{{OXDW>LQ5_u?u4_y6_3RD5-z?vu_K$s0%QKAE$b3pFkiP9g8*Mn2~GFD(u}vzVQnW0#to=0B|tMi$g zInh%>xof@R9%XOL2w7EVT;KI7aLaB>?J>+l+51z95-EIGz``e}G_}rhT{H2t+=*!K8 zCog679M}1><#LekLMf4b_fyU@oT~P@z;$Xq_wE3(dr3LP z;*Zx)jQSzF(rH(Fr|mMKVD4K2rv*-nY;x9d*9pJS9x*Rs--i4SU!mDLKCU@c#dCrs z-Y)teWo-Dk$hhh3v7UHq?FhrPJ8^*XQLXFGi+Nip2=h>HkWLLd; zruVGshf1St9qYf~0w~TK6L<$>K79{Zxr_ zUk^_gI{dS)LetPjvh^cBsCiQ~@yD|^W(J18?D(>`Jx2R8AhD<DL|il?&$Y)zWOA*x!5cB}>|2qJ^Zp9k zc-GuxkH7L@(vO51qhs<*=V|V4nBXyap5^DW87bcjz1yWz`hrec^k+A!^=N&$p{eN_-nvK45c>5t*}L`TT{| zY3Cw!cWwL7T<~dU>bYBuGfMXuyk5WWlkK}s9_OTYz3N;s7TqZpPb&H<4qTXQb!}7m zJjH2Wr&~C?&+AVA)^vLFoznS5`JL=GH%zkAWWX~N!-pY}{Vr~aqmIrIJ(6C<-|r^%rhF2y_*@dLmZuvaDi% z)v79YzBt*os^h|+w?(TgezJe%FWVl9y!CgF@@-jhjBm!oe@(Oe1-nnK4tZG9&{P$5U-G4Vz~$5{c}|^E z1y<`SFFS5N@xtScx-Zz?zUB#Yi{Vh{=J>g0}=lqXNt9`dTM3)^`z_E6`E!dj679^Xq}81D7!f4|^m>&K0gew0S? ztv&lC|0O$QO@D>?OxYbw3=C`VE}6v~8;4~Hc-R8Ba5Zi$OnJPchm|ut>BP|wfjsiu zN7XrX9$l8O>wa9U)A=xq>H3G(3G2EadNcmeY806ESY@rsgyX!45u$CToUaXYI5sNi z#B;xt=5*!UF2S~X+s&*9)q59W+a4Ab&X@nN=H%L{u+K7wSH-7xR8_ZGZ$4lUdZowh z^pkmScf2m=y6O9_Vs_ipXK&puZ!0;iTo6;8QCYn!J>=xaS&5SOO4}sA#+<*I+g5OI z-Af+l(z~aBZ~0Vq`jdpytDMFalYVWhm3T2JcEW>m6N0!m|2?73vHk4XY5RQq7H2&a zy|VVyzBth}?L6k|XFtn2`=R3Kk^;fTJ?`)F`hTl_U88?+TdGfD@Uh!75_bHE=i@Q_ zxOKAcVWq;k)m70wKN3@ye4N&jpL(b57z1at(Ypqxy7t{dWhr-@BaeM|`po?9)DJ=X zlRqS5+*m_7O(m_$Qm<@OKYYOM@R9v2UTfW4%dh1uKe+cQd+6Sml4hxXVm`s^i;F)k zIQziPN0K+fC@070$vMkaGyBrKbFTVY8BKP4xqJ%uw58USlXtIMu}<>f8^>$5OJYy{ z`aLIh-Hv&OSI4avpKEsY&=E_W7a0{>SM3g&!5uP7dVOHx(?@LU@14&pSYCEQc5nCl z1nz6=e773Z+I4kpycxH(+y7;FlS zY|o|buh?IQq{kjl+3?EX<(oUA8;iTwZ!NAZYVpi4=vndi_qt=Y_w;Pp+}>KN?29?_ zUL&~V(=_kO(*45Qa&pg?{ZX@(UT@%iR`BENsf#Ao9Nc7^{5|nvf$iL^GheO4gjX~)$?gw`dgf5)< zj?Kl`eL|cK=bQJXZ-X0cUB5L3ANl8^@r}GHME=ZPmlrJJ(+@eW_!1Gpy=iH2^1g2z`E#5sk8Oxp zQvWup-=L;x;_(^rT^w_bs+zp#YV2K**JJ+ogt|nvo6e(%W4udh;#8%CP2!iyzw~_o zKBH4zxn|ufW(I~Mcq?7ZF$IkB1k#$G8_pRalP+1uUS|B}8NW_=5|^RLvQov~*^9!I zd1na(ndJ#hVh!@JZM!Q!BW1?HnT$?0uP#RQOTAzGwd-St`_*l2OLfiUzOD&h`#tpi z=6l~i+PwOHcH;&elfZfD{~zyO|NnPe_5a%ImJFJIwA*AYPMzLpVU@T-qF*_HElmuz?GjI?Em@GH?2L&ZRL+* zYb+N(y1VA3ZB3=V@qYiKx?1qdX|%3UMxBuWIJo_{A)QguO3(DJ-hWy$blJV?rZp1 zH)@`pF~#qis_0jDBloSEx~Un@GP)FYS$c_tmR)S?^9k%J4z0Hmd0GY^(WVUhn1^VX-S`@4CHmfzeH? z1qzp3=LxM=zI(4B+A(?4ojkR56X)%!bH9~YoOCI4!im@CgaW>{_Krr(&u+O8gZ*Ms+jOy~C&Rj2qet2&7pCL-apuI>=So^>eY3m~&R^b|}cE=5duI_dAG}albiS$9nt!`(LSy@*+F9Y?(6O zEM<>~TgT+@=5}z|=igo{qq5c*bKUx{et2(}$PVW6 zRXe;BG>>nBH0c=rz;*gp0pF_=?^a`e7EoulYS!4L?6e&HUIOjQaLZ zp1SY(Gh_Pv2g|kU)IJpdaXPBcTGz@R`X}mv`H!^+-hZfWw143E%I^4+GaFnthJ18y zw10S>ss3Pm^M~p**+svW8%Ryc{W1H%{lfVN>_7OkN}m@tVf9TtUu^izrZYv1b+-Nj zlb4xC)eb$Gvek5z; z>6xE%(ND3d*JE<~Q~R@3f))mZ7u!X|a^#fco-H}S^OE!R=1s}dd_QbG&C^nnJxywk z`CAXEx!FFauezrh?Q)I{y~SreYqRd*7gv3hBI9Q*$q{s&wlr8sRCa@)*lAZ1rmXc%n?67Fs-<(*w)lj3@rBVri%M6? zn;n`aJnLMlr1a&_Mf|qRvr@Bv+*#b;C;6pVeE;Tz2l2Z;9f)^vzhypmepiV2QDNsF zP2nj@E2ZToIXLRpGu|w6xwY*K`)A8ZUp@s&+fAU{U=Pw2+92>GvRQ#K!e6mUf+ zWgesKzv}OWr6*NA#CA=)U^{K?e1(RzH%nH`e0(oDeg=Pv)N?zloC*IXJ^Ey@B)NC_ z;c1JvnPxuw8J(`#d%beSx<9A71pn%(sq$-WwJF>(t)PXsZ004Y14q9U-sNQVcM%c& z!|U+BE93)vcZpgj#to+xI-3k{CaGuk7`#?QcRiVL!3m&ty zGx`NXYrGk^DxO@pNU+r9fZGo*=bAFfnp8n~#mm2$YfRtvtnaud^nk5k$BKQI4j+9M zczoa0`%)eIrJ5N}njSeI_HC2>L?)>dr;g3uFm>I$*{o|+Pwdi}tKC#>&HUoe2I~!V zV&YqMmADtMnzZ)uJoH%bk|E?0Yl&cBF{AW1!}#DSC3ZFT^4rBW6w2u~Z;AK$?#pVU zR6a>>_TSU0J5O`%_|kT9a&bk^9jxUsd1c^zBX8Lp9R>eQtPvNvwYNnzapU7ux$Dz05TAt7BfM*p(}C zx4x8QFgj)@TxJWqbmgAS>&(Devz%kQpYn+d-xE^VqG-~z;>CB3UrP^tdERw}{Ulr1 zrL`$1w!g?M`IU2f*83w*MNgRA=h>)wF~H%sWKKrkoTwdFP2Bwh1Ft>OiM8GS{^QZ` z59OJGdtOOiKFeBTEf;$r`G-sE|A>39*DaX!EwEqv!N;0e$G;tPNmrUD;c0U2At!4| zLF19BOzXZJ4G-Mp=E2#$p0}pAsN)YuADc_^h3SexV#1m?ByA>ed~H&%d@g%~^$&Pc z-_DGt$p7pN3^N7rb>mgAcH@!y@P?2EMQtE>4ypDjXbQzU^SBOUB zt`@N#`_o7Ik2KpKkWbAqFSwwQyX^AIJ?8mpfB#hdXLyi!-jVCI*`yPeHyrNCuyVU{ zM~iLa49Yr?`m|%go9#a{qyj|!Qa&$x8hf#GQg49?AFJ@ImIHbAT&4+K<)*KvaIZVZ z!MEykX8U%QPPZG$EH8g=u%7CBiuHBo&Qua5`@{|n<;B@Llh?@zHyp_2JgC;&;B`{P(M*VU#f$3ca}{4}HC>9Y{Sl+J ztdr&As+Y^Q_;f9>Fyp_zMR>z*`Q&Hy>Sr8oT)#i@(%HycMQH|aWoL+9pVqeeacHf! z(lYZ0SME7veHA}4Pf6sUlu@xyV&BH>^Bq^?1>+qy{dW@LKCx`&+FGNokG!A(7HwHQ zV-H3K22+&zBlHEqMucJp)buL`53L~e8e2nRgD(dN*iPTJgtyUYVaFD(jEh?u9FO>a zVAgWlDzfB+&qK{A9E~Q4vqGLMe;}N{@5cgTroO&2KVJ10-I=}Y#PtO0lV|VR?yi3K z&a>|S&pHl=gL^tOCMj-FR9&Fo@lS!RX~$9Ct`5gLVumf&N^OPV2lgtw_5; zBiF@6VzE-Ae0N3Da;ABl9>yjjx{HI1inBa7OGZuK^!k-`s9{KP=t=9;yD_qfE6T5x zSR0-wFr9tfThzI9%_iHQYKzaTNdG^ zSx(0Fs%I3>U#P#hKz?InC8MIs_t!tz`(|?Q!*Z$8A5%JCTGtOH7LYD+Zmb+uL`A{Pq9AwXefI{)0QyPbY<- z`S+VY9OYfMT{<={qb1BOyY`iK%VGa{`+uL1|N2Mq)Ad^C4;+`8v*ngd&HDU`$zM?V z*BeHUT)722_J13<>xlnvDANzl$&g=I+p)9%#L>UIB`h}mcRI}HB-m+l_;^pR^^0DU zi5s=$Zn!?@Z{b!CHkDtXY96rqez$boU$v;(Ju~-7{hU3)Hr~3@qSEkb_gm#n{nw)Y zSZu#^%T4}{;REo+n@+N)+&P&U80NC#D*}}WWHd+tI5n)hUizruzjK>PuBARcp{Cfv z;e3EKk}V}8Q$uaak;0s%MURg3t!$h$XK8Qk!;1K;^J%v)OA7kD0c z?%=gRxAvd;U-nz)-pmy_YW6Jrf8D*?bALXYeRJmA*uSss=g(meIADMI2iv~%2V!@Y zKVHzt@-F$LqU^FhPG+l9d)B>}z{VrFl#5 zm-E)h%RR1@V+uR-A*YP@S;3V9Hhml4uxI`euunS5Y-5x0;CMwxdwZ!((gNXBG5fR! zg*FF&%zyDibN63Ke*64`lda|%6)?|BTYlc)=4PAfhK=Vxe%R9|Uh>E3xW4HcX|uft zt0p6?d9)F%b)f!AH9@Oc>ZAH+r@vSZh5<(iQJqp`&>$*$_JhF zP2q=c*`zp)VeI#%iF=i-qCPzDSiB+H zvr}uO!IS6nE-i@Mx8ERv?NYe1Chz_?JGa^9Sh;L?nbb6KS6Ae!i*b26y%AR>Z}Y^Q zm$wMeS#kE;&a0W%C;DC3neskmg>_o!G_^OWAE%z-Wc9e4XBk$|-sZ9{+sCM`X6n5k2tGanw{I91+O^cb&!MizT+P?cYFJE5#@Y$VJp6}j9t(^37Vx{_wNsXam zH~M6mT;D8Pr0>7;00Z008F~vZ6#V@k9Qo{juY-M=Zs{U}HUHKg*j~8&fJ7Pho{qgt zwKp_3w5RJoe0sxgY1Z=4seSo7`EKvk`M?z?TEY9fL`J+qHlJh9NtOMNAAYyl(<*Fr zPppFd{i_Q92P$nW_l~n${ZlC5TF!dzfpcU3h6TzZ5l12$`wORWZF!}Ze~F>dzrgRf zJgeQ&%Et2_cDD7#Uy_h{H=pI-ncbcr8TY)}b}aYp^wd`mPin~43;tlL7yTja{=NK< z^8ZwR!&|QvQ^q-@2NR2Pg*&q_~={_uujvl*03tk6PcM`*t)&u>OraC z8E(@V!#7{JaIr`5O3Rh0&6j4);ac=gdSlI4qoKv2jVLw~?lg!CBpW}0;%sW*oJzr+spT+~5)*g8DUBmWt z{u#aLn>W5|GUTpW{K{q5w>v^hy^7!3$xTUft=e;P>bD)c8J(BNu2z0AOJ)7u$G5X|wpRbs;-gQr(=dcdeVY-T%78whR8Vq8B`z{YCq2Q4RO@ zi+iTmT{V4J7L}hJao_QO$;s80d#zr1Z{PFl((MKNzTCM`&U^F1WS7U~8CToWW-&&8 z?#?(h-#Mv9@GQ5-GvWD4TN!#?ep$SX5}UAWr{TQ+94}qhL^deAymk43J+CUy(H858 zi{eubtewrN>9oZ!ck#(xH61=?r5Y~M8@KeYPF?o+f|4HRM!Wdvwi^M-ORj6Cow+dG zIVbP%e*a^)65n)hmCi`^{o*@$dP;eRcQ(s!Lm}s?2_X~C)qMY%5q_7`DZBIC=k$$+ zT%R|+*t{~$HtPI^)Q#1F%xybtoJ>C+7F^txdGz+Zl~aXoZ(3=-LANRYTwPC&u-8p- z#a+gJ9ol{hvvcjvt#;g+bylrk`R?4CUaQ?_ZxR0gchNDsu=M(=ug)9V%)jnbV(?iq zM)J|B6UV2ybgb6*S^w~*Wl7P^ePWMp{fUebS8}g>|L9ex>l5)63L#Tm(uzCs{9=B8 zonkp}&SBoiD?^?Yq#ahu;|WZ-Dfy*khvs>)C;!sssa#DFj9>rswO);RU+LPexhbYs zD`L0K+qWjGGgwkFs=)l6qNVb!M=9z%?UqmZb#KPAFsa*|%YyxLo@QxT{$mFhgz@D5V6 zU+~D)h0CcmiErmxsYBOhIPE^U{!_w2SIDl3%Ue4V$`bFrt2X}J_7l{`7kIRRQ+h6& zPKkNqeaG{T^8@rh^z7w?gp)^qbUGL=EYmAqsmC$zyLxer zy|3Jr5B0fk++*r2t9>}ungm{4A9()r>NPTcQkmwLKPQX(%IsKiurScQxxi%Nc~`Y7 zIs10(lWyH^bX|7+DV6Y+eR&ZYGh1ijOUx&J1Ky9pmTr`xCZ zzi;MtiQ5Ms@QTb?o5-S`J;OVPFOhxs?K6DJhPMuK9eW*i&w00#S^O5rIxnX~hN3)- z3=DJe-rJ3(2L%mUpUmQt)I8YHP1axYuiLS)vDLDbm9d4Dv6;EC{cAe2XTy;>mqMQR z9NF{biijHWS{Qokn;JUu)${wNYvj%Q#mT$OfjJmypJ_mJ6 zNV04aIxY0IxIyjJZ}rrrYSS5VlTs3r7#Q8e+}P6C!~}%F$8Gzam{eWFz`)SYfUgOJ zdG|Q#L@ulo2wO<_Y3sX9TulO^0emt7e5=!Y#TT`t2>S-CU*<4%(o*k?gFg@p3Coz- zdoQI~&HXm>ob}7+*MGA!@c-ruy0K-V%Q;86=rqj;ji?(NH+WA7a@NakXA#|h`uOIC zRRvnNugkul#C?=zY-JApgh_7)e{n#HHx6nqEj1TKD(#JjC^Q#Y59-nR)Co5DlZ$qF_c zc*}8c*;+^^aFt|0;rrMxZfn+aoT@+hVP}Ysy3mo=Za$f=s!fMnj)!j%-*8*r_F4Vh z*=Ye+NSb<$sPPo0UmpSOKGsd3C4lx=P1e>(}<2BnX;4`|N7zyLp7r`SEzQy(>6Ks;~{ z5OZ?9HsrSd5o=(`m5U2m^(!Qm4Dwui+(aht6}8AYdTG`-p9$&z zIctp6($;4csMtx&@A=ptv_II)vBTtL`M%HA``_2yn!kTv4Qs-q#xApxWf!`FwRROm zslM$Ixf?WR>Z2I0=NA`0V$$;}^mKG{6|M?4m@qZHHfXnwY;0hH){avX1XR`Eyi9*F zYi@Da>2@%7p>dsXE=JkXz=P zD}`%BguUm>S&b@PS!r=*RyCs4Q);yGR6Y0s4 zaE?1{p(YVk{y1XZ16R3>87^@Lr?h28NTn6TA6|3C?}5tU1B#*FPuy(`lKk@j!K|m1 zSGcb8Im;PIRNq!mxhwPhblFYY8+L6GZrgUeO?aLW=V$TIvs81DsKk{C-TMPRa-Z;1@X`R!DWfdaO5nW#1%s+u;4e z)$6&OFMT|+=k2tU8h`U|J;_l#6#ebGb8XbJ$SGMn4Y{U%U@kg+(f59YbZyU+jeF9! zyqe(8yjRx3?f2t}*8~(-ZRAZ$v0wZ!`AE{IS63|FFI4b+y=>xNKGSH|9AU3LO%-dp zcFe0_zN@hIVnV3Ok^rp@ysZ;%ELfy{OiXIqgf&WE`Ig;_xc#bRU7d5V=&fiI>G>CY zj)^W&R$ng~_Ve%JbH48d`ds=Z2Qnz%zP|MMS2x>@z0=Zmk3>zq7S=K4 zSWwh%5$}yxRU;E#rkUT}`|#mvyZ=n~7xk}Rl-yS`r;P1VU!Uyp{(pge&)?}OPU1Q1 z^Uk*ae&yZbcX#Xm{rxN1pi|e8z>vT7vBkYv%%jsH@p|q82TYc)`|wn2`+tL`>;Q`jw?khI z(ky=pir;&1Wlqa%p*&8DkS#q~H|K<%o~68?x-QE#Hgt1amR_o8+UsYRBpDUAt+8%C z%+%+nS+z53#hFcWPrhz_6MDDgQ`pX=nX^uE+*p@0BPTMsYGTj1SIf?w<9y*Sn=y5s zsKT?glhhUzdnQ+!&)pMhI>!L zY^^{1rKyRo+Mjx?OV!s)9&_$2|Tz8wh?wtfh-)sxq!$I_v7$=9i^2 z-!x@cb$)!-7aY0PZATxEad!EFs-U&*clB#p#OGD#J!G#qQOJLO_l7@ZQ$m(i6+5eb zu=YwfNDMlB$HrP_*{z&@{><{#s~&zheXC~Tj{SY9dzbiz^B&%-^<+}Y+cf6&7dqEg zm8jZtl8??s_iWAbGzP{uQFe{rEaQ9^y(G6PG0bT|DT~&_SOr3e&)4-|N0ypxc;bL zwD0Bl=}`fX;ic_em;Cx!oo42? z%(MOSb^Z0PhVl3Per;Pm;nf74wptJK)~AiC@02E1KVf#8@R?D}<<}2}qfct@{9t~# zQ@ymj^NyL4sZ3Tv>c{XUwIN%Q=dWu!_abr9)eBo&6TYza*F14tRDJON0ZscKs;7F{ z?cXQvGB32!{MRCQE^o2=4+eD`qif$7KDM}j|JS28zvpk$f*%GOqQA|ycx(M{_A0K6 z|88H1=jiFG<2o4=vu5FYJF{}u!obdMo6Gxrc`EGU@3`DquQl_t%STz6n@)@Ldb{hI z{3j}ircbiJw)M6}kaH2Yx_fhsSnbNTV4%=Vzd;aJ1XY8-rfBy79yL>J~Lsn|Qg-1tzX*P0%y{ykqA2gn(AoYekEjxIjhnX8UtVO{q`kNnGQkE+_``tz>}8`>^iF5sdv z@j|d{q3+ykmpP{DMU)#YJ1*$O-qSKo%01%B)%2c}N3&-7EH%&T-?HuW*S;qw=A}6K z&&cKYXL~NPW!JjcTPwD0H?>VuX^S#H9m@34ki)RJ^17PtuHB`J(_Xy{QarcO-_Ov*B>_Wku zx@CI>3?^6a`Vwe+Z)#80vWY$yCLL`tOWT&`DHWubsu_N3^)k+hOW$@Ccm|3JGN~@? zeG$w2Q8MZ6CAKdX-uFDp)qW)OEZH>qS*MT9zUEZV&vq?ciOS2qKe?uLY1uTRr-Fx? z1N^oWZPwbg>E`m|o-I{5*+o4)3B3~y&TtFvS-8~NqgysbI>jpU?iuGOp;xz0?hf6R zl3E?*?P)oU#|gxoC^(<8r4xN+i!ld*2+OV%wBYbN&|-pJi@*?C&5SFz{zvU3Kql^e{K z_N%ym%}jqS_Mn6K;TU%Yra)GEB!_kwK*H6{aJVLw%Ha<^Yu!Kx81f+ z?VLEZMM-ew$%e%zOEbOit!X)NX%XMtG6&z&OjeUlhV(dfpS-x@n(fs0{!dw^74Mid z#m_=#X}OB9S~g!|-inNl#CJzLj3!^Re&kkS?wygS;qI8ea7)?eIzPLoLi>u>CmQW2 z-8K2el8PwB<zV*nJZIXsbesU*c7*eB34d)8TFHjiE4Xa1=ZZ1RD1a36wB_d!5kSg81u82DP9SWF`c?bN;!8znv+xM}>a?NZvllFYp$I+EuHAmN6IksVvp-Az{8XjxbJDkEycFgld zKV({HJjk=qdth+K>)-$S_Ij&cd9ecanpU|TGY`fe5d5*K;k@CewnOUS_p|d1zEt=e zlxDrxA}{zO&_>}y+8>ESO*I$3{#r1tbGFY`<1~SMpU;n(`VOvTdY5#@)Hv10%`!IN zT+lscod*JU)E<=O?c>-k_;9kCAd?;A{5f_0nnH~Co7iWp_viQ_a!2XI6ZKidwle^l%eZFP)#Q2rs2F}_KkyM{$R>_cGV zebtW_Qssny*s5gp8?RE|S=sgTPvZf3rND|w>h?lEM7Td6KVtc>CE>&JAI6RTkI%E( z9X`AH2Y2KCC%y58ch*aO-Ta~Fzt|s4f5bh` zVbY=Qns=%5_OL0{4t}pn!ie2N;`ALbJV&(_iXxPa0Prq3aSy5BMCHHj-N5#CUfu|yUF0=l8ldF1P z>FI{>J8v~bPt#wwduml*+yFzzAf|8SDC-CNvFs`Z+p~kAq$CDT5|qR-#xl;a&mzB!maZPBjYZ< zj+?=9GW5}|w&Fx>w&$-lU0oz;e;^y>@5bom`jYc(QxdPMIq~cG{iuvroNw{HtTjr>2$_!qVU)L>qVKFrxx}krsf%WYm3Q?oBndN*QzuZ{k&rN2Ln>93R`3wDGLZhQ%-P4jX z8}Ig6UJjnZomJTFu-i@N-27)Ev+vsOKDObHmRH2{lc$ztr!hR^=ef3=CGOU=EuWtr z60v93UE5+1uhzQl-mEYF=kI)~&?#=w%C@PzersWp>QPo#@2*9u$IdjZGV*%reQMQ@ zwfz#6tE877uyqPsyEN!lg~`tJIYld!^aM3Gsr(ELw$i-Y5%|fYY0lOwN|%>*2eufp z@kU<$)w@O8cWUHfpEn`C6T1{P9({ zUS;p}-#YhA|E{+r3qfrhNYsTwwNk!B@W7m$pB26hE@)iMrR*vyl<+3_c6gEa&i;;1Fh^ zz`t98*Q_I}dCi_Hjg?21UU6IV^T+?X;0>$neQwz=Z4}c^XLC${S#oAcQ}Sc^$YukEUvKc?ajTD z3mp5u$HedLKkqTE$!67e&w00^`VLAxI_Yj>JJzh%6#{5>xSKx z%VSE8$wo%p7oR3j$q@OX|WkmchD^S>Zcbv zIVA~oPn5Eio*Heka=L86I{R1iWC6vePn_+aCe6u?UYqbjC+A%IFT+17=daiFt-rc) z{Z(rR`_}n49kycU}^Fr|J_}AYA-h(*Gp<-2{*gt#M36dmNhz!@7esr#@`Oc z1*rVwYuatW9eX#($u20MoS#2>(*1|75%DO}buzDZjru|5i_I zKYVqw-X~MDPfvwbPM=ujEh^LMtr}*vXQ}I=C4uqWk53=}!W}-%cbm@ZH40^trzh3P zd?>S;{!8`GskUo5nK}IC^EW7K@mnl0+q|=4?^*S}Lr?E*?LDi`=QXoZ>hRg#9G6W~ zH{E)kc)jGs$#m?Ii~hq;-^IRbGxQP%mw_CpF|rEY-LyQ=I-9~;TLnkKGR*7 z4C~ZwgkOY4UMM=usNZ^Eg{z*MchyPV2}@Qks5`;;qNXbFMw8^1iwhNn9{$VZzWpsd zF@h;d?@;u#=@Q1_FAwe3;VZYk{(EipUar19d!FU|&HJ|Y{`q}h+i!0F$8r8<^yi%N zwH)TR%ZwPOTks$Hyv}mXR{0g8H(b4REIGbCJ)bj0KRW#JS%q25X=0Ds58Rj8(Z&`u z*WW_q|C3)O?YY{|H~!~5bZnC1YKz00xaOH!JzRdlY~Gp3=6?GwKmNNl%!MLubIf16 zR-9yesnYdEeD%h5<;>5z0t@nPGJd$OQpGoMb%gq4+ij1sqfVH9GdZ^7>>=r@C>i#j z-POHcznPxnkDBDcyFRsFP3&^-(iB0pr|dK9EO~YIWC^)#HV`XY7J1_}$FtP$7kO{! zJzw2sA07VT!}o&f@0vxq_i9^C`X02f-y5F(u=mo2%>}(jkIp_3wf-#ceVJuPp6ebt zS^9U61!w+T1+h-w{DyfGwzu{l+NZN;F7L#dYum(`o_qM+Kj>ZZrRp8$dF!RD=?`PS zRGZtsGJSvYltQo_tNEAd)7aRUzfS&ePv_0^t;!$v>Fk-$Dc8uK@~}Bk`gVIo!A4_^ z=Z(s(`w!lKTOAgB{?-%mhlkI7v%mA!b=#(F+4r+2u& z7#L=%;G17k!yL3N%1d0+so22?yEj&eR=d+so)eB z4yUFoxjj}dyR3ybPrh`X>sN!`FUG$sGRij3=8(2HGv{ID^V;(@HT(85f7tL+p?6NN z$S1yOfg3g?Elf$AI^m+T{Tdm8Q)~O=@AS`{rnP5BR#mPldlxIOTKWrlAqLk z(k*?MaJIFTmHV}x*#y(T=h9((oC-U96?bIyL`r;`Frh#9m=DjM)9*UIn4YpO)%`r@>9Kh z+wP0jm_=z%K ziN3Coh`4|r0NXmj+nd=?r1kvU!-dB-uAO>qyV#pW+qwm}cP(&T60jklM7vPx_7p!Q z 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 literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/lib/TranslatorsGUI.jar b/projects/09/Tetris/bin/lib/TranslatorsGUI.jar new file mode 100755 index 0000000000000000000000000000000000000000..f29f926b0158193d525de0c62864176a47467d22 GIT binary patch literal 13643 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 O2r*c(F);kr1MvXkb^g-; literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/bin/scripts/defaultCPU.txt b/projects/09/Tetris/bin/scripts/defaultCPU.txt new file mode 100755 index 0000000..43b2720 --- /dev/null +++ b/projects/09/Tetris/bin/scripts/defaultCPU.txt @@ -0,0 +1,3 @@ +repeat { + ticktock; +} \ No newline at end of file diff --git a/projects/09/Tetris/bin/scripts/defaultHW.txt b/projects/09/Tetris/bin/scripts/defaultHW.txt new file mode 100755 index 0000000..bdb2261 --- /dev/null +++ b/projects/09/Tetris/bin/scripts/defaultHW.txt @@ -0,0 +1,4 @@ +repeat { + tick, + tock; +} \ No newline at end of file diff --git a/projects/09/Tetris/bin/scripts/defaultVM.txt b/projects/09/Tetris/bin/scripts/defaultVM.txt new file mode 100755 index 0000000..dbc64c4 --- /dev/null +++ b/projects/09/Tetris/bin/scripts/defaultVM.txt @@ -0,0 +1,3 @@ +repeat { + vmstep; +} \ No newline at end of file diff --git a/projects/09/Tetris/builtInChips/ALU.class b/projects/09/Tetris/builtInChips/ALU.class new file mode 100755 index 0000000000000000000000000000000000000000..03f95dca8c34632f9f1752ac76ebdca0cb366bb2 GIT binary patch literal 1754 zcmX^0Z`VEs1_phGG%f}i1|2R2T?Rc6q0i1>z{SAApu@=^&0q*(8G#66E(Q|@Q;?V$ zh%o13uwbwRNmwy6FnnMD$y#$T*l;n}GT1RQFg#!Y$=S0rIB+pIGB|;>ID@pfurs)F zFt~9sNHDmwGkCBwcrr3DrO1;`I_KvWR9#68p#ZWAMen1-fLR$^JAeqwovK3v?Ik%6-)6~rwqNo8c42b zOUx-vbu3|IVA1f@3}$5Da;->CEhx#%&nsqR;3`H^z^dUHtQp3`pva)a&fvwv;LYH} z!{E!{$H*Xs+s`}>QbE3q zXJimaD$UF(@yv71$Sf!Z#U&$yERv~C5LuAn;h7~F?xCKH4B|-gAc&R7pIo^ zSBVu+D}Rm0O0lnz*nQj1ed7#Y;Sw!^~*S3+WB(1KY{P%S9UWabr=mIP#il7vt+ zva|j2Q&O!N8Ti50LVN-e0_6sfbC@+iNs1>uwZyfez^M|FSVc90p=mQGF)v*|xTGjE zFWs7vK>(ayk;E7o*is8i6LX3g8ALT8sTnNmpOlrFTw<*m1xcXJ`MJ4?c`0a$pvHm% zM+)q^(2~rY%#zI1Vttp?G*BjjCh_F_+=9}QR7amsMh0$;;NU1Q0J)nhzqADIZ)R}# zvSF zb_T{B3{2Y?m}fF5YVBrViQLY>x|M-VYYPLLK!70Qm2C{{Aoex}4y_#woLd>VHZp(! zBZCTqD%3DR21c-9tRRIOK(Y*s3~CHY5NXCD22KWU1_s7Btt|}P%tqT7cx*r{77)u8 z#9{@p>_99w5X+1O#AF9EK}K?OfSDjCaSK3HfSklF08zpLvh^5)D2QT~-p0TSVz9_; zW8jq);I0s55#Xw55M>qMtY{Er6X2+55M>u&uV@hE5MZllFyqwP!oVfUDa6+>c^d=2 z6_+HJkia$u!I=y~PzfQZ1jx{13_Ku8l4~1-@Nx!LD=ujnS(XJ1>@3R}SeQjw5KLAC zlMTUSM=&|y%pDA(W?WiZ7{r*3M7g#xh=Z6cMxtD^pvF#yim@7ra?L>%V><@%D=SDN z??whjhA9kZ7|t_@FfcGMGN?0XFff7RT8x32fr){EfonH|M5K`9b_S{a;5gC*rw&F2 Q2?j<`35TSb8Lw&v0H(B(FaQ7m literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/ALU.hdl b/projects/09/Tetris/builtInChips/ALU.hdl new file mode 100755 index 0000000..e5fd1f0 --- /dev/null +++ b/projects/09/Tetris/builtInChips/ALU.hdl @@ -0,0 +1,55 @@ +// 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/ALU.hdl + +/** + * The ALU. Computes one of the following functions: + * x+y, x-y, y–x, 0, 1, -1, x, y, -x, -y, !x, !y, + * x+1, y+1, x-1, y-1, x&y, x|y on two 16-bit inputs. + * Which function to compute is determined by 6 input bits + * denoted zx, nx, zy, ny, f, no. + * The computed function's value is called "out". + * In addition to computing out, the ALU computes two + * 1-bit outputs called zr and ng: + * if out == 0, zr = 1; otherwise zr = 0; + * If out < 0, ng = 1; otherwise ng = 0. + * The 6-bit combinations (zx,nx,zy,ny,f,no) and + * their effect are documented in the book. + */ + +// Implementation: the ALU manipulates the x and y +// inputs and then operates on the resulting values, +// as follows: +// if (zx == 1) sets x = 0 // 16-bit constant +// if (nx == 1) sets x = ~x // bitwise "not" +// if (zy == 1) sets y = 0 // 16-bit constant +// if (ny == 1) sets y = ~y // bitwise "not" +// if (f == 1) sets out = x + y // integer 2's-complement addition +// if (f == 0) sets out = x & y // bitwise And +// if (no == 1) sets out = ~out // bitwise Not +// if (out == 0) sets zr = 1 +// if (out < 0) sets ng = 1 + + +CHIP ALU { + + IN // 16-bit inputs: + x[16], y[16], + // Control bits: + zx, // Zero the x input + nx, // Negate the x input + zy, // Zero the y input + ny, // Negate the y input + f, // Function code: 1 for add, 0 for and + no; // Negate the out output + + OUT // 16-bit output + out[16], + + // ALU output flags + zr, // 1 if out=0, 0 otherwise + ng; // 1 if out<0, 0 otherwise + + BUILTIN ALU; +} diff --git a/projects/09/Tetris/builtInChips/ARegister.class b/projects/09/Tetris/builtInChips/ARegister.class new file mode 100755 index 0000000000000000000000000000000000000000..ab9aadcb61a8f5c25c9b48436c623df0d86bf24d GIT binary patch literal 337 zcmX^0Z`VEs1_pfwDJ}+f25wFUHU=IJ23{@(J_ddeA;8Wc$j%_d$iQZknU`5&$H>5} zp&7==z~Y>rlFGxt!NAGGAj}}b$iU=i#m*qg!yv{W&ch(VAj!xemQ_0)$caL&&y$j?j7 zE3sx|ki;p;$iQBlTH=?Oo65)_s^OEBSeB@tlbDyTA6!zDnU`)2ay)l&YKc#Na$-ql zejXzOtA?kiW*CDa0~-T70|+oOFoHbBz{tSGz`&rxz|6qNz`&rOwVi=cYYPL@F$QrE YCB(dqfd#~17i8SEje&I|NGk&a0FTN_rvLx| literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/ARegister.hdl b/projects/09/Tetris/builtInChips/ARegister.hdl new file mode 100755 index 0000000..23aee73 --- /dev/null +++ b/projects/09/Tetris/builtInChips/ARegister.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/ARegister.hdl + +/** + * A 16-Bit register called "A Register". + * If load[t-1]=1 then out[t] = in[t-1] + * else out does not change (out[t] = out[t-1]) + * + * This built-in chip implementation has the side effect of + * providing a GUI representation of a 16-bit register + * called "A register" (typically used to store an address). + */ + +CHIP ARegister { + + IN in[16], load; + OUT out[16]; + + BUILTIN ARegister; + CLOCKED in, load; +} + diff --git a/projects/09/Tetris/builtInChips/Add16.class b/projects/09/Tetris/builtInChips/Add16.class new file mode 100755 index 0000000000000000000000000000000000000000..c3754ce2a82e66b71bd1726feb55eb164119f8ec GIT binary patch literal 343 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&|av#f%I> z(LPAZ{PI&$tr;2k(S#TonA1~Bz-|j>WZ=p#ErIK2E(S@kXasA9F(@*yF|ad$022cv z$h{1V3|tHh41x@d42%p646It)85lQ$BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA&d49pD73=9lPT3Z;Hn2okEFx!Aw YEFhMx))od9W+Q2ty2;xZSRr~D08h9+Jpcdz literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/And.hdl b/projects/09/Tetris/builtInChips/And.hdl new file mode 100755 index 0000000..d2c48b5 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/And16.hdl b/projects/09/Tetris/builtInChips/And16.hdl new file mode 100755 index 0000000..4c71874 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Bit.class b/projects/09/Tetris/builtInChips/Bit.class new file mode 100755 index 0000000000000000000000000000000000000000..1e5a3c457c0abbb4801757bbcfb53e08bad62590 GIT binary patch literal 416 zcmX^0Z`VEs1_pfwMJ@&o1_4e6b_PK%1|bGv5K9C^h=RCc>gXC8>-I zjKPcyY&MyBnI(3N49psuVT=qc&iN^+j126_Ir+)ip#_W#oM4tqet8}b12+Q?4}&Cw z6gz`74}%PYEDr-G0~Zg29D@`OgFJ%*BZELvX=YA|XP$FLWaafq{{M3FJHm1_ovZMv&7P7#VmO7#IW@7#SED7#LW! zwlgqpWB>sc20jKJsI(>nGXoO?1B0yA76v93qiqb#HqtB$7zDIHd}a`TD+3Em8$Vo| b6ay33R6eaO46MvXT3Z-cwlT0l)G+`6Uf4!% literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Bit.hdl b/projects/09/Tetris/builtInChips/Bit.hdl new file mode 100755 index 0000000..a0a76bb --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/DFF.class b/projects/09/Tetris/builtInChips/DFF.class new file mode 100755 index 0000000000000000000000000000000000000000..49efcf1ae7958520030cafe649d65bfb433bf2e7 GIT binary patch literal 401 zcmX^0Z`VEs1_pfwMJ@&o1_4e6b_PK%1|bGv5K9C^h=RCc>gXC8>-I zjKPcyY&MyBnI(3N49psuVT=qc&iN^+j126_Ir+)ip#_W#oM4tqet8}b12+Q?4}&Cw z6gz`74}%PYEDr-G0~Zg29D@`OgFJ%*BZELvX=YA|XP$FLWaafq{{M3FJHm1_ovZMv&7P7#VmO7#IW@7#SED7#LW! zwlgqpWB>sc20jKJsI(MVIRgWqmev*qCT62;49r^@SYYb-k<>APjp5VU!obRGq_u^C LWg7z&VFyFx=I literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/DFF.hdl b/projects/09/Tetris/builtInChips/DFF.hdl new file mode 100755 index 0000000..c66b796 --- /dev/null +++ b/projects/09/Tetris/builtInChips/DFF.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/DFF.hdl + +/** + * Data Flip-flop: out(t) = in(t-1) + * where t is the current time unit, or clock cycle. + */ + +CHIP DFF { + + IN in; + OUT out; + + BUILTIN DFF; + CLOCKED in; +} diff --git a/projects/09/Tetris/builtInChips/DMux.class b/projects/09/Tetris/builtInChips/DMux.class new file mode 100755 index 0000000000000000000000000000000000000000..8cf4e0b296eb714a06b45276662a37aeb0dab49b GIT binary patch literal 365 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&5c+85#J|gcuo^(^E^pP77va;L0y8f$L{321&4J1Z##dC^E1yurq)F69Xg2 zxeSa9Tnr2hf((odj0_A6tXkU{7&n6C8CV#&891TRt_(~J%nS?+mRegFn3#>WF)-VJ sSS%oxt=1L>7G@)vSq$vb%Nbahw=uASL|DKg%*z>Aq_;7!LX2bp0GcpDZ2$lO literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/DMux.hdl b/projects/09/Tetris/builtInChips/DMux.hdl new file mode 100755 index 0000000..80153d7 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/DMux4Way.class b/projects/09/Tetris/builtInChips/DMux4Way.class new file mode 100755 index 0000000000000000000000000000000000000000..ab72a174054b6a3d615a62427e3bb128d111e293 GIT binary patch literal 408 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&B;Hofpi=z?ENG0@u%643c2c2-XZ^P-I|ZU}pdU zCI&{3lNlHpxEL511Q{3^7#SECShcn@Fm43NGq5mlGjKwsa~PNzm>C!t61283Ffki# zV_>!cu~BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&B;Hofpi=z?ENG0@u%643c2c2-XZ^P-I|ZU}pdU zCI&{3lNlHpxEL511Q{3^7#SECShcn@Fm43NGq5mlGjKws_b@OsFf%YPY|z@mz{G5{ zje*$)#9{%lY_+y9urM3R%wk}dUe3V6yp4esB*J1O!?FNXh}B4j6-|iENQMnfh}}qr e9ZiVCNQMJVNPx{qMgU!_0K1Wl0J3I?PZ$8Ky;*|* literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/DMux8Way.hdl b/projects/09/Tetris/builtInChips/DMux8Way.hdl new file mode 100755 index 0000000..c5536b8 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/DRegister.class b/projects/09/Tetris/builtInChips/DRegister.class new file mode 100755 index 0000000000000000000000000000000000000000..74a713d010fd8f6e39ea4d2b8bfcbc497026feef GIT binary patch literal 339 zcmX^0Z`VEs1_pfwDJ}+f25wFUHU=IJ23{@(J_ddeA;8Wc$j%_d$iQZknU`5&$H>5} zp&7==z~Y>rlFGxt!NAGGAj}}b$iU=c#m*qg!yv{W&ch(VAj!xemQ_0)$caL&&y$j?j7 zE3sx|ki;p;$iQBlTH=?Oo65)_s^OEBSeB@tlbDyTA6!zDnU`)2ay)l&YKc#Na$-ql zejXzOtA?kiW*CDa0~-T70|+oOFoHbBz{tSGz`&r#z|6qNz`&rSwVi=cYYPL@F$PHx aCB(dqfd#}6WY{9exN92&>qd}f1_l5z_)BpB literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/DRegister.hdl b/projects/09/Tetris/builtInChips/DRegister.hdl new file mode 100755 index 0000000..6c9a254 --- /dev/null +++ b/projects/09/Tetris/builtInChips/DRegister.hdl @@ -0,0 +1,24 @@ +// 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: tools/builtIn/DRegister.hdl + +/** + * A 16-Bit register called "D Register". + * If load[t-1]=1 then out[t] = in[t-1] + * else out does not change (out[t] = out[t-1]) + * + * This built-in chip implementation has the side effect of + * providing a GUI representation of a 16-bit register + * called "D register" (typically used to store data). + */ + +CHIP DRegister { + + IN in[16], load; + OUT out[16]; + + BUILTIN DRegister; + CLOCKED in, load; +} + diff --git a/projects/09/Tetris/builtInChips/FullAdder.class b/projects/09/Tetris/builtInChips/FullAdder.class new file mode 100755 index 0000000000000000000000000000000000000000..2ed9eadef15d6454351c107a83ac11391786c4ee GIT binary patch literal 380 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1rTrP08CV$@7@W1XFfcJ2 zZDU}z0kK#>EL#wZ6~wZWmPwFJm~6(PwS|F&*+`UywP5l#238P{1;on%@gRmX007EZ BN1p%y literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/FullAdder.hdl b/projects/09/Tetris/builtInChips/FullAdder.hdl new file mode 100755 index 0000000..a4caa56 --- /dev/null +++ b/projects/09/Tetris/builtInChips/FullAdder.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/FullAdder.hdl + +/** + * Full adder. Computes sum, the least significant bit of + * a + b + c, and carry, the most significant bit of a + b + c. + */ + +CHIP FullAdder { + + IN a, b, c; + OUT sum, // LSB of a + b + c + carry; // MSB of a + b + c + + BUILTIN FullAdder; +} + diff --git a/projects/09/Tetris/builtInChips/HalfAdder.class b/projects/09/Tetris/builtInChips/HalfAdder.class new file mode 100755 index 0000000000000000000000000000000000000000..e7741ed48866ecbb8a9cf92178bb92a33eb10368 GIT binary patch literal 360 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1rL7s58JIyqrL~2DiP>ly m1G5c?#R6j4YHeX)VK$PMX_~x^ffdAIF_M<4192b*F#rHIn?u9^ literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/HalfAdder.hdl b/projects/09/Tetris/builtInChips/HalfAdder.hdl new file mode 100755 index 0000000..1591b96 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Inc16.class b/projects/09/Tetris/builtInChips/Inc16.class new file mode 100755 index 0000000000000000000000000000000000000000..b5b2aebe7bb4d4e7e8ec8d59b79b8302b123e9c7 GIT binary patch literal 333 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&kOTcamW@O;XFD-%VXD$XwuxJEphA}8IuraVRfB+K% zBgnlBj0{{13=Dz{j0}tn3=FJV+Zh-)g5()k7`PcYq0%Z0%nVEn3=9%lTNs#_jkYl` W+h}cJU|}|rW=WX5je!-Sg8=|!B$zTd%nSls%E(Qw*OAyP7 zi@}<~21M9`l-Pj?doBhC21hOiNd_m7gfmE;3y5$9iMg>exN|Uga50E7cycg!u`_tH zGx)GG_%bpuXQx&&GB5@+GBBr?W->A;`UGd@mgXduL-?$ z=)=XW85y{;Q!4|CQj3dIQy3X!G!TkX%Tn`7Kz6!<7}g-uxwBI%gHm%+6Tyl(vQsNV zDhojRxYAQg!V+^zQyohf8CWztHG>%$xLhleQwvHm^Ye-s8Mu-&Qj@bi^HNePAPT}5 z8Mum(G_h)U25W}#Feor6vNQPcF!(bB@Gt~21Tiwm69@zz1~~?K9)@6s5FUn5hA?)9 za2|#ThDaWUD3DRnAfsY<7-AXXco<|DWO*3k84}nT5_uSs7?ODyQWz9@7*ZM1co@`6YvqK@_e!vsj@hH8DjYKQE_}kwG-6G&85fGtW6Av!ECh%;2bHWROL& z*a@Np8r2~H;-iFqkGAPc3S39drFxI8m2UEd2i(TRaPfhohtz?Ybk;+?RQ56T7*KR~h%zH9(W z+4-d<1*IhcnV^&{6pb8`e)%b>){G4NV7Gu{Kp!N;$iNJCBa22bD8RT<%Mx<}5{pvv zN*EbHdB;1o(l0SLm61Ugn|HwhYYol6If;4c`oSednR)4;>|YEHdPW9Os77RIkX0PX zIjM<7-l>%giVTtrQVfg?(hN)tOrWg5z`(!+$~z1U3>*xMpq$6R$e_f)z~IEd%)rRN zz+k4eoq=%&1JgDJ=9vuITDuuoBDXWJZe?K8+QPubF38BSje#A++{VD6wT*!j!sOb> z00N8*$_y${^8^_f!RE1oRBQmrGB7fzGN?hNT^X1em>3usEVXtpaBFX4;MvN+tF?uJ zcOHYL))odnW+M=18w0=AHU!>;5G&!n2qXiBMrfRWMEL$Vul!o%@i(> zDccx?VcIp|+Ihi2!@$4@lhS0+VqgM?jTqEqE-mTp3?d+xtpR&Tn}LCWg@KVll!1vs zhd~#rS{mv#e(9MEyt^4hBZb7aGl=hp7>m%t$e_od57i>Zz|6qRz`(!-RxSZjj%EP^ E0L6`vGynhq literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Keyboard.hdl b/projects/09/Tetris/builtInChips/Keyboard.hdl new file mode 100755 index 0000000..26ca5ed --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Mux.class b/projects/09/Tetris/builtInChips/Mux.class new file mode 100755 index 0000000000000000000000000000000000000000..75c66452bb093e5fcab3b770331d2b3cc81b6af4 GIT binary patch literal 356 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA(E3``6x3=9m0T3Z;Hn2okEFx!Aw jEFhLGh{XzG*=cQIU|}|royEW|y_|tXW*Y-5#3%*;HwHlH literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Mux.hdl b/projects/09/Tetris/builtInChips/Mux.hdl new file mode 100755 index 0000000..a0eefbc --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Mux16.hdl b/projects/09/Tetris/builtInChips/Mux16.hdl new file mode 100755 index 0000000..676d1f4 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Mux4Way16.class b/projects/09/Tetris/builtInChips/Mux4Way16.class new file mode 100755 index 0000000000000000000000000000000000000000..b2e2ed773d8437a2fd7f69d81ca6300eac2b0702 GIT binary patch literal 435 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1rP~;oz}l*`wlFX;8*O7? zwgItNKrCAjixtGO1F_gZEHf4mlO4=tWj13IWnBd}(-cfHFfcPPFvv47FsL#xFlaL{ mFc?aku`Op1mI0BxvLKROl*NoqYYPJlvymvBP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&$^aTpmmGxG{cO9C?U ziWwP%qJ5B*`Q@jiS~D{6qX{uGFsG-MfZZ3&$iS6fS_0S4Tnv(6(FoQIV^CyZV_;_h z0VW1UkeeA88Mqi27z7y@85kKD7+AHoGcaxh$uqDpa5Hd1r5`acF>o_5FkI8x!ob9A zw2gt;2E<|kv1~ysRuIb$#9{-n%veB7b}*9_#N+@o*+5JIhzfQv8=`~*%!a7pWH#dx zfq}t^fq}u3fq@}_fq@~Mfq@}T+Kg*CgT4%i)RYC0 q%AzbFN=B3wM2U*Bfhayvb`Zrb%3;Q(wS|F&*+`UY8v`rEzYG9LH(KZb literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Mux8Way16.hdl b/projects/09/Tetris/builtInChips/Mux8Way16.hdl new file mode 100755 index 0000000..dc16861 --- /dev/null +++ b/projects/09/Tetris/builtInChips/Mux8Way16.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/Mux8Way16.hdl + +/** + * 8-way 16-bit multiplexor. + * out = a if sel == 000 + * b if sel == 001 + * etc. + * h if sel == 111 + */ + + +CHIP Mux8Way16 { + + IN a[16], b[16], c[16], d[16], + e[16], f[16], g[16], h[16], + sel[3]; + + OUT out[16]; + + BUILTIN Mux8Way16; +} \ No newline at end of file diff --git a/projects/09/Tetris/builtInChips/Nand.class b/projects/09/Tetris/builtInChips/Nand.class new file mode 100755 index 0000000000000000000000000000000000000000..4b429bada97350f1438428fa168bed2c8096ccc5 GIT binary patch literal 344 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&5c+85#J|gcuo^(^E^pP77va;L0y8f$L{321&4J1Z##dC^E1yurq)F69Xg2 zxeSa9Tnr2hf((odj0_A6tXkU{7&n6C8CV#&891TR1`I3=%nS?+Dq33@n3#>WF)-VJ bSS%oxt=1L>7G@(BX_>l|$=euMA-Wj=L7+bw literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Nand.hdl b/projects/09/Tetris/builtInChips/Nand.hdl new file mode 100755 index 0000000..ae0204e --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Not.class b/projects/09/Tetris/builtInChips/Not.class new file mode 100755 index 0000000000000000000000000000000000000000..4726b678408f6fb87b2a44060bdcb07ce67d8fa0 GIT binary patch literal 331 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA%i49pBn3=9ksT3Z;Hn2okEFxzNt TVPIi4Vv$anyp4esqJsed`Mo>{ literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Not.hdl b/projects/09/Tetris/builtInChips/Not.hdl new file mode 100755 index 0000000..5b9d897 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Not16.class b/projects/09/Tetris/builtInChips/Not16.class new file mode 100755 index 0000000000000000000000000000000000000000..ff3e68f6b9766669c35db54e79cc853dc9a3628c GIT binary patch literal 327 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&@kmV0)^|@VNd@Ui zNwsEV;71c;WMEEDEdjeKn2~`izqACdpSc($!J-kY8OETfrZ&f OnyG2>HU?IR4h8^*oI11s literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Not16.hdl b/projects/09/Tetris/builtInChips/Not16.hdl new file mode 100755 index 0000000..c50dab9 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Or.class b/projects/09/Tetris/builtInChips/Or.class new file mode 100755 index 0000000000000000000000000000000000000000..a5b64f9419c5dcbf1a9b30e44d7d32cfd0cda243 GIT binary patch literal 340 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&kOTZ2bW@O;XFD-%VXD$XwuxJEphA}8IuraVRfB+K%BgnA~ zj0{{13=Dz{j0}tn3=FJV+Zh-)g5()k7`PcYq0)K`%nZy73=B$ITNs#_jkYl`+kjXs XAeODx76uk(BWan2$=euMA$l1A^#wib literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Or.hdl b/projects/09/Tetris/builtInChips/Or.hdl new file mode 100755 index 0000000..4a3f14b --- /dev/null +++ b/projects/09/Tetris/builtInChips/Or.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/Or.hdl + +/** + * Or gate: out = 1 if {a == 1 or b == 1}, 0 otherwise + */ + +CHIP Or { + + IN a, b; + OUT out; + + BUILTIN Or; +} diff --git a/projects/09/Tetris/builtInChips/Or16.hdl b/projects/09/Tetris/builtInChips/Or16.hdl new file mode 100755 index 0000000..6c124e8 --- /dev/null +++ b/projects/09/Tetris/builtInChips/Or16.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/Or16.hdl + +/** + * 16-bit bitwise Or gate: for i = 0..15 out[i] = a[i] or b[i]. + */ + +CHIP Or16 { + + IN a[16], b[16]; + OUT out[16]; + + BUILTIN Or; +} diff --git a/projects/09/Tetris/builtInChips/Or8Way.class b/projects/09/Tetris/builtInChips/Or8Way.class new file mode 100755 index 0000000000000000000000000000000000000000..104804b24118329fc4c994a065abcb49ae1bd0c7 GIT binary patch literal 340 zcmX^0Z`VEs1_pfw87>BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&%*eo%Us?j!&s+?WV9^NH3}aAaU}Ios00AZj zMv#LU7#X-27#IW@7#SED7#LW!wlgqp1j#e7FmN+)LZ!7Bm>8HC7#QTVwlFX;8*O7? cw$a+cz`|@KJ&S>zc{u|M%j9hgtPp(+0C(m+`Tzg` literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Or8Way.hdl b/projects/09/Tetris/builtInChips/Or8Way.hdl new file mode 100755 index 0000000..dccd61d --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/PC.class b/projects/09/Tetris/builtInChips/PC.class new file mode 100755 index 0000000000000000000000000000000000000000..1e6ada1389a15401a6a660b935e8cc6a7f5d8f92 GIT binary patch literal 1899 zcmX^0Z`VEs1_phGA}$6w26HY33kFLNVa3j1&BegNV9v=P%V5L7U<=~dfe3pL;Q%5W zL4*@Xfio9_3xg|&0fV$I0FW|NthSz^b?z^tJe#>l|poS%})$iSYQlb@U&TENJ_31+$Em*+7u z@TaGixQBYewKFn^X=wUnC6*=XCzhA!!^N!`8F;|XaL!1~OHWNV7=`Cr267L`3EZUxDTyViVGw_?Xas`<`O-@>-4iqOQd8XWlS_*k8Mx9@OTbDT zOBfkgG(0tf85y`-E0R+SN;32FKnjvGQj@bi^HNePAPT}58Mum(G_h)U25W}#FsLx7 zvNJ^RFhnv$@i0U)#4s{Q;tVhz1|`7DhGZUw z6oynDhBStBc7_ZdhD?Sm9tH&lMIHuI1~VRpY=(3mh8zYxc7|LYhCGm5K7%SFgQ#at zPHK8$jzVHeN>OTYu>v^gco+&m#_KZZ@h}vE>@a39VPud1xlG?Zu_Uz^Ou{|P$RHWu ztdNmdtdN(lkO}g%o<}YtQ=$l#Bs&GiFt|XAQ|rT)Dq9U;*!L? z! zVqUs_a7j^SUb;0Xm9Q427N?dlGH@5CmiXi+CxVg!BLl03rzc33J252%;aWrDk|az6 z*nEM+loZ#ZqWmJ5C?kV1)EIF3E!GFig4r-7V2zxac?G2<0hyqLDHM(Dd%ygYRBJ{C zex$Gi34t;%$S2Gi;DnuDS_0S44ECZ5SObB$VPxQdWfMjQ;pCju#3HZ*VQwpCWDv>A zFUd@+L>J~tElbP^NGwXtD`8M%kY$i#U}TVIU}9hbrDp~P1}0EOU|?Y2VqgSiAO=PT zH3kNTAO>azMg|53H?8dqj5`>ZwlOfzWU$uS&A<}5oq=^L1Dnsc26YBisQD!f%nYmy3=A1sTNrqmjkYoH*??Fq zAeJqN#R_8Cfmm!HmKlpE3(EoqZY}1m4E)O(6lB00X)s4vmSq70pH}1+27Z==$y*ut zLDn9FP|R9e82Gm_2*6yR0e68E0~6SXd|F!=1euK>>VzQb7#TDfw4g2(WMBlVV+EPI z0pt$`Mh0yL9jLSu12Y3N0|SGZ_BIA#Tdi#jA~LfXxMT$D|1V*X*Af!l#vlgLc#J_D zM8TZ1oPk42W;=s8#5yJhT?RdFo?M`ys|6v@n9oL#P&U1}1Pwa6>FWcn_hR0RV-^ Bta|_e literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/PC.hdl b/projects/09/Tetris/builtInChips/PC.hdl new file mode 100755 index 0000000..f102d99 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/RAM.class b/projects/09/Tetris/builtInChips/RAM.class new file mode 100755 index 0000000000000000000000000000000000000000..e17050f0cbbb0bd207174db146fedf32ee3c7ce2 GIT binary patch literal 1928 zcmX^0Z`VEs1_phGGA;%=26IjZSq2L(21^Dj5Mj;EV8g}03K6yivFt#EJ&14s5so0j z38cxHi@}A#6~uJ|aos^&4-nUri$Rvbi;KaV!3RY6g1CMl!XHEgfQUeLh9C}xU@itJ zh7fj!PACJW3Z1+%4{eb+; zypq%uU$C5Wer`d2UTR*6H6sI?O=ezZi5(*Yi-xCW7$XCVbAC!HBLjPKPJVKBXaOSw zvj#|*vnUm$tF$DQk%1E|=aOHZ$H>5+o?7A_>Isqqo5;u@rlIMRl~|UjpIBa^4;Qy) zWZ(fi(>WtCFFiGdkwH@f>^QKJ(vsAofW)GbVicZh8OVts+qp{%QW8s2!$AIIWMI|s z3QQT$iU@Vk(^pkl9`_eQjnaHnw;&K zmy%k+$iP($SIxtq!l1#!punKW&Je-F5Xlh5!w}67!^j|qKm2$Ylo*tG7-AXXco^at zRCyQ@7!r9Hk{FVC7*ZHgc^J|d(%Bg@co;GnvUnKG7z}tAvKi8O7;+eLc^L9Q>NOcO z*ctM97z#iN3K@!c7>Yp-(FZ9l0kKROR2dm0K(5etPb^6-29t0vF*5La=H#TNC*~+* zf;VZ(?3zI!J~)J+;I$uec;JFFBQwL0Ur-63duMtr-~vGmF7a zbPx4(%}Y$m0VNA&4b3P<2JYh266gH9lGMDCVo-!fLn0g$W0}R7Nja%O`Q^nBWj^`I ziJ<5ODf0v;VeZ6~6ogX^iA!fN4c4HPC6Jhs;#yRcUj!3nWKf1015T91`e0cw8>R%T zkux)|ptK|)6O`D5qLIDsm!Fbq&B(xy6mTFRMh52e)Dmzm10~k{(h|6S=340h2P`{4n9yX;tfA@2$RM1YlbTor_65uXp!|_qmY5TeSd^Mq z!pI=10m;WXiFxVz!6ikRdFj@gVJwOavJ7$zj12M&ObjfbEW^OSzyit#3=9n142%pa z45|!_3~CGv3^5GM3``6R3;|l(85p&s_i%1yVA{dJyp4fnCWD>UZU)xK?F?*N8Q8V9 zfHBiH1`ZHYfMXj2Cx{`)uuOn!8v_@Jt+kDT8%pzRWB>sc26YAvs7>w+%nU3H3=Gy< zTNrqmjkYoH*??FqAeJqN#R_8C$*?S7kkZ=1z$7aj1~Tjz0}qIjmEOj{4>ME~Zm22L z`I>M8K!yr18-YxaHr>V`2-18E;x6fJ3_>s?wBSYvGB7eQGB7Z(YHec>hDb9qXfxDT=(~_0h&L9pkjfp{@!2qgU zhk==anSp^p0qi~*WFJb)Y-8XDxj}0ig9Jn;BZDE_nY;`PU}rMIq>LDh8JNIvD8ax4 zjzbFo@XV3SSPfL&?=j(0`|DF!A6QwCM2dKGA(Nl4FT;E@KY-?xx~cQ=Dnq>%J> d2ATa38xVRKLB%3euLRTsP`jiN-bAQp002NJuHgUx literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/RAM16K.class b/projects/09/Tetris/builtInChips/RAM16K.class new file mode 100755 index 0000000000000000000000000000000000000000..2f1e3feaaf03e35f6ada3dbd8d47cccfc5272dbd GIT binary patch literal 390 zcmX^0Z`VEs1_pfwIW7hc1|CiZb_QM!20ktZeg**$AqXOb*cpV`8AKQv*laTMGE3|j z8JIOR!x$M@obyvsc^EhuM0ps*7{nPFID#B~6%5V1t=JhPco-xZq<9#lL6R~IvWyJE zNu`-NC7yZC8JPve`azDqhGyQ33gXb5nEkiz?kiJsBAkd^{49v)w~I z^#k%V^GZ@ve8FE(S&hZUzPh3kGHeMg|539W6lzhV2ZDT3Z;Hjxi{JC?V!;3@jjq0Q)uu TRuF?-kWqab1KUQBF$@dVMYe_AV*&X6K^Ya1`!?xQ3f$a2BDJm-wef@1w3 zM_&_fMg{?NK}H4^4Ns7XoVlsF`9+oPp`MHk3O*i*$=U9qp85g#nRz9tDZXGi=ltA) z{Jhk>5^F{VIs7UZ8Q6VMYdyAV*&XQ$r&wb_Nk122lnvMh4-e(#)I^&phXh%z|S5 zAV*(QLnB580d!GD1{MuZkeQshsk!+@mF}UQj0_4s9*N1>?xCLg0r{DEC8;UCU^(af z+=BeP)VvaFMg}?jDi|5qi&IPd5_3}-8ALUFvJ%S@^>Y&Q()EK&iZb)ktu@0K6d70< z*cd>7k%5tcoq>aak%5zefkB0ViGh)Ufk8q`kcnYC1Eba!2Bu>SJRnMlc^d=EMvxW; F1^}D{Ly!Of literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/RAM512.hdl b/projects/09/Tetris/builtInChips/RAM512.hdl new file mode 100755 index 0000000..2a2f433 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/RAM64.class b/projects/09/Tetris/builtInChips/RAM64.class new file mode 100755 index 0000000000000000000000000000000000000000..a1fe78ab90af4332d0a4dae904dd6f871d6cad28 GIT binary patch literal 308 zcmX^0Z`VEs1_pfwaV`cn1};tpRt9bk1|BX3UIspP27Y!10Y(Nko6Nk-5<5l)W)00S zMg|t={FGE426hHP9tI%>VMYe_AV*&XGZQOz1`!?xQ3f$a2BDJm-wef@1w3 zM_)4&Mg{?NK}H4^4Ns7XoVlsF`9+oPp`MHk3O*i*$=U9qp85g#nRz9tDZXGi=ltA) z{Jhk>5^F{VIs7UZ8Q6VMYeFAV*&X3oCX85grCn1~Enk!KBj6oD$DG=ZwsPV*MaT zUkgSC0dz4&1{MuZka?WBsk!+@mF}UQj0_4s9*N1>?xCLg0r{DEC8;UCU^(af+=BeP z)VvaFMg}?jDi|5qi&IPd5_3}-8ALUFvJ%S@^>Y&Q()EK&iZb)ktu@0K6d70<*cd>7 zk%5tcoq>aak%5zefkBypiGh)Ufk9kLfMYuYqt+G%reh2|AWDdN8w1NmkPZe00DmJw A&j0`b literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/RAM8.hdl b/projects/09/Tetris/builtInChips/RAM8.hdl new file mode 100755 index 0000000..c08d62c --- /dev/null +++ b/projects/09/Tetris/builtInChips/RAM8.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/RAM8.hdl + +/** + * Memory of 8 registers, each 16-bit wide. + * The chip facilitates read and write operations, as follows: + * Read: out(t) = RAM8[address(t)](t) + * Write: If load(t-1) then RAM8[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 RAM8 { + + IN in[16], load, address[3]; + OUT out[16]; + + BUILTIN RAM8; + CLOCKED in, load; +} diff --git a/projects/09/Tetris/builtInChips/ROM32K.class b/projects/09/Tetris/builtInChips/ROM32K.class new file mode 100755 index 0000000000000000000000000000000000000000..c4320d8ee7fd27ad78ca3ab43a7e45f107a66d2d GIT binary patch literal 3469 zcmX^0Z`VEs1_phG+guFx46)1%3=IsN40a50TnzCH2_Pboogs;ffsG*+B%BOlrGSW3 z5Rt~gkPf0VKtv{p$N~}BAR-5(K9`Fjk0Bq#DgdzxK@vq=48;s391Nvg3}p=EAdw0X zQOU(%$4~_#szF2z2SY7LxQ>gVo}mFG(#X!x#KoY@&B;`* zoOu|QF)Zg{Sium;*v`YSgJBB~!%l`>JPf-TBH0=C@G$r=>}6zN)yqgs&Sq!W$HTCn;Q$ZA zL6GT(Kqh*EOgs!Cjxe}0GI06iC#GcPrR(YG@h}`^@MUK>#=~%&;RMJWUq%K+aBMji z7pLYX<)jwr!&&fH=3zJqQhf?!_Gt!pc7`)N3}-#K7qqDaAUK zrlqA8@i1IvxW>b9o#6%}1EW5Oag&GP7RYF|kc`Y?h2)IP0)>?P)Z#q#5{2T@f`a^_ z5`_}53@lLyCzWRAlz8SjXJi%>gYu-YkvAiQERuJeAPPXf3ePOba1ZrlWY7W26G+@X znZ+fkd8tK=3<_Z7;1rLVbr4F#!Ad}uKmxGXH!&|U9i*8%J+;I$uec;JFFBQwL0Ur- zk`XbLS~D^TW)_1z;vVYhnwOZA1IoF~8k$jz4BW-3CC>SIC6MrB)rf{ep=B5^9 zCcEVqGOp(0&lFYP942v@|Q&QoIR6v1- zQe$ALKNuM}V6_5-39Sm4H8edL8MI(|1s?XeVglsCko=I;iV{%p21DyoRBv#X z>3$k93eD-#;lUHMztZ(^g1HXU)ifq8wIlV^nBxN26w0%Oc|INm>3usG_|%c2r(ONV-U8{+QJ~h zY^1e?fmzyg8-plF?=grK(%TrsAVx4UcrkcGjSysD1bc%Oq;dnu0tOZa9|m6rCa^E# z8JHQE85kIXwS}0NcQA85FEow1jlv<_dz0 zmj$_B)^r<#F35O3xbaM&dLL@M4m7wFKx(CB!a(|RF+9eGN4ovmY3^7pk3mBLgSQr=>dbB~w z&q&C48-vMAhBEDatn;B(nu4rE3I}i$?q)EH+|FPQ&Mp?)7%YXXwlP?1vlwk-u-?XC z1CCXtrh Ct$y18 literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/ROM32K.hdl b/projects/09/Tetris/builtInChips/ROM32K.hdl new file mode 100755 index 0000000..929f824 --- /dev/null +++ b/projects/09/Tetris/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/projects/09/Tetris/builtInChips/Register.class b/projects/09/Tetris/builtInChips/Register.class new file mode 100755 index 0000000000000000000000000000000000000000..3958fcd4ecd31f6dc560c2c6bbc0a9594988cc26 GIT binary patch literal 423 zcmX^0Z`VEs1_pfwMJ@&o1_4e6b_PK%1|bGv5K9C^h=RCc>T35dhUz?qp>P+Ag@nODrnAQbI`q|7frCDoddfgeqXk%2iqwFKLAeJ|X@BtCN>6yhPsYTBDxdr)o zsd**Vj0|ixnR%Hdc8mwl9wP&PdTNP# zs3%-IBZHWRrcYL4S)zVod5Jz;+?tVr2kZ>zjKsY3)D%VrO%1Rkz)DI>Qi}o-i%N=7 zc&=q2_kf(hU0RTmSdtnB@dt}WFi4Ouy)@H3F*7eU#VtR%w3v~BD?POYti-W|k%2|S zQ!|*6fy=cbIkli9Gd~ZcAUPv7IomTYCA9*gAdHcLs~AZWtA=N=W*85H5`!{3LkJH; zC_@+zLpVbOBZDN)0OMg$U{GXaUvpbCpYg^a{vg}i))Opy2V6hezr6<|`)u^=x+F*3*`m1gFY zc;-20WEK>|<32pIB*Q(_laWCd$r>k!N|2p!c^$AkC{FQ2m=7pD<)s!eGKhnfgG_+9 zy4W`{FEJe?!=0X5;+a=ml9-pA%E%zCp$SO}m`be~83Z$n!OnFL^>ockOv(YJ9cB&9 zC`JbM;?xqq#N1Ry22l-2lFLcVOVePC#N&YF-J0B7-!83>xFa$C%GcYnRFt}=MXJFjHz_g8lc_xFE)@}xt$n6ZQTN&82wlJ^> zv2SDG05Jp^wg_--W8eg_w=r;mD6MS_+)$clBLfJqFsL#pLyfm%U}j)uU|=xP+QPug zY_yGm&j!R|0kLdlSQaoyYe{cq;0GCS3_>w$ZDHWw#vlMQOAT(86ay33seD>n7zCL? zCh~7%5Q3;|V3dK-g~);0z)kio|oct8}hG~BI>47zZ)@-i@h z-M|Pjn2|w`L7#yM9O7b7`?<8Fw=;-?e7gqhMgwphF)~OnFfkZ17(rD_L!H4dJ(GcV nH-ki^kmPm-sr?XR5n32Qg%VVYI0F+n%()>J$iTgaP|g4VYU7R; literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Screen.class b/projects/09/Tetris/builtInChips/Screen.class new file mode 100755 index 0000000000000000000000000000000000000000..100ed03dc68a20edc3acb9b47e7f9458a680de3e GIT binary patch literal 1322 zcmX^0Z`VEs1_phGU@itR25n9TQ3f3@23-a{5TVb`V8F$|3K2F0v5Y_pjJX(07)(K2 zGZ5Dt#I@jJ5M{6g5mq3=nw`OhgTa=IL6E@?#J6W>aA0R}WMp7YFU@3RkoO7B%q`7H zEXgk_b`SN`4^A#hP0e%8&n?K$OU)~>W@KP1OUx-vEoNk3iVkLEV6(~0%Pg^DWMJ0N z3}a+qan4UkWn^Ga&dE>C4lQ70;4Df7X)Y~EWn|z4i@M~O=P@$yr>B;oi zh-qm0WF?j*>L-?$=)=XW85y`s3sMqGQo}&jGBU7gcm{)P;z~~~0Sh^nFfy=ccxnbS zGH|(8B&QaXWaj4;Gcs@`XQU=)d*-F2RzMVlF*0x!!!_|RNHfUrFi0{;u`@XFFgP=~ z@G!VCxG^%w;tc>E25|-n9tL*?4;}_j1}}C7Zyp98245ZqEd~`H20sQb9tMAg03HT; zkl}$KLW4n*kwL;EF*#e`J+UOU7)-()%E-X$nUj;6o|vPM334jPSwTDu$_y%u48lpJ znK>n%dCnP`1;x;qU}TU*GRg^}0Ay}>W=V#7s3#+XIFdX_qS!YvFEKr}h>?LiJ+;I$ zuec;JFFBQwL0Uu82ZvH?Mh3ymVz9ODp`NaJiAg!BDc~rMVr1YhPA&1tPfi2{GdMat zLD9jPnO9I+5|9ZBd7)@zgZ=VTQmq*o_>t@a34sz^Y6;j-P|W3*mcaEh7lR~NG$8Su zT9%j-kXV$OSHj33ssTwNIf;4c`oSednR)5fnqdrz45AET3=9lR3{0Tt0kb3-q!<_& zI2jm0@yx);Aj`nOV9vnIz{tSBpslr?fl*6Pfng8lRtBaW49wdYSY|SaYwc!Wjoi+_ zwv~ZhYYPKAJL@(Ej*Sc;z``KMAOkhToq?Hwg@J*=T5AgfC$rHu1}+;Aiv`581+iE` zEIS#N1q@PJTNs#RrNcm`9b@1DQL@t87`S1E%EJv+V_;@rVqgI4-~<~0GL(ne2xNk^ z={5#lm>vbV9zh01uy0tkwlVNQq!}3$8I+*zL`ZL8VBY}p1p^Z(T|uRF7?>HD85kH8 zz&6MryHQ$Z8v{4UP_1nY{4j%68PphkwQY-8HD#kY(VH`1mz{DUJ0lxp>|2j LY-bQbSI+BP1|CiZHU?fU20jLU5K92W5@cr(VrLL$WMH$&%*!mXV`N~~ z&3Q&O!N8TiqJ7#Wz;Q%k@u3ua{C$}cT}>t`+oNw8=HYlbl>GO#hQGk^dS10%?_ z42%q13=9l{42%qn3=9mcTH6^IH-h9DSQxk&IHA&d49pD73=9lPT3Z;Hn2okEFx!Aw YEFhMx))od9W+Q2trpenFSRr~D0C2xPX8-^I literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInChips/Xor.hdl b/projects/09/Tetris/builtInChips/Xor.hdl new file mode 100755 index 0000000..8452d73 --- /dev/null +++ b/projects/09/Tetris/builtInChips/Xor.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/Xor.hdl + +/** + * Exclusive-or gate: out = !(a == b). + */ + +CHIP Xor { + + IN a, b; + OUT out; + + BUILTIN Xor; +} diff --git a/projects/09/Tetris/builtInVMCode/Array.class b/projects/09/Tetris/builtInVMCode/Array.class new file mode 100755 index 0000000000000000000000000000000000000000..c76b652c52cea0217b34479ef7fe827c780e64b9 GIT binary patch literal 436 zcmX^0Z`VEs1_pfwX)XqK20;!6Aua|s24M~c5e^1Xb_Owa2609PHk-`6%o00B24)S- zFh&Lz=lqmZMh0d-*KkG#7L8!dU`7Tm*NWuSf|AVqykd3+2}TC?l+5CS{NhxIf-oKi z4hBv}2F~EhV!hO&qWmHr21y1fMg|_=)ZF}{O1;FKocv@)20kb^CDjokAe>a1nN#AK z7v>AHQ{S*EP2^C$S{INIxXCC^s`N zu_QIjH=rm#y(lp^B%>(5JTWOJm63rbIWZ^4tu!wg3Lv19P|#i_{JV<~3loybKHsEDVecd<>in{0st6T_R9j973!h LrQr~B5o#F#px{?b literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInVMCode/JackOSClass.class b/projects/09/Tetris/builtInVMCode/JackOSClass.class new file mode 100755 index 0000000000000000000000000000000000000000..25df72a4693f8cfdac9990c7b9c0483bac190cd7 GIT binary patch literal 1782 zcmX^0Z`VEs1_phGa4rTu23sx$I|h3W1_v$%UIs^Y1}82CRt9Gf;Q}IDnHd=V|L0(E z14+AsL_F9TJlPq%7#XC3BZK3^9X&(h{aoE0Lp;M=<6T07978<){TLY-gBclko%8dG zOA_-+!V+^zQ<)hU7#JBDq#T2S93$iXT*Kr2{QUy_gFV4IgFT}_RxvO!G6?uOhIqug zc!qhpxW-4h2Kj?@GBYv=fyILZgAf*iWLOv(WPM$I{evRo9esTKov|9r%E%yvqR7M5 zF(BSQ%r(f($3Glo3>zbZe6VwntE*qUOORuDfMVh0y zJVU__gNJd81EM9;{!575aAHlAje==AID&@N%5|}0U?nf6+)m; zg4^Qh7ZUI37aZ#5=IQL|>K794>=@wa>9HyV6(~0%Pg^DWMJ0N3}a+qan4UkWn_@eN-RqZE-A{)OApESN=(j%utSS8 z^U}k785u-1d_XGna}x8?^&xWBn!$_=T&@+#sRbpO`FX|c4Bm_k{2)~j`H+0iyb>M; zQwB431|J>Hc41!QY5(^4a^HM*EP2^2V}Iq6I?Asfi}8=kkq2w%)G>s)G*(GqWtut#N3dK zqWtp2q?}Yn1_7|!k%EMgfh{LBFTErK9J-#23_Qt+IXP~ndC8y85!7CEhx#%&nsqUuwrE3C`wICan49Af--$F z^FaDFf;EE~8Q4LRo_QsV416FKNSR;0YjQ?DBZCM?0Hio1-z%{!F}S2CGcTQyK~y7H z(qT!HI{#nZbpTK@MS}XI@EaQBi3@Nooq*Cp-+&3^I%iLdYgV zY-VH-LuiEvIhCfRr55opxH7o$Ft{^#@Gy8Xc=0fJGx#tvh$WR~=9GBmh53SlQQteY zGATc?D20(h5>>)0F*(~m*f}S$xR{Ya+aobKTR+U#HMcY;u_V7pKP0s%H#0A>BsI)8 zpeR4RC^0uAqbR>TF)1gNk%0>oZoa9x`9+nC3@jR+pkU@nPRz-1E6qy=MGGT?mDAbd)A?(oN%)In4Ur^vnpyyI zlNTrcX_371+9 zbhTWd`~fxBl7WeVnSp^pmD!rvMtUX#yVOhuDG>(F9Sq#d8CZOGFz{MS&HVpT%4Yfh zC(>&e7#VmNgcw8_co-NM5I*GsSSQr=>I)wPZzS_;eAGw`Dzz5;+NLxXM zhWQMkGJ*_^3mEjYw=oE^q}a*M{{IXqL}WlA0@b4}yNy98eEI)lxa4KFF$jk*|Gx}f OUV9sZ$Og1nVE_QB%px`b literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInVMCode/Math.class b/projects/09/Tetris/builtInVMCode/Math.class new file mode 100755 index 0000000000000000000000000000000000000000..71aef914e8bb27f1170510b1a57819bea5c904e3 GIT binary patch literal 650 zcmX^0Z`VEs1_pfwMJ@(522l>2RxmQK6c-ki@G!75a4<4(23HpAr4|+C7x6I2GRUzr z$n!9WFeorG2ql$f=9GBmh53RUpzoVllEKIzi7M!on4Ik&?3|NWT+GOz?U9(Atsmy= znp>KaSdw3)ACg*>o0*qbk{ae4P?Voul$aZmQIubvn3R*s$iS1Fn3LmHnwJc6A|r#C zhEG;vS)zVUVqUs_a7j^SUb?j>$d7yoVTco0G+Z=Y7!(;;8Q2&=fP;Y%8Hq=1WOuOomDGGw?AmfvuN;N()HOV&D>DV%x#M94;lD163)& zz`(%5z{nuTz{wy4H&Ps`hg(W|2?M({vc1AM6iF>-V3CH|F2cYAwOyWp3G8`csW~9q Q*}=BA?_gl*!*Bot0673`&;S4c literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInVMCode/Memory.class b/projects/09/Tetris/builtInVMCode/Memory.class new file mode 100755 index 0000000000000000000000000000000000000000..e9bb7ad3ff815685aab0771a85044a2f062fc3e5 GIT binary patch literal 788 zcmX^0Z`VEs1_pfwWiAGG22m~sHU=>eA>MB(*3vGcU0uHOx1lC_lX@F*hWmD8D>0DJPYYfxEmYvm_N}E~|#8C&;~AMX8A? zFhLd#Pmq^*k`r@s+)DG3L4Iar5YzCTn*AFf!%FIi*_S6h!P-I|ZU}pdU zHU>tJ{}>n zq@=MLDFipNo`IQxnSp_!Sc+v41D6mB#|{S8a6t|R8)jQ+LHqxU8N{V`Ffd2jN-bjG zm1arU!N6>@{QnD()Di}6Ar=8Pka`&@)`TStn$l7UtO+twDXb|w7?`A`64(+TIzT*@ z1h6cK$qXV`6DDJNK$t-U>VZH8W(HOU1_oCt)|AOMASc*D%(9aOyNXv9O+L0)sm<1H*p?5X%EZcycg! zfoN|K;R7OkL4+R%gFgpD0Eig~B7)c%g4r2DxEMqkoH!UlL39|12nP`nTnr)%ksu-p zL_~vZ_zz;murtK6GsH16u=&M1`}+hlGBA2FGVnU*=M|SE=9Ppc=9H!~GcYhXfK>$f zhX;dr;*1Qu!6A-8A@PnbE;$lVy?zGIJ z;u6oi@cg0_Mh3EO*XGEMjC}(eMO`aJg0_rxuiC=I0f&GsH78aOLKg zr8<`u73UW*GO%g{2ZI!G78GUXmB93Yg}A{&!6ikRdFhM{9AKVjUI`-uJD8c1$H>5$ zl$e|yT#%TY%EMs5V93Lu!=THb{-q@ar6r6ElBmL7 ziOJdi!Ol5}plH?hNKDSw5A$`+EzJSBK|dt5C^s`Nu_QIjH=rm#y(lp^B%>(5JTWOJ zm63s~C^a#~H#IlEs1g!k!Hf*tjDU1v{Sd?gD7zYU{YeoiX4Np9>93}aX&}U>2(ZEz^&B!2% z&AKo~23Bwe0H<(gMh5oe(xReNQ2JuYORXqjP-IYGP-I|WU}unGP-0MKU}R8XU|?Wk zP-T!}P($LYGe|LLAn`RBI6#Syfq{VoloG+T4udY3)??6TU|`^4U<9RB21W)W1_lN} z21W)(1_lOJt?dkq8yP@=lfjt55F*X7kAVjy#IcEGGXs-=!e$0$=FJQ&0`&siM;Ta| zHZ!m>3)rJWX679X>;ekR2msM>0IO3HFcUBn5P>NMDOF|`5E2j) zut$&(BUQjg7_$k;2^a_%3&?>D0clWWW)@HuFcy#y;1OUGFcvU`s8<842PrcXkOo6D zh=e*wrvMwWof=ThYyuF-BOn1$t0}-Hz#||5hddyCAWOBFnVG?^uosXMFlL6R)&>dk z2=EBlgRFoG>Od_52??-)eXR=?60iqTAk*}~EM}yD(Pw5BP!KSHxQmSiV!i>`OU42) zC?~)JkuVhC5#STx2U`KMp9f?%$Y3Lo>)^%+7{kOt;b$yhAYdRM1160H{jJpfnpSJiyTlOGNVp1s3|1E47T_1)2B&X(h=d!m1RKo# z?oiVOtigtv3Ftsndw{thlR?ITXsA0qAvp*Xs89@z2rmH}aJ)kjJt*fuBf=YMlr+N0 z5IcO>zyR5iz5CDW~=rk4pl^3A$3*@{EkVB*e%%NsO(|RT-ZkYx6Kol55?aTr> zhFQP@M1e8Pm~45e1n6a;}5` zKiI)lAYpp}X=wcnEyt<_EWmNWBft)&Eg*iWfpQ^13??BGwFs3^B~ahj38)F^3P?gy zDOfF}EyD$Be?!_b3`Gpg;MPpqCI&VsBW7uTFwG(Zp;=`iG@B?3guyP#3Sn@FvOyRE zY@+N?7P}}1l*J*+31xALazR;KqTK#4`^^~48JNILtrP|p237_Jh6pJEg@p{9QUdi0 z8CaREH!(2HWZ)L!uwk}c&cG$e@ZUy&!v_mA_gr%2L@4=1PHl~L8klM~5?W4VoK_*;#8-uKn+A zK@DrwO$^L}j0vE?PJuSAK`m{NsQiHi3>@GlH>N?3aDyVjj$~l)1t%kiO$;pa7{ox~ vnzESz9IhZ^moq2`$V2$x@D-Flu$h4wWC^1qNFEfk%Nf`~HVY_ViC_i*?hBET literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInVMCode/Screen.class b/projects/09/Tetris/builtInVMCode/Screen.class new file mode 100755 index 0000000000000000000000000000000000000000..8644e094155ee50512caa7dfbb3a3ac7991ccd18 GIT binary patch literal 1921 zcmX^0Z`VEs1_pfwGcE=m231Z5ZU!|j25ts*5TU`rpb4V2K!i4k&|zj^`2Qco(q(7R zV`tE3WMECoNleaWWMGV9WMH$&%*!mXV`N~~&6nuHoqkaRV1f);Y5%8KjgA zWQb-M4+B4g01pE%10N5AA%i#%gAs!2Z*OwRTXcFsvGE@ouV_DD?5)(`V_%`MGIEXgm@ z4@oV`&CE+INe%N2D9TSSO3V$(D9SHSOai%%ySyl~B-J-HH@~Qok%6lyH8BOoVbSo^ z3}$5DNlwhkaVyPB289$OgP4X-R$^JAeokUux_)p;QD$DcwWnq-z z49pD73=9k^Qi2W)3D#0O7+7pKF)+vl+Og1sNF@ zGH?sA3b5~BU<;QPWMasWN?@;IkrLpqtJuN7j&3&>gA9W#)KCis7O)?5WM(o*fDFx$ z25FUsYF*ACO4vM31~~?KhGZs;nISd@4EG1?vveGGLtfH(SE^CPyt0;>o>mq0XnX!qo z&1B$^m0rleE6O&DK|)4q5reRl8M}34IHk?FWX#y5Wf9_{oT6N!Y&#e@SVdVgL|IbI zxIqjv9#I}vQI?DpGhR_nQT9a)`l8%(7W~@S-;J7wp6XF!$ml5EvOQ|tqmljaS5M@a);}B&9xt>#$a~6Y&D7z?Iof#L% z^k`8IFmDF~yEIF}WSbTah2{TWf@B;;IYc=V%(z53K>lZM;b0Wy5an9LARx*i#JPh3 zB(VJddysaRUQrGK1yRnF1T&81{|}&hk_%MgK+*@p3I-N%W}X9bH;XL9@gNshKpZa% zbv(q)98yp}aKb#pCCV|2K?)S|qHJ|L7}!O*V18K6;3dil3Uh8zPO!5fvB%!R$=JdL ziUjUOAdO%Th;o4`h}81`PeJBE4a1UOI2n`~RG{uZ%fQOO296|LnUDt@H8Lr)8Kk9T z62NI)NE*cDk(Nn-r*~eEDrP$wGZq$^6f;(7QI-^GQI-TL*%T?+gdGfA(y}SivI$b6 zEGbf=EFb|<7TF~XzM$M7Aj--ro57ZlV8*(fK^VjlWl7240P$N`{O=B1ZpFfy*fW)CHgBclkQ;QOdQ+*PP!Ri?q zI5P7}!V+^zQyCf9ic?EG^I)ciF*2~{rI!0-=7HR)0k$P6F*!T9ATc?Wk%2oUzceW) zHLx_lB$bCjgh7;%fit+WSTD7xD8Gn@!GXb%k%7lIH8;PgQZF$lCqJ2o!HL0{k%12? zmXhiS5p`j3Wn>V`N-Rs%&q>Tn*AFf!%FIi5DosmEE#hHtV{qqT@L=%dVen$`W@KOh ziTHpBUv>sR9tK$ke;x)oh5$wek)+bhoD$ExFkeu}LQP?0kVF;sN=(l74|dK;EG}kb z(Dq17&ejj}b0IOt!#1A8bw1%@L zhG~!xux4c7D9ML}2_u7u2Btb|Mh1S6OCV}O^1(4Eip6yx$LU}b$8EK=h9{PX9h(EAqHUv5a4BC1f>uLMg}nk1_nU}Mg~R(1_oBG?F@_?LGlco z4B`wD3`}5YeFkO*CI$uuWvMv~+(JwOd^;GJ!-ZI+SQB6Eq#0zO#)vR5fo*Jtt{M1VW?VmDVBsC4D6W3$}z}8 zjn!jdVqj)qU{Hc6wUwUDz#%QO5bRQZkUdhY3DO`#CSjVQz@Ug^3Jby%JFqFT5K{!; zrpWAIV8wK{5`!|-6iWtX29PPbQac#fZ6OY_la*Njc8nm@7}*5r9Sp2eED5q8zp+YT zI!gr}W}48TmxY*RBRvajln~e`mIP^*6s#^%g$JY^)I~wZ#=s}N zje&m~1GlfvHU@#ocAyY2V-aPMT?BTqFx17eI~Z7*%~(ZQWfw6>NUq@ CKr_w& literal 0 HcmV?d00001 diff --git a/projects/09/Tetris/builtInVMCode/Sys.class b/projects/09/Tetris/builtInVMCode/Sys.class new file mode 100755 index 0000000000000000000000000000000000000000..0c15f1b9fb855912121996b6ab5892b4b3bb8bea GIT binary patch literal 1885 zcmX^0Z`VEs1_phGd@crU1~U!@b1nug1`7@bOAZDr4hCxu1{)3rTMh<0kgz=mg9C_m z|@4hCNi20so4e-4HK4u(Juh9C}x zU=D^54u((;hA<9>a1MqD4u(h$hA4K1Xf6g-kmWHTIu=C4u`|T8GbAuFu-RnhWtP}6 zGB9gshA}d*IOnINGBU7$1Q{8)Tq}}O3raHc^NQIS5*Zm-G7@u27#Uc~6Ei`SMleVV zYidzZei09Y4udWu1GjH#Zhldv9!NhALlQ$WBLk;zVo3&AfRTYaIJqb_H4nz~FD)r3 zErIfQy;Ccb@)L_vpnOi>#LPUs+{Da0Mh2aLqWtut#9RfB#GI1U6e|U|oI+Y=US@Gd zYKlT?MQU;>$gMmKDGaHM41B11co<9>OxPLHco@Y&Q()B&_N>Yo8 zN()L-Q{et(WDtTnuAnG0uOzsnC^Ijek%8GYD2Rt4lOY-8w=6~meq=?Sc_oYtk}jo1 zi6B=f6DCC!=7NzCnmoqX*dgkP$rYGho6l7MU<|riR=NF}9 z=79`iWRQT#7P)60v2a_yHOvx-QW@J$I zO{~bwEzMQPNzF?y$$$q^UVfe~%&UwHQjpkC$jnPgtx(7>1&2jaeraAxF(U&XOtM%Z ztu!Zxk%1o}keXXiQpw05n%d11bwyrmyp zSKaSdw3)ACg*>3yz8~U#LAH8AbW! ziAg!Bj0`-^JQcZ!{Pu>kPFxn3kp*6 zQWzO@u&B_)a5W@otr;0OO7bCAFfxc}V5+lbP-M_z&}IMuRt82;Da63YpvS<#AjrVT zz{tSBz^b*KfpH^9o`I7=pFx*_2`p^}mSkYi5@OoHz#J~b0w!6(BpaAy2a_CNl5+1Jer>i#0cFC?&oL2w6yP`Hq=6o_KwX2ub)XXYdn}^jXf}AtdFqoWV&*+Gja~jgXAbat1RYS)b($210T^%NewU', '<', '=', '*', '+', '-', '/', '.', ';', ',', '&', '|', + '~') + self.key_word = ( + 'class', 'method', 'function', 'constructor', 'int', 'boolean', 'char', 'void', 'var', 'static', 'field', + 'let', 'do', 'if', 'else', 'while', 'return', 'true', 'false', 'null', 'this') + self.token = '' + + def token_type(self, token=None): + if token is None: + token = self.token + if token is None or token == '': + return None + if token in self.key_word: + return 'keyword' + elif token[0] == '"': + return 'stringConstant' + elif re.match(r"\d+", token): + return 'integerConstant' + elif token in self.symbols: + return 'symbol' + else: + return 'identifier' + + def advance(self): + token = '' + i = self.i + while i < len(self.file): + if re.match(r'\s', self.file[i]): + i = i + 1 + continue + else: + if self.file[i] in self.symbols: + self.token = self.file[i] + self.i = i + 1 + return + elif self.file[i] == '"': + i += 1 + while self.file[i] != '"': + token += self.file[i] + i += 1 + self.i = i + 1 + self.token = '"' + token + '"' + return + else: + while re.match(r'\w', self.file[i]): + token += self.file[i] + if i + 1 > len(self.file) - 1: + break + i += 1 + self.i = i + self.token = token + return + + def clear_file(self, directory): + with open(directory, "r") as my_file: + txt = my_file.read() + txt = re.sub(r"//.*", "", txt) + txt = re.sub(r"/[*][*].*[*]/", "", txt) + i = 0 + # TODO this should be a regex + while i < len(txt): + if txt[i] == '/' and txt[i + 1] == '*' and txt[i + 2] == '*': + start = i + while txt[i] != '*' or txt[i + 1] != '/': + i += 1 + stop = i + 2 + txt = txt[:start] + txt[stop:len(txt)] + i = start - 1 + i += 1 + self.file = txt diff --git a/projects/09/Tetris/vmwriter.py b/projects/09/Tetris/vmwriter.py new file mode 100755 index 0000000..98c4840 --- /dev/null +++ b/projects/09/Tetris/vmwriter.py @@ -0,0 +1,75 @@ +class VMWriter: + def __init__(self, vm_path): + self.my_vm = open(vm_path, "w+") + self.label_index = 0 + + def write_push(self, segment, index): + self.my_vm.write(f'push {segment} {index}\n') + #print(f'push {segment} {index}') + + def write_lable(self, label): + self.my_vm.write(f'label L{label}\n') + #print(f'label L{label}') + + def write_arithmetic(self, command): + if command == '+': + self.my_vm.write('add\n') + #print('add') + elif command == '-': + self.my_vm.write('sub\n') + #print('sub') + elif command == 'neg': + self.my_vm.write('neg\n') + #print('neg') + elif command == '=': + self.my_vm.write('eq\n') + #print('eq') + elif command == '>': + self.my_vm.write('gt\n') + #print('gt') + elif command == '<': + self.my_vm.write('lt\n') + #print('lt') + elif command == '&': + self.my_vm.write('and\n') + #print('and') + elif command == '|': + self.my_vm.write('or\n') + #print('or') + elif command == '~': + self.my_vm.write('not\n') + #print('not') + elif command == '*': + self.write_call('Math.multiply', 2) + elif command == '/': + self.write_call('Math.divide', 2) + + def write_pop(self, segment, index): + #print(f'pop {segment} {index}') + self.my_vm.write(f'pop {segment} {index}\n') + + def write_goto(self, label): + self.my_vm.write(f'goto L{label}\n') + #print(f'goto L{label}') + + def write_if(self, label): + self.write_arithmetic('~') + self.my_vm.write(f'if-goto L{label}\n') + #print(f'if-goto L{label}') + + def write_call(self, label, num_args): + self.my_vm.write(f'call {label} {num_args}\n') + #print(f'call {label} {num_args}') + + def write_function(self, label, num_locals): + self.my_vm.write(f'function {label} {num_locals}\n') + #print(f'function {label} {num_locals}') + + def write_return(self, func_type): + if func_type == 'void': + self.write_push('constant', '0') + self.my_vm.write('return\n') + #print(f'return') + + def close_vm_file(self): + self.my_vm.close() diff --git a/projects/10/ArrayTest/Main.jack b/projects/10/ArrayTest/Main.jack new file mode 100755 index 0000000..aa237b1 --- /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 100755 index 0000000..0ea96df --- /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 100755 index 0000000..68721ec --- /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 100755 index 0000000..94764ad --- /dev/null +++ b/projects/10/ExpressionLessSquare/Main.jack @@ -0,0 +1,28 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/10/ExpressionLessSquare/Main.jack + +/** Expressionless version of projects/10/Square/Main.jack. */ + +class Main { + static boolean test; // Added for testing -- there is no static keyword + // in the Square files. + + function void main() { + var SquareGame game; + let game = game; + do game.run(); + do game.dispose(); + return; + } + + function void more() { // Added to test Jack syntax that is not used in + var boolean b; // the Square files. + if (b) { + } + else { // There is no else keyword in the Square files. + } + return; + } +} diff --git a/projects/10/ExpressionLessSquare/Main.xml b/projects/10/ExpressionLessSquare/Main.xml new file mode 100755 index 0000000..f71a0ef --- /dev/null +++ b/projects/10/ExpressionLessSquare/Main.xml @@ -0,0 +1,114 @@ + + class + Main + { + + static + boolean + test + ; + + + function + void + main + ( + + + ) + + { + + var + SquareGame + game + ; + + + + let + game + = + + + game + + + ; + + + do + game + . + run + ( + + + ) + ; + + + do + game + . + dispose + ( + + + ) + ; + + + return + ; + + + } + + + + function + void + more + ( + + + ) + + { + + var + boolean + b + ; + + + + if + ( + + + b + + + ) + { + + + } + else + { + + + } + + + return + ; + + + } + + + } + diff --git a/projects/10/ExpressionLessSquare/MainT.xml b/projects/10/ExpressionLessSquare/MainT.xml new file mode 100755 index 0000000..441dfed --- /dev/null +++ b/projects/10/ExpressionLessSquare/MainT.xml @@ -0,0 +1,64 @@ + + class + Main + { + static + boolean + test + ; + function + void + main + ( + ) + { + var + SquareGame + game + ; + let + game + = + game + ; + do + game + . + run + ( + ) + ; + do + game + . + dispose + ( + ) + ; + return + ; + } + function + void + more + ( + ) + { + var + boolean + b + ; + if + ( + b + ) + { + } + else + { + } + return + ; + } + } + diff --git a/projects/10/ExpressionLessSquare/Square.jack b/projects/10/ExpressionLessSquare/Square.jack new file mode 100755 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 100755 index 0000000..ed0e6ec --- /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 100755 index 0000000..2866f0d --- /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 100755 index 0000000..288c6cd --- /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 100755 index 0000000..278a8a9 --- /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 100755 index 0000000..cd03a1e --- /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/JackAnalyzer.py b/projects/10/JackAnalyzer.py new file mode 100755 index 0000000..d7f8f02 --- /dev/null +++ b/projects/10/JackAnalyzer.py @@ -0,0 +1,410 @@ +import re +import os +from pathlib import Path + + +class Tokenizer: + + def __init__(self): + self.i = 0 + self.file = '' + self.symbols = ('(', ')', '[', ']', '}', '{', '>', '<', '=', '*', '+', '-', '/', '.', ';', ',', '&', '|', + '~', '>', '<', '&') + self.key_word = ( + 'class', 'method', 'function', 'constructor', 'int', 'boolean', 'char', 'void', 'var', 'static', 'field', + 'let', 'do', 'if', 'else', 'while', 'return', 'true', 'false', 'null', 'this') + self.token = '' + + def token_type(self): + if self.token is None or self.token == '': + return None + if self.token in self.key_word: + return 'keyword' + elif self.token[0] == '"': + return 'stringConstant' + elif re.match(r"\d+", self.token): + return 'integerConstant' + elif self.token in self.symbols: + return 'symbol' + else: + return 'identifier' + + def advance(self): + token = '' + i = self.i + while i < len(self.file): + if re.match(r'\s', self.file[i]): + i = i + 1 + continue + else: + if self.file[i] in self.symbols: + if self.file[i] == '>': + self.token = '>' + elif self.file[i] == '<': + self.token = '<' + elif self.file[i] == '&': + self.token = '&' + else: + self.token = self.file[i] + # self.token = self.file[i] + self.i = i + 1 + return + elif self.file[i] == '"': + i += 1 + while self.file[i] != '"': + token += self.file[i] + i += 1 + self.i = i + 1 + self.token = '"' + token + '"' + return + else: + while re.match(r'\w', self.file[i]): + token += self.file[i] + if i + 1 > len(self.file) - 1: + break + i += 1 + self.i = i + self.token = token + return + + def clear_file(self, directory): + with open(directory, "r") as my_file: + txt = my_file.read() + txt = re.sub(r"//.*", "", txt) + txt = re.sub(r"/[*][*].*[*]/", "", txt) + txt = re.sub(r"/[*][*][\w*\W*]*[*]/", "", txt) + self.file = txt + + +class CompilationEngine: + def __init__(self): + self.string = '' + self.tab = 0 + + def write_token(self, tokenizer): + if tokenizer.token_type() == 'stringConstant': + self.string += ' ' * self.tab + '<' + tokenizer.token_type() + '> ' + tokenizer.token.strip('"') + ' \n' + else: + self.string += ' ' * self.tab + '<' + tokenizer.token_type() + '> ' + tokenizer.token + ' \n' + + def compile_class(self, tokenizer): + tokenizer.advance() + self.string += '\n' + ' ' * self.tab + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token != '}': + if tokenizer.token in ['static', 'field']: + self.compile_class_var_dec(tokenizer) + if tokenizer.token in ['constructor', 'function', 'method']: + self.compile_subroutine(tokenizer) + + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_class_var_dec(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_subroutine(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_parameter_list(tokenizer) + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token != '}': + if tokenizer.token == 'var': + self.compile_var_dec(tokenizer) + elif tokenizer.token in ['let', 'if', 'while', 'do', 'return']: + self.compile_statements(tokenizer) + self.write_token(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_parameter_list(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + while tokenizer.token != ')': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + self.write_token(tokenizer) + tokenizer.advance() + + def compile_var_dec(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_statements(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + while True: + if tokenizer.token == 'let': + self.compile_let(tokenizer) + elif tokenizer.token == 'if': + self.compile_if(tokenizer) + elif tokenizer.token == 'while': + self.compile_while(tokenizer) + elif tokenizer.token == 'do': + self.compile_do(tokenizer) + elif tokenizer.token == 'return': + self.compile_return(tokenizer) + else: + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + break + + def compile_do(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token == '(': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + elif tokenizer.token == '.': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_let(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token == '[': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_while(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_statements(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_return(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token != ';': + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_if(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_statements(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + while tokenizer.token == 'else': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_statements(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_expression(self, tokenizer): + if tokenizer.token in ['(', '~', '-'] or tokenizer.token_type() != 'symbol': + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.compile_term(tokenizer) + while tokenizer.token in ['+', '-', '*', '/', '&', '|', '<', '>', '=']: + self.write_token(tokenizer) + tokenizer.advance() + self.compile_term(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_term(self, tokenizer): + if tokenizer.token == '(': + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token in ['~', '-']: + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + self.compile_term(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token_type() != 'symbol': + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.write_token(tokenizer) + tokenizer.advance() + if tokenizer.token == '[': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token == '(': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + elif tokenizer.token == '.': + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression_list(tokenizer) + self.write_token(tokenizer) + tokenizer.advance() + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + else: + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + def compile_expression_list(self, tokenizer): + self.string += ' ' * self.tab + '\n' + self.tab += 2 + self.compile_expression(tokenizer) + while tokenizer.token == ',': + self.write_token(tokenizer) + tokenizer.advance() + self.compile_expression(tokenizer) + self.tab -= 2 + self.string += ' ' * self.tab + '\n' + + +path = os.getcwd() +for root, dirs, files in os.walk(path, topdown=False): + for name in files: + if name[-4:] == 'jack': + tok = Tokenizer() + tok.clear_file(Path(root, name)) + ce = CompilationEngine() + ce.compile_class(tok) + with open(Path(root, name[:-4] + 'xml'), "w+") as my_xml: + my_xml.write(ce.string) diff --git a/projects/10/Square/Main.jack b/projects/10/Square/Main.jack new file mode 100755 index 0000000..a6fd2c2 --- /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 more() { // Added to test Jack syntax that is not used in + var int i, j; // the Square files. + var String s; + var Array a; + if (false) { + let s = "string constant"; + let s = null; + let a[1] = a[2]; + } + else { // There is no else keyword in the Square files. + let i = i * (-j); + let j = j / (-2); // note: unary negate constant 2 + let i = i | j; + } + return; + } +} diff --git a/projects/10/Square/Main.xml b/projects/10/Square/Main.xml new file mode 100755 index 0000000..8796fa9 --- /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 + more + ( + + + ) + + { + + var + int + i + , + j + ; + + + var + String + s + ; + + + var + Array + a + ; + + + + if + ( + + + false + + + ) + { + + + let + s + = + + + string constant + + + ; + + + let + s + = + + + null + + + ; + + + let + a + [ + + + 1 + + + ] + = + + + a + [ + + + 2 + + + ] + + + ; + + + } + else + { + + + let + i + = + + + i + + * + + ( + + + - + + j + + + + ) + + + ; + + + let + j + = + + + j + + / + + ( + + + - + + 2 + + + + ) + + + ; + + + let + i + = + + + i + + | + + j + + + ; + + + } + + + return + ; + + + } + + + } + diff --git a/projects/10/Square/MainT.xml b/projects/10/Square/MainT.xml new file mode 100755 index 0000000..bc92200 --- /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 + more + ( + ) + { + var + int + i + , + j + ; + var + String + s + ; + var + Array + a + ; + if + ( + false + ) + { + let + s + = + string constant + ; + let + s + = + null + ; + let + a + [ + 1 + ] + = + a + [ + 2 + ] + ; + } + else + { + let + i + = + i + * + ( + - + j + ) + ; + let + j + = + j + / + ( + - + 2 + ) + ; + let + i + = + i + | + j + ; + } + return + ; + } + } + diff --git a/projects/10/Square/Square.jack b/projects/10/Square/Square.jack new file mode 100755 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 100755 index 0000000..ff5f235 --- /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 100755 index 0000000..4f71b16 --- /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 100755 index 0000000..ed3ab6e --- /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 100755 index 0000000..3136af2 --- /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 100755 index 0000000..69a8ca0 --- /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/10/lang.txt b/projects/10/lang.txt new file mode 100755 index 0000000..d27c8d9 --- /dev/null +++ b/projects/10/lang.txt @@ -0,0 +1,2 @@ +python3 +debug diff --git a/projects/11/Average/Main.jack b/projects/11/Average/Main.jack new file mode 100755 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 100755 index 0000000..89dd1a8 --- /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 L0 +push local 2 +push local 1 +lt +not +if-goto L1 +push local 0 +push local 2 +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 1 +add +pop pointer 1 +push temp 1 +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 L0 +label L1 +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/ComplexArrays/Main.jack b/projects/11/ComplexArrays/Main.jack new file mode 100755 index 0000000..fe51c20 --- /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 100755 index 0000000..574f01f --- /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 +push constant 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 4 +push constant 8 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 5 +push constant 4 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 1 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +push constant 3 +add +pop temp 1 +add +pop pointer 1 +push temp 1 +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 +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 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 2 +push constant 0 +push constant 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 L0 +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 +push constant 33 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 +push constant 77 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 +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 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L1 +label L0 +label L1 +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 L2 +push argument 1 +push constant 0 +gt +not +if-goto L3 +push argument 1 +push constant 1 +sub +pop argument 1 +push argument 0 +push argument 1 +push constant 3 +call Array.new 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L2 +label L3 +push constant 0 +return diff --git a/projects/11/ConvertToBin/Main.jack b/projects/11/ConvertToBin/Main.jack new file mode 100755 index 0000000..e627486 --- /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 100755 index 0000000..71dd03c --- /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 1 +neg +pop local 2 +label L0 +push local 2 +not +if-goto L1 +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 L2 +push argument 0 +push local 0 +and +push constant 0 +eq +not +not +if-goto L3 +push constant 8000 +push local 1 +add +push constant 1 +call Memory.poke 2 +pop temp 0 +goto L4 +label L3 +push constant 8000 +push local 1 +add +push constant 0 +call Memory.poke 2 +pop temp 0 +label L4 +goto L5 +label L2 +push constant 0 +pop local 2 +label L5 +goto L0 +label L1 +push constant 0 +return +function Main.nextMask 0 +push argument 0 +push constant 0 +eq +not +if-goto L6 +push constant 1 +return +goto L7 +label L6 +push argument 0 +push constant 2 +call Math.multiply 2 +return +label L7 +function Main.fillMemory 0 +label L8 +push argument 1 +push constant 0 +gt +not +if-goto L9 +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 L8 +label L9 +push constant 0 +return diff --git a/projects/11/JackCompiler.py b/projects/11/JackCompiler.py new file mode 100755 index 0000000..5782f99 --- /dev/null +++ b/projects/11/JackCompiler.py @@ -0,0 +1,350 @@ +import os +from pathlib import Path +from tokenizer import Tokenizer +from vmwriter import VMWriter +from symbol_table import SymbolTable + + +# TODO add names to variables when you call for them, aka current_vm_append(thingtobeappended=blablac) + +class CompilationEngine: + def __init__(self, tokenizer, full_path_vm): + self.string = self.sub_type = self.class_name = self.function_type = '' + self.tab = self.recursion_index = 0 + self.tokenizer = tokenizer + self.sym_table = [] + self.vmwriter = VMWriter(full_path_vm) + self.current_vm = [] # used to reverse some of the commands, eg a+b need to be a b + + + def search_kind_of_sym(self, current_vm): + if self.sym_table[-1].kind_of(current_vm) is not None: + return self.sym_table[-1].kind_of(current_vm), self.sym_table[-1].index_of(current_vm) + for i in range(len(self.sym_table) - 2, -1, + -1): # start from the amount of sym_tables -2 so it starts from one below the current, + # until it is bigger than -1, walking it backwards + if self.sym_table[i].kind_of(current_vm) in ('static', 'this'): + return self.sym_table[i].kind_of(current_vm), self.sym_table[i].index_of(current_vm) + + def search_type_of_sym(self, current_vm): + for i in range(len(self.sym_table) - 1, -1, -1): + if self.sym_table[i].type_of(current_vm) is not None: + return self.sym_table[i].type_of(current_vm) + + def write_token(self): + if self.tokenizer.token_type() == 'stringConstant': + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token.strip( + '"') + ' \n' + else: + self.string += ' ' * self.tab + '<' + self.tokenizer.token_type() + '> ' + self.tokenizer.token + ' \n' + + def compile_class(self): + self.sym_table.append(SymbolTable()) + self.tokenizer.advance() # class -> + self.tokenizer.advance() # type -> + self.class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + self.tokenizer.advance() # { -> + while self.tokenizer.token != '}': + if self.tokenizer.token in ['static', 'field']: + self.compile_class_var_dec() + if self.tokenizer.token in ['constructor', 'function', 'method']: + self.compile_subroutine() + self.tokenizer.advance() + self.sym_table.pop() + self.vmwriter.close_vm_file() + + def compile_class_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_subroutine(self): + self.sym_table.append(SymbolTable()) + self.sub_type = self.tokenizer.token + self.tokenizer.advance() # subroutine type(function|method|constructor) -> + self.function_type = self.tokenizer.token + self.tokenizer.advance() # subroutine kind(int|void|etc..) -> + sub_name = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + if self.sub_type == 'method': + self.sym_table[-1].start_subroutine('this', self.class_name) + self.compile_parameter_list() + self.tokenizer.advance() # { -> + while self.tokenizer.token == 'var': # create only symbol teable entries + self.compile_var_dec() + if self.sub_type == 'constructor': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('constant', self.sym_table[-2].var_count('field')) + self.vmwriter.write_call('Memory.alloc', 1) + self.vmwriter.write_pop('pointer', 0) + elif self.sub_type == 'method': + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + self.vmwriter.write_push('argument', 0) + self.vmwriter.write_pop('pointer', 0) + else: + self.vmwriter.write_function(f'{self.class_name}.{sub_name}', self.sym_table[-1].var_count('var')) + while self.tokenizer.token != '}': + self.compile_statements() + self.tokenizer.advance() + self.sym_table.pop() + + def compile_parameter_list(self): + if self.tokenizer.token != ')': + var_type = self.tokenizer.token + self.tokenizer.advance() # var ype -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # var name -> + while self.tokenizer.token == ',': + self.tokenizer.advance() # , -> + var_type = self.tokenizer.token + self.tokenizer.advance() # type -> + var_name = self.tokenizer.token + self.sym_table[-1].define(var_name, var_type, 'argument') + self.tokenizer.advance() # name -> + self.tokenizer.advance() # )-> + + def compile_var_dec(self): + var_kind = tokenizer_main.token + self.tokenizer.advance() + var_type = tokenizer_main.token + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + while self.tokenizer.token == ',': + self.tokenizer.advance() + var_name = tokenizer_main.token + self.sym_table[-1].define(var_name, var_type, var_kind) + self.tokenizer.advance() + self.tokenizer.advance() + + def compile_statements(self): + while True: + if self.tokenizer.token == 'let': + self.compile_let() + elif self.tokenizer.token == 'if': + self.compile_if() + elif self.tokenizer.token == 'while': + self.compile_while() + elif self.tokenizer.token == 'do': + self.compile_do() + elif self.tokenizer.token == 'return': + self.compile_return() + else: + break + + def compile_do(self): + self.tokenizer.advance() # do -> + class_name = self.tokenizer.token + self.tokenizer.advance() # name -> + if self.tokenizer.token == '(': # method + self.vmwriter.write_push('pointer', 0) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{class_name}', count + 1) + elif self.tokenizer.token == '.': # method or function + self.tokenizer.advance() # . -> + fname = f'{class_name}.{self.tokenizer.token}' + sname = f'{self.search_type_of_sym(class_name)}.{self.tokenizer.token}' + self.tokenizer.advance() # name -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_push(*self.search_kind_of_sym(class_name)) + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if self.search_kind_of_sym(class_name) is not None: + self.vmwriter.write_call(f'{sname}', count + 1) + else: + self.vmwriter.write_call(f'{fname}', count) + self.vmwriter.write_pop('temp', '0') + self.tokenizer.advance() # ; -> + + def compile_let(self): + flag_array = 0 + self.tokenizer.advance() # let -> + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # var_name -> + if self.tokenizer.token == '[': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.tokenizer.advance() # [ -> + self.compile_expression() + self.tokenizer.advance() # ] -> + flag_array = 1 + self.tokenizer.advance() # = -> + self.compile_expression() + self.tokenizer.advance() # ; -> + if flag_array == 0: + self.vmwriter.write_pop(*self.search_kind_of_sym(self.current_vm[-1])) + else: + self.vmwriter.write_pop('temp', 1) + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('temp', 1) + self.vmwriter.write_pop('that', 0) + self.current_vm.pop() + + def compile_while(self): + self.tokenizer.advance() # while -> + label1 = self.vmwriter.label_index + self.vmwriter.write_lable(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label2 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_goto(label1) + self.vmwriter.write_lable(label2) + + def compile_return(self): + self.tokenizer.advance() # return -> + if self.tokenizer.token != ';': + self.compile_expression() + self.vmwriter.write_return(self.function_type) + self.tokenizer.advance() # ; -> + + def compile_if(self): + self.tokenizer.advance() # if -> + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + label1 = self.vmwriter.label_index + self.vmwriter.write_if(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + label2 = self.vmwriter.label_index + self.vmwriter.write_goto(self.vmwriter.label_index) + self.vmwriter.label_index += 1 + self.vmwriter.write_lable(label1) + if self.tokenizer.token == 'else': + self.tokenizer.advance() # else -> + self.tokenizer.advance() # { -> + self.compile_statements() + self.tokenizer.advance() # } -> + self.vmwriter.write_lable(label2) + + def compile_expression(self): + self.compile_term() + while self.tokenizer.token in ['+', '-', '*', '/', '|', '=', '>', '<', '&']: + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # symbol -> + self.compile_term() + self.vmwriter.write_arithmetic(self.current_vm[-1]) + self.current_vm.pop() + + def compile_term(self): + if self.tokenizer.token == '(': # expression () + self.tokenizer.advance() # ( -> + self.compile_expression() + self.tokenizer.advance() # ) -> + elif self.tokenizer.token in ['~', '-']: # uniry op + self.current_vm.append(self.tokenizer.token) + tmp = 'neg' if self.tokenizer.token == '-' else self.tokenizer.token + self.tokenizer.advance() # ~ or - -> + self.compile_term() + self.vmwriter.write_arithmetic(tmp) + self.current_vm.pop() + elif self.tokenizer.token_type() != 'symbol': + self.current_vm.append(self.tokenizer.token) + self.tokenizer.advance() # integer, string, keyword, varnname, subroutine_name, class_name, var_name -> + if self.tokenizer.token == '[': # Array + self.tokenizer.advance() # [ -> + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + self.compile_expression() + self.vmwriter.write_arithmetic('+') + self.vmwriter.write_pop('pointer', 1) + self.vmwriter.write_push('that', 0) + self.tokenizer.advance() # ] -> + elif self.tokenizer.token == '(': # subroutine_name () + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + self.vmwriter.write_call(f'{self.class_name}.{self.current_vm[-1]}', count) + self.current_vm.pop() + elif self.tokenizer.token == '.': # method + if self.search_type_of_sym(self.current_vm[-1]) is not None: + flag = 1 + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + else: + flag = 0 + self.tokenizer.advance() # . -> + fname = self.tokenizer.token + self.tokenizer.advance() # subroutine name -> + self.tokenizer.advance() # ( -> + count = self.compile_expression_list() + self.tokenizer.advance() # ) -> + if flag == 1: + self.vmwriter.write_call(f'{self.search_type_of_sym(self.current_vm[-1])}.{fname}', count + 1) + else: + self.vmwriter.write_call(f'{self.current_vm[-1]}.{fname}', count) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'stringConstant': + self.vmwriter.write_push('constant', len(self.current_vm[-1].strip('"'))) + self.vmwriter.write_call('String.new', 1) + for index, item in enumerate(self.current_vm[-1].strip('"')): + self.vmwriter.write_push('constant', ord(item)) + self.vmwriter.write_call('String.appendChar', 2) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'integerConstant': + self.vmwriter.write_push('constant', self.current_vm[-1]) + self.current_vm.pop() + elif self.tokenizer.token_type(self.current_vm[-1]) == 'identifier': + self.vmwriter.write_push(*self.search_kind_of_sym(self.current_vm[-1])) + self.current_vm.pop() + elif self.current_vm[-1] == 'true': + self.vmwriter.write_push('constant', '1') + self.vmwriter.write_arithmetic('neg') + self.current_vm.pop() + elif self.current_vm[-1] == 'false' or self.current_vm[-1] == 'null': + self.vmwriter.write_push('constant', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'this': + self.vmwriter.write_push('pointer', '0') + self.current_vm.pop() + elif self.current_vm[-1] == 'that': + self.vmwriter.write_push('pointer', '1') + self.current_vm.pop() + + def compile_expression_list(self): + count_exp = 0 + if self.tokenizer.token in ['(', '~', '-'] or self.tokenizer.token_type() != 'symbol': + count_exp += 1 + self.compile_expression() + while self.tokenizer.token == ',': + count_exp += 1 + self.tokenizer.advance() # , + self.compile_expression() + return count_exp + + +if __name__ == '__main__': + path = os.getcwd() + for root, dirs, files in os.walk(path, topdown=False): + for name in files: + if name[-4:] == 'jack': + tokenizer_main = Tokenizer() + tokenizer_main.clear_file(Path(root, name)) + full_path = Path(root, name[:-4] + 'vm') + comp_eng_main = CompilationEngine(tokenizer_main, full_path) + comp_eng_main.compile_class() diff --git a/projects/11/Pong/Ball.jack b/projects/11/Pong/Ball.jack new file mode 100755 index 0000000..02e47f9 --- /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 100755 index 0000000..04f0872 --- /dev/null +++ b/projects/11/Pong/Ball.vm @@ -0,0 +1,435 @@ +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 1 +neg +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 +not +if-goto L0 +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 L1 +label L0 +push this 0 +push argument 1 +lt +pop this 8 +push this 1 +push argument 2 +lt +pop this 9 +label L1 +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 +not +if-goto L2 +push this 4 +push this 5 +add +pop this 4 +goto L3 +label L2 +push this 4 +push this 6 +add +pop this 4 +push this 9 +not +if-goto L4 +push this 7 +not +if-goto L5 +push this 0 +push constant 4 +add +pop this 0 +goto L6 +label L5 +push this 1 +push constant 4 +add +pop this 1 +label L6 +goto L7 +label L4 +push this 7 +not +if-goto L8 +push this 0 +push constant 4 +sub +pop this 0 +goto L9 +label L8 +push this 1 +push constant 4 +sub +pop this 1 +label L9 +label L7 +label L3 +push this 8 +not +if-goto L10 +push this 7 +not +if-goto L11 +push this 1 +push constant 4 +add +pop this 1 +goto L12 +label L11 +push this 0 +push constant 4 +add +pop this 0 +label L12 +goto L13 +label L10 +push this 7 +not +if-goto L14 +push this 1 +push constant 4 +sub +pop this 1 +goto L15 +label L14 +push this 0 +push constant 4 +sub +pop this 0 +label L15 +label L13 +push this 0 +push this 10 +gt +not +not +if-goto L16 +push constant 1 +pop this 14 +push this 10 +pop this 0 +goto L17 +label L16 +label L17 +push this 0 +push this 11 +lt +not +not +if-goto L18 +push constant 2 +pop this 14 +push this 11 +pop this 0 +goto L19 +label L18 +label L19 +push this 1 +push this 12 +gt +not +not +if-goto L20 +push constant 3 +pop this 14 +push this 12 +pop this 1 +goto L21 +label L20 +label L21 +push this 1 +push this 13 +lt +not +not +if-goto L22 +push constant 4 +pop this 14 +push this 13 +pop this 1 +goto L23 +label L22 +label L23 +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 +not +if-goto L24 +push constant 10 +pop local 4 +goto L25 +label L24 +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 +not +if-goto L26 +push constant 20 +pop local 4 +goto L27 +label L26 +push constant 5 +pop local 4 +label L27 +label L25 +push this 14 +push constant 1 +eq +not +if-goto L28 +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 L29 +label L28 +push this 14 +push constant 2 +eq +not +if-goto L30 +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 L31 +label L30 +push this 14 +push constant 3 +eq +not +if-goto L32 +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 L33 +label L32 +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 L33 +label L31 +label L29 +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/Bat.jack b/projects/11/Pong/Bat.jack new file mode 100755 index 0000000..340760f --- /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 100755 index 0000000..bb53b61 --- /dev/null +++ b/projects/11/Pong/Bat.vm @@ -0,0 +1,208 @@ +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 1 +neg +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 +not +if-goto L0 +push this 0 +push constant 4 +sub +pop this 0 +push this 0 +push constant 0 +lt +not +if-goto L1 +push constant 0 +pop this 0 +goto L2 +label L1 +label L2 +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 1 +neg +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 L3 +label L0 +push this 0 +push constant 4 +add +pop this 0 +push this 0 +push this 2 +add +push constant 511 +gt +not +if-goto L4 +push constant 511 +push this 2 +sub +pop this 0 +goto L5 +label L4 +label L5 +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 1 +neg +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 L3 +push constant 0 +return diff --git a/projects/11/Pong/Main.jack b/projects/11/Pong/Main.jack new file mode 100755 index 0000000..ac5490e --- /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; + } +} \ No newline at end of file diff --git a/projects/11/Pong/Main.vm b/projects/11/Pong/Main.vm new file mode 100755 index 0000000..f1d0269 --- /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/PongGame.jack b/projects/11/Pong/PongGame.jack new file mode 100755 index 0000000..7e1ae4c --- /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 100755 index 0000000..196a57a --- /dev/null +++ b/projects/11/Pong/PongGame.vm @@ -0,0 +1,321 @@ +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 L0 +push this 3 +not +not +if-goto L1 +label L2 +push local 0 +push constant 0 +eq +push this 3 +not +and +not +if-goto L3 +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 L2 +label L3 +push local 0 +push constant 130 +eq +not +if-goto L4 +push this 0 +push constant 1 +call Bat.setDirection 2 +pop temp 0 +goto L5 +label L4 +push local 0 +push constant 132 +eq +not +if-goto L6 +push this 0 +push constant 2 +call Bat.setDirection 2 +pop temp 0 +goto L7 +label L6 +push local 0 +push constant 140 +eq +not +if-goto L8 +push constant 1 +neg +pop this 3 +goto L9 +label L8 +label L9 +label L7 +label L5 +label L10 +push local 0 +push constant 0 +eq +not +push this 3 +not +and +not +if-goto L11 +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 L10 +label L11 +goto L0 +label L1 +push this 3 +not +if-goto L12 +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 +goto L13 +label L12 +label L13 +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 +not +if-goto L14 +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 +not +if-goto L15 +push local 1 +push local 4 +gt +push local 2 +push local 3 +lt +or +pop this 3 +push this 3 +not +not +if-goto L16 +push local 4 +push local 1 +push constant 10 +add +lt +not +if-goto L17 +push constant 1 +neg +pop local 0 +goto L18 +label L17 +push local 3 +push local 2 +push constant 10 +sub +gt +not +if-goto L19 +push constant 1 +pop local 0 +goto L20 +label L19 +label L20 +label L18 +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 +goto L21 +label L16 +label L21 +goto L22 +label L15 +label L22 +push this 1 +push local 0 +call Ball.bounce 2 +pop temp 0 +goto L23 +label L14 +label L23 +push constant 0 +return diff --git a/projects/11/Seven/Main.jack b/projects/11/Seven/Main.jack new file mode 100755 index 0000000..067402e --- /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 100755 index 0000000..c0f49ca --- /dev/null +++ b/projects/11/Seven/Main.vm @@ -0,0 +1,10 @@ +function Main.main 0 +push constant 1 +push constant 2 +push constant 3 +call Math.multiply 2 +add +call Output.printInt 1 +pop temp 0 +push constant 0 +return diff --git a/projects/11/Square/Main.jack b/projects/11/Square/Main.jack new file mode 100755 index 0000000..0753893 --- /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 100755 index 0000000..c070b0c --- /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/Square.jack b/projects/11/Square/Square.jack new file mode 100755 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 100755 index 0000000..e64bb3f --- /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 1 +neg +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 L0 +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 L1 +label L0 +label L1 +push constant 0 +return +function Square.decSize 0 +push argument 0 +pop pointer 0 +push this 2 +push constant 2 +gt +not +if-goto L2 +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 L3 +label L2 +label L3 +push constant 0 +return +function Square.moveUp 0 +push argument 0 +pop pointer 0 +push this 1 +push constant 1 +gt +not +if-goto L4 +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 1 +neg +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 L5 +label L4 +label L5 +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 L6 +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 1 +neg +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 L7 +label L6 +label L7 +push constant 0 +return +function Square.moveLeft 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 1 +gt +not +if-goto L8 +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 1 +neg +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 L9 +label L8 +label L9 +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 L10 +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 1 +neg +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 L11 +label L10 +label L11 +push constant 0 +return diff --git a/projects/11/Square/SquareGame.jack b/projects/11/Square/SquareGame.jack new file mode 100755 index 0000000..4fe7e39 --- /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 100755 index 0000000..5cb10b8 --- /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 L0 +push this 0 +call Square.moveUp 1 +pop temp 0 +goto L1 +label L0 +label L1 +push this 1 +push constant 2 +eq +not +if-goto L2 +push this 0 +call Square.moveDown 1 +pop temp 0 +goto L3 +label L2 +label L3 +push this 1 +push constant 3 +eq +not +if-goto L4 +push this 0 +call Square.moveLeft 1 +pop temp 0 +goto L5 +label L4 +label L5 +push this 1 +push constant 4 +eq +not +if-goto L6 +push this 0 +call Square.moveRight 1 +pop temp 0 +goto L7 +label L6 +label L7 +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 L8 +push local 1 +not +not +if-goto L9 +label L10 +push local 0 +push constant 0 +eq +not +if-goto L11 +call Keyboard.keyPressed 0 +pop local 0 +push pointer 0 +call SquareGame.moveSquare 1 +pop temp 0 +goto L10 +label L11 +push local 0 +push constant 81 +eq +not +if-goto L12 +push constant 1 +neg +pop local 1 +goto L13 +label L12 +label L13 +push local 0 +push constant 90 +eq +not +if-goto L14 +push this 0 +call Square.decSize 1 +pop temp 0 +goto L15 +label L14 +label L15 +push local 0 +push constant 88 +eq +not +if-goto L16 +push this 0 +call Square.incSize 1 +pop temp 0 +goto L17 +label L16 +label L17 +push local 0 +push constant 131 +eq +not +if-goto L18 +push constant 1 +pop this 1 +goto L19 +label L18 +label L19 +push local 0 +push constant 133 +eq +not +if-goto L20 +push constant 2 +pop this 1 +goto L21 +label L20 +label L21 +push local 0 +push constant 130 +eq +not +if-goto L22 +push constant 3 +pop this 1 +goto L23 +label L22 +label L23 +push local 0 +push constant 132 +eq +not +if-goto L24 +push constant 4 +pop this 1 +goto L25 +label L24 +label L25 +label L26 +push local 0 +push constant 0 +eq +not +not +if-goto L27 +call Keyboard.keyPressed 0 +pop local 0 +push pointer 0 +call SquareGame.moveSquare 1 +pop temp 0 +goto L26 +label L27 +goto L8 +label L9 +push constant 0 +return diff --git a/projects/11/__pycache__/symbol_table.cpython-39.pyc b/projects/11/__pycache__/symbol_table.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..78e9c0ae8e4c1118fdf7ee648f84c719dd113278 GIT binary patch literal 2282 zcmYe~<>g{vU|`T>QcL{7#=!6x#6iZ)3=9ko3=9m#3JeSk?hGjmDU2-)DU8ibQ6L^u z3UdoX3Uf146k`fYFoPy*GO}I}n+c|0gn@w}l_82Tg&~S5g)xPxg&~SLg*li(ljRm$ zaAj^%eoitYNCOmu*dV>mAiHH47#LC*YZ&4oBqNy3l)_ZQ5YL>#5X_*-?01XdB}ga8 zwBq=@#N5ro^%i?^d}dxsYQ;*%TP($?IcX~yia=if<>G7=6Iz^F zR2&l==&0-HUR0WrS{CDyTAW>yUl5a*n3rNyl3G%fSsYVPl%JKFTv8lkXc$urc5-}4 zVp2}3UP0w8j`;Y@yv&mLc#xxuIY4e5XF|lnZnh=5XGLtox;@f7~rDp&=mFZ|NsC0UxLC`lcPw8fq~%`TVg>$YF-LByo*5A7qNk& zgB2vlS(aE7pPXNsS5m|d%1wqmYJ8z3rgc4&oeOcG4g<6l@PN3 zAdVkybUEQSOEYg%S% zP6{{#iX=f^mjV$W2P6548{)|1oW$Z{X)LiQj_Dz=+GJ49g+(POjer6g9F=O|qOKO4 zU|kqu#cG*rn6nsb7_*s*xN4YEn9Lb!nF_gTn81Y|#C4#M)MSE05-2TdLen0IeTx;G zCT}rjLR<}YKPWz`g<#Ag|qG2bKHr`DvOU?+Ji{8SFJKMm9z+Mm8oM z#wuZCPeN7W_M!^HixTKwMD{|FASmY}I~QC&fI=B9^l!0)s-*b*G!u{$LFFL>*oo*) zgQ}v1(?F$E5jLlBfNRP4{4^^Jx1kiuFlBz4+(n=gtcVX375pFqRG1fugIJ(UQ6vXq zfzn%%GKd8V&LUM13mjz#0u*^gp!fn6oy8yq2O|eF2RjsUbFhJB{WO^%MKDMOQow=@ V0-14(!v<2N+JTBIaE-#p0RYR?q96bO literal 0 HcmV?d00001 diff --git a/projects/11/__pycache__/tokenizer.cpython-39.pyc b/projects/11/__pycache__/tokenizer.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..a3bcf76ac28dedc00b5950edbf24cd79e1f713ab GIT binary patch literal 2111 zcmYe~<>g{vU|{%kN+xj^7X!m%5C<7EGcYhXFfcF_OEEAoq%fo~<}gGtxHF_Mr7*WJ zq%b!#MKPu@1~X`~yaeg;O9qk17_MKBfq@~FA&N1DA&M!5F@>pxA&NPLD}^P6wS_T? zC50`8y@er)HH9OEvxOmwErmIlL6iFyXGnf_YF=hlYEd#HlBpmz69WT-Gss~|Acry5 zFvK&YFx4=`Go~=tFvK&Zu+%WbGlNA~QW%06G+F(MK-z9GXbS&g)cD1y`HM077h~)% z#@b(u)xQ|+elgnoVzj-*sP&6c`xm3`FGl@ajC#Kqt$#7<{9;u5#aQ!;u})L;7He`& zVsY^;w%pW`jQo^a9BHL_$t9WjdAGQe^Ye;Jib|79@{4XUXXceeu_xu{=cFd)-C{}3 zNGytCDa+4Hxy4+TSagf6xFoS8Gx-*4T4ria$}Q%c)RJ3FDfzdUGShCcq~;W--eN7! z$jnK-#a5JBQd*REi>0KfH1!s1S|Uh}C9gCm=N3yzMrN@l>n+C2TP$fHwd}=}xk>ps z#kV-JQ!C@k^NUh$v6g^>Pm}Q$OL1yW+De8Z0|o|$UyjaJF`>n&Ma40}fsVS4?nR|3 zsbw)Psm0kP`2{g~iFqkTC8;GvnZ+>$Mfq8&$tA@xhK4a^&F)H2SD=sO@%u9C$ z#b9DyNfmQUiuNu3%)FA+^wc7l=q)x#0N>)uOi9fv$xO>kEz)Ey0;TIBT?Ph*TTDf% zw^(x%OOi8+bQl;IG?|L@85kHK3P1r54*eoSkWwyiXvUXR7NiP*LJ*X>7#KMi*%$>F zSs1w(Sr~bsn2V8xsY(P9q6m#BIRfM_R#=dVF)}cuFxG;CjG>mPhN%R^Vrpj0W|+WO zBvit@fCZE`-uK*VbpvRKO)ijolgcs7VSa86?g zW`N0nqhS|F&KzVLRDTLfHgnNDaI}H#F$YB~QwlRkO<@H{wKxOVB$gURafTEYFpmus zOm?appS&F_*U@T++nG3dIR}H8v0PBkfn_9>PGFy`k zk_4)lVv1jaii08(1_p*IrkHX~_987%%rNJq<`rp!;>{97Sb+#oY=WavlNl*WLCPUf z3XWWGys{^zlqKdRrz(IV6=XC6BMUfEg%~*)S(pSEdBBm&$H>9R$H>RX#mL3T$H>AY z!pO%c299`8CaMxdL^sqtl)QU}0ckXl7<)$P+MRD1KnTzzBws42&QX7~)yMG0Ek3 zi?OJRMPFY}3!JN~c=e;TVxzTU^|Ye3V)em!y9kuIiflk}$jiXM@Dfz;XtLd6$uCIF zyTwwJnwU}qisf6(#idC_wjgDonAcBN@h_is5q~TV$ZFN2NkkW%q0~ikc7fo zT#{H+a*L(7B)k;^HWN5Ky04)_`=e}9EePj5yD)lt7C>Apk0Ri$Mv9gNcKSOMpWTEUL)_4ht|F$v?EDgXcg literal 0 HcmV?d00001 diff --git a/projects/11/__pycache__/vmwriter.cpython-39.pyc b/projects/11/__pycache__/vmwriter.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9bc3b055cb58ac582b9e091b5d8b9b653b896289 GIT binary patch literal 2952 zcmYe~<>g{vU|_hgJ~c6dlY!weh=Yuo85kHG7#J9eg%}tZ+!<0BQW#qpQW%?=q8L(` zf*CZKlaW<}*i0}TDGUq@sSHt!DGX6eDU2yhEeui2DaEeugCDXb}MEeuhtDeNg6 zEeug?DV!->EeuiYDcmVMEeuf{DZD9sEeuhdDf}q{EeugyDS|0NEeuiIDZ(itEeugS zDWWN2Eeuh-DdNElni97-!hFMvGD}j6l0mkETmix$Hpu>)aW+E=Qw`H>h7{(xtP2?#8A_Ot zMdz|KGcq!O{m$Z7#ad8WoT2cGQQ;ON*GlFhknOiv!EU?7T2PdkSF)11h>d}PA&R{? zH9a>qujCdhI6T0fhY%bL3=Frpzcd z`A}DiFjk46xe}}d!lxi4LShAUl9H8>B zm|%m-Gu1GruxB$B#X;pcp!(TC@_A2c7*ja2nTl$lvRqJEZm{gJ8paf!Y^I`FP+4B6 zEFV~QMGa#Le>PLm4yddER8|ly+f~DuB9zTkbPXyi43!lD%jVQDrif-U6@7uqia}+? z!Loiej42Y?OcNN3M4_R3+hCHzv#uPcQxD!}h z9wH7-g9?7X7`3Zd5>ryRZZRjOr2Jyktzs!IP2#%6TwI!Ti#abfy^19-HJ$4hqiq#) zY9ZGxrqse;jCNJb=_OpZn9@srG1^oy=YZHbCBGQes#p^9z((bz{9>%BV$Lt(y2X@V z^oy~siX|_N7b71d7h{zqT3SWefWLq!VZbZ~Y8bK@7oZdmutEbIIV^rv zECu-m3PqsY0?uWc%tau7AcYG*C~&}e3`~GC8Yjf>1^ET~pyC&lZx|Rw7^{TPoL-P$ zfRV|_EDPAu^GouPi-IChrG*|TTo8wW)Ec9>4852Fsle?t18_05fFXqul>VWC$OJBV znV|(1a|)P`RA90A6{#>VFjR47rs;x=hdNf1rAP}DgrGn|q%^Fq=YY6AGtC_2c2Ggb zz{mv(S43R_Q-MDzKyxptbp|p#X>NRCQF<|2xEEzKU`Sy~VFneF&_u)nN>C-tDXgFZ6`Tjz{BE(7A0;ODZhwy?WS0e0*+x zN@)&=%@ZGASelpvktyN?1q(QAL_jQXUegA#KrvCI3u1v%XOSL=1u7JZOhGJgVTK?; zp;83$DhL;Y+LIiN94ug{2qsyBA#Hcz literal 0 HcmV?d00001 diff --git a/projects/11/lang.txt b/projects/11/lang.txt new file mode 100755 index 0000000..d27c8d9 --- /dev/null +++ b/projects/11/lang.txt @@ -0,0 +1,2 @@ +python3 +debug diff --git a/projects/11/symbol_table.py b/projects/11/symbol_table.py new file mode 100755 index 0000000..7c62c3e --- /dev/null +++ b/projects/11/symbol_table.py @@ -0,0 +1,62 @@ +class Symbol: + def __init__(self): + self.s_name = '' + self.s_kind = '' + self.s_type = '' + self.s_index = 0 + + +class SymbolTable: + def __init__(self): + self.sym = [] + + def define(self, s_name, s_type, s_kind): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = s_kind + self.sym[-1].s_index = self.var_count(s_kind) - 1 + + def start_subroutine(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = s_name + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'argument' + self.sym[-1].s_index = 0 + + def start_class(self, s_name, s_type): + self.sym.append(Symbol()) + self.sym[-1].s_name = 'this' + self.sym[-1].s_type = s_type + self.sym[-1].s_kind = 'field' + self.sym[-1].s_index = 0 + + def var_count(self, s_kind): + count = 0 # it is -1 so the first index is 0 + for i in self.sym: + if i.s_kind == s_kind: + count += 1 + return count + + def kind_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + if i.s_kind == 'var': + return 'local' + elif i.s_kind == 'field': + return 'this' + else: + return i.s_kind + return None + + def type_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_type + return None + + def index_of(self, s_name): + for i in self.sym: + if i.s_name == s_name: + return i.s_index + return None diff --git a/projects/11/tokenizer.py b/projects/11/tokenizer.py new file mode 100755 index 0000000..aaaa873 --- /dev/null +++ b/projects/11/tokenizer.py @@ -0,0 +1,78 @@ +import re + + +class Tokenizer: + + def __init__(self): + self.i = 0 + self.file = '' + self.symbols = ('(', ')', '[', ']', '}', '{', '>', '<', '=', '*', '+', '-', '/', '.', ';', ',', '&', '|', + '~') + self.key_word = ( + 'class', 'method', 'function', 'constructor', 'int', 'boolean', 'char', 'void', 'var', 'static', 'field', + 'let', 'do', 'if', 'else', 'while', 'return', 'true', 'false', 'null', 'this') + self.token = '' + + def token_type(self, token=None): + if token is None: + token = self.token + if token is None or token == '': + return None + if token in self.key_word: + return 'keyword' + elif token[0] == '"': + return 'stringConstant' + elif re.match(r"\d+", token): + return 'integerConstant' + elif token in self.symbols: + return 'symbol' + else: + return 'identifier' + + def advance(self): + token = '' + i = self.i + while i < len(self.file): + if re.match(r'\s', self.file[i]): + i = i + 1 + continue + else: + if self.file[i] in self.symbols: + self.token = self.file[i] + self.i = i + 1 + return + elif self.file[i] == '"': + i += 1 + while self.file[i] != '"': + token += self.file[i] + i += 1 + self.i = i + 1 + self.token = '"' + token + '"' + return + else: + while re.match(r'\w', self.file[i]): + token += self.file[i] + if i + 1 > len(self.file) - 1: + break + i += 1 + self.i = i + self.token = token + return + + def clear_file(self, directory): + with open(directory, "r") as my_file: + txt = my_file.read() + txt = re.sub(r"//.*", "", txt) + txt = re.sub(r"/[*][*].*[*]/", "", txt) + i = 0 + # TODO this should be a regex + while i < len(txt): + if txt[i] == '/' and txt[i + 1] == '*' and txt[i + 2] == '*': + start = i + while txt[i] != '*' or txt[i + 1] != '/': + i += 1 + stop = i + 2 + txt = txt[:start] + txt[stop:len(txt)] + i = start - 1 + i += 1 + self.file = txt diff --git a/projects/11/vmwriter.py b/projects/11/vmwriter.py new file mode 100755 index 0000000..5bf6929 --- /dev/null +++ b/projects/11/vmwriter.py @@ -0,0 +1,75 @@ +class VMWriter: + def __init__(self, vm_path): + self.my_vm = open(vm_path, "w+") + self.label_index = 0 + + def write_push(self, segment, index): + self.my_vm.write(f'push {segment} {index}\n') + print(f'push {segment} {index}') + + def write_lable(self, label): + self.my_vm.write(f'label L{label}\n') + print(f'label L{label}') + + def write_arithmetic(self, command): + if command == '+': + self.my_vm.write('add\n') + print('add') + elif command == '-': + self.my_vm.write('sub\n') + print('sub') + elif command == 'neg': + self.my_vm.write('neg\n') + print('neg') + elif command == '=': + self.my_vm.write('eq\n') + print('eq') + elif command == '>': + self.my_vm.write('gt\n') + print('gt') + elif command == '<': + self.my_vm.write('lt\n') + print('lt') + elif command == '&': + self.my_vm.write('and\n') + print('and') + elif command == '|': + self.my_vm.write('or\n') + print('or') + elif command == '~': + self.my_vm.write('not\n') + print('not') + elif command == '*': + self.write_call('Math.multiply', 2) + elif command == '/': + self.write_call('Math.divide', 2) + + def write_pop(self, segment, index): + print(f'pop {segment} {index}') + self.my_vm.write(f'pop {segment} {index}\n') + + def write_goto(self, label): + self.my_vm.write(f'goto L{label}\n') + print(f'goto L{label}') + + def write_if(self, label): + self.write_arithmetic('~') + self.my_vm.write(f'if-goto L{label}\n') + print(f'if-goto L{label}') + + def write_call(self, label, num_args): + self.my_vm.write(f'call {label} {num_args}\n') + print(f'call {label} {num_args}') + + def write_function(self, label, num_locals): + self.my_vm.write(f'function {label} {num_locals}\n') + print(f'function {label} {num_locals}') + + def write_return(self, func_type): + if func_type == 'void': + self.write_push('constant', '0') + self.my_vm.write('return\n') + print(f'return') + + def close_vm_file(self): + self.my_vm.close() diff --git a/projects/12/Array.jack b/projects/12/Array.jack new file mode 100755 index 0000000..f16cad6 --- /dev/null +++ b/projects/12/Array.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/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) { + if(size < 0){ + do Sys.error(7); + } + 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 100755 index 0000000..f16cad6 --- /dev/null +++ b/projects/12/ArrayTest/Array.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/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) { + if(size < 0){ + do Sys.error(7); + } + 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 100755 index 0000000..60838ae --- /dev/null +++ b/projects/12/ArrayTest/Array.vm @@ -0,0 +1,23 @@ +function Array.new 0 +push argument 0 +push constant 0 +lt +not +if-goto L0 +push constant 7 +call Sys.error 1 +pop temp 0 +goto L1 +label L0 +label L1 +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 100755 index 0000000..d1a9798 --- /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.out b/projects/12/ArrayTest/ArrayTest.out new file mode 100755 index 0000000..e69de29 diff --git a/projects/12/ArrayTest/ArrayTest.tst b/projects/12/ArrayTest/ArrayTest.tst new file mode 100755 index 0000000..89934b9 --- /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/Main.jack b/projects/12/ArrayTest/Main.jack new file mode 100755 index 0000000..439770a --- /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 100755 index 0000000..afe00a3 --- /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 local 1 +push constant 2 +push constant 222 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 0 +push local 1 +push constant 2 +add +pop pointer 1 +push that 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 3 +call Array.new 1 +pop local 2 +push local 2 +push constant 1 +push local 1 +push constant 2 +add +pop pointer 1 +push that 0 +push constant 100 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 1 +push local 2 +push constant 1 +add +pop pointer 1 +push that 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 500 +call Array.new 1 +pop local 3 +push local 3 +push constant 499 +push local 1 +push constant 2 +add +pop pointer 1 +push that 0 +push local 2 +push constant 1 +add +pop pointer 1 +push that 0 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 2 +push local 3 +push constant 499 +add +pop pointer 1 +push that 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +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 local 2 +push constant 0 +push local 3 +push constant 499 +add +pop pointer 1 +push that 0 +push constant 90 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 3 +push local 2 +push constant 0 +add +pop pointer 1 +push that 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +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/Keyboard.jack b/projects/12/Keyboard.jack new file mode 100755 index 0000000..5308b8c --- /dev/null +++ b/projects/12/Keyboard.jack @@ -0,0 +1,102 @@ +// This 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 mem; + /** Initializes the keyboard. */ + function void init() { + let mem = 0; + 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 mem[24576]; + } + + /** + * 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 a, b; + do Output.printChar(0); + while ((b = 0) | (a > 0)){ + let a = Keyboard.keyPressed(); + if (a > 0){ + let b = a; + } + } + do Output.printChar(String.backSpace()); + do Output.printChar(b); + return b; + } + + /** + * 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 s, b; + var char c; + let s = String.new(100); + do Output.printString(message); + while (true){ + let c = Keyboard.readChar(); + if (c = 128){ + return s; + } + else{ + if (c = 129){ + do s.eraseLastChar(); + } + else{ + do s.appendChar(c); + } + } + } + return; + } + + /** + * 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 starting a; + var int b; + let a = Main.readLine_stolen(message); + let b = String.intValue(a); + do String.dispose(a); + return b; + } +} diff --git a/projects/12/KeyboardTest/Keyboard.jack b/projects/12/KeyboardTest/Keyboard.jack new file mode 100755 index 0000000..7d8dd47 --- /dev/null +++ b/projects/12/KeyboardTest/Keyboard.jack @@ -0,0 +1,101 @@ +// This 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 mem; + /** Initializes the keyboard. */ + function void init() { + let mem = 0; + 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 mem[24576]; + } + + /** + * 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 a, b; + do Output.printChar(0); + while ((b = 0) | (a > 0)){ + let a = Keyboard.keyPressed(); + if (a > 0){ + let b = a; + } + } + do Output.printChar(String.backSpace()); + do Output.printChar(b); + return b; + } + + /** + * 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 s, b; + var char c; + let s = String.new(100); + do Output.printString(message); + while (true){ + let c = Keyboard.readChar(); + if (c = 128){ + return s; + } + else{ + if (c = 129){ + do s.eraseLastChar(); + } + else{ + do s.appendChar(c); + } + } + } + } + + /** + * 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 starting a; + var int b; + let a = Main.readLine_stolen(message); + let b = String.intValue(a); + do String.dispose(a); + return b; + } +} diff --git a/projects/12/KeyboardTest/Keyboard.vm b/projects/12/KeyboardTest/Keyboard.vm new file mode 100755 index 0000000..46d9e79 --- /dev/null +++ b/projects/12/KeyboardTest/Keyboard.vm @@ -0,0 +1,156 @@ +function Keyboard.init 0 +push constant 0 +pop static 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push static 0 +push constant 24576 +add +pop pointer 1 +push that 0 +return +function Keyboard.readChar 2 +push constant 0 +call Output.printChar 1 +pop temp 0 +label L0 +push local 1 +push constant 0 +eq +push local 0 +push constant 0 +gt +or +not +if-goto L1 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 0 +gt +not +if-goto L2 +push local 0 +pop local 1 +goto L3 +label L2 +label L3 +goto L0 +label L1 +call String.backSpace 0 +call Output.printChar 1 +pop temp 0 +push local 1 +call Output.printChar 1 +pop temp 0 +push local 1 +return +function Keyboard.readLine 3 +push constant 100 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label L4 +push constant 1 +neg +not +if-goto L5 +call Keyboard.readChar 0 +pop local 2 +push local 2 +push constant 128 +eq +not +if-goto L6 +push local 0 +return +goto L7 +label L6 +push local 2 +push constant 129 +eq +not +if-goto L8 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto L9 +label L8 +push local 0 +push local 2 +call String.appendChar 2 +pop temp 0 +label L9 +label L7 +goto L4 +label L5 +function Keyboard.readInt 2 +push constant 100 +call String.new 1 +pop local 0 +push argument 0 +call Output.printString 1 +pop temp 0 +label L10 +push constant 1 +neg +not +if-goto L11 +push local 1 +call Keyboard.readChar 1 +pop local 1 +push local 1 +push constant 128 +eq +not +if-goto L12 +push local 0 +call String.intValue 1 +return +goto L13 +label L12 +push local 1 +push constant 129 +eq +not +if-goto L14 +push local 0 +call String.eraseLastChar 1 +pop temp 0 +goto L15 +label L14 +push local 1 +push constant 47 +gt +push local 1 +push constant 57 +lt +and +not +if-goto L16 +push local 0 +push local 1 +call String.appendChar 2 +pop temp 0 +goto L17 +label L16 +label L17 +push local 1 +push constant 45 +eq +not +if-goto L18 +push local 0 +push local 1 +call String.appendChar 2 +pop temp 0 +goto L19 +label L18 +label L19 +label L15 +label L13 +goto L10 +label L11 diff --git a/projects/12/KeyboardTest/KeyboardTestOutput.gif b/projects/12/KeyboardTest/KeyboardTestOutput.gif new file mode 100755 index 0000000000000000000000000000000000000000..944983aaf1c0559b1b10f02987fe7574dc0a5bdd GIT binary patch literal 12048 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 0){ + return x; + } + 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, temp, y_comp, i, neg; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (x < y){ + let temp = x; + let x = y; + let y = temp; + } + if (y = 1){ + if(neg){ + return -x; + } + return x; + } + while((y_comp - 1) < (y - 1)){ + if ((st[i] & y) > 0) { + let sum = sum + x; + let y_comp = y_comp + st[i]; + } + let x = x + x; + let i = i + 1; + } + if(neg){ + let sum = -sum; + } + 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, neg; + if (f = 0){ + let division_tmp = 0; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (y = 0){ + do Sys.error(3); + } + let f = 1; + } + if ((y > x) | (y < 0)){ + return 0; + } + let q = Math.divide(x, y + y); + let f = 0; + let q = Math.abs(q); + if ((q & 1) = 1){ + let division_tmp = division_tmp + y + y; + } + if (x - division_tmp < y){ + if (neg){ + return -(q + q); + } + return q + q; + } + else{ + if (neg){ + return -(q + q + 1); + } + return q + q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int j, b, d, y; + + if (x < 0){ + do Sys.error(4); + } + let j = 7; + while (j > -1){ + let d = y + st[j]; + let b = d * d; + if ((~(b > x)) & (b > 0)){ + let y = d; + } + let j = j - 1; + } + return y; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if (a > b){ + return a; + } + return b; + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if (a < b){ + return a; + } + return b; + } +} diff --git a/projects/12/MathTest/Array.vm b/projects/12/MathTest/Array.vm new file mode 100755 index 0000000..aa4c9e8 --- /dev/null +++ b/projects/12/MathTest/Array.vm @@ -0,0 +1,23 @@ +function Array.new 0 +push argument 0 +push constant 0 +gt +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 2 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +call Memory.alloc 1 +return +function Array.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/MathTest/Keyboard.vm b/projects/12/MathTest/Keyboard.vm new file mode 100755 index 0000000..a806c4e --- /dev/null +++ b/projects/12/MathTest/Keyboard.vm @@ -0,0 +1,102 @@ +function Keyboard.init 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 24576 +call Memory.peek 1 +return +function Keyboard.readChar 2 +push constant 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +push local 0 +push constant 0 +gt +or +not +if-goto WHILE_END0 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +pop local 1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +call String.backSpace 0 +call Output.printChar 1 +pop temp 0 +push local 1 +call Output.printChar 1 +pop temp 0 +push local 1 +return +function Keyboard.readLine 5 +push constant 80 +call String.new 1 +pop local 3 +push argument 0 +call Output.printString 1 +pop temp 0 +call String.newLine 0 +pop local 1 +call String.backSpace 0 +pop local 2 +label WHILE_EXP0 +push local 4 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 0 +push local 0 +push local 1 +eq +pop local 4 +push local 4 +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 3 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 3 +push local 0 +call String.appendChar 2 +pop local 3 +label IF_END1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Keyboard.readInt 2 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +pop local 1 +push local 0 +call String.dispose 1 +pop temp 0 +push local 1 +return diff --git a/projects/12/MathTest/Main.jack b/projects/12/MathTest/Main.jack new file mode 100755 index 0000000..de5cec2 --- /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 100755 index 0000000..21f5221 --- /dev/null +++ b/projects/12/MathTest/Main.vm @@ -0,0 +1,162 @@ +function Main.main 1 +push constant 8000 +pop local 0 +push local 0 +push constant 0 +push constant 2 +push constant 3 +call Math.multiply 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 1 +push local 0 +push constant 0 +add +pop pointer 1 +push that 0 +push constant 30 +neg +call Math.multiply 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 2 +push local 0 +push constant 1 +add +pop pointer 1 +push that 0 +push constant 100 +call Math.multiply 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 3 +push constant 1 +push local 0 +push constant 2 +add +pop pointer 1 +push that 0 +call Math.multiply 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 4 +push local 0 +push constant 3 +add +pop pointer 1 +push that 0 +push constant 0 +call Math.multiply 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 5 +push constant 9 +push constant 3 +call Math.divide 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 6 +push constant 18000 +neg +push constant 6 +call Math.divide 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 7 +push constant 32766 +push constant 32767 +neg +call Math.divide 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 8 +push constant 9 +call Math.sqrt 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 9 +push constant 32767 +call Math.sqrt 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 10 +push constant 345 +push constant 123 +call Math.min 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 11 +push constant 123 +push constant 345 +neg +call Math.max 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 12 +push constant 27 +call Math.abs 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 13 +push constant 32767 +neg +call Math.abs 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return diff --git a/projects/12/MathTest/Math.jack b/projects/12/MathTest/Math.jack new file mode 100755 index 0000000..de479be --- /dev/null +++ b/projects/12/MathTest/Math.jack @@ -0,0 +1,143 @@ +// This 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 st; + static int division_tmp, f; + + /** Initializes the library. */ + function void init() { + var int a; + let st = Array.new(16); + let st[0] = 1; + while (a < 15){ + let a = a + 1; + let st[a] = st[a - 1] + st[a - 1]; + } + return; + } + + /** Returns the absolute value of x. */ + function int abs(int x) { + if (x > 0){ + return x; + } + 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, temp, y_comp, i, neg; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (x < y){ + let temp = x; + let x = y; + let y = temp; + } + if (y = 1){ + if(neg){ + return -x; + } + return x; + } + while((y_comp - 1) < (y - 1)){ + if ((st[i] & y) > 0) { + let sum = sum + x; + let y_comp = y_comp + st[i]; + } + let x = x + x; + let i = i + 1; + } + if(neg){ + let sum = -sum; + } + 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, neg; + if (f = 0){ + let division_tmp = 0; + let neg = ((x < 0) & (y > 0)) | ((x > 0) & (y < 0)); + let x = Math.abs(x); + let y = Math.abs(y); + if (y = 0){ + do Sys.error(3); + } + let f = 1; + } + if ((y > x) | (y < 0)){ + return 0; + } + let q = divide(x, y + y); + let f = 0; + let q = Math.abs(q); + if ((q & 1) = 1){ + let division_tmp = division_tmp + y + y; + } + if (x - division_tmp < y){ + if (neg){ + return -(q + q); + } + return q + q; + } + else{ + if (neg){ + return -(q + q + 1); + } + return q + q + 1; + } + } + + /** Returns the integer part of the square root of x. */ + function int sqrt(int x) { + var int j, b, d, y; + + if (x < 0){ + do Sys.error(4); + } + let j = 7; + while (j > -1){ + let d = y + st[j]; + let b = d * d; + if ((~(b > x)) & (b > 0)){ + let y = d; + } + let j = j - 1; + } + return y; + } + + /** Returns the greater number. */ + function int max(int a, int b) { + if (a > b){ + return a; + } + return b; + } + + /** Returns the smaller number. */ + function int min(int a, int b) { + if (a < b){ + return a; + } + return b; + } +} diff --git a/projects/12/MathTest/Math.vm b/projects/12/MathTest/Math.vm new file mode 100755 index 0000000..5f85428 --- /dev/null +++ b/projects/12/MathTest/Math.vm @@ -0,0 +1,388 @@ +function Math.init 1 +push constant 16 +call Array.new 1 +pop static 0 +push static 0 +push constant 0 +push constant 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +label L0 +push local 0 +push constant 15 +lt +not +if-goto L1 +push local 0 +push constant 1 +add +pop local 0 +push static 0 +push local 0 +push static 0 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +push static 0 +push local 0 +push constant 1 +sub +add +pop pointer 1 +push that 0 +add +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +goto L0 +label L1 +push constant 0 +return +function Math.abs 0 +push argument 0 +push constant 0 +gt +not +if-goto L2 +push argument 0 +return +goto L3 +label L2 +label L3 +push argument 0 +neg +return +function Math.multiply 5 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 4 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 0 +push argument 1 +lt +not +if-goto L4 +push argument 0 +pop local 1 +push argument 1 +pop argument 0 +push local 1 +pop argument 1 +goto L5 +label L4 +label L5 +push argument 1 +push constant 1 +eq +not +if-goto L6 +push local 4 +not +if-goto L7 +push argument 0 +neg +return +goto L8 +label L7 +label L8 +push argument 0 +return +goto L9 +label L6 +label L9 +label L10 +push local 2 +push constant 1 +sub +push argument 1 +push constant 1 +sub +lt +not +if-goto L11 +push static 0 +push local 3 +add +pop pointer 1 +push that 0 +push argument 1 +and +push constant 0 +gt +not +if-goto L12 +push local 0 +push argument 0 +add +pop local 0 +push local 2 +push static 0 +push local 3 +add +pop pointer 1 +push that 0 +add +pop local 2 +goto L13 +label L12 +label L13 +push argument 0 +push argument 0 +add +pop argument 0 +push local 3 +push constant 1 +add +pop local 3 +goto L10 +label L11 +push local 4 +not +if-goto L14 +push local 0 +neg +pop local 0 +goto L15 +label L14 +label L15 +push local 0 +return +function Math.divide 2 +push static 2 +push constant 0 +eq +not +if-goto L16 +push constant 0 +pop static 1 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 1 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 1 +push constant 0 +eq +not +if-goto L17 +push constant 3 +call Sys.error 1 +pop temp 0 +goto L18 +label L17 +label L18 +push constant 1 +pop static 2 +goto L19 +label L16 +label L19 +push argument 1 +push argument 0 +gt +push argument 1 +push constant 0 +lt +or +not +if-goto L20 +push constant 0 +return +goto L21 +label L20 +label L21 +push argument 0 +push argument 1 +push argument 1 +add +call Math.divide 2 +pop local 0 +push constant 0 +pop static 2 +push local 0 +call Math.abs 1 +pop local 0 +push local 0 +push constant 1 +and +push constant 1 +eq +not +if-goto L22 +push static 1 +push argument 1 +add +push argument 1 +add +pop static 1 +goto L23 +label L22 +label L23 +push argument 0 +push static 1 +sub +push argument 1 +lt +not +if-goto L24 +push local 1 +not +if-goto L25 +push local 0 +push local 0 +add +neg +return +goto L26 +label L25 +label L26 +push local 0 +push local 0 +add +return +goto L27 +label L24 +push local 1 +not +if-goto L28 +push local 0 +push local 0 +add +push constant 1 +add +neg +return +goto L29 +label L28 +label L29 +push local 0 +push local 0 +add +push constant 1 +add +return +label L27 +function Math.sqrt 4 +push argument 0 +push constant 0 +lt +not +if-goto L30 +push constant 4 +call Sys.error 1 +pop temp 0 +goto L31 +label L30 +label L31 +push constant 7 +pop local 0 +label L32 +push local 0 +push constant 1 +neg +gt +not +if-goto L33 +push local 3 +push static 0 +push local 0 +add +pop pointer 1 +push that 0 +add +pop local 2 +push local 2 +push local 2 +call Math.multiply 2 +pop local 1 +push local 1 +push argument 0 +gt +not +push local 1 +push constant 0 +gt +and +not +if-goto L34 +push local 2 +pop local 3 +goto L35 +label L34 +label L35 +push local 0 +push constant 1 +sub +pop local 0 +goto L32 +label L33 +push local 3 +return +function Math.max 0 +push argument 0 +push argument 1 +gt +not +if-goto L36 +push argument 0 +return +goto L37 +label L36 +label L37 +push argument 1 +return +function Math.min 0 +push argument 0 +push argument 1 +lt +not +if-goto L38 +push argument 0 +return +goto L39 +label L38 +label L39 +push argument 1 +return diff --git a/projects/12/MathTest/MathTest.cmp b/projects/12/MathTest/MathTest.cmp new file mode 100755 index 0000000..703c1be --- /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.out b/projects/12/MathTest/MathTest.out new file mode 100755 index 0000000..e69de29 diff --git a/projects/12/MathTest/MathTest.tst b/projects/12/MathTest/MathTest.tst new file mode 100755 index 0000000..bac6e6c --- /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 1150000 { + vmstep; +} + +output; diff --git a/projects/12/MathTest/Memory.vm b/projects/12/MathTest/Memory.vm new file mode 100755 index 0000000..8c74b87 --- /dev/null +++ b/projects/12/MathTest/Memory.vm @@ -0,0 +1,376 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push constant 2048 +push static 0 +add +push constant 14334 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2049 +push static 0 +add +push constant 2050 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.peek 0 +push argument 0 +push static 0 +add +pop pointer 1 +push that 0 +return +function Memory.poke 0 +push argument 0 +push static 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Memory.alloc 2 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 5 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +pop argument 0 +label IF_FALSE1 +push constant 2048 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 16383 +lt +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +lt +and +not +if-goto WHILE_END0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push constant 0 +eq +push local 1 +push constant 16382 +gt +or +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +or +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +pop local 0 +goto IF_END2 +label IF_FALSE2 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END3 +label IF_FALSE3 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END3 +label IF_END2 +goto WHILE_EXP0 +label WHILE_END0 +push local 0 +push argument 0 +add +push constant 16379 +gt +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 6 +call Sys.error 1 +pop temp 0 +label IF_FALSE4 +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 2 +add +gt +if-goto IF_TRUE5 +goto IF_FALSE5 +label IF_TRUE5 +push argument 0 +push constant 2 +add +push local 0 +add +push constant 0 +push local 0 +add +pop pointer 1 +push that 0 +push argument 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 2 +add +eq +if-goto IF_TRUE6 +goto IF_FALSE6 +label IF_TRUE6 +push argument 0 +push constant 3 +add +push local 0 +add +push local 0 +push argument 0 +add +push constant 4 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END6 +label IF_FALSE6 +push argument 0 +push constant 3 +add +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END6 +push constant 1 +push local 0 +add +push local 0 +push argument 0 +add +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_FALSE5 +push constant 0 +push local 0 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 2 +add +return +function Memory.deAlloc 2 +push argument 0 +push constant 2 +sub +pop local 0 +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +pop local 1 +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 2 +sub +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push constant 0 +push local 0 +add +push constant 1 +push local 0 +add +pop pointer 1 +push that 0 +push local 0 +sub +push constant 0 +push local 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +push local 1 +push constant 2 +add +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 1 +push local 0 +add +push local 0 +push constant 2 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END1 +label IF_FALSE1 +push constant 1 +push local 0 +add +push constant 1 +push local 1 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END1 +label IF_END0 +push constant 0 +return diff --git a/projects/12/MathTest/Output.vm b/projects/12/MathTest/Output.vm new file mode 100755 index 0000000..b8addd7 --- /dev/null +++ b/projects/12/MathTest/Output.vm @@ -0,0 +1,1852 @@ +function Output.init 0 +push constant 16384 +pop static 4 +push constant 0 +not +pop static 2 +push constant 32 +pop static 1 +push constant 0 +pop static 0 +push constant 6 +call String.new 1 +pop static 3 +call Output.initMap 0 +pop temp 0 +call Output.createShiftedMap 0 +pop temp 0 +push constant 0 +return +function Output.initMap 0 +push constant 127 +call Array.new 1 +pop static 5 +push constant 0 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 32 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 33 +push constant 12 +push constant 30 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 34 +push constant 54 +push constant 54 +push constant 20 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 35 +push constant 0 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 63 +push constant 18 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 36 +push constant 12 +push constant 30 +push constant 51 +push constant 3 +push constant 30 +push constant 48 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 37 +push constant 0 +push constant 0 +push constant 35 +push constant 51 +push constant 24 +push constant 12 +push constant 6 +push constant 51 +push constant 49 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 38 +push constant 12 +push constant 30 +push constant 30 +push constant 12 +push constant 54 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 39 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 40 +push constant 24 +push constant 12 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 41 +push constant 6 +push constant 12 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 42 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 63 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 43 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 63 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 44 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 45 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 46 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 47 +push constant 0 +push constant 0 +push constant 32 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 1 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 48 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 49 +push constant 12 +push constant 14 +push constant 15 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 50 +push constant 30 +push constant 51 +push constant 48 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 51 +push constant 30 +push constant 51 +push constant 48 +push constant 48 +push constant 28 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 52 +push constant 16 +push constant 24 +push constant 28 +push constant 26 +push constant 25 +push constant 63 +push constant 24 +push constant 24 +push constant 60 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 53 +push constant 63 +push constant 3 +push constant 3 +push constant 31 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 54 +push constant 28 +push constant 6 +push constant 3 +push constant 3 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 55 +push constant 63 +push constant 49 +push constant 48 +push constant 48 +push constant 24 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 56 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 57 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 24 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 58 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 59 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +push constant 12 +push constant 12 +push constant 6 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 60 +push constant 0 +push constant 0 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 61 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 62 +push constant 0 +push constant 0 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 12 +push constant 6 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 64 +push constant 30 +push constant 51 +push constant 51 +push constant 59 +push constant 59 +push constant 59 +push constant 27 +push constant 3 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 63 +push constant 30 +push constant 51 +push constant 51 +push constant 24 +push constant 12 +push constant 12 +push constant 0 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 65 +push constant 12 +push constant 30 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 66 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 67 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 68 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 69 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 70 +push constant 63 +push constant 51 +push constant 35 +push constant 11 +push constant 15 +push constant 11 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 71 +push constant 28 +push constant 54 +push constant 35 +push constant 3 +push constant 59 +push constant 51 +push constant 51 +push constant 54 +push constant 44 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 72 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 73 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 74 +push constant 60 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 27 +push constant 27 +push constant 14 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 75 +push constant 51 +push constant 51 +push constant 51 +push constant 27 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 76 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 77 +push constant 33 +push constant 51 +push constant 63 +push constant 63 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 78 +push constant 51 +push constant 51 +push constant 55 +push constant 55 +push constant 63 +push constant 59 +push constant 59 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 79 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 80 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 3 +push constant 3 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 81 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 59 +push constant 30 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 82 +push constant 31 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 83 +push constant 30 +push constant 51 +push constant 51 +push constant 6 +push constant 28 +push constant 48 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 84 +push constant 63 +push constant 63 +push constant 45 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 85 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 86 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 87 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 88 +push constant 51 +push constant 51 +push constant 30 +push constant 30 +push constant 12 +push constant 30 +push constant 30 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 89 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 90 +push constant 63 +push constant 51 +push constant 49 +push constant 24 +push constant 12 +push constant 6 +push constant 35 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 91 +push constant 30 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 6 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 92 +push constant 0 +push constant 0 +push constant 1 +push constant 3 +push constant 6 +push constant 12 +push constant 24 +push constant 48 +push constant 32 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 93 +push constant 30 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 24 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 94 +push constant 8 +push constant 28 +push constant 54 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 95 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 96 +push constant 6 +push constant 12 +push constant 24 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 97 +push constant 0 +push constant 0 +push constant 0 +push constant 14 +push constant 24 +push constant 30 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 98 +push constant 3 +push constant 3 +push constant 3 +push constant 15 +push constant 27 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 99 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 3 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 100 +push constant 48 +push constant 48 +push constant 48 +push constant 60 +push constant 54 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 101 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 63 +push constant 3 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 102 +push constant 28 +push constant 54 +push constant 38 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 15 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 103 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 104 +push constant 3 +push constant 3 +push constant 3 +push constant 27 +push constant 55 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 105 +push constant 12 +push constant 12 +push constant 0 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 106 +push constant 48 +push constant 48 +push constant 0 +push constant 56 +push constant 48 +push constant 48 +push constant 48 +push constant 48 +push constant 51 +push constant 30 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 107 +push constant 3 +push constant 3 +push constant 3 +push constant 51 +push constant 27 +push constant 15 +push constant 15 +push constant 27 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 108 +push constant 14 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 109 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 63 +push constant 43 +push constant 43 +push constant 43 +push constant 43 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 110 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 111 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 112 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 31 +push constant 3 +push constant 3 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 113 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 48 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 114 +push constant 0 +push constant 0 +push constant 0 +push constant 29 +push constant 55 +push constant 51 +push constant 3 +push constant 3 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 115 +push constant 0 +push constant 0 +push constant 0 +push constant 30 +push constant 51 +push constant 6 +push constant 24 +push constant 51 +push constant 30 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 116 +push constant 4 +push constant 6 +push constant 6 +push constant 15 +push constant 6 +push constant 6 +push constant 6 +push constant 54 +push constant 28 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 117 +push constant 0 +push constant 0 +push constant 0 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 27 +push constant 54 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 118 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 51 +push constant 30 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 119 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 63 +push constant 63 +push constant 18 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 120 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 30 +push constant 12 +push constant 12 +push constant 30 +push constant 51 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 121 +push constant 0 +push constant 0 +push constant 0 +push constant 51 +push constant 51 +push constant 51 +push constant 62 +push constant 48 +push constant 24 +push constant 15 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 122 +push constant 0 +push constant 0 +push constant 0 +push constant 63 +push constant 27 +push constant 12 +push constant 6 +push constant 51 +push constant 63 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 123 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 124 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 12 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 125 +push constant 7 +push constant 12 +push constant 12 +push constant 12 +push constant 56 +push constant 12 +push constant 12 +push constant 12 +push constant 7 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 126 +push constant 38 +push constant 45 +push constant 25 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +push constant 0 +call Output.create 12 +pop temp 0 +push constant 0 +return +function Output.create 1 +push constant 11 +call Array.new 1 +pop local 0 +push argument 0 +push static 5 +add +push local 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +push local 0 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +push local 0 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 2 +push local 0 +add +push argument 3 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 3 +push local 0 +add +push argument 4 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 4 +push local 0 +add +push argument 5 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 5 +push local 0 +add +push argument 6 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 6 +push local 0 +add +push argument 7 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 7 +push local 0 +add +push argument 8 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 8 +push local 0 +add +push argument 9 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 9 +push local 0 +add +push argument 10 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 10 +push local 0 +add +push argument 11 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function Output.createShiftedMap 4 +push constant 127 +call Array.new 1 +pop static 6 +push constant 0 +pop local 2 +label WHILE_EXP0 +push local 2 +push constant 127 +lt +not +if-goto WHILE_END0 +push local 2 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +push constant 11 +call Array.new 1 +pop local 1 +push local 2 +push static 6 +add +push local 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +pop local 3 +label WHILE_EXP1 +push local 3 +push constant 11 +lt +not +if-goto WHILE_END1 +push local 3 +push local 1 +add +push local 3 +push local 0 +add +pop pointer 1 +push that 0 +push constant 256 +call Math.multiply 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop local 2 +goto IF_END0 +label IF_FALSE0 +push local 2 +push constant 1 +add +pop local 2 +label IF_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.getMap 1 +push argument 0 +push constant 32 +lt +push argument 0 +push constant 126 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +pop argument 0 +label IF_FALSE0 +push static 2 +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +push static 5 +add +pop pointer 1 +push that 0 +pop local 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +push static 6 +add +pop pointer 1 +push that 0 +pop local 0 +label IF_END1 +push local 0 +return +function Output.drawChar 4 +push argument 0 +call Output.getMap 1 +pop local 2 +push static 1 +pop local 0 +label WHILE_EXP0 +push local 1 +push constant 11 +lt +not +if-goto WHILE_END0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 256 +neg +and +pop local 3 +goto IF_END0 +label IF_FALSE0 +push local 0 +push static 4 +add +pop pointer 1 +push that 0 +push constant 255 +and +pop local 3 +label IF_END0 +push local 0 +push static 4 +add +push local 1 +push local 2 +add +pop pointer 1 +push that 0 +push local 3 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 32 +add +pop local 0 +push local 1 +push constant 1 +add +pop local 1 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.moveCursor 0 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 22 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 63 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 20 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push constant 2 +call Math.divide 2 +pop static 0 +push constant 32 +push argument 0 +push constant 352 +call Math.multiply 2 +add +push static 0 +add +pop static 1 +push argument 1 +push static 0 +push constant 2 +call Math.multiply 2 +eq +pop static 2 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return +function Output.printChar 0 +push argument 0 +call String.newLine 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +call Output.println 0 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +call String.backSpace 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +call Output.backSpace 0 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push argument 0 +call Output.drawChar 1 +pop temp 0 +push static 2 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push static 0 +push constant 1 +add +pop static 0 +push static 1 +push constant 1 +add +pop static 1 +label IF_FALSE2 +push static 0 +push constant 32 +eq +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +call Output.println 0 +pop temp 0 +goto IF_END3 +label IF_FALSE3 +push static 2 +not +pop static 2 +label IF_END3 +label IF_END1 +label IF_END0 +push constant 0 +return +function Output.printString 2 +push argument 0 +call String.length 1 +pop local 1 +label WHILE_EXP0 +push local 0 +push local 1 +lt +not +if-goto WHILE_END0 +push argument 0 +push local 0 +call String.charAt 2 +call Output.printChar 1 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Output.printInt 0 +push static 3 +push argument 0 +call String.setInt 2 +pop temp 0 +push static 3 +call Output.printString 1 +pop temp 0 +push constant 0 +return +function Output.println 0 +push static 1 +push constant 352 +add +push static 0 +sub +pop static 1 +push constant 0 +pop static 0 +push constant 0 +not +pop static 2 +push static 1 +push constant 8128 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 32 +pop static 1 +label IF_FALSE0 +push constant 0 +return +function Output.backSpace 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push static 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push static 0 +push constant 1 +sub +pop static 0 +push static 1 +push constant 1 +sub +pop static 1 +goto IF_END1 +label IF_FALSE1 +push constant 31 +pop static 0 +push static 1 +push constant 32 +eq +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push constant 8128 +pop static 1 +label IF_FALSE2 +push static 1 +push constant 321 +sub +pop static 1 +label IF_END1 +push constant 0 +pop static 2 +goto IF_END0 +label IF_FALSE0 +push constant 0 +not +pop static 2 +label IF_END0 +push constant 32 +call Output.drawChar 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/MathTest/Screen.vm b/projects/12/MathTest/Screen.vm new file mode 100755 index 0000000..fccafb5 --- /dev/null +++ b/projects/12/MathTest/Screen.vm @@ -0,0 +1,806 @@ +function Screen.init 1 +push constant 16384 +pop static 1 +push constant 0 +not +pop static 2 +push constant 17 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 16 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.clearScreen 1 +label WHILE_EXP0 +push local 0 +push constant 8192 +lt +not +if-goto WHILE_END0 +push local 0 +push static 1 +add +push constant 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.updateLocation 0 +push static 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +or +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push static 1 +add +push argument 0 +push static 1 +add +pop pointer 1 +push that 0 +push argument 1 +not +and +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label IF_END0 +push constant 0 +return +function Screen.setColor 0 +push argument 0 +pop static 2 +push constant 0 +return +function Screen.drawPixel 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 7 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 0 +push argument 0 +push local 0 +push constant 16 +call Math.multiply 2 +sub +pop local 1 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 0 +add +pop local 2 +push local 2 +push local 1 +push static 0 +add +pop pointer 1 +push that 0 +call Screen.updateLocation 2 +pop temp 0 +push constant 0 +return +function Screen.drawConditional 0 +push argument 2 +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 1 +push argument 0 +call Screen.drawPixel 2 +pop temp 0 +goto IF_END0 +label IF_FALSE0 +push argument 0 +push argument 1 +call Screen.drawPixel 2 +pop temp 0 +label IF_END0 +push constant 0 +return +function Screen.drawLine 11 +push argument 0 +push constant 0 +lt +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 8 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 2 +push argument 0 +sub +call Math.abs 1 +pop local 3 +push argument 3 +push argument 1 +sub +call Math.abs 1 +pop local 2 +push local 3 +push local 2 +lt +pop local 6 +push local 6 +push argument 3 +push argument 1 +lt +and +push local 6 +not +push argument 2 +push argument 0 +lt +and +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +pop local 4 +push argument 2 +pop argument 0 +push local 4 +pop argument 2 +push argument 1 +pop local 4 +push argument 3 +pop argument 1 +push local 4 +pop argument 3 +label IF_FALSE1 +push local 6 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 3 +pop local 4 +push local 2 +pop local 3 +push local 4 +pop local 2 +push argument 1 +pop local 1 +push argument 0 +pop local 0 +push argument 3 +pop local 8 +push argument 0 +push argument 2 +gt +pop local 7 +goto IF_END2 +label IF_FALSE2 +push argument 0 +pop local 1 +push argument 1 +pop local 0 +push argument 2 +pop local 8 +push argument 1 +push argument 3 +gt +pop local 7 +label IF_END2 +push constant 2 +push local 2 +call Math.multiply 2 +push local 3 +sub +pop local 5 +push constant 2 +push local 2 +call Math.multiply 2 +pop local 9 +push constant 2 +push local 2 +push local 3 +sub +call Math.multiply 2 +pop local 10 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 8 +lt +not +if-goto WHILE_END0 +push local 5 +push constant 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 5 +push local 9 +add +pop local 5 +goto IF_END3 +label IF_FALSE3 +push local 5 +push local 10 +add +pop local 5 +push local 7 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 0 +push constant 1 +sub +pop local 0 +goto IF_END4 +label IF_FALSE4 +push local 0 +push constant 1 +add +pop local 0 +label IF_END4 +label IF_END3 +push local 1 +push constant 1 +add +pop local 1 +push local 1 +push local 0 +push local 6 +call Screen.drawConditional 3 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawRectangle 9 +push argument 0 +push argument 2 +gt +push argument 1 +push argument 3 +gt +or +push argument 0 +push constant 0 +lt +or +push argument 2 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 3 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 9 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 16 +call Math.divide 2 +pop local 3 +push argument 0 +push local 3 +push constant 16 +call Math.multiply 2 +sub +pop local 7 +push argument 2 +push constant 16 +call Math.divide 2 +pop local 4 +push argument 2 +push local 4 +push constant 16 +call Math.multiply 2 +sub +pop local 8 +push local 7 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 6 +push local 8 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 5 +push argument 1 +push constant 32 +call Math.multiply 2 +push local 3 +add +pop local 0 +push local 4 +push local 3 +sub +pop local 2 +label WHILE_EXP0 +push argument 1 +push argument 3 +gt +not +not +if-goto WHILE_END0 +push local 0 +push local 2 +add +pop local 1 +push local 2 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 5 +push local 6 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 6 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP1 +push local 0 +push local 1 +lt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 1 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +push argument 1 +push constant 1 +add +pop argument 1 +push local 1 +push constant 32 +add +push local 2 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Screen.drawHorizontal 11 +push argument 1 +push argument 2 +call Math.min 2 +pop local 7 +push argument 1 +push argument 2 +call Math.max 2 +pop local 8 +push argument 0 +push constant 1 +neg +gt +push argument 0 +push constant 256 +lt +and +push local 7 +push constant 512 +lt +and +push local 8 +push constant 1 +neg +gt +and +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 7 +push constant 0 +call Math.max 2 +pop local 7 +push local 8 +push constant 511 +call Math.min 2 +pop local 8 +push local 7 +push constant 16 +call Math.divide 2 +pop local 1 +push local 7 +push local 1 +push constant 16 +call Math.multiply 2 +sub +pop local 9 +push local 8 +push constant 16 +call Math.divide 2 +pop local 2 +push local 8 +push local 2 +push constant 16 +call Math.multiply 2 +sub +pop local 10 +push local 9 +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +not +pop local 5 +push local 10 +push constant 1 +add +push static 0 +add +pop pointer 1 +push that 0 +push constant 1 +sub +pop local 4 +push argument 0 +push constant 32 +call Math.multiply 2 +push local 1 +add +pop local 0 +push local 2 +push local 1 +sub +pop local 6 +push local 0 +push local 6 +add +pop local 3 +push local 6 +push constant 0 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push local 4 +push local 5 +and +call Screen.updateLocation 2 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 0 +push local 5 +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +label WHILE_EXP0 +push local 0 +push local 3 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +neg +call Screen.updateLocation 2 +pop temp 0 +push local 0 +push constant 1 +add +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +push local 4 +call Screen.updateLocation 2 +pop temp 0 +label IF_END1 +label IF_FALSE0 +push constant 0 +return +function Screen.drawSymetric 0 +push argument 1 +push argument 3 +sub +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 3 +add +push argument 0 +push argument 2 +add +push argument 0 +push argument 2 +sub +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +sub +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push argument 1 +push argument 2 +add +push argument 0 +push argument 3 +sub +push argument 0 +push argument 3 +add +call Screen.drawHorizontal 3 +pop temp 0 +push constant 0 +return +function Screen.drawCircle 3 +push argument 0 +push constant 0 +lt +push argument 0 +push constant 511 +gt +or +push argument 1 +push constant 0 +lt +or +push argument 1 +push constant 255 +gt +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 12 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push argument 2 +sub +push constant 0 +lt +push argument 0 +push argument 2 +add +push constant 511 +gt +or +push argument 1 +push argument 2 +sub +push constant 0 +lt +or +push argument 1 +push argument 2 +add +push constant 255 +gt +or +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 13 +call Sys.error 1 +pop temp 0 +label IF_FALSE1 +push argument 2 +pop local 1 +push constant 1 +push argument 2 +sub +pop local 2 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +label WHILE_EXP0 +push local 1 +push local 0 +gt +not +if-goto WHILE_END0 +push local 2 +push constant 0 +lt +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 2 +push constant 2 +push local 0 +call Math.multiply 2 +add +push constant 3 +add +pop local 2 +goto IF_END2 +label IF_FALSE2 +push local 2 +push constant 2 +push local 0 +push local 1 +sub +call Math.multiply 2 +add +push constant 5 +add +pop local 2 +push local 1 +push constant 1 +sub +pop local 1 +label IF_END2 +push local 0 +push constant 1 +add +pop local 0 +push argument 0 +push argument 1 +push local 0 +push local 1 +call Screen.drawSymetric 4 +pop temp 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return diff --git a/projects/12/MathTest/String.vm b/projects/12/MathTest/String.vm new file mode 100755 index 0000000..9b7577e --- /dev/null +++ b/projects/12/MathTest/String.vm @@ -0,0 +1,393 @@ +function String.new 0 +push constant 3 +call Memory.alloc 1 +pop pointer 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 14 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +gt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push argument 0 +call Array.new 1 +pop this 1 +label IF_FALSE1 +push argument 0 +pop this 0 +push constant 0 +pop this 2 +push pointer 0 +return +function String.dispose 0 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push this 1 +call Array.dispose 1 +pop temp 0 +label IF_FALSE0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return +function String.length 0 +push argument 0 +pop pointer 0 +push this 2 +return +function String.charAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 15 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +pop pointer 1 +push that 0 +return +function String.setCharAt 0 +push argument 0 +pop pointer 0 +push argument 1 +push constant 0 +lt +push argument 1 +push this 2 +gt +or +push argument 1 +push this 2 +eq +or +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 16 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 1 +push this 1 +add +push argument 2 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 0 +return +function String.appendChar 0 +push argument 0 +pop pointer 0 +push this 2 +push this 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 17 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push this 1 +add +push argument 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +push pointer 0 +return +function String.eraseLastChar 0 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 18 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push this 2 +push constant 1 +sub +pop this 2 +push constant 0 +return +function String.intValue 5 +push argument 0 +pop pointer 0 +push this 2 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 0 +return +label IF_FALSE0 +push constant 0 +not +pop local 3 +push constant 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 45 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 4 +push constant 1 +pop local 0 +label IF_FALSE1 +label WHILE_EXP0 +push local 0 +push this 2 +lt +push local 3 +and +not +if-goto WHILE_END0 +push local 0 +push this 1 +add +pop pointer 1 +push that 0 +push constant 48 +sub +pop local 2 +push local 2 +push constant 0 +lt +push local 2 +push constant 9 +gt +or +not +pop local 3 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 1 +push constant 10 +call Math.multiply 2 +push local 2 +add +pop local 1 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +neg +pop local 1 +label IF_FALSE3 +push local 1 +return +function String.setInt 4 +push argument 0 +pop pointer 0 +push this 0 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 6 +call Array.new 1 +pop local 2 +push argument 1 +push constant 0 +lt +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push constant 0 +not +pop local 3 +push argument 1 +neg +pop argument 1 +label IF_FALSE1 +push argument 1 +pop local 1 +label WHILE_EXP0 +push local 1 +push constant 0 +gt +not +if-goto WHILE_END0 +push argument 1 +push constant 10 +call Math.divide 2 +pop local 1 +push local 0 +push local 2 +add +push constant 48 +push argument 1 +push local 1 +push constant 10 +call Math.multiply 2 +sub +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +push local 1 +pop argument 1 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push local 2 +add +push constant 45 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +push this 0 +push local 0 +lt +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push constant 19 +call Sys.error 1 +pop temp 0 +label IF_FALSE3 +push local 0 +push constant 0 +eq +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push constant 0 +push this 1 +add +push constant 48 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push constant 1 +pop this 2 +goto IF_END4 +label IF_FALSE4 +push constant 0 +pop this 2 +label WHILE_EXP1 +push this 2 +push local 0 +lt +not +if-goto WHILE_END1 +push this 2 +push this 1 +add +push local 0 +push this 2 +push constant 1 +add +sub +push local 2 +add +pop pointer 1 +push that 0 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push this 2 +push constant 1 +add +pop this 2 +goto WHILE_EXP1 +label WHILE_END1 +label IF_END4 +push local 2 +call Array.dispose 1 +pop temp 0 +push constant 0 +return +function String.newLine 0 +push constant 128 +return +function String.backSpace 0 +push constant 129 +return +function String.doubleQuote 0 +push constant 34 +return diff --git a/projects/12/MathTest/Sys.vm b/projects/12/MathTest/Sys.vm new file mode 100755 index 0000000..c186dad --- /dev/null +++ b/projects/12/MathTest/Sys.vm @@ -0,0 +1,83 @@ +function Sys.init 0 +call Memory.init 0 +pop temp 0 +call Math.init 0 +pop temp 0 +call Screen.init 0 +pop temp 0 +call Output.init 0 +pop temp 0 +call Keyboard.init 0 +pop temp 0 +call Main.main 0 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return +function Sys.halt 0 +label WHILE_EXP0 +push constant 0 +not +not +if-goto WHILE_END0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.wait 1 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 1 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +label WHILE_EXP0 +push argument 0 +push constant 0 +gt +not +if-goto WHILE_END0 +push constant 50 +pop local 0 +label WHILE_EXP1 +push local 0 +push constant 0 +gt +not +if-goto WHILE_END1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push argument 0 +push constant 1 +sub +pop argument 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Sys.error 0 +push constant 69 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push constant 82 +call Output.printChar 1 +pop temp 0 +push argument 0 +call Output.printInt 1 +pop temp 0 +call Sys.halt 0 +pop temp 0 +push constant 0 +return diff --git a/projects/12/Memory.jack b/projects/12/Memory.jack new file mode 100755 index 0000000..14305f1 --- /dev/null +++ b/projects/12/Memory.jack @@ -0,0 +1,63 @@ +// This 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 mem; + /** Initializes the class. */ + function void init() { + let mem = 0; + let mem[2048] = 14334; + let mem[2049] = -1; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return mem[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let mem[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 current_block; + var int tmp; + let current_block = 2048; + if (size < 0){ + do Sys.error(5); + } + if (size = 0){ + let size = 1; + } + while (current_block[0] < (size + 2)) { + let current_block = current_block[1]; + } + let current_block[0] = current_block[0] - size - 2; + let current_block = current_block + current_block[0] + 2; + let current_block[0] = size; + return current_block + 2; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array current_block; + let current_block = 2048; + let o[1]= current_block[1]; + let current_block[1] = o; + return; + + } +} diff --git a/projects/12/MemoryTest/Array.vm b/projects/12/MemoryTest/Array.vm new file mode 100755 index 0000000..aa4c9e8 --- /dev/null +++ b/projects/12/MemoryTest/Array.vm @@ -0,0 +1,23 @@ +function Array.new 0 +push argument 0 +push constant 0 +gt +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 2 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +call Memory.alloc 1 +return +function Array.dispose 0 +push argument 0 +pop pointer 0 +push pointer 0 +call Memory.deAlloc 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/MemoryTest/Keyboard.vm b/projects/12/MemoryTest/Keyboard.vm new file mode 100755 index 0000000..a806c4e --- /dev/null +++ b/projects/12/MemoryTest/Keyboard.vm @@ -0,0 +1,102 @@ +function Keyboard.init 0 +push constant 0 +return +function Keyboard.keyPressed 0 +push constant 24576 +call Memory.peek 1 +return +function Keyboard.readChar 2 +push constant 0 +call Output.printChar 1 +pop temp 0 +label WHILE_EXP0 +push local 1 +push constant 0 +eq +push local 0 +push constant 0 +gt +or +not +if-goto WHILE_END0 +call Keyboard.keyPressed 0 +pop local 0 +push local 0 +push constant 0 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +pop local 1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +call String.backSpace 0 +call Output.printChar 1 +pop temp 0 +push local 1 +call Output.printChar 1 +pop temp 0 +push local 1 +return +function Keyboard.readLine 5 +push constant 80 +call String.new 1 +pop local 3 +push argument 0 +call Output.printString 1 +pop temp 0 +call String.newLine 0 +pop local 1 +call String.backSpace 0 +pop local 2 +label WHILE_EXP0 +push local 4 +not +not +if-goto WHILE_END0 +call Keyboard.readChar 0 +pop local 0 +push local 0 +push local 1 +eq +pop local 4 +push local 4 +not +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push local 0 +push local 2 +eq +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 3 +call String.eraseLastChar 1 +pop temp 0 +goto IF_END1 +label IF_FALSE1 +push local 3 +push local 0 +call String.appendChar 2 +pop local 3 +label IF_END1 +label IF_FALSE0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Keyboard.readInt 2 +push argument 0 +call Keyboard.readLine 1 +pop local 0 +push local 0 +call String.intValue 1 +pop local 1 +push local 0 +call String.dispose 1 +pop temp 0 +push local 1 +return diff --git a/projects/12/MemoryTest/Main.jack b/projects/12/MemoryTest/Main.jack new file mode 100755 index 0000000..a9817f4 --- /dev/null +++ b/projects/12/MemoryTest/Main.jack @@ -0,0 +1,53 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/MemoryTest/Main.jack + +/** Test program for the OS Memory class. */ +class Main { + + /** Performs various memory manipulations. */ + function void main() { + var int temp, err; + var Array a, b, c; + + do Memory.poke(8000, 333); // RAM[8000] = 333 + let temp = Memory.peek(8000); + do Memory.poke(8001, temp + 1); // RAM[8001] = 334 + + let a = Array.new(3); // uses Memory.alloc + let a[2] = 222; + do Memory.poke(8002, a[2]); // RAM[8002] = 222 + + let err = 0; + let b = Array.new(3); + let b[1] = a[2] - 100; + if (b = a) { // Fail compare if b = a + let err = 1; } + do Memory.poke(8003, b[1] + err); // RAM[8003] = 122 + + let err = 0; + let c = Array.new(500); + let c[499] = a[2] - b[1]; + if (c = a) { // Fail compare if c = a + let err = 1; } + if (c = b) { // Fail compare if c = b + let err = err + 10; } + do Memory.poke(8004, c[499]+err); // RAM[8004] = 100 + + do a.dispose(); // uses Memory.deAlloc + do b.dispose(); + + let err = 0; + let b = Array.new(3); + let b[0] = c[499] - 90; + if (b = c) { // Fail compare if b = c + let err = 1; } + do Memory.poke(8005, b[0] + err); // RAM[8005] = 10 + + do c.dispose(); + do b.dispose(); + + return; + } +} diff --git a/projects/12/MemoryTest/Main.vm b/projects/12/MemoryTest/Main.vm new file mode 100755 index 0000000..00c9ad7 --- /dev/null +++ b/projects/12/MemoryTest/Main.vm @@ -0,0 +1,180 @@ +function Main.main 5 +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 2 +push local 2 +push constant 2 +push constant 222 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 8002 +push local 2 +push constant 2 +add +pop pointer 1 +push that 0 +call Memory.poke 2 +pop temp 0 +push constant 0 +pop local 1 +push constant 3 +call Array.new 1 +pop local 3 +push local 3 +push constant 1 +push local 2 +push constant 2 +add +pop pointer 1 +push that 0 +push constant 100 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +push local 2 +eq +not +if-goto L0 +push constant 1 +pop local 1 +goto L1 +label L0 +label L1 +push constant 8003 +push local 3 +push constant 1 +add +pop pointer 1 +push that 0 +push local 1 +add +call Memory.poke 2 +pop temp 0 +push constant 0 +pop local 1 +push constant 500 +call Array.new 1 +pop local 4 +push local 4 +push constant 499 +push local 2 +push constant 2 +add +pop pointer 1 +push that 0 +push local 3 +push constant 1 +add +pop pointer 1 +push that 0 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push local 2 +eq +not +if-goto L2 +push constant 1 +pop local 1 +goto L3 +label L2 +label L3 +push local 4 +push local 3 +eq +not +if-goto L4 +push local 1 +push constant 10 +add +pop local 1 +goto L5 +label L4 +label L5 +push constant 8004 +push local 4 +push constant 499 +add +pop pointer 1 +push that 0 +push local 1 +add +call Memory.poke 2 +pop temp 0 +push local 2 +call Array.dispose 1 +pop temp 0 +push local 3 +call Array.dispose 1 +pop temp 0 +push constant 0 +pop local 1 +push constant 3 +call Array.new 1 +pop local 3 +push local 3 +push constant 0 +push local 4 +push constant 499 +add +pop pointer 1 +push that 0 +push constant 90 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +push local 4 +eq +not +if-goto L6 +push constant 1 +pop local 1 +goto L7 +label L6 +label L7 +push constant 8005 +push local 3 +push constant 0 +add +pop pointer 1 +push that 0 +push local 1 +add +call Memory.poke 2 +pop temp 0 +push local 4 +call Array.dispose 1 +pop temp 0 +push local 3 +call Array.dispose 1 +pop temp 0 +push constant 0 +return diff --git a/projects/12/MemoryTest/Math.vm b/projects/12/MemoryTest/Math.vm new file mode 100755 index 0000000..b660688 --- /dev/null +++ b/projects/12/MemoryTest/Math.vm @@ -0,0 +1,408 @@ +function Math.init 1 +push constant 16 +call Array.new 1 +pop static 1 +push constant 16 +call Array.new 1 +pop static 0 +push constant 0 +push static 0 +add +push constant 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +not +if-goto WHILE_END0 +push local 0 +push constant 1 +add +pop local 0 +push local 0 +push static 0 +add +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +push local 0 +push constant 1 +sub +push static 0 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +goto WHILE_EXP0 +label WHILE_END0 +push constant 0 +return +function Math.abs 0 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +neg +pop argument 0 +label IF_FALSE0 +push argument 0 +return +function Math.multiply 5 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 4 +push argument 0 +call Math.abs 1 +pop argument 0 +push argument 1 +call Math.abs 1 +pop argument 1 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop local 1 +push argument 1 +pop argument 0 +push local 1 +pop argument 1 +label IF_FALSE0 +label WHILE_EXP0 +push local 2 +push constant 1 +sub +push argument 1 +push constant 1 +sub +lt +not +if-goto WHILE_END0 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +push argument 1 +and +push constant 0 +eq +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push argument 0 +add +pop local 0 +push local 2 +push local 3 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 2 +label IF_FALSE1 +push argument 0 +push argument 0 +add +pop argument 0 +push local 3 +push constant 1 +add +pop local 3 +goto WHILE_EXP0 +label WHILE_END0 +push local 4 +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +neg +pop local 0 +label IF_FALSE2 +push local 0 +return +function Math.divide 4 +push argument 1 +push constant 0 +eq +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 3 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push argument 0 +push constant 0 +lt +push argument 1 +push constant 0 +gt +and +push argument 0 +push constant 0 +gt +push argument 1 +push constant 0 +lt +and +or +pop local 2 +push constant 0 +push static 1 +add +push argument 1 +call Math.abs 1 +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push argument 0 +call Math.abs 1 +pop argument 0 +label WHILE_EXP0 +push local 0 +push constant 15 +lt +push local 3 +not +and +not +if-goto WHILE_END0 +push constant 32767 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +sub +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +lt +pop local 3 +push local 3 +not +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 0 +push constant 1 +add +push static 1 +add +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +add +pop temp 0 +pop pointer 1 +push temp 0 +pop that 0 +push local 0 +push constant 1 +add +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +pop local 3 +push local 3 +not +if-goto IF_TRUE2 +goto IF_FALSE2 +label IF_TRUE2 +push local 0 +push constant 1 +add +pop local 0 +label IF_FALSE2 +label IF_FALSE1 +goto WHILE_EXP0 +label WHILE_END0 +label WHILE_EXP1 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END1 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +push constant 1 +sub +push argument 0 +push constant 1 +sub +gt +not +if-goto IF_TRUE3 +goto IF_FALSE3 +label IF_TRUE3 +push local 1 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push argument 0 +push local 0 +push static 1 +add +pop pointer 1 +push that 0 +sub +pop argument 0 +label IF_FALSE3 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP1 +label WHILE_END1 +push local 2 +if-goto IF_TRUE4 +goto IF_FALSE4 +label IF_TRUE4 +push local 1 +neg +pop local 1 +label IF_FALSE4 +push local 1 +return +function Math.sqrt 4 +push argument 0 +push constant 0 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push constant 4 +call Sys.error 1 +pop temp 0 +label IF_FALSE0 +push constant 7 +pop local 0 +label WHILE_EXP0 +push local 0 +push constant 1 +neg +gt +not +if-goto WHILE_END0 +push local 3 +push local 0 +push static 0 +add +pop pointer 1 +push that 0 +add +pop local 1 +push local 1 +push local 1 +call Math.multiply 2 +pop local 2 +push local 2 +push argument 0 +gt +not +push local 2 +push constant 0 +lt +not +and +if-goto IF_TRUE1 +goto IF_FALSE1 +label IF_TRUE1 +push local 1 +pop local 3 +label IF_FALSE1 +push local 0 +push constant 1 +sub +pop local 0 +goto WHILE_EXP0 +label WHILE_END0 +push local 3 +return +function Math.max 0 +push argument 0 +push argument 1 +gt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return +function Math.min 0 +push argument 0 +push argument 1 +lt +if-goto IF_TRUE0 +goto IF_FALSE0 +label IF_TRUE0 +push argument 0 +pop argument 1 +label IF_FALSE0 +push argument 1 +return diff --git a/projects/12/MemoryTest/Memory.jack b/projects/12/MemoryTest/Memory.jack new file mode 100755 index 0000000..14305f1 --- /dev/null +++ b/projects/12/MemoryTest/Memory.jack @@ -0,0 +1,63 @@ +// This 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 mem; + /** Initializes the class. */ + function void init() { + let mem = 0; + let mem[2048] = 14334; + let mem[2049] = -1; + return; + } + + /** Returns the RAM value at the given address. */ + function int peek(int address) { + return mem[address]; + } + + /** Sets the RAM value at the given address to the given value. */ + function void poke(int address, int value) { + let mem[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 current_block; + var int tmp; + let current_block = 2048; + if (size < 0){ + do Sys.error(5); + } + if (size = 0){ + let size = 1; + } + while (current_block[0] < (size + 2)) { + let current_block = current_block[1]; + } + let current_block[0] = current_block[0] - size - 2; + let current_block = current_block + current_block[0] + 2; + let current_block[0] = size; + return current_block + 2; + } + + /** De-allocates the given object (cast as an array) by making + * it available for future allocations. */ + function void deAlloc(Array o) { + var Array current_block; + let current_block = 2048; + let o[1]= current_block[1]; + let current_block[1] = o; + return; + + } +} diff --git a/projects/12/MemoryTest/Memory.vm b/projects/12/MemoryTest/Memory.vm new file mode 100755 index 0000000..a19cd86 --- /dev/null +++ b/projects/12/MemoryTest/Memory.vm @@ -0,0 +1,147 @@ +function Memory.init 0 +push constant 0 +pop static 0 +push static 0 +push constant 2048 +push constant 14334 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push static 0 +push constant 2049 +push constant 1 +neg +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return +function Memory.peek 0 +push static 0 +push argument 0 +add +pop pointer 1 +push that 0 +return +function Memory.poke 0 +push static 0 +push argument 0 +push argument 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return +function Memory.alloc 2 +push constant 2048 +pop local 0 +push argument 0 +push constant 0 +lt +not +if-goto L0 +push constant 5 +call Sys.error 1 +pop temp 0 +goto L1 +label L0 +label L1 +push argument 0 +push constant 0 +eq +not +if-goto L2 +push constant 1 +pop argument 0 +goto L3 +label L2 +label L3 +label L4 +push local 0 +push constant 0 +add +pop pointer 1 +push that 0 +push argument 0 +push constant 2 +add +lt +not +if-goto L5 +push local 0 +push constant 1 +add +pop pointer 1 +push that 0 +pop local 0 +goto L4 +label L5 +push local 0 +push constant 0 +push local 0 +push constant 0 +add +pop pointer 1 +push that 0 +push argument 0 +sub +push constant 2 +sub +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push local 0 +push constant 0 +add +pop pointer 1 +push that 0 +add +push constant 2 +add +pop local 0 +push local 0 +push constant 0 +push argument 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 2 +add +return +function Memory.deAlloc 1 +push constant 2048 +pop local 0 +push argument 0 +push constant 1 +push local 0 +push constant 1 +add +pop pointer 1 +push that 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 0 +push constant 1 +push argument 0 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return diff --git a/projects/12/MemoryTest/MemoryDiag/Main.jack b/projects/12/MemoryTest/MemoryDiag/Main.jack new file mode 100755 index 0000000..de439d0 --- /dev/null +++ b/projects/12/MemoryTest/MemoryDiag/Main.jack @@ -0,0 +1,183 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/MemoryTest/Main.jack + +/** Test program for the OS Memory class. */ +class Main { + + /** Test Memory.peek(), poke(), alloc() and deAlloc(). + * + * This test is also a diagnostic. RAM[17000] is incremented before and + * after every call so that the failure point can be accurately determined + * when using command line testing. Return values from all alloc() calls + * are also stored in the test results to aid debugging. + */ + function void main() { + var int temp; + var Array a, b, c, out; + + let out = 17000; // Address where test results will be stored. + + // Test poke() and peek(). + + let out[0] = 10; // poke test + do Memory.poke(out + 1, 333); // RAM[17001] = 333 + + let out[0] = 11; // peek test + let temp = Memory.peek(out + 1); + let out[2] = temp + 1; // RAM[17002] = 334 + let out[0] = 12; // peek/poke test complete + + // Allocate a memory block. + // Validate that the returned block is entirely within the heap, + // Test aborts if the block is not valid. + + let out[0] = 20; + let a = Memory.alloc(20); + let out[3] = a; // RAM[17003] = block address + + let out[0] = 21; + do Main.checkRange(a, 20); + let out[0] = 22; + + // Allocate a SMALLER memory block. + // Validate that the returned block is entirely within the heap, + // and that it does not overlap block 'a'. + // Test aborts if the block is not valid or overlaps. + // + // Common failure: first block was not removed from free list so space + // for this block was found within the first block. + + let out[0] = 30; + let b = Memory.alloc(3); + let out[4] = b; // RAM[17004] = block address + + let out[0] = 31; + do Main.checkRange(b, 3); + let out[0] = 32; + do Main.checkOverlap(b, 3, a, 3); + let out[0] = 33; + + // Allocate a memory block. + // Validate that the returned block is entirely within the heap, + // and that it does not overlap blocks 'a' or 'b'. + // Test aborts if the block is not valid or overlaps. + + let out[0] = 40; + let c = Memory.alloc(500); + let out[5] = c; // RAM[17005] = block address + + let out[0] = 41; + do Main.checkRange(c, 500); + let out[0] = 42; + do Main.checkOverlap(c, 500, a, 3); + let out[0] = 43; + do Main.checkOverlap(c, 500, b, 3); + let out[0] = 44; + + // Deallocate blocks 'a' and 'b', retaining 'c'. + // + // Common failure: free list corrupted by deAlloc(). + + let out[0] = 50; + do Memory.deAlloc(a); + + let out[0] = 51; + do Memory.deAlloc(b); + let out[0] = 52; + + // Allocate a memory block. + // Validate that the returned block is entirely within the heap, + // and that it does not overlap blocks 'c'. + // Test aborts if the block is not valid or overlaps. + // + // Common failure: free list corrupted by deAlloc(). + + let out[0] = 60; + let b = Memory.alloc(3); + let out[6] = b; // RAM[17006] = block address + + let out[0] = 61; + do Main.checkRange(b, 3); + let out[0] = 62; + do Main.checkOverlap(b, 3, c, 500); + let out[0] = 63; + + // Deallocate blocks 'b' and 'c'. + + let out[0] = 70; + do Memory.deAlloc(c); + + let out[0] = 71; + do Memory.deAlloc(b); + let out[0] = 72; + + // Test that deallocated blocks are placed on the free list and can + // be reused. + + let out[0] = 70; + let a = Memory.alloc(8000); + let out[7] = a; // RAM[17007] = block address + + let out[0] = 71; + do Main.checkRange(a, 8000); + + let out[0] = 72; + do Memory.deAlloc(a); + + let out[0] = 73; + let a = Memory.alloc(7000); + + let out[0] = 74; + do Main.checkRange(a, 7000); + + let out[0] = 75; + do Memory.deAlloc(a); + let out[8] = a; // RAM[17008] = block address + + // Test complete. + let out[0] = 100; + + // At this point all allocated blocks have been deallocated. + // + // You can inspect the free list and confirm that all of the heap is + // contained in the free segments. + // + // If you implemented defragmentation in dealloc(), the free list + // should contain only one segment, consisting of the entire heap. + + return; + } + + + /** Check that block a(a_len) is in the heap. + * + * If the block begins or ends outside of the heap, calls Sys.halt() + */ + function void checkRange(int a, int a_len) { + var int a_high; + let a_high = (a + a_len)-1; + if ((a < 2048) | ((a_high) > 16383)) { + // Block is not entirely within heap. + do Sys.halt(); + } + return; + } + + /** Check that block a(a_len) does not overlap block b(b_len). + * Assumes that both blocks have been range checked. + * + * If the blocks overlap, calls Sys.halt() + */ + function void checkOverlap(int a, int a_len, int b, int b_len) { + var int a_high, b_high; + let a_high = (a + a_len)-1; + let b_high = (b + b_len)-1; + if ( ~ ((a > b_high) | (a_high < b))) { + // Block overlaps excluded range. + do Sys.halt(); + } + return; + } +} diff --git a/projects/12/MemoryTest/MemoryDiag/Main.vm b/projects/12/MemoryTest/MemoryDiag/Main.vm new file mode 100755 index 0000000..11ca0ba --- /dev/null +++ b/projects/12/MemoryTest/MemoryDiag/Main.vm @@ -0,0 +1,467 @@ +function Main.main 5 +push constant 17000 +pop local 4 +push local 4 +push constant 0 +push constant 10 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 1 +add +push constant 333 +call Memory.poke 2 +pop temp 0 +push local 4 +push constant 0 +push constant 11 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 1 +add +call Memory.peek 1 +pop local 0 +push local 4 +push constant 2 +push local 0 +push constant 1 +add +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 12 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 20 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 20 +call Memory.alloc 1 +pop local 1 +push local 4 +push constant 3 +push local 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 21 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 1 +push constant 20 +call Main.checkRange 2 +pop temp 0 +push local 4 +push constant 0 +push constant 22 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 30 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 3 +call Memory.alloc 1 +pop local 2 +push local 4 +push constant 4 +push local 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 31 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 2 +push constant 3 +call Main.checkRange 2 +pop temp 0 +push local 4 +push constant 0 +push constant 32 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 2 +push constant 3 +push local 1 +push constant 3 +call Main.checkOverlap 4 +pop temp 0 +push local 4 +push constant 0 +push constant 33 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 40 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 500 +call Memory.alloc 1 +pop local 3 +push local 4 +push constant 5 +push local 3 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 41 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +push constant 500 +call Main.checkRange 2 +pop temp 0 +push local 4 +push constant 0 +push constant 42 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +push constant 500 +push local 1 +push constant 3 +call Main.checkOverlap 4 +pop temp 0 +push local 4 +push constant 0 +push constant 43 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +push constant 500 +push local 2 +push constant 3 +call Main.checkOverlap 4 +pop temp 0 +push local 4 +push constant 0 +push constant 44 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 50 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 1 +call Memory.deAlloc 1 +pop temp 0 +push local 4 +push constant 0 +push constant 51 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 2 +call Memory.deAlloc 1 +pop temp 0 +push local 4 +push constant 0 +push constant 52 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 60 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 3 +call Memory.alloc 1 +pop local 2 +push local 4 +push constant 6 +push local 2 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 61 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 2 +push constant 3 +call Main.checkRange 2 +pop temp 0 +push local 4 +push constant 0 +push constant 62 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 2 +push constant 3 +push local 3 +push constant 500 +call Main.checkOverlap 4 +pop temp 0 +push local 4 +push constant 0 +push constant 63 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 70 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 3 +call Memory.deAlloc 1 +pop temp 0 +push local 4 +push constant 0 +push constant 71 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 2 +call Memory.deAlloc 1 +pop temp 0 +push local 4 +push constant 0 +push constant 72 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 70 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 8000 +call Memory.alloc 1 +pop local 1 +push local 4 +push constant 7 +push local 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 71 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 1 +push constant 8000 +call Main.checkRange 2 +pop temp 0 +push local 4 +push constant 0 +push constant 72 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 1 +call Memory.deAlloc 1 +pop temp 0 +push local 4 +push constant 0 +push constant 73 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 7000 +call Memory.alloc 1 +pop local 1 +push local 4 +push constant 0 +push constant 74 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 1 +push constant 7000 +call Main.checkRange 2 +pop temp 0 +push local 4 +push constant 0 +push constant 75 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 1 +call Memory.deAlloc 1 +pop temp 0 +push local 4 +push constant 8 +push local 1 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push local 4 +push constant 0 +push constant 100 +pop temp 1 +add +pop pointer 1 +push temp 1 +pop that 0 +push constant 0 +return +function Main.checkRange 1 +push argument 0 +push argument 1 +add +push constant 1 +sub +pop local 0 +push argument 0 +push constant 2048 +lt +push local 0 +push constant 16383 +gt +or +not +if-goto L0 +call Sys.halt 0 +pop temp 0 +goto L1 +label L0 +label L1 +push constant 0 +return +function Main.checkOverlap 2 +push argument 0 +push argument 1 +add +push constant 1 +sub +pop local 0 +push argument 2 +push argument 3 +add +push constant 1 +sub +pop local 1 +push argument 0 +push local 1 +gt +push local 0 +push argument 2 +lt +or +not +not +if-goto L2 +call Sys.halt 0 +pop temp 0 +goto L3 +label L2 +label L3 +push constant 0 +return diff --git a/projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp b/projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp new file mode 100755 index 0000000..808e2ce --- /dev/null +++ b/projects/12/MemoryTest/MemoryDiag/MemoryDiag.cmp @@ -0,0 +1,2 @@ +|RAM[17000|RAM[17001|RAM[17002|RAM[17003|RAM[17004|RAM[17005|RAM[17006|RAM[17007|RAM[17008| +| 100 | 333 | 334 |*********|*********|*********|*********|*********|*********| diff --git a/projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst b/projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst new file mode 100755 index 0000000..94cd921 --- /dev/null +++ b/projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst @@ -0,0 +1,18 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/MemoryTest/MemoryDiag/MemoryDiag.tst + +echo "At the end of this test it is normal to see some pixels set on the screen"; +load, +output-file MemoryDiag.out, +compare-to MemoryDiag.cmp, +output-list RAM[17000]%D2.6.1 RAM[17001]%D2.6.1 RAM[17002]%D2.6.1 + RAM[17003]%D2.6.1 RAM[17004]%D2.6.1 RAM[17005]%D2.6.1 RAM[17006]%D2.6.1 + RAM[17007]%D2.6.1 RAM[17008]%D2.6.1; + +repeat 1000000 { + vmstep; +} + +output; diff --git a/projects/12/MemoryTest/MemoryDiag/README.html b/projects/12/MemoryTest/MemoryDiag/README.html new file mode 100755 index 0000000..587847e --- /dev/null +++ b/projects/12/MemoryTest/MemoryDiag/README.html @@ -0,0 +1,55 @@ + +