Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var LineReader = require('node-line-reader').LineReader;
- const fs = require('fs');
- let registers = [{name: 'ACC', val: 0}, {name: 'R0', val: 0}];
- let mem = [6,9,4,2,7,8,1];
- let marks = [];
- let counter = 0;
- fs.readFile('code.txt', {encoding: 'utf-8'}, function(err, data) {
- if (!err) {
- let code = data.replace(/,/g,'').replace(/\r/g,'').split('\n');
- let filtered = code.filter((val, i, arr) => {
- return val != '';
- });
- runProgram(filtered);
- } else {
- console.log(err);
- }
- });
- const runProgram = (sourceCode) => {
- while(counter < sourceCode.length - 1) {
- if (sourceCode[counter].includes(':')) {
- marks.push({pos: counter, val: sourceCode[counter].replace(/:/g,'')});
- } else {
- processCommand(sourceCode[counter], sourceCode[counter - 1]);
- }
- counter++;
- }
- console.log(registers);
- }
- const processCommand = (line, previousLine) => {
- let data = line.split(' ');
- let prevData = previousLine.split(' ');
- switch(data[0]) {
- case 'MOV' : processMov(data);
- break;
- case 'ADD' : processAdd(data);
- break;
- case 'DEC' : processDec(data);
- break;
- case 'JNE' : processJne(data, processCmp(prevData));
- break;
- }
- }
- const processJne = (data, condition) => {
- if (!condition) {
- marks.forEach((mark, i) => {
- if (mark.val === 'loop') { counter = mark.pos }
- });
- }
- }
- const processCmp = (data) => {
- let regValue = registers[findRegister(data[1])].val;
- return regValue <= data[2];
- }
- const processDec = (data) => {
- let index = findRegister(data[1]);
- registers[index].val -= 1;
- }
- const processAdd = (data) => {
- registers[0].val += memAccess(data[1]);
- }
- const processMov = (data) => {
- if (data[2].includes('[') && data[2].includes(']')) {
- registers[findRegister(data[1])].val = memAccess(data[2]);
- } else {
- registers[findRegister(data[1])].val = parseInt(data[2]);
- }
- }
- const memAccess = (sector) => {
- const numbers = /^[0-9]+$/
- let sectorData = sector.replace(/\[|\]/g,'');
- if (sectorData.match(numbers)) {
- return mem[parseInt(sectorData, 10)];
- }
- else {
- let reg = registers[findRegister(sectorData)];
- return mem[reg.val];
- }
- }
- const findRegister = (name) => {
- let index = -1;
- registers.forEach((register, i) => {
- if (register.name === name) { index = i; }
- });
- return index;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement