var memoryCells = 20;
var memory = new Array();
var currentMemoryPos = 0;
var currentCodePos = 0;
var running = false;
var stopRunning = false;
var memoryTable = document.getElementById("memorytable");
var memoryTableData = "";
for(var i = 0; i < memoryCells; i++)
{
memory[i] = 0;
memoryTableData += "
0
";
}
memoryTable.innerHTML = memoryTableData;
document.getElementById("memorycell0").classList.add("active_cell");
function reset()
{
if(running === true)
{
return;
}
currentMemoryPos = 0;
currentCodePos = 0;
var cell = null;
for(var i = 0; i < memoryCells; i++)
{
memory[i] = 0;
cell = document.getElementById("memorycell" + i);
cell.innerHTML = "0";
cell.classList.remove("active_cell");
}
document.getElementById("memorycell0").classList.add("active_cell");
document.getElementById("outputcode").innerHTML = "";
document.getElementById("output").innerHTML = "";
}
function start()
{
if(running === true)
{
stopRunning = true;
return;
}
var length = document.getElementById("input").value.length;
if(currentCodePos >= length && length !== 0)
{
reset();
}
document.getElementById("start").innerHTML = "Halt";
running = true;
setTimeout(execute, 200);
}
function execute()
{
var code = document.getElementById("input").value;
var output = code.substring(0, currentCodePos) + "" +
code.substring(currentCodePos, currentCodePos + 1) + "" + code.substring(currentCodePos + 1, code.length);
output = output.replace(new RegExp("\n", 'g'), "
");
document.getElementById("outputcode").innerHTML = output;
switch(code[currentCodePos])
{
case '>':
document.getElementById("memorycell" + currentMemoryPos).classList.remove("active_cell");
currentMemoryPos = (currentMemoryPos + 1) % memoryCells;
document.getElementById("memorycell" + currentMemoryPos).classList.add("active_cell");
break;
case '<':
document.getElementById("memorycell" + currentMemoryPos).classList.remove("active_cell");
currentMemoryPos = (currentMemoryPos + memoryCells - 1) % memoryCells;
document.getElementById("memorycell" + currentMemoryPos).classList.add("active_cell");
break;
case '+':
memory[currentMemoryPos] = (memory[currentMemoryPos] + 1) % 256;
document.getElementById("memorycell" + currentMemoryPos).innerHTML = memory[currentMemoryPos];
break;
case '-':
memory[currentMemoryPos] = (memory[currentMemoryPos] + 255) % 256;
document.getElementById("memorycell" + currentMemoryPos).innerHTML = memory[currentMemoryPos];
break;
case '.':
var out = document.getElementById("output");
out.innerHTML = out.innerHTML + String.fromCharCode(memory[currentMemoryPos]);
break;
case ',':
break;
case '[':
if(memory[currentMemoryPos] === 0)
{
while(currentCodePos < code.length && code[currentCodePos] !== ']')
{
currentCodePos++;
}
}
break;
case ']':
if(memory[currentMemoryPos] !== 0)
{
while(currentCodePos >= 0 && code[currentCodePos] !== '[')
{
currentCodePos--;
}
}
break;
}
currentCodePos++;
if(currentCodePos < code.length && !stopRunning)
{
setTimeout(execute, document.getElementById("delay").value);
}
else
{
running = false;
stopRunning = false;
document.getElementById("start").innerHTML = "Start";
}
}