Files
nand2tetris/projects/12/MemoryTest/Memory.jack
2021-04-21 17:01:42 +03:00

74 lines
2.1 KiB
Plaintext

// 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/Memory.jack
/**
* This library provides two services: direct access to the computer's main
* memory (RAM), and allocation and recycling of memory blocks. The Hack RAM
* consists of 32,768 words, each holding a 16-bit binary number.
*/
class Memory {
static Array memory;
static Array heap;
static Array freeList;
/** Initializes the class. */
function void init() {
let memory = 0;
let heap = 2048;
let freeList = 2048;
let heap[0] = 0;
let heap[1] = 14335;
return;
}
/** Returns the RAM value at the given address. */
function int peek(int address) {
return memory[address];
}
/** Sets the RAM value at the given address to the given value. */
function void poke(int address, int value) {
let memory[address] = value;
return;
}
/** Finds an available RAM block of the given size and returns
* a reference to its base address. */
function int alloc(int size) {
var Array curList, found;
let curList = freeList;
while (curList > 0) {
if (curList[1] > (size + 1)) {
do Memory.poke(8010, 1);
let found = curList + curList[1] - size;
let curList[1] = curList[1] - size - 2;
let found[0] = 0;
let found[1] = size;
return found;
} else {
let curList = curList[0];
}
}
return 0;
}
/** De-allocates the given object (cast as an array) by making
* it available for future allocations. */
function void deAlloc(Array o) {
var Array curList;
let curList = freeList;
if(curList = 0) {
let freeList = o;
return;
}
while (curList[0] > 0) {
let curList = curList[0];
}
let curList = o;
return;
}
}