diff --git a/sample/sample.js b/sample/sample.js index 5bd9c00..1098009 100644 --- a/sample/sample.js +++ b/sample/sample.js @@ -20,7 +20,8 @@ let p = new Parser(); let sl = p.parse(prog); let asm = new Assembler(); asm.setTracing(true); -let mem = asm.assemble(sl); +let [mem, labelToAddr] = asm.assemble(sl); +console.log(labelToAddr); // Set up memory access functions for the simulator. function memoryTo(addr, value) { diff --git a/src/assembler.js b/src/assembler.js index 1221eb7..ccb281f 100644 --- a/src/assembler.js +++ b/src/assembler.js @@ -31,7 +31,7 @@ class Assembler { assemble(sourceLines) { this._assembleInstructions(sourceLines); this._applyFixups(); - return this.memory; + return [this.memory, this.labelToAddr]; } // Set tracing mode: true or false; diff --git a/test/test.js b/test/test.js index 50aa294..d5efd4b 100644 --- a/test/test.js +++ b/test/test.js @@ -16,7 +16,7 @@ function runProg(progText, maxSteps) { let p = new Parser(); let asm = new Assembler(); let sourceLines = p.parse(progText); - let mem = asm.assemble(sourceLines); + let [mem, labelToAddr] = asm.assemble(sourceLines); const memoryTo = (addr, value) => {mem[addr] = value;}; const memoryAt = (addr) => {return mem[addr];}; @@ -35,7 +35,7 @@ function runProg(progText, maxSteps) { } } - return [CPU8080.status(), mem]; + return [CPU8080.status(), mem, labelToAddr]; } describe('sim', () => { @@ -121,6 +121,29 @@ describe('sim', () => { assert.equal(state.a, 100); }); + it('labels-to-addr', () => { + // Verifies that labels have been mapped onto addresses as expected. + let [state, mem, labelToAddr] = runProg(` + Start: + mvi a, 50 ; 2 bytes each + mvi b, 20 + mvi c, 100 + jmp Uno ; 3 bytes + Tres: add b ; 1 bytes for add/hlt each + hlt + Uno: jmp Dos + add c + Dos: jmp Tres + add c + `); + assert.ok(state.halted); + + assert.equal(labelToAddr.get('Start'), 0); + assert.equal(labelToAddr.get('Tres'), 9); + assert.equal(labelToAddr.get('Uno'), 11); + assert.equal(labelToAddr.get('Dos'), 15); + }); + it('chainjmp', () => { let [state, mem] = runProg(` mvi a, 50