Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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
- /**
- * Handles writing characters to the screen.
- * The text screen (256 columns and 512 roes) is divided into 23 text rows (0..22),
- * each containing 64 text columns (0..63).
- * Each row is 11 pixels high (including 1 space pixel), and 8 pixels wide
- * (including 2 space pixels).
- */
- class Output {
- // Character map for printing on the left of a screen word
- static Array charMaps;
- static int line, column;
- /** Initializes the screen and locates the cursor at the screen's top-left. */
- function void init() {
- let line = 0;
- let column = 0;
- /* let line_y = 0; */
- /* let column_x = 0; */
- do Output.initMap();
- return;
- }
- // Initalizes the character map array
- function void initMap() {
- var int i;
- let charMaps = Array.new(127);
- // black square (used for 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.
- 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,51,51); // 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 a character map array of the given char index with 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) for the given character
- // If an invalid character is given, 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 that was there. */
- function void moveCursor(int i, int j) {
- /* let line_y = i; */
- /* let column_x = j; */
- let line = i * 11;
- let column = j * 8;
- do Output.printChar(32);
- do Output.backSpace();
- return;
- }
- function Array int_to_binary(int n){
- var int i, j;
- var Array binary;
- let binary = Array.new(8);
- let i = 0;
- let j = 0;
- while(j < 8){
- let binary[j] = 0;
- let j = j + 1;
- }
- if(~(n = 0)){
- while(i < 8){
- let binary[i] = Output.get_mod(n);
- let n = n / 2;
- let i = i + 1;
- if (n = 0){
- return binary;
- }
- }
- }
- return binary;
- }
- function int get_mod(int n){
- var int quotient, mod;
- let quotient = n / 2;
- let mod = n - (quotient * 2);
- return mod;
- }
- /** Prints c at the cursor location and advances the cursor one
- * column forward. */
- function void printChar(char c) {
- var Array binary, charMap;
- var int x, y, i, j, pre_column, pre_line;
- let pre_column = column;
- let pre_line = line;
- let charMap = Output.getMap(c);
- let i = 0;
- /* do Output.printChar(32); */
- /* do Output.backSpace(); */
- while (i < 11){
- let j = 0;
- let binary = Output.int_to_binary(charMap[i]);
- while(j < 8){
- let x = column + j;
- let y = line + i;
- if(binary[j] = 1){
- do Screen.drawPixel(x, y);
- }
- let j = j + 1;
- }
- let i = i + 1;
- }
- if(pre_column = 504){
- if(pre_line = 242){
- do Output.moveCursor(0, 0);
- }else{
- let column = 0;
- let line = line + 11;
- }
- }else{
- let column = column + 8;
- }
- return;
- }
- /** Prints s starting at the cursor location, and advances the
- * cursor appropriately. */
- function void printString(String s) {
- var int i;
- var char c;
- let i = 0;
- while(i < s.length()){
- let c = s.charAt(i);
- do Output.printChar(c);
- let i = i + 1;
- }
- return;
- }
- /** Prints i starting at the cursor location, and advances the
- * cursor appropriately. */
- function void printInt(int i) {
- var string int_string;
- do int_string.setInt(i);
- do Output.printString(int_string);
- return;
- }
- /** Advances the cursor to the beginning of the next line. */
- function void println() {
- let column = 0;
- if(line = 242){
- let line = 0;
- }else{
- let line = line + 11;
- }
- return;
- }
- /** Moves the cursor one column back. */
- function void backSpace() {
- if(column = 0){
- if (line = 0){
- /* do Output.moveCursor(0,0); */
- let column = 504;
- let line = 242;
- }else{
- let column = 504;
- let line = line - 11;
- }
- }else{
- let column = column - 8;
- }
- return;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement