From 6bafaa84439aeddab722f94c77400f7cd267e543 Mon Sep 17 00:00:00 2001 From: Sean O'Connor Date: Sun, 7 Dec 2025 19:32:48 -0500 Subject: [PATCH] project12 - add files --- 12/Array.jack | 22 +++ 12/ArrayTest/ArrayTest.tst | 15 ++ 12/ArrayTest/Main.jack | 40 +++++ 12/Keyboard.jack | 55 +++++++ 12/KeyboardTest/KeyboardTestOutput.png | Bin 0 -> 14085 bytes 12/KeyboardTest/Main.jack | 93 +++++++++++ 12/Math.jack | 49 ++++++ 12/MathTest/Main.jack | 34 ++++ 12/MathTest/MathTest.tst | 15 ++ 12/Memory.jack | 33 ++++ 12/MemoryTest/Main.jack | 53 +++++++ 12/MemoryTest/MemoryDiag/Main.jack | 183 +++++++++++++++++++++ 12/MemoryTest/MemoryDiag/MemoryDiag.tst | 18 +++ 12/MemoryTest/MemoryDiag/README.html | 55 +++++++ 12/MemoryTest/MemoryTest.tst | 15 ++ 12/MemoryTest/README.txt | 9 ++ 12/Output.jack | 202 ++++++++++++++++++++++++ 12/OutputTest/Main.jack | 42 +++++ 12/OutputTest/OutputTestOutput.gif | Bin 0 -> 6184 bytes 12/Screen.jack | 42 +++++ 12/ScreenTest/Main.jack | 36 +++++ 12/ScreenTest/ScreenTestOutput.gif | Bin 0 -> 4563 bytes 12/String.jack | 63 ++++++++ 12/StringTest/Main.jack | 83 ++++++++++ 12/StringTest/StringTestOutput.gif | Bin 0 -> 8126 bytes 12/Sys.jack | 27 ++++ 12/SysTest/Main.jack | 31 ++++ 27 files changed, 1215 insertions(+) create mode 100644 12/Array.jack create mode 100644 12/ArrayTest/ArrayTest.tst create mode 100644 12/ArrayTest/Main.jack create mode 100644 12/Keyboard.jack create mode 100644 12/KeyboardTest/KeyboardTestOutput.png create mode 100644 12/KeyboardTest/Main.jack create mode 100644 12/Math.jack create mode 100644 12/MathTest/Main.jack create mode 100644 12/MathTest/MathTest.tst create mode 100644 12/Memory.jack create mode 100644 12/MemoryTest/Main.jack create mode 100644 12/MemoryTest/MemoryDiag/Main.jack create mode 100644 12/MemoryTest/MemoryDiag/MemoryDiag.tst create mode 100644 12/MemoryTest/MemoryDiag/README.html create mode 100644 12/MemoryTest/MemoryTest.tst create mode 100644 12/MemoryTest/README.txt create mode 100644 12/Output.jack create mode 100644 12/OutputTest/Main.jack create mode 100644 12/OutputTest/OutputTestOutput.gif create mode 100644 12/Screen.jack create mode 100644 12/ScreenTest/Main.jack create mode 100644 12/ScreenTest/ScreenTestOutput.gif create mode 100644 12/String.jack create mode 100644 12/StringTest/Main.jack create mode 100644 12/StringTest/StringTestOutput.gif create mode 100644 12/Sys.jack create mode 100644 12/SysTest/Main.jack diff --git a/12/Array.jack b/12/Array.jack new file mode 100644 index 0000000..efc7e9c --- /dev/null +++ b/12/Array.jack @@ -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/12/Array.jack +/** + * Represents an array. + * In the Jack language, arrays are instances of the Array class. + * Once declared, the array entries can be accessed using the usual + * syntax arr[i]. Each array entry can hold a primitive data type as + * well as any object type. Different array entries can have different + * data types. + */ +class Array { + + /** Constructs a new Array of the given size. */ + function Array new(int size) { + } + + /** Disposes this array. */ + method void dispose() { + } +} diff --git a/12/ArrayTest/ArrayTest.tst b/12/ArrayTest/ArrayTest.tst new file mode 100644 index 0000000..89934b9 --- /dev/null +++ b/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/12/ArrayTest/Main.jack b/12/ArrayTest/Main.jack new file mode 100644 index 0000000..439770a --- /dev/null +++ b/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/12/Keyboard.jack b/12/Keyboard.jack new file mode 100644 index 0000000..d90e547 --- /dev/null +++ b/12/Keyboard.jack @@ -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: projects/12/Keyboard.jack +/** + * A library for handling user input from the keyboard. + */ +class Keyboard { + + /** Initializes the keyboard. */ + function void init() { + } + + /** + * Returns the character of the currently pressed key on the keyboard; + * if no key is currently pressed, returns 0. + * + * Recognizes all ASCII characters, as well as the following keys: + * new line = 128 = String.newline() + * backspace = 129 = String.backspace() + * left arrow = 130 + * up arrow = 131 + * right arrow = 132 + * down arrow = 133 + * home = 134 + * End = 135 + * page up = 136 + * page down = 137 + * insert = 138 + * delete = 139 + * ESC = 140 + * F1 - F12 = 141 - 152 + */ + function char keyPressed() { + } + + /** Waits until a key is pressed on the keyboard and released, + * then echoes the key to the screen, and returns the character + * of the pressed key. */ + function char readChar() { + } + + /** Displays the message on the screen, reads from the keyboard the entered + * text until a newline character is detected, echoes the text to the screen, + * and returns its value. Also handles user backspaces. */ + function String readLine(String message) { + } + + /** Displays the message on the screen, reads from the keyboard the entered + * text until a newline character is detected, echoes the text to the screen, + * and returns its integer value (until the first non-digit character in the + * entered text is detected). Also handles user backspaces. */ + function int readInt(String message) { + } +} diff --git a/12/KeyboardTest/KeyboardTestOutput.png b/12/KeyboardTest/KeyboardTestOutput.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7f7985d05c739d382a3a2807e8185170da9d79 GIT binary patch literal 14085 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 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/12/MemoryTest/MemoryDiag/MemoryDiag.tst b/12/MemoryTest/MemoryDiag/MemoryDiag.tst new file mode 100644 index 0000000..94cd921 --- /dev/null +++ b/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/12/MemoryTest/MemoryDiag/README.html b/12/MemoryTest/MemoryDiag/README.html new file mode 100644 index 0000000..587847e --- /dev/null +++ b/12/MemoryTest/MemoryDiag/README.html @@ -0,0 +1,55 @@ + +

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

+

+MemoryDiag tests the following: +

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

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

Using MemoryDiag as a diagnostic

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

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

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

Sample MemoryDiag output files

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

+Supplied Memory.vm passes: +

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

\ No newline at end of file diff --git a/12/MemoryTest/MemoryTest.tst b/12/MemoryTest/MemoryTest.tst new file mode 100644 index 0000000..1da34fd --- /dev/null +++ b/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/12/MemoryTest/README.txt b/12/MemoryTest/README.txt new file mode 100644 index 0000000..15ad0c8 --- /dev/null +++ b/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/12/Output.jack b/12/Output.jack new file mode 100644 index 0000000..79534e5 --- /dev/null +++ b/12/Output.jack @@ -0,0 +1,202 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/Output.jack +/** + * A library of functions for writing text on the screen. + * The Hack physical screen consists of 512 rows of 256 pixels each. + * The library uses a fixed font, in which each character is displayed + * within a frame which is 11 pixels high (including 1 pixel for inter-line + * spacing) and 8 pixels wide (including 2 pixels for inter-character spacing). + * The resulting grid accommodates 23 rows (indexed 0..22, top to bottom) + * of 64 characters each (indexed 0..63, left to right). The top left + * character position on the screen is indexed (0,0). A cursor, implemented + * as a small filled square, indicates where the next character will be displayed. + */ +class Output { + + // Character map for displaying characters + static Array charMaps; + + /** Initializes the screen, and locates the cursor at the screen's top-left. */ + function void init() { + } + + // Initializes the character map array + function void initMap() { + var int i; + + let charMaps = Array.new(127); + + // Black square, used for displaying non-printable characters. + do Output.create(0,63,63,63,63,63,63,63,63,63,0,0); + + // Assigns the bitmap for each character in the charachter set. + // The first parameter is the character index, the next 11 numbers + // are the values of each row in the frame that represents this character. + do Output.create(32,0,0,0,0,0,0,0,0,0,0,0); // + do Output.create(33,12,30,30,30,12,12,0,12,12,0,0); // ! + do Output.create(34,54,54,20,0,0,0,0,0,0,0,0); // " + do Output.create(35,0,18,18,63,18,18,63,18,18,0,0); // # + do Output.create(36,12,30,51,3,30,48,51,30,12,12,0); // $ + do Output.create(37,0,0,35,51,24,12,6,51,49,0,0); // % + do Output.create(38,12,30,30,12,54,27,27,27,54,0,0); // & + do Output.create(39,12,12,6,0,0,0,0,0,0,0,0); // ' + do Output.create(40,24,12,6,6,6,6,6,12,24,0,0); // ( + do Output.create(41,6,12,24,24,24,24,24,12,6,0,0); // ) + do Output.create(42,0,0,0,51,30,63,30,51,0,0,0); // * + do Output.create(43,0,0,0,12,12,63,12,12,0,0,0); // + + do Output.create(44,0,0,0,0,0,0,0,12,12,6,0); // , + do Output.create(45,0,0,0,0,0,63,0,0,0,0,0); // - + do Output.create(46,0,0,0,0,0,0,0,12,12,0,0); // . + do Output.create(47,0,0,32,48,24,12,6,3,1,0,0); // / + + do Output.create(48,12,30,51,51,51,51,51,30,12,0,0); // 0 + do Output.create(49,12,14,15,12,12,12,12,12,63,0,0); // 1 + do Output.create(50,30,51,48,24,12,6,3,51,63,0,0); // 2 + do Output.create(51,30,51,48,48,28,48,48,51,30,0,0); // 3 + do Output.create(52,16,24,28,26,25,63,24,24,60,0,0); // 4 + do Output.create(53,63,3,3,31,48,48,48,51,30,0,0); // 5 + do Output.create(54,28,6,3,3,31,51,51,51,30,0,0); // 6 + do Output.create(55,63,49,48,48,24,12,12,12,12,0,0); // 7 + do Output.create(56,30,51,51,51,30,51,51,51,30,0,0); // 8 + do Output.create(57,30,51,51,51,62,48,48,24,14,0,0); // 9 + + do Output.create(58,0,0,12,12,0,0,12,12,0,0,0); // : + do Output.create(59,0,0,12,12,0,0,12,12,6,0,0); // ; + do Output.create(60,0,0,24,12,6,3,6,12,24,0,0); // < + do Output.create(61,0,0,0,63,0,0,63,0,0,0,0); // = + do Output.create(62,0,0,3,6,12,24,12,6,3,0,0); // > + do Output.create(64,30,51,51,59,59,59,27,3,30,0,0); // @ + do Output.create(63,30,51,51,24,12,12,0,12,12,0,0); // ? + + do Output.create(65,0,0,0,0,0,0,0,0,0,0,0); // A ** TO BE FILLED ** + do Output.create(66,31,51,51,51,31,51,51,51,31,0,0); // B + do Output.create(67,28,54,35,3,3,3,35,54,28,0,0); // C + do Output.create(68,15,27,51,51,51,51,51,27,15,0,0); // D + do Output.create(69,63,51,35,11,15,11,35,51,63,0,0); // E + do Output.create(70,63,51,35,11,15,11,3,3,3,0,0); // F + do Output.create(71,28,54,35,3,59,51,51,54,44,0,0); // G + do Output.create(72,51,51,51,51,63,51,51,51,51,0,0); // H + do Output.create(73,30,12,12,12,12,12,12,12,30,0,0); // I + do Output.create(74,60,24,24,24,24,24,27,27,14,0,0); // J + do Output.create(75,51,51,51,27,15,27,51,51,51,0,0); // K + do Output.create(76,3,3,3,3,3,3,35,51,63,0,0); // L + do Output.create(77,33,51,63,63,51,51,51,51,51,0,0); // M + do Output.create(78,51,51,55,55,63,59,59,51,51,0,0); // N + do Output.create(79,30,51,51,51,51,51,51,51,30,0,0); // O + do Output.create(80,31,51,51,51,31,3,3,3,3,0,0); // P + do Output.create(81,30,51,51,51,51,51,63,59,30,48,0);// Q + do Output.create(82,31,51,51,51,31,27,51,51,51,0,0); // R + do Output.create(83,30,51,51,6,28,48,51,51,30,0,0); // S + do Output.create(84,63,63,45,12,12,12,12,12,30,0,0); // T + do Output.create(85,51,51,51,51,51,51,51,51,30,0,0); // U + do Output.create(86,51,51,51,51,51,30,30,12,12,0,0); // V + do Output.create(87,51,51,51,51,51,63,63,63,18,0,0); // W + do Output.create(88,51,51,30,30,12,30,30,51,51,0,0); // X + do Output.create(89,51,51,51,51,30,12,12,12,30,0,0); // Y + do Output.create(90,63,51,49,24,12,6,35,51,63,0,0); // Z + + do Output.create(91,30,6,6,6,6,6,6,6,30,0,0); // [ + do Output.create(92,0,0,1,3,6,12,24,48,32,0,0); // \ + do Output.create(93,30,24,24,24,24,24,24,24,30,0,0); // ] + do Output.create(94,8,28,54,0,0,0,0,0,0,0,0); // ^ + do Output.create(95,0,0,0,0,0,0,0,0,0,63,0); // _ + do Output.create(96,6,12,24,0,0,0,0,0,0,0,0); // ` + + do Output.create(97,0,0,0,14,24,30,27,27,54,0,0); // a + do Output.create(98,3,3,3,15,27,51,51,51,30,0,0); // b + do Output.create(99,0,0,0,30,51,3,3,51,30,0,0); // c + do Output.create(100,48,48,48,60,54,51,51,51,30,0,0); // d + do Output.create(101,0,0,0,30,51,63,3,51,30,0,0); // e + do Output.create(102,28,54,38,6,15,6,6,6,15,0,0); // f + do Output.create(103,0,0,30,51,51,51,62,48,51,30,0); // g + do Output.create(104,3,3,3,27,55,51,51,51,51,0,0); // h + do Output.create(105,12,12,0,14,12,12,12,12,30,0,0); // i + do Output.create(106,48,48,0,56,48,48,48,48,51,30,0); // j + do Output.create(107,3,3,3,51,27,15,15,27,51,0,0); // k + do Output.create(108,14,12,12,12,12,12,12,12,30,0,0); // l + do Output.create(109,0,0,0,29,63,43,43,43,43,0,0); // m + do Output.create(110,0,0,0,29,51,51,51,51,51,0,0); // n + do Output.create(111,0,0,0,30,51,51,51,51,30,0,0); // o + do Output.create(112,0,0,0,30,51,51,51,31,3,3,0); // p + do Output.create(113,0,0,0,30,51,51,51,62,48,48,0); // q + do Output.create(114,0,0,0,29,55,51,3,3,7,0,0); // r + do Output.create(115,0,0,0,30,51,6,24,51,30,0,0); // s + do Output.create(116,4,6,6,15,6,6,6,54,28,0,0); // t + do Output.create(117,0,0,0,27,27,27,27,27,54,0,0); // u + do Output.create(118,0,0,0,51,51,51,51,30,12,0,0); // v + do Output.create(119,0,0,0,51,51,51,63,63,18,0,0); // w + do Output.create(120,0,0,0,51,30,12,12,30,51,0,0); // x + do Output.create(121,0,0,0,51,51,51,62,48,24,15,0); // y + do Output.create(122,0,0,0,63,27,12,6,51,63,0,0); // z + + do Output.create(123,56,12,12,12,7,12,12,12,56,0,0); // { + do Output.create(124,12,12,12,12,12,12,12,12,12,0,0); // | + do Output.create(125,7,12,12,12,56,12,12,12,7,0,0); // } + do Output.create(126,38,45,25,0,0,0,0,0,0,0,0); // ~ + + return; + } + + // Creates the character map array of the given character index, using the given values. + function void create(int index, int a, int b, int c, int d, int e, + int f, int g, int h, int i, int j, int k) { + var Array map; + + let map = Array.new(11); + let charMaps[index] = map; + + let map[0] = a; + let map[1] = b; + let map[2] = c; + let map[3] = d; + let map[4] = e; + let map[5] = f; + let map[6] = g; + let map[7] = h; + let map[8] = i; + let map[9] = j; + let map[10] = k; + + return; + } + + // Returns the character map (array of size 11) of the given character. + // If the given character is invalid or non-printable, returns the + // character map of a black square. + function Array getMap(char c) { + if ((c < 32) | (c > 126)) { + let c = 0; + } + return charMaps[c]; + } + + /** Moves the cursor to the j-th column of the i-th row, + * and erases the character displayed there. */ + function void moveCursor(int i, int j) { + } + + /** Displays the given character at the cursor location, + * and advances the cursor one column forward. */ + function void printChar(char c) { + } + + /** displays the given string starting at the cursor location, + * and advances the cursor appropriately. */ + function void printString(String s) { + } + + /** Displays the given integer starting at the cursor location, + * and advances the cursor appropriately. */ + function void printInt(int i) { + } + + /** Advances the cursor to the beginning of the next line. */ + function void println() { + } + + /** Moves the cursor one column back. */ + function void backSpace() { + } +} diff --git a/12/OutputTest/Main.jack b/12/OutputTest/Main.jack new file mode 100644 index 0000000..f243068 --- /dev/null +++ b/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/12/OutputTest/OutputTestOutput.gif b/12/OutputTest/OutputTestOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8ec2c087f7817b026f37825cdd9870ebef4ee45 GIT binary patch literal 6184 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 M5UY8lAPF$~4}^9c-v9sr literal 0 HcmV?d00001 diff --git a/12/String.jack b/12/String.jack new file mode 100644 index 0000000..e829ec2 --- /dev/null +++ b/12/String.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/String.jack +/** + * Represents character strings. In addition for constructing and disposing + * strings, the class features methods for getting and setting individual + * characters of the string, for erasing the string's last character, + * for appending a character to the string's end, and more typical + * string-oriented operations. + */ +class String { + + /** constructs a new empty string with a maximum length of maxLength + * and initial length of 0. */ + constructor String new(int maxLength) { + } + + /** Disposes this string. */ + method void dispose() { + } + + /** Returns the current length of this string. */ + method int length() { + } + + /** Returns the character at the j-th location of this string. */ + method char charAt(int j) { + } + + /** Sets the character at the j-th location of this string to c. */ + method void setCharAt(int j, char c) { + } + + /** Appends c to this string's end and returns this string. */ + method String appendChar(char c) { + } + + /** Erases the last character from this string. */ + method void eraseLastChar() { + } + + /** Returns the integer value of this string, + * until a non-digit character is detected. */ + method int intValue() { + } + + /** Sets this string to hold a representation of the given value. */ + method void setInt(int val) { + } + + /** Returns the new line character. */ + function char newLine() { + } + + /** Returns the backspace character. */ + function char backSpace() { + } + + /** Returns the double quote (") character. */ + function char doubleQuote() { + } +} diff --git a/12/StringTest/Main.jack b/12/StringTest/Main.jack new file mode 100644 index 0000000..2848548 --- /dev/null +++ b/12/StringTest/Main.jack @@ -0,0 +1,83 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/StringTest/Main.jack + +/** Test program for the OS String class. */ +class Main { + + /** Performs various string manipulations and displays their results. */ + function void main() { + var String s; + var String i; + + let s = String.new(0); // a zero-capacity string should be supported + do s.dispose(); + + let s = String.new(6); // capacity 6, make sure that length 5 is displayed + let s = s.appendChar(97); + let s = s.appendChar(98); + let s = s.appendChar(99); + let s = s.appendChar(100); + let s = s.appendChar(101); + do Output.printString("new,appendChar: "); + do Output.printString(s); // new, appendChar: abcde + do Output.println(); + + let i = String.new(6); + do i.setInt(12345); + do Output.printString("setInt: "); + do Output.printString(i); // setInt: 12345 + do Output.println(); + + do i.setInt(-32767); + do Output.printString("setInt: "); + do Output.printString(i); // setInt: -32767 + do Output.println(); + + do Output.printString("length: "); + do Output.printInt(s.length()); // length: 5 + do Output.println(); + + do Output.printString("charAt[2]: "); + do Output.printInt(s.charAt(2)); // charAt[2]: 99 + do Output.println(); + + do s.setCharAt(2, 45); + do Output.printString("setCharAt(2,'-'): "); + do Output.printString(s); // setCharAt(2,'-'): ab-de + do Output.println(); + + do s.eraseLastChar(); + do Output.printString("eraseLastChar: "); + do Output.printString(s); // eraseLastChar: ab-d + do Output.println(); + + let s = "456"; + do Output.printString("intValue: "); + do Output.printInt(s.intValue()); // intValue: 456 + do Output.println(); + + let s = "-32123"; + do Output.printString("intValue: "); + do Output.printInt(s.intValue()); // intValue: -32123 + do Output.println(); + + do Output.printString("backSpace: "); + do Output.printInt(String.backSpace()); // backSpace: 129 + do Output.println(); + + do Output.printString("doubleQuote: "); + do Output.printInt(String.doubleQuote());// doubleQuote: 34 + do Output.println(); + + do Output.printString("newLine: "); + do Output.printInt(String.newLine()); // newLine: 128 + do Output.println(); + + do i.dispose(); + do s.dispose(); + + return; + } +} diff --git a/12/StringTest/StringTestOutput.gif b/12/StringTest/StringTestOutput.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c2932c07fc2fd63f3e73b9cb6ece86b71ccd4b3 GIT binary patch literal 8126 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≻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 YHZvr3!QZP7Z3t&zmuh42C}9160Cv8dQ~&?~ literal 0 HcmV?d00001 diff --git a/12/Sys.jack b/12/Sys.jack new file mode 100644 index 0000000..bee6f67 --- /dev/null +++ b/12/Sys.jack @@ -0,0 +1,27 @@ +// This file is part of www.nand2tetris.org +// and the book "The Elements of Computing Systems" +// by Nisan and Schocken, MIT Press. +// File name: projects/12/Sys.jack + +/** + * A library that supports various program execution services. + */ +class Sys { + + /** Performs all the initializations required by the OS. */ + function void init() { + } + + /** Halts the program execution. */ + function void halt() { + } + + /** Waits approximately duration milliseconds and returns. */ + function void wait(int duration) { + } + + /** Displays the given error code in the form "ERR", + * and halts the program's execution. */ + function void error(int errorCode) { + } +} diff --git a/12/SysTest/Main.jack b/12/SysTest/Main.jack new file mode 100644 index 0000000..a153b25 --- /dev/null +++ b/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; + } +}