// This 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) { key = Memory.peek(24576); } key1 = key; while (key1 = key) { key1 = Memory.peek(24576); } 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 = ""; 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; 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); Output.printString("Keyboard.readInt: the input data is not number!"); } let done = false; while (~done) { if ((s.charAt(i) > 47) & (s.charAt(i) < 58)) { n = n * 10 + (t - 48); } else { done = true; } let i = i + 1; done = done | (i < s.length()); } if (neg) { n = - n; } return n; } }