// This 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 char c, key; //単一文字の読み込みと出力 do Output.printChar(95); let key = 0; while(key = 0) { let key = Keyboard.keyPressed(); } let c = key; while(~(key = 0)) { let key = Keyboard.keyPressed(); } if(c < 128) { do Output.backSpace(); do Output.printChar(c); } return 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 value. Also handles user backspaces. */ function String readLine(String message) { var String s; var char c; do Output.printString(message); //読み込みと”行”の出力(Enterキーが押されるまで) let s = String.new(100); while(s.length() < 101) { let c = Keyboard.readChar(); if(c = String.newLine()) { do Output.backSpace(); do Output.println(); return s; } else { if(c = String.backSpace()) { do Output.backSpace(); if(s.length() > 0) { do Output.backSpace(); do s.eraseLastChar(); } } else { do s.appendChar(c); } } } do Output.backSpace(); do Output.println(); 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 String s; let s = Keyboard.readLine(message); return s.intValue(); } }