UNPKG

friscjs

Version:

FRISC processor simulator in JavaScript

1,642 lines (1,544 loc) 168 kB
frisc_asm = (function(){ /* * Generated by PEG.js 0.7.0. * * http://pegjs.majda.cz/ */ function quote(s) { /* * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a * string literal except for the closing quote character, backslash, * carriage return, line separator, paragraph separator, and line feed. * Any character may appear in the form of an escape sequence. * * For portability, we also escape escape all control and non-ASCII * characters. Note that "\0" and "\v" escape sequences are not used * because JSHint does not like the first and IE the second. */ return '"' + s .replace(/\\/g, '\\\\') // backslash .replace(/"/g, '\\"') // closing quote character .replace(/\x08/g, '\\b') // backspace .replace(/\t/g, '\\t') // horizontal tab .replace(/\n/g, '\\n') // line feed .replace(/\f/g, '\\f') // form feed .replace(/\r/g, '\\r') // carriage return .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) + '"'; } var result = { /* * Parses the input with a generated parser. If the parsing is successfull, * returns a value explicitly or implicitly specified by the grammar from * which the parser was generated (see |PEG.buildParser|). If the parsing is * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. */ parse: function(input, startRule) { var parseFunctions = { "instructions_main": parse_instructions_main, "instructions": parse_instructions, "newline": parse_newline, "instruction_or_end": parse_instruction_or_end, "instruction_end": parse_instruction_end, "instruction": parse_instruction, "label": parse_label, "operationPart": parse_operationPart, "operation": parse_operation, "regaddr": parse_regaddr, "sraddr": parse_sraddr, "immaddr": parse_immaddr, "absaddr_mem": parse_absaddr_mem, "rinaddr": parse_rinaddr, "rinaddroff": parse_rinaddroff, "delimiter": parse_delimiter, "moveop_name": parse_moveop_name, "aluop_name": parse_aluop_name, "cmpop_name": parse_cmpop_name, "nonjmpop_name": parse_nonjmpop_name, "jmpop_name": parse_jmpop_name, "memop_name": parse_memop_name, "stackop_name": parse_stackop_name, "orgop_name": parse_orgop_name, "dwop_name": parse_dwop_name, "equop_name": parse_equop_name, "dsop_name": parse_dsop_name, "endop_name": parse_endop_name, "baseop_name": parse_baseop_name, "dwhbop_name": parse_dwhbop_name, "flag_name": parse_flag_name, "aluop": parse_aluop, "cmpop": parse_cmpop, "moveop": parse_moveop, "uprop": parse_uprop, "flag": parse_flag, "memop": parse_memop, "stackop": parse_stackop, "orgop": parse_orgop, "dwop": parse_dwop, "equop": parse_equop, "dsop": parse_dsop, "endop": parse_endop, "baseop": parse_baseop, "dwhbop": parse_dwhbop, "commentPart": parse_commentPart, "whitespace": parse_whitespace, "register": parse_register, "number": parse_number, "base": parse_base, "numberWithoutBase": parse_numberWithoutBase }; if (startRule !== undefined) { if (parseFunctions[startRule] === undefined) { throw new Error("Invalid rule name: " + quote(startRule) + "."); } } else { startRule = "instructions_main"; } var pos = 0; var reportFailures = 0; var rightmostFailuresPos = 0; var rightmostFailuresExpected = []; function padLeft(input, padding, length) { var result = input; var padLength = length - input.length; for (var i = 0; i < padLength; i++) { result = padding + result; } return result; } function escape(ch) { var charCode = ch.charCodeAt(0); var escapeChar; var length; if (charCode <= 0xFF) { escapeChar = 'x'; length = 2; } else { escapeChar = 'u'; length = 4; } return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); } function matchFailed(failure) { if (pos < rightmostFailuresPos) { return; } if (pos > rightmostFailuresPos) { rightmostFailuresPos = pos; rightmostFailuresExpected = []; } rightmostFailuresExpected.push(failure); } function parse_instructions_main() { var result0; var pos0; pos0 = pos; result0 = parse_instructions(); if (result0 !== null) { result0 = (function(offset, ins) { var instrs = []; var machinecode = []; var unknownlabels = []; for (var i=0; i<ins.length; i++) { if (typeof ins[i][0].op !== "undefined" && ins[i][0].op !== "") { instrs.push(ins[i][0]); } } function replaceLabel(element, baseValueForDiff) { if (element.type === "label") { var labelValue = labels[element.value]; if (typeof labelValue !== "undefined") { element.type = "num"; element.value = (typeof baseValueForDiff === 'undefined') ? labelValue : (labelValue - baseValueForDiff); } else { unknownlabels.push(element.value); element.value = null; } } } // replace labels for (var i=0; i<instrs.length; i++) { if (instrs[i].op in aluops || instrs[i].op in cmpops || instrs[i].op in moveops) { replaceLabel(instrs[i].alusrc2); } else if (instrs[i].op in jmpops) { if (instrs[i].op === "JR") { replaceLabel(instrs[i].addr, instrs[i].curloc); } else { replaceLabel(instrs[i].addr); } } else if (instrs[i].op in memops) { replaceLabel(instrs[i].mem); } else if (instrs[i].op in dwhbops) { var vals = []; for (var j=0; j<instrs[i].values.length; j++) { replaceLabel(instrs[i].values[j]); vals.push(instrs[i].values[j].value); } instrs[i].values = vals; } } // check if all labels are defined if (unknownlabels.length > 0) { throw new Error("Unknown labels: " + unknownlabels.toString()); } // generate machine code for (var i=0; i<instrs.length; i++) { generateMachineCode(instrs[i]); machinecode.push(instrs[i]); } // generate memory model var mem = []; var writeToMemory = function(bitString, startPosition, memoryArray) { if (bitString.length % 8 !== 0) { throw new Error("Memory string has wrong length"); } var elems = bitString.match(/.{8}/g); for (var i=0; i<elems.length; i++) { memoryArray[startPosition+i] = elems[elems.length - i - 1]; } return startPosition + elems.length; }; for (var opCount=0, memCount=0; opCount<machinecode.length; ) { if (typeof machinecode[opCount].curloc === "undefined") { opCount++; } else { if (machinecode[opCount].curloc > memCount) { memCount = writeToMemory("00000000", memCount, mem); } else { if (typeof machinecode[opCount].machineCode === "string") { memCount = writeToMemory(machinecode[opCount].machineCode, memCount, mem); } else { for (var j=0; j<machinecode[opCount].machineCode.length; j++) { memCount = writeToMemory(machinecode[opCount].machineCode[j], memCount, mem); } } opCount += 1; } } } return { ast : machinecode, mem : mem}; })(pos0, result0); } if (result0 === null) { pos = pos0; } return result0; } function parse_instructions() { var result0, result1, result2; var pos0, pos1, pos2; pos0 = pos; pos1 = pos; pos2 = pos; result1 = parse_instruction_or_end(); if (result1 !== null) { result2 = (function(offset) { linecounter++; return true;})(pos) ? "" : null; if (result2 !== null) { result1 = [result1, result2]; } else { result1 = null; pos = pos2; } } else { result1 = null; pos = pos2; } if (result1 !== null) { result0 = []; while (result1 !== null) { result0.push(result1); pos2 = pos; result1 = parse_instruction_or_end(); if (result1 !== null) { result2 = (function(offset) { linecounter++; return true;})(pos) ? "" : null; if (result2 !== null) { result1 = [result1, result2]; } else { result1 = null; pos = pos2; } } else { result1 = null; pos = pos2; } } } else { result0 = null; } if (result0 !== null) { pos2 = pos; reportFailures++; if (input.length > pos) { result2 = input.charAt(pos); pos++; } else { result2 = null; if (reportFailures === 0) { matchFailed("any character"); } } if (result2 !== null) { result1 = []; while (result2 !== null) { result1.push(result2); if (input.length > pos) { result2 = input.charAt(pos); pos++; } else { result2 = null; if (reportFailures === 0) { matchFailed("any character"); } } } } else { result1 = null; } reportFailures--; if (result1 === null) { result1 = ""; } else { result1 = null; pos = pos2; } if (result1 !== null) { result0 = [result0, result1]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, ins) { return ins; })(pos0, result0[0]); } if (result0 === null) { pos = pos0; } return result0; } function parse_newline() { var result0; if (input.charCodeAt(pos) === 10) { result0 = "\n"; pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"\\n\""); } } if (result0 === null) { if (input.substr(pos, 2) === "\r\n") { result0 = "\r\n"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"\\r\\n\""); } } if (result0 === null) { if (input.charCodeAt(pos) === 13) { result0 = "\r"; pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"\\r\""); } } if (result0 === null) { if (input.substr(pos, 2) === "\n\r") { result0 = "\n\r"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"\\n\\r\""); } } } } } return result0; } function parse_instruction_or_end() { var result0, result1; var pos0, pos1; pos0 = pos; result0 = parse_instruction_end(); if (result0 !== null) { result0 = (function(offset, i) { var ins = i; ins.line = linecounter-1; return {}})(pos0, result0); } if (result0 === null) { pos = pos0; } if (result0 === null) { pos0 = pos; pos1 = pos; result0 = parse_instruction(); if (result0 !== null) { result1 = parse_newline(); if (result1 !== null) { result0 = [result0, result1]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, i) { var ins = i; ins.line = linecounter; return ins;})(pos0, result0[0]); } if (result0 === null) { pos = pos0; } } return result0; } function parse_instruction_end() { var result0, result1, result2, result3, result4, result5, result6; var pos0, pos1, pos2; pos0 = pos; pos1 = pos; result0 = parse_label(); result0 = result0 !== null ? result0 : ""; if (result0 !== null) { result2 = parse_whitespace(); if (result2 !== null) { result1 = []; while (result2 !== null) { result1.push(result2); result2 = parse_whitespace(); } } else { result1 = null; } if (result1 !== null) { result2 = parse_endop(); if (result2 !== null) { result3 = parse_commentPart(); result3 = result3 !== null ? result3 : ""; if (result3 !== null) { pos2 = pos; result4 = parse_newline(); if (result4 !== null) { result5 = []; if (input.length > pos) { result6 = input.charAt(pos); pos++; } else { result6 = null; if (reportFailures === 0) { matchFailed("any character"); } } while (result6 !== null) { result5.push(result6); if (input.length > pos) { result6 = input.charAt(pos); pos++; } else { result6 = null; if (reportFailures === 0) { matchFailed("any character"); } } } if (result5 !== null) { result4 = [result4, result5]; } else { result4 = null; pos = pos2; } } else { result4 = null; pos = pos2; } result4 = result4 !== null ? result4 : ""; if (result4 !== null) { result0 = [result0, result1, result2, result3, result4]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, l, o, c) { return o; })(pos0, result0[0], result0[2], result0[3]); } if (result0 === null) { pos = pos0; } return result0; } function parse_instruction() { var result0, result1, result2; var pos0, pos1; pos0 = pos; pos1 = pos; result0 = parse_label(); result0 = result0 !== null ? result0 : ""; if (result0 !== null) { result1 = parse_operationPart(); result1 = result1 !== null ? result1 : ""; if (result1 !== null) { result2 = parse_commentPart(); result2 = result2 !== null ? result2 : ""; if (result2 !== null) { result0 = [result0, result1, result2]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, l, o, c) { if (o === null || o === "") { if (l !== null && l !== "") { addLabel(l, curloc); } return {}; } if (!(o.op in dwops || o.op in equops || o.op in endops)) { curloc = curloc % 4 === 0 ? curloc : curloc + (4-curloc%4); } if (l !== null && l !== "") { if (!(o.op in baseops || o.op in endops || o.op in orgops || o.op in equops)) { addLabel(l, curloc); } else if (o.op in equops) { addLabel(l, o.value); } } o.curloc = curloc; if (o.op in aluops || o.op in cmpops || o.op in moveops || o.op in jmpops || o.op in rethaltops || o.op in memops || o.op in stackops) { curloc += 4; } else if (o.op in orgops) { if (o.value < curloc) { var err = new Error("ORG op must not point to previous addresses."); err.line = linecounter; err.column = 1; throw err; } curloc = o.value; } else if (o.op in dwops) { curloc += o.values.length; } else if (o.op in equops) { curloc = curloc; } else if (o.op in endops) { curloc = curloc; } else if (o.op in dsops) { curloc += o.value; } else if (o.op in dwhbops) { curloc += o.size*o.values.length; } if (o.op in baseops) { defaultBase = o.value; } if (o.op in endops || o.op in equops || o.op in orgops || o.op in baseops) { return {}; } else { return o; } })(pos0, result0[0], result0[1], result0[2]); } if (result0 === null) { pos = pos0; } return result0; } function parse_label() { var result0, result1, result2; var pos0, pos1; pos0 = pos; pos1 = pos; if (/^[a-zA-Z]/.test(input.charAt(pos))) { result0 = input.charAt(pos); pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("[a-zA-Z]"); } } if (result0 !== null) { result1 = []; if (/^[0-9a-zA-Z_]/.test(input.charAt(pos))) { result2 = input.charAt(pos); pos++; } else { result2 = null; if (reportFailures === 0) { matchFailed("[0-9a-zA-Z_]"); } } while (result2 !== null) { result1.push(result2); if (/^[0-9a-zA-Z_]/.test(input.charAt(pos))) { result2 = input.charAt(pos); pos++; } else { result2 = null; if (reportFailures === 0) { matchFailed("[0-9a-zA-Z_]"); } } } if (result1 !== null) { result0 = [result0, result1]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, first, rest) { return first + rest.join(""); })(pos0, result0[0], result0[1]); } if (result0 === null) { pos = pos0; } return result0; } function parse_operationPart() { var result0, result1; var pos0, pos1; pos0 = pos; pos1 = pos; result1 = parse_whitespace(); if (result1 !== null) { result0 = []; while (result1 !== null) { result0.push(result1); result1 = parse_whitespace(); } } else { result0 = null; } if (result0 !== null) { result1 = parse_operation(); if (result1 !== null) { result0 = [result0, result1]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, o) {return o;})(pos0, result0[1]); } if (result0 === null) { pos = pos0; } return result0; } function parse_operation() { var result0; result0 = parse_dwhbop(); if (result0 === null) { result0 = parse_baseop(); if (result0 === null) { result0 = parse_dsop(); if (result0 === null) { result0 = parse_equop(); if (result0 === null) { result0 = parse_dwop(); if (result0 === null) { result0 = parse_orgop(); if (result0 === null) { result0 = parse_stackop(); if (result0 === null) { result0 = parse_memop(); if (result0 === null) { result0 = parse_uprop(); if (result0 === null) { result0 = parse_moveop(); if (result0 === null) { result0 = parse_cmpop(); if (result0 === null) { result0 = parse_aluop(); } } } } } } } } } } } return result0; } function parse_regaddr() { var result0; var pos0; pos0 = pos; result0 = parse_register(); if (result0 !== null) { result0 = (function(offset, value) { return {type : "reg", value : value}; })(pos0, result0); } if (result0 === null) { pos = pos0; } return result0; } function parse_sraddr() { var result0, result1; var pos0, pos1; pos0 = pos; pos1 = pos; if (/^[sS]/.test(input.charAt(pos))) { result0 = input.charAt(pos); pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("[sS]"); } } if (result0 !== null) { if (/^[rR]/.test(input.charAt(pos))) { result1 = input.charAt(pos); pos++; } else { result1 = null; if (reportFailures === 0) { matchFailed("[rR]"); } } if (result1 !== null) { result0 = [result0, result1]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, value) { return {type : "sr", value : "sr"}; })(pos0, result0); } if (result0 === null) { pos = pos0; } return result0; } function parse_immaddr() { var result0; var pos0; pos0 = pos; result0 = parse_label(); if (result0 !== null) { result0 = (function(offset, value) { return {type : "label", value : value}; })(pos0, result0); } if (result0 === null) { pos = pos0; } if (result0 === null) { pos0 = pos; result0 = parse_number(); if (result0 !== null) { result0 = (function(offset, value) { return {type : "num", value : value}; })(pos0, result0); } if (result0 === null) { pos = pos0; } } return result0; } function parse_absaddr_mem() { var result0, result1, result2; var pos0, pos1; pos0 = pos; pos1 = pos; if (input.charCodeAt(pos) === 40) { result0 = "("; pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"(\""); } } if (result0 !== null) { result1 = parse_label(); if (result1 !== null) { if (input.charCodeAt(pos) === 41) { result2 = ")"; pos++; } else { result2 = null; if (reportFailures === 0) { matchFailed("\")\""); } } if (result2 !== null) { result0 = [result0, result1, result2]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, value) { return {type : "label", value : value}; })(pos0, result0[1]); } if (result0 === null) { pos = pos0; } if (result0 === null) { pos0 = pos; pos1 = pos; if (input.charCodeAt(pos) === 40) { result0 = "("; pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"(\""); } } if (result0 !== null) { result1 = parse_number(); if (result1 !== null) { if (input.charCodeAt(pos) === 41) { result2 = ")"; pos++; } else { result2 = null; if (reportFailures === 0) { matchFailed("\")\""); } } if (result2 !== null) { result0 = [result0, result1, result2]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, value) { return {type : "num", value : value}; })(pos0, result0[1]); } if (result0 === null) { pos = pos0; } } return result0; } function parse_rinaddr() { var result0, result1, result2; var pos0, pos1; pos0 = pos; pos1 = pos; if (input.charCodeAt(pos) === 40) { result0 = "("; pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"(\""); } } if (result0 !== null) { result1 = parse_regaddr(); if (result1 !== null) { if (input.charCodeAt(pos) === 41) { result2 = ")"; pos++; } else { result2 = null; if (reportFailures === 0) { matchFailed("\")\""); } } if (result2 !== null) { result0 = [result0, result1, result2]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, value) { return value; })(pos0, result0[1]); } if (result0 === null) { pos = pos0; } return result0; } function parse_rinaddroff() { var result0, result1, result2, result3; var pos0, pos1; pos0 = pos; pos1 = pos; if (input.charCodeAt(pos) === 40) { result0 = "("; pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"(\""); } } if (result0 !== null) { result1 = parse_register(); if (result1 !== null) { result2 = parse_numberWithoutBase(); if (result2 === null) { result2 = ""; } if (result2 !== null) { if (input.charCodeAt(pos) === 41) { result3 = ")"; pos++; } else { result3 = null; if (reportFailures === 0) { matchFailed("\")\""); } } if (result3 !== null) { result0 = [result0, result1, result2, result3]; } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } } else { result0 = null; pos = pos1; } if (result0 !== null) { result0 = (function(offset, reg, val) { return {type : "regoff", value : reg, offset : val === "" ? 0 : val }; })(pos0, result0[1], result0[2]); } if (result0 === null) { pos = pos0; } return result0; } function parse_delimiter() { var result0, result1, result2, result3; var pos0; pos0 = pos; result0 = []; result1 = parse_whitespace(); while (result1 !== null) { result0.push(result1); result1 = parse_whitespace(); } if (result0 !== null) { if (input.charCodeAt(pos) === 44) { result1 = ","; pos++; } else { result1 = null; if (reportFailures === 0) { matchFailed("\",\""); } } if (result1 !== null) { result2 = []; result3 = parse_whitespace(); while (result3 !== null) { result2.push(result3); result3 = parse_whitespace(); } if (result2 !== null) { result0 = [result0, result1, result2]; } else { result0 = null; pos = pos0; } } else { result0 = null; pos = pos0; } } else { result0 = null; pos = pos0; } return result0; } function parse_moveop_name() { var result0; if (input.substr(pos, 4) === "MOVE") { result0 = "MOVE"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"MOVE\""); } } return result0; } function parse_aluop_name() { var result0; if (input.substr(pos, 2) === "OR") { result0 = "OR"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"OR\""); } } if (result0 === null) { if (input.substr(pos, 3) === "AND") { result0 = "AND"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"AND\""); } } if (result0 === null) { if (input.substr(pos, 3) === "XOR") { result0 = "XOR"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"XOR\""); } } if (result0 === null) { if (input.substr(pos, 3) === "ADD") { result0 = "ADD"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"ADD\""); } } if (result0 === null) { if (input.substr(pos, 3) === "ADC") { result0 = "ADC"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"ADC\""); } } if (result0 === null) { if (input.substr(pos, 3) === "SUB") { result0 = "SUB"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"SUB\""); } } if (result0 === null) { if (input.substr(pos, 3) === "SBC") { result0 = "SBC"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"SBC\""); } } if (result0 === null) { if (input.substr(pos, 4) === "ROTL") { result0 = "ROTL"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"ROTL\""); } } if (result0 === null) { if (input.substr(pos, 4) === "ROTR") { result0 = "ROTR"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"ROTR\""); } } if (result0 === null) { if (input.substr(pos, 3) === "SHL") { result0 = "SHL"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"SHL\""); } } if (result0 === null) { if (input.substr(pos, 3) === "SHR") { result0 = "SHR"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"SHR\""); } } if (result0 === null) { if (input.substr(pos, 4) === "ASHR") { result0 = "ASHR"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"ASHR\""); } } } } } } } } } } } } } return result0; } function parse_cmpop_name() { var result0; if (input.substr(pos, 3) === "CMP") { result0 = "CMP"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"CMP\""); } } return result0; } function parse_nonjmpop_name() { var result0; if (input.substr(pos, 4) === "RETI") { result0 = "RETI"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"RETI\""); } } if (result0 === null) { if (input.substr(pos, 4) === "RETN") { result0 = "RETN"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"RETN\""); } } if (result0 === null) { if (input.substr(pos, 3) === "RET") { result0 = "RET"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"RET\""); } } if (result0 === null) { if (input.substr(pos, 4) === "HALT") { result0 = "HALT"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"HALT\""); } } } } } return result0; } function parse_jmpop_name() { var result0; if (input.substr(pos, 2) === "JP") { result0 = "JP"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"JP\""); } } if (result0 === null) { if (input.substr(pos, 4) === "CALL") { result0 = "CALL"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"CALL\""); } } if (result0 === null) { if (input.substr(pos, 2) === "JR") { result0 = "JR"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"JR\""); } } } } return result0; } function parse_memop_name() { var result0; if (input.substr(pos, 5) === "LOADB") { result0 = "LOADB"; pos += 5; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"LOADB\""); } } if (result0 === null) { if (input.substr(pos, 6) === "STOREB") { result0 = "STOREB"; pos += 6; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"STOREB\""); } } if (result0 === null) { if (input.substr(pos, 5) === "LOADH") { result0 = "LOADH"; pos += 5; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"LOADH\""); } } if (result0 === null) { if (input.substr(pos, 6) === "STOREH") { result0 = "STOREH"; pos += 6; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"STOREH\""); } } if (result0 === null) { if (input.substr(pos, 4) === "LOAD") { result0 = "LOAD"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"LOAD\""); } } if (result0 === null) { if (input.substr(pos, 5) === "STORE") { result0 = "STORE"; pos += 5; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"STORE\""); } } } } } } } return result0; } function parse_stackop_name() { var result0; if (input.substr(pos, 3) === "POP") { result0 = "POP"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"POP\""); } } if (result0 === null) { if (input.substr(pos, 4) === "PUSH") { result0 = "PUSH"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"PUSH\""); } } } return result0; } function parse_orgop_name() { var result0; if (input.substr(pos, 4) === "`ORG") { result0 = "`ORG"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"`ORG\""); } } return result0; } function parse_dwop_name() { var result0; if (input.substr(pos, 3) === "`DW") { result0 = "`DW"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"`DW\""); } } return result0; } function parse_equop_name() { var result0; if (input.substr(pos, 4) === "`EQU") { result0 = "`EQU"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"`EQU\""); } } return result0; } function parse_dsop_name() { var result0; if (input.substr(pos, 3) === "`DS") { result0 = "`DS"; pos += 3; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"`DS\""); } } return result0; } function parse_endop_name() { var result0; if (input.substr(pos, 4) === "`END") { result0 = "`END"; pos += 4; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"`END\""); } } return result0; } function parse_baseop_name() { var result0; if (input.substr(pos, 5) === "`BASE") { result0 = "`BASE"; pos += 5; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"`BASE\""); } } return result0; } function parse_dwhbop_name() { var result0; if (input.substr(pos, 2) === "DW") { result0 = "DW"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"DW\""); } } if (result0 === null) { if (input.substr(pos, 2) === "DH") { result0 = "DH"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"DH\""); } } if (result0 === null) { if (input.substr(pos, 2) === "DB") { result0 = "DB"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"DB\""); } } } } return result0; } function parse_flag_name() { var result0; if (input.charCodeAt(pos) === 77) { result0 = "M"; pos++; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"M\""); } } if (result0 === null) { if (input.substr(pos, 2) === "NN") { result0 = "NN"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"NN\""); } } if (result0 === null) { if (input.substr(pos, 2) === "NV") { result0 = "NV"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"NV\""); } } if (result0 === null) { if (input.substr(pos, 2) === "NZ") { result0 = "NZ"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"NZ\""); } } if (result0 === null) { if (input.substr(pos, 2) === "NE") { result0 = "NE"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"NE\""); } } if (result0 === null) { if (input.substr(pos, 2) === "NC") { result0 = "NC"; pos += 2; } else { result0 = null; if (reportFailures === 0) { matchFailed("\"NC\""); } } if (result0 === null) { if (input.charCodeAt(pos) === 78) { result0 = "N"; pos++; } else { result0 = null;