diff --git a/app/assembler.js b/app/assembler.js index 4747f68..1dc0403 100644 --- a/app/assembler.js +++ b/app/assembler.js @@ -33,7 +33,7 @@ function SimulatorWidget(node) { $node.find('.runButton').click(simulator.runBinary); $node.find('.runButton').click(simulator.stopDebugger); $node.find('.resetButton').click(simulator.reset); - $node.find('.hexdumpButton').click(assembler.hexdump); + $node.find('.hexdumpButton').click(assembler.hexdump).trigger('keydown', {which: 65}); $node.find('.disassembleButton').click(assembler.disassemble); $node.find('.debug').on('click', function () { $(this).toggleClass('active'); @@ -49,7 +49,7 @@ function SimulatorWidget(node) { $node.find('.monitoring').on('click', function () { $(this).toggleClass('active'); if($(this).hasClass('active')) { - + } ui.toggleMonitor(); simulator.toggleMonitor(); @@ -177,10 +177,10 @@ function SimulatorWidget(node) { // Insert tab at caret position (instead of losing focus) var caretStart = this.selectionStart, - caretEnd = this.selectionEnd, - currentValue = this.value; + caretEnd = this.selectionEnd, + currentValue = this.value; - this.value = currentValue.substring(0, caretStart) + "\t" + currentValue.substring(caretEnd); + this.value = currentValue.substring(0, caretStart) + '\t' + currentValue.substring(caretEnd); // Move cursor forwards one (after tab) this.selectionStart = this.selectionEnd = caretStart + 1; @@ -204,10 +204,10 @@ function SimulatorWidget(node) { function Display() { var displayArray = []; var palette = [ - "#000000", "#ffffff", "#880000", "#aaffee", - "#cc44cc", "#00cc55", "#0000aa", "#eeee77", - "#dd8855", "#664400", "#ff7777", "#333333", - "#777777", "#aaff66", "#0088ff", "#bbbbbb" + '#000000', '#ffffff', '#880000', '#aaffee', + '#cc44cc', '#00cc55', '#0000aa', '#eeee77', + '#dd8855', '#664400', '#ff7777', '#333333', + '#777777', '#aaff66', '#0088ff', '#bbbbbb' ]; var ctx; var width; @@ -226,7 +226,7 @@ function SimulatorWidget(node) { } function reset() { - ctx.fillStyle = "black"; + ctx.fillStyle = 'black'; ctx.fillRect(0, 0, width, height); } @@ -279,14 +279,14 @@ function SimulatorWidget(node) { for (var x = 0; x < length; x++) { if ((x & 15) === 0) { - if (x > 0) { html += "\n"; } + if (x > 0) { html += '\n'; } n = (start + x); html += num2hex(((n >> 8) & 0xff)); html += num2hex((n & 0xff)); - html += ": "; + html += ': '; } html += num2hex(memory.get(start + x)); - html += " "; + html += ' '; } return html; } @@ -871,7 +871,7 @@ function SimulatorWidget(node) { i58: function () { regP &= ~0x04; - throw new Error("Interrupts not implemented"); + throw new Error('Interrupts not implemented'); //CLI }, @@ -1006,7 +1006,7 @@ function SimulatorWidget(node) { i78: function () { regP |= 0x04; - throw new Error("Interrupts not implemented"); + throw new Error('Interrupts not implemented'); //SEI }, @@ -1499,7 +1499,7 @@ function SimulatorWidget(node) { }, ierr: function () { - message("Address $" + addr2hex(regPC) + " - unknown opcode"); + message('Address $' + addr2hex(regPC) + ' - unknown opcode'); codeRunning = false; } }; @@ -1509,7 +1509,7 @@ function SimulatorWidget(node) { regSP--; if (regSP < 0) { regSP &= 0xff; - message("6502 Stack filled! Wrapping..."); + message('6502 Stack filled! Wrapping...'); } } @@ -1518,7 +1518,7 @@ function SimulatorWidget(node) { regSP++; if (regSP >= 0x100) { regSP &= 0xff; - message("6502 Stack emptied! Wrapping..."); + message('6502 Stack emptied! Wrapping...'); } value = memory.get(regSP + 0x100); return value; @@ -1582,7 +1582,7 @@ function SimulatorWidget(node) { if ((regPC === 0) || (!codeRunning && !debugging)) { stop(); - message("Program end at PC=$" + addr2hex(regPC - 1)); + message('Program end at PC=$' + addr2hex(regPC - 1)); ui.stop(); } } @@ -1611,10 +1611,10 @@ function SimulatorWidget(node) { function handleMonitorRangeChange() { var $start = $node.find('.start'), - $length = $node.find('.length'), - start = parseInt($start.val(), 16), - length = parseInt($length.val(), 16), - end = start + length - 1; + $length = $node.find('.length'), + start = parseInt($start.val(), 16), + length = parseInt($length.val(), 16), + end = start + length - 1; $start.removeClass('monitor-invalid'); $length.removeClass('monitor-invalid'); @@ -1632,15 +1632,15 @@ function SimulatorWidget(node) { // Execute one instruction and print values function debugExec() { //if (codeRunning) { - execute(true); + execute(true); //} updateDebugInfo(); } function updateDebugInfo() { - var html = "A=$" + num2hex(regA) + " X=$" + num2hex(regX) + " Y=$" + num2hex(regY) + - " SP=$" + num2hex(regSP) + " PC=$" + addr2hex(regPC) + " NV-BDIZC: "; - for (var i = 7; i >=0; i--) { + var html = 'A=$' + num2hex(regA) + ' X=$' + num2hex(regX) + ' Y=$' + num2hex(regY) + + ' SP=$' + num2hex(regSP) + ' PC=$' + addr2hex(regPC) + ' NV-BDIZC: '; + for (var i = 7; i >= 0; i--) { html += regP >> i & 1; } $node.find('.minidebugger').html(html); @@ -1649,21 +1649,21 @@ function SimulatorWidget(node) { // gotoAddr() - Set PC to address (or address of label) function gotoAddr() { - var inp = prompt("Enter address or label", ""); + var inp = prompt('Enter address or label', ''); var addr = 0; if (labels.find(inp)) { addr = labels.getPC(inp); } else { if (inp.match(/^0x[0-9a-f]{1,4}$/i)) { - inp = inp.replace(/^0x/, ""); + inp = inp.replace(/^0x/, ''); addr = parseInt(inp, 16); } else if (inp.match(/^\$[0-9a-f]{1,4}$/i)) { - inp = inp.replace(/^\$/, ""); + inp = inp.replace(/^\$/, ''); addr = parseInt(inp, 16); } } if (addr === 0) { - message("Unable to find/parse given address/label"); + message('Unable to find/parse given address/label'); } else { regPC = addr; } @@ -1698,7 +1698,7 @@ function SimulatorWidget(node) { function stop() { codeRunning = false; clearInterval(executeId); - message("\nStopped\n"); + message('\nStopped\n'); } function toggleMonitor() { @@ -1725,7 +1725,7 @@ function SimulatorWidget(node) { function indexLines(lines, symbols) { for (var i = 0; i < lines.length; i++) { if (!indexLine(lines[i], symbols)) { - message("**Label already defined at line " + (i + 1) + ":** " + lines[i]); + message('**Label already defined at line ' + (i + 1) + ':** ' + lines[i]); return false; } } @@ -1735,21 +1735,21 @@ function SimulatorWidget(node) { // Extract label if line contains one and calculate position in memory. // Return false if label already exists. function indexLine(input, symbols) { - + // Figure out how many bytes this instruction takes var currentPC = assembler.getCurrentPC(); assembler.assembleLine(input, 0, symbols); //TODO: find a better way for Labels to have access to assembler // Find command or label if (input.match(/^\w+:/)) { - var label = input.replace(/(^\w+):.*$/, "$1"); - + var label = input.replace(/(^\w+):.*$/, '$1'); + if (symbols.lookup(label)) { - message("**Label " + label + "is already used as a symbol; please rename one of them**"); + message('**Label ' + label + 'is already used as a symbol; please rename one of them**'); return false; } - - return push(label + "|" + currentPC); + + return push(label + '|' + currentPC); } return true; } @@ -1759,7 +1759,7 @@ function SimulatorWidget(node) { if (find(name)) { return false; } - labelIndex.push(name + "|"); + labelIndex.push(name + '|'); return true; } @@ -1767,7 +1767,7 @@ function SimulatorWidget(node) { function find(name) { var nameAndAddr; for (var i = 0; i < labelIndex.length; i++) { - nameAndAddr = labelIndex[i].split("|"); + nameAndAddr = labelIndex[i].split('|'); if (name === nameAndAddr[0]) { return true; } @@ -1779,9 +1779,9 @@ function SimulatorWidget(node) { function setPC(name, addr) { var nameAndAddr; for (var i = 0; i < labelIndex.length; i++) { - nameAndAddr = labelIndex[i].split("|"); + nameAndAddr = labelIndex[i].split('|'); if (name === nameAndAddr[0]) { - labelIndex[i] = name + "|" + addr; + labelIndex[i] = name + '|' + addr; return true; } } @@ -1792,7 +1792,7 @@ function SimulatorWidget(node) { function getPC(name) { var nameAndAddr; for (var i = 0; i < labelIndex.length; i++) { - nameAndAddr = labelIndex[i].split("|"); + nameAndAddr = labelIndex[i].split('|'); if (name === nameAndAddr[0]) { return (nameAndAddr[1]); } @@ -1801,11 +1801,11 @@ function SimulatorWidget(node) { } function displayMessage() { - var str = "Found " + labelIndex.length + " label"; + var str = 'Found ' + labelIndex.length + ' label'; if (labelIndex.length !== 1) { - str += "s"; + str += 's'; } - message(str + "."); + message(str + '.'); } function reset() { @@ -1830,86 +1830,86 @@ function SimulatorWidget(node) { var Opcodes = [ /* Name, Imm, ZP, ZPX, ZPY, ABS, ABSX, ABSY, IND, INDX, INDY, SNGL, BRA */ - ["ADC", 0x69, 0x65, 0x75, null, 0x6d, 0x7d, 0x79, null, 0x61, 0x71, null, null], - ["AND", 0x29, 0x25, 0x35, null, 0x2d, 0x3d, 0x39, null, 0x21, 0x31, null, null], - ["ASL", null, 0x06, 0x16, null, 0x0e, 0x1e, null, null, null, null, 0x0a, null], - ["BIT", null, 0x24, null, null, 0x2c, null, null, null, null, null, null, null], - ["BPL", null, null, null, null, null, null, null, null, null, null, null, 0x10], - ["BMI", null, null, null, null, null, null, null, null, null, null, null, 0x30], - ["BVC", null, null, null, null, null, null, null, null, null, null, null, 0x50], - ["BVS", null, null, null, null, null, null, null, null, null, null, null, 0x70], - ["BCC", null, null, null, null, null, null, null, null, null, null, null, 0x90], - ["BCS", null, null, null, null, null, null, null, null, null, null, null, 0xb0], - ["BNE", null, null, null, null, null, null, null, null, null, null, null, 0xd0], - ["BEQ", null, null, null, null, null, null, null, null, null, null, null, 0xf0], - ["BRK", null, null, null, null, null, null, null, null, null, null, 0x00, null], - ["CMP", 0xc9, 0xc5, 0xd5, null, 0xcd, 0xdd, 0xd9, null, 0xc1, 0xd1, null, null], - ["CPX", 0xe0, 0xe4, null, null, 0xec, null, null, null, null, null, null, null], - ["CPY", 0xc0, 0xc4, null, null, 0xcc, null, null, null, null, null, null, null], - ["DEC", null, 0xc6, 0xd6, null, 0xce, 0xde, null, null, null, null, null, null], - ["EOR", 0x49, 0x45, 0x55, null, 0x4d, 0x5d, 0x59, null, 0x41, 0x51, null, null], - ["CLC", null, null, null, null, null, null, null, null, null, null, 0x18, null], - ["SEC", null, null, null, null, null, null, null, null, null, null, 0x38, null], - ["CLI", null, null, null, null, null, null, null, null, null, null, 0x58, null], - ["SEI", null, null, null, null, null, null, null, null, null, null, 0x78, null], - ["CLV", null, null, null, null, null, null, null, null, null, null, 0xb8, null], - ["CLD", null, null, null, null, null, null, null, null, null, null, 0xd8, null], - ["SED", null, null, null, null, null, null, null, null, null, null, 0xf8, null], - ["INC", null, 0xe6, 0xf6, null, 0xee, 0xfe, null, null, null, null, null, null], - ["JMP", null, null, null, null, 0x4c, null, null, 0x6c, null, null, null, null], - ["JSR", null, null, null, null, 0x20, null, null, null, null, null, null, null], - ["LDA", 0xa9, 0xa5, 0xb5, null, 0xad, 0xbd, 0xb9, null, 0xa1, 0xb1, null, null], - ["LDX", 0xa2, 0xa6, null, 0xb6, 0xae, null, 0xbe, null, null, null, null, null], - ["LDY", 0xa0, 0xa4, 0xb4, null, 0xac, 0xbc, null, null, null, null, null, null], - ["LSR", null, 0x46, 0x56, null, 0x4e, 0x5e, null, null, null, null, 0x4a, null], - ["NOP", null, null, null, null, null, null, null, null, null, null, 0xea, null], - ["ORA", 0x09, 0x05, 0x15, null, 0x0d, 0x1d, 0x19, null, 0x01, 0x11, null, null], - ["TAX", null, null, null, null, null, null, null, null, null, null, 0xaa, null], - ["TXA", null, null, null, null, null, null, null, null, null, null, 0x8a, null], - ["DEX", null, null, null, null, null, null, null, null, null, null, 0xca, null], - ["INX", null, null, null, null, null, null, null, null, null, null, 0xe8, null], - ["TAY", null, null, null, null, null, null, null, null, null, null, 0xa8, null], - ["TYA", null, null, null, null, null, null, null, null, null, null, 0x98, null], - ["DEY", null, null, null, null, null, null, null, null, null, null, 0x88, null], - ["INY", null, null, null, null, null, null, null, null, null, null, 0xc8, null], - ["ROR", null, 0x66, 0x76, null, 0x6e, 0x7e, null, null, null, null, 0x6a, null], - ["ROL", null, 0x26, 0x36, null, 0x2e, 0x3e, null, null, null, null, 0x2a, null], - ["RTI", null, null, null, null, null, null, null, null, null, null, 0x40, null], - ["RTS", null, null, null, null, null, null, null, null, null, null, 0x60, null], - ["SBC", 0xe9, 0xe5, 0xf5, null, 0xed, 0xfd, 0xf9, null, 0xe1, 0xf1, null, null], - ["STA", null, 0x85, 0x95, null, 0x8d, 0x9d, 0x99, null, 0x81, 0x91, null, null], - ["TXS", null, null, null, null, null, null, null, null, null, null, 0x9a, null], - ["TSX", null, null, null, null, null, null, null, null, null, null, 0xba, null], - ["PHA", null, null, null, null, null, null, null, null, null, null, 0x48, null], - ["PLA", null, null, null, null, null, null, null, null, null, null, 0x68, null], - ["PHP", null, null, null, null, null, null, null, null, null, null, 0x08, null], - ["PLP", null, null, null, null, null, null, null, null, null, null, 0x28, null], - ["STX", null, 0x86, null, 0x96, 0x8e, null, null, null, null, null, null, null], - ["STY", null, 0x84, 0x94, null, 0x8c, null, null, null, null, null, null, null], - ["WDM", 0x42, 0x42, null, null, null, null, null, null, null, null, null, null], - ["---", null, null, null, null, null, null, null, null, null, null, null, null] + ['ADC', 0x69, 0x65, 0x75, null, 0x6d, 0x7d, 0x79, null, 0x61, 0x71, null, null], + ['AND', 0x29, 0x25, 0x35, null, 0x2d, 0x3d, 0x39, null, 0x21, 0x31, null, null], + ['ASL', null, 0x06, 0x16, null, 0x0e, 0x1e, null, null, null, null, 0x0a, null], + ['BIT', null, 0x24, null, null, 0x2c, null, null, null, null, null, null, null], + ['BPL', null, null, null, null, null, null, null, null, null, null, null, 0x10], + ['BMI', null, null, null, null, null, null, null, null, null, null, null, 0x30], + ['BVC', null, null, null, null, null, null, null, null, null, null, null, 0x50], + ['BVS', null, null, null, null, null, null, null, null, null, null, null, 0x70], + ['BCC', null, null, null, null, null, null, null, null, null, null, null, 0x90], + ['BCS', null, null, null, null, null, null, null, null, null, null, null, 0xb0], + ['BNE', null, null, null, null, null, null, null, null, null, null, null, 0xd0], + ['BEQ', null, null, null, null, null, null, null, null, null, null, null, 0xf0], + ['BRK', null, null, null, null, null, null, null, null, null, null, 0x00, null], + ['CMP', 0xc9, 0xc5, 0xd5, null, 0xcd, 0xdd, 0xd9, null, 0xc1, 0xd1, null, null], + ['CPX', 0xe0, 0xe4, null, null, 0xec, null, null, null, null, null, null, null], + ['CPY', 0xc0, 0xc4, null, null, 0xcc, null, null, null, null, null, null, null], + ['DEC', null, 0xc6, 0xd6, null, 0xce, 0xde, null, null, null, null, null, null], + ['EOR', 0x49, 0x45, 0x55, null, 0x4d, 0x5d, 0x59, null, 0x41, 0x51, null, null], + ['CLC', null, null, null, null, null, null, null, null, null, null, 0x18, null], + ['SEC', null, null, null, null, null, null, null, null, null, null, 0x38, null], + ['CLI', null, null, null, null, null, null, null, null, null, null, 0x58, null], + ['SEI', null, null, null, null, null, null, null, null, null, null, 0x78, null], + ['CLV', null, null, null, null, null, null, null, null, null, null, 0xb8, null], + ['CLD', null, null, null, null, null, null, null, null, null, null, 0xd8, null], + ['SED', null, null, null, null, null, null, null, null, null, null, 0xf8, null], + ['INC', null, 0xe6, 0xf6, null, 0xee, 0xfe, null, null, null, null, null, null], + ['JMP', null, null, null, null, 0x4c, null, null, 0x6c, null, null, null, null], + ['JSR', null, null, null, null, 0x20, null, null, null, null, null, null, null], + ['LDA', 0xa9, 0xa5, 0xb5, null, 0xad, 0xbd, 0xb9, null, 0xa1, 0xb1, null, null], + ['LDX', 0xa2, 0xa6, null, 0xb6, 0xae, null, 0xbe, null, null, null, null, null], + ['LDY', 0xa0, 0xa4, 0xb4, null, 0xac, 0xbc, null, null, null, null, null, null], + ['LSR', null, 0x46, 0x56, null, 0x4e, 0x5e, null, null, null, null, 0x4a, null], + ['NOP', null, null, null, null, null, null, null, null, null, null, 0xea, null], + ['ORA', 0x09, 0x05, 0x15, null, 0x0d, 0x1d, 0x19, null, 0x01, 0x11, null, null], + ['TAX', null, null, null, null, null, null, null, null, null, null, 0xaa, null], + ['TXA', null, null, null, null, null, null, null, null, null, null, 0x8a, null], + ['DEX', null, null, null, null, null, null, null, null, null, null, 0xca, null], + ['INX', null, null, null, null, null, null, null, null, null, null, 0xe8, null], + ['TAY', null, null, null, null, null, null, null, null, null, null, 0xa8, null], + ['TYA', null, null, null, null, null, null, null, null, null, null, 0x98, null], + ['DEY', null, null, null, null, null, null, null, null, null, null, 0x88, null], + ['INY', null, null, null, null, null, null, null, null, null, null, 0xc8, null], + ['ROR', null, 0x66, 0x76, null, 0x6e, 0x7e, null, null, null, null, 0x6a, null], + ['ROL', null, 0x26, 0x36, null, 0x2e, 0x3e, null, null, null, null, 0x2a, null], + ['RTI', null, null, null, null, null, null, null, null, null, null, 0x40, null], + ['RTS', null, null, null, null, null, null, null, null, null, null, 0x60, null], + ['SBC', 0xe9, 0xe5, 0xf5, null, 0xed, 0xfd, 0xf9, null, 0xe1, 0xf1, null, null], + ['STA', null, 0x85, 0x95, null, 0x8d, 0x9d, 0x99, null, 0x81, 0x91, null, null], + ['TXS', null, null, null, null, null, null, null, null, null, null, 0x9a, null], + ['TSX', null, null, null, null, null, null, null, null, null, null, 0xba, null], + ['PHA', null, null, null, null, null, null, null, null, null, null, 0x48, null], + ['PLA', null, null, null, null, null, null, null, null, null, null, 0x68, null], + ['PHP', null, null, null, null, null, null, null, null, null, null, 0x08, null], + ['PLP', null, null, null, null, null, null, null, null, null, null, 0x28, null], + ['STX', null, 0x86, null, 0x96, 0x8e, null, null, null, null, null, null, null], + ['STY', null, 0x84, 0x94, null, 0x8c, null, null, null, null, null, null, null], + ['WDM', 0x42, 0x42, null, null, null, null, null, null, null, null, null, null], + ['---', null, null, null, null, null, null, null, null, null, null, null, null] ]; - + // Assembles the code into memory function assembleCode() { var BOOTSTRAP_ADDRESS = 0x600; wasOutOfRangeBranch = false; - + simulator.reset(); labels.reset(); defaultCodePC = BOOTSTRAP_ADDRESS; $node.find('.messages code').empty(); var code = $node.find('.code').val(); - code += "\n\n"; - var lines = code.split("\n"); + code += '\n\n'; + var lines = code.split('\n'); codeAssembledOK = true; - message("Preprocessing ..."); + message('Preprocessing ...'); var symbols = preprocess(lines); - message("Indexing labels ..."); + message('Indexing labels ...'); defaultCodePC = BOOTSTRAP_ADDRESS; if (!labels.indexLines(lines, symbols)) { return false; @@ -1917,8 +1917,8 @@ function SimulatorWidget(node) { labels.displayMessage(); defaultCodePC = BOOTSTRAP_ADDRESS; - message("Assembling code ..."); - + message('Assembling code ...'); + codeLen = 0; for (var i = 0; i < lines.length; i++) { if (!assembleLine(lines[i], i, symbols)) { @@ -1929,7 +1929,7 @@ function SimulatorWidget(node) { if (codeLen === 0) { codeAssembledOK = false; - message("No code to run."); + message('No code to run.'); } if (codeAssembledOK) { @@ -1937,10 +1937,10 @@ function SimulatorWidget(node) { memory.set(defaultCodePC, 0x00); //set a null byte at the end of the code } else { - var str = lines[i].replace("<", "<").replace(">", ">"); + var str = lines[i].replace('<', '<').replace('>', '>'); if(!wasOutOfRangeBranch) { - message("**Syntax error line " + (i + 1) + ": " + str + "**"); + message('**Syntax error line ' + (i + 1) + ': ' + str + '**'); } else { message('**Out of range branch on line ' + (i + 1) + ' (branches are limited to -128 to +127): ' + str + '**'); } @@ -1949,51 +1949,51 @@ function SimulatorWidget(node) { return false; } - message("Code assembled successfully, " + codeLen + " bytes."); + message('Code assembled successfully, ' + codeLen + ' bytes.'); return true; } // Sanitize input: remove comments and trim leading/trailing whitespace function sanitize(line) { // remove comments - var no_comments = line.replace(/^(.*?);.*/, "$1"); - + var no_comments = line.replace(/^(.*?);.*/, '$1'); + // trim line - return no_comments.replace(/^\s+/, "").replace(/\s+$/, ""); + return no_comments.replace(/^\s+/, '').replace(/\s+$/, ''); } function preprocess(lines) { var table = []; - var PREFIX = "__"; // Using a prefix avoids clobbering any predefined properties - + var PREFIX = '__'; // Using a prefix avoids clobbering any predefined properties + function lookup(key) { if (table.hasOwnProperty(PREFIX + key)) return table[PREFIX + key]; else return undefined; } - + function add(key, value) { var valueAlreadyExists = table.hasOwnProperty(PREFIX + key) if (!valueAlreadyExists) { table[PREFIX + key] = value; } } - + // Build the substitution table for (var i = 0; i < lines.length; i++) { lines[i] = sanitize(lines[i]); var match_data = lines[i].match(/^define\s+(\w+)\s+(\S+)/); if (match_data) { add(match_data[1], sanitize(match_data[2])); - lines[i] = ""; // We're done with this preprocessor directive, so delete it + lines[i] = ''; // We're done with this preprocessor directive, so delete it } } - + // Callers will only need the lookup function return { lookup: lookup } } - + // Assembles one line of code. // Returns true if it assembled successfully, false otherwise. function assembleLine(input, lineno, symbols) { @@ -2001,19 +2001,19 @@ function SimulatorWidget(node) { // Find command or label if (input.match(/^\w+:/)) { - label = input.replace(/(^\w+):.*$/, "$1"); + label = input.replace(/(^\w+):.*$/, '$1'); if (input.match(/^\w+:[\s]*\w+.*$/)) { - input = input.replace(/^\w+:[\s]*(.*)$/, "$1"); - command = input.replace(/^(\w+).*$/, "$1"); + input = input.replace(/^\w+:[\s]*(.*)$/, '$1'); + command = input.replace(/^(\w+).*$/, '$1'); } else { - command = ""; + command = ''; } } else { - command = input.replace(/^(\w+).*$/, "$1"); + command = input.replace(/^(\w+).*$/, '$1'); } // Nothing to do for blank lines - if (command === "") { + if (command === '') { return true; } @@ -2021,15 +2021,15 @@ function SimulatorWidget(node) { if (input.match(/^\*\s*=\s*\$?[0-9a-f]*$/)) { // equ spotted - param = input.replace(/^\s*\*\s*=\s*/, ""); - if (param[0] === "$") { - param = param.replace(/^\$/, ""); + param = input.replace(/^\s*\*\s*=\s*/, ''); + if (param[0] === '$') { + param = param.replace(/^\$/, ''); addr = parseInt(param, 16); } else { addr = parseInt(param, 10); } if ((addr < 0) || (addr > 0xffff)) { - message("Unable to relocate code outside 64k memory"); + message('Unable to relocate code outside 64k memory'); return false; } defaultCodePC = addr; @@ -2037,16 +2037,16 @@ function SimulatorWidget(node) { } if (input.match(/^\w+\s+.*?$/)) { - param = input.replace(/^\w+\s+(.*?)/, "$1"); + param = input.replace(/^\w+\s+(.*?)/, '$1'); } else if (input.match(/^\w+$/)) { - param = ""; + param = ''; } else { return false; } - param = param.replace(/[ ]/g, ""); + param = param.replace(/[ ]/g, ''); - if (command === "DCB") { + if (command === 'DCB') { return DCB(param); } for (var o = 0; o < Opcodes.length; o++) { @@ -2065,22 +2065,22 @@ function SimulatorWidget(node) { if (checkBranch(param, Opcodes[o][12])) { return true; } } } - + return false; // Unknown syntax } function DCB(param) { var values, number, str, ch; - values = param.split(","); + values = param.split(','); if (values.length === 0) { return false; } for (var v = 0; v < values.length; v++) { str = values[v]; if (str) { ch = str.substring(0, 1); - if (ch === "$") { - number = parseInt(str.replace(/^\$/, ""), 16); + if (ch === '$') { + number = parseInt(str.replace(/^\$/, ''), 16); pushByte(number); - } else if (ch >= "0" && ch <= "9") { + } else if (ch >= '0' && ch <= '9') { number = parseInt(str, 10); pushByte(number); } else { @@ -2090,7 +2090,7 @@ function SimulatorWidget(node) { } return true; } - + // Try to parse the given parameter as a byte operand. // Returns the (positive) value if successful, otherwise -1 function tryParseByteOperand(param, symbols) { @@ -2100,9 +2100,9 @@ function SimulatorWidget(node) { param = lookupVal; } } - + var value; - + // Is it a hexadecimal operand? var match_data = param.match(/^\$([0-9a-f]{1,2})$/i); if (match_data) { @@ -2114,15 +2114,15 @@ function SimulatorWidget(node) { value = parseInt(match_data[1], 10); } } - + // Validate range if (value >= 0 && value <= 0xff) { return value; } else { - return -1; + return -1; } } - + // Try to parse the given parameter as a word operand. // Returns the (positive) value if successful, otherwise -1 function tryParseWordOperand(param, symbols) { @@ -2132,9 +2132,9 @@ function SimulatorWidget(node) { param = lookupVal; } } - + var value; - + // Is it a hexadecimal operand? var match_data = param.match(/^\$([0-9a-f]{3,4})$/i); if (match_data) { @@ -2146,7 +2146,7 @@ function SimulatorWidget(node) { value = parseInt(match_data[1], 10); } } - + // Validate range if (value >= 0 && value <= 0xffff) { return value; @@ -2170,8 +2170,8 @@ function SimulatorWidget(node) { var distance = addr - defaultCodePC - 1; if(distance < -128 || distance > 127) { - wasOutOfRangeBranch = true; - return false; + wasOutOfRangeBranch = true; + return false; } pushByte(distance); @@ -2182,7 +2182,7 @@ function SimulatorWidget(node) { function checkImmediate(param, opcode, symbols) { var value, label, hilo, addr; if (opcode === null) { return false; } - + var match_data = param.match(/^#([\w\$]+)$/i); if (match_data) { var operand = tryParseByteOperand(match_data[1], symbols); @@ -2192,30 +2192,30 @@ function SimulatorWidget(node) { return true; } } - + // Label lo/hi if (param.match(/^#[<>]\w+$/)) { - label = param.replace(/^#[<>](\w+)$/, "$1"); - hilo = param.replace(/^#([<>]).*$/, "$1"); + label = param.replace(/^#[<>](\w+)$/, '$1'); + hilo = param.replace(/^#([<>]).*$/, '$1'); pushByte(opcode); if (labels.find(label)) { addr = labels.getPC(label); switch(hilo) { - case ">": - pushByte((addr >> 8) & 0xff); - return true; - case "<": - pushByte(addr & 0xff); - return true; - default: - return false; + case '>': + pushByte((addr >> 8) & 0xff); + return true; + case '<': + pushByte(addr & 0xff); + return true; + default: + return false; } } else { pushByte(0x00); return true; } } - + return false; } @@ -2223,7 +2223,7 @@ function SimulatorWidget(node) { function checkIndirect(param, opcode, symbols) { var value; if (opcode === null) { return false; } - + var match_data = param.match(/^\(([\w\$]+)\)$/i); if (match_data) { var operand = tryParseWordOperand(match_data[1], symbols); @@ -2240,7 +2240,7 @@ function SimulatorWidget(node) { function checkIndirectX(param, opcode, symbols) { var value; if (opcode === null) { return false; } - + var match_data = param.match(/^\(([\w\$]+),X\)$/i); if (match_data) { var operand = tryParseByteOperand(match_data[1], symbols); @@ -2257,7 +2257,7 @@ function SimulatorWidget(node) { function checkIndirectY(param, opcode, symbols) { var value; if (opcode === null) { return false; } - + var match_data = param.match(/^\(([\w\$]+)\),Y$/i); if (match_data) { var operand = tryParseByteOperand(match_data[1], symbols); @@ -2274,7 +2274,7 @@ function SimulatorWidget(node) { function checkSingle(param, opcode) { if (opcode === null) { return false; } // Accumulator instructions are counted as single-byte opcodes - if (param !== "" && param !== "A") { return false; } + if (param !== '' && param !== 'A') { return false; } pushByte(opcode); return true; } @@ -2290,7 +2290,7 @@ function SimulatorWidget(node) { pushByte(operand); return true; } - + return false; } @@ -2298,7 +2298,7 @@ function SimulatorWidget(node) { function checkAbsoluteX(param, opcode, symbols) { var number, value, addr; if (opcode === null) { return false; } - + var match_data = param.match(/^([\w\$]+),X$/i); if (match_data) { var operand = tryParseWordOperand(match_data[1], symbols); @@ -2311,7 +2311,7 @@ function SimulatorWidget(node) { // it could be a label too.. if (param.match(/^\w+,X$/i)) { - param = param.replace(/,X$/i, ""); + param = param.replace(/,X$/i, ''); pushByte(opcode); if (labels.find(param)) { addr = labels.getPC(param); @@ -2331,7 +2331,7 @@ function SimulatorWidget(node) { function checkAbsoluteY(param, opcode, symbols) { var number, value, addr; if (opcode === null) { return false; } - + var match_data = param.match(/^([\w\$]+),Y$/i); if (match_data) { var operand = tryParseWordOperand(match_data[1], symbols); @@ -2344,7 +2344,7 @@ function SimulatorWidget(node) { // it could be a label too.. if (param.match(/^\w+,Y$/i)) { - param = param.replace(/,Y$/i, ""); + param = param.replace(/,Y$/i, ''); pushByte(opcode); if (labels.find(param)) { addr = labels.getPC(param); @@ -2363,7 +2363,7 @@ function SimulatorWidget(node) { function checkZeroPageX(param, opcode, symbols) { var number, value; if (opcode === null) { return false; } - + var match_data = param.match(/^([\w\$]+),X$/i); if (match_data) { var operand = tryParseByteOperand(match_data[1], symbols); @@ -2373,7 +2373,7 @@ function SimulatorWidget(node) { return true; } } - + return false; } @@ -2381,7 +2381,7 @@ function SimulatorWidget(node) { function checkZeroPageY(param, opcode, symbols) { var number, value; if (opcode === null) { return false; } - + var match_data = param.match(/^([\w\$]+),Y$/i); if (match_data) { var operand = tryParseByteOperand(match_data[1], symbols); @@ -2391,7 +2391,7 @@ function SimulatorWidget(node) { return true; } } - + return false; } @@ -2637,7 +2637,7 @@ function SimulatorWidget(node) { } function num2hex(nr) { - var str = "0123456789abcdef"; + var str = '0123456789abcdef'; var hi = ((nr & 0xf0) >> 4); var lo = (nr & 15); return str.substring(hi, hi + 1) + str.substring(lo, lo + 1); @@ -2645,7 +2645,7 @@ function SimulatorWidget(node) { // Prints text in the message window function message(text) { - if (text.length>1) + if (text.length > 1) text += '\n'; // allow putc operations from the simulator (WDM opcode) $node.find('.messages code').append(text).scrollTop(10000); }