Nand2Tetris — Capítulo 12
El sistema operativo de Jack
// Math.jack
//Ejemplo de implementación del sistema operativo
//multiplicar implementa la multiplicación con suma repetida.
//dividir implementa la división con resta repetida.
class Math {
function void init() {
return;
}
function int multiply(int x, int y) {
var int result;
let result = 0;
while (y > 0) {
let result = result + x;
let y = y - 1;
}
return result;
}
function int divide(int x, int y) {
var int result;
let result = 0;
while (~(x < y)) {
let x = x - y;
let result = result + 1;
}
return result;
}
}
// String.jack
//Implementación parcial del objeto de cadena
//Almacene caracteres en una matriz interna y administre la longitud por separado
class String {
field Array data;
field int length;
field int capacity;
constructor String new(int maxLength) {
let capacity = maxLength;
let length = 0;
let data = Array.new(maxLength);
return this;
}
method void dispose() {
do data.dispose();
do Memory.deAlloc(this);
return;
}
method int length() {
return length;
}
method String appendChar(char c) {
let data[length] = c;
let length = length + 1;
return this;
}
method char charAt(int index) {
return data[index];
}
}
// Array.jack
//Array.new asigna memoria igual al tamaño del montón.
//La matriz Jack es en realidad un bloque de memoria con una dirección base.
class Array {
function Array new(int size) {
return Memory.alloc(size);
}
method void dispose() {
do Memory.deAlloc(this);
return;
}
}