summaryrefslogtreecommitdiff
path: root/projects/12/KeyboardTest/Keyboard.jack
diff options
context:
space:
mode:
Diffstat (limited to 'projects/12/KeyboardTest/Keyboard.jack')
-rw-r--r--projects/12/KeyboardTest/Keyboard.jack125
1 files changed, 125 insertions, 0 deletions
diff --git a/projects/12/KeyboardTest/Keyboard.jack b/projects/12/KeyboardTest/Keyboard.jack
new file mode 100644
index 0000000..2aba72e
--- /dev/null
+++ b/projects/12/KeyboardTest/Keyboard.jack
@@ -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/12/Keyboard.jack
+
+/**
+ * A library for handling user input from the keyboard.
+ */
+class Keyboard {
+
+ /** Initializes the keyboard. */
+ function void init() {
+ 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 Memory.peek(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 int key, key1;
+ let key = 0;
+ while (key = 0) {
+ let key = Memory.peek(24576);
+ }
+ let key1 = key;
+ while (key1 = key) {
+ let key1 = Memory.peek(24576);
+ }
+ if ((key > 31) & (key < 127) | (key = 128) | (key = 129)) {
+ do Output.printChar(key);
+ }
+ return key;
+ }
+
+ /**
+ * Displays the message on the screen, reads from the keyboard the entered
+ * text until a newline character is detected, echoes the text to the screen,
+ * and returns its value. Also handles user backspaces.
+ */
+ function String readLine(String message) {
+ var int c;
+ var String s;
+ let s = String.new(140);
+ do Output.printString(message);
+ let c = Keyboard.readChar();
+ while (~(c = 128)) {
+ if (c = 129) {
+ if (s.length() > 0) {
+ do s.eraseLastChar();
+ }
+ } else {
+ do s.appendChar(c);
+ }
+ let c = Keyboard.readChar();
+ }
+ 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 int n, i;
+ var char t;
+ var String s;
+ var boolean neg, done;
+ do Output.printString(message);
+ let n = 0;
+ let neg = false;
+ let s = Keyboard.readLine("");
+ let i = 0;
+ if (s.charAt(0) = 45) {
+ let i = 1;
+ let neg = true;
+ }
+ let t = s.charAt(i);
+ if ((t < 48) | (t > 57)) {
+ do Sys.error(3);
+ do Output.printString("Keyboard.readInt: the input data is not number!");
+ }
+ let done = false;
+ while (~done) {
+ if ((s.charAt(i) > 47) & (s.charAt(i) < 58)) {
+ let n = n * 10 + (s.charAt(i) - 48);
+ } else {
+ let done = true;
+ }
+ let i = i + 1;
+ let done = done | (i + 1 > s.length());
+ }
+ if (neg) {
+ let n = - n;
+ }
+ return n;
+ }
+}