From f4c53705de677d0071ee97faf5c86a7d6207e14a Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Thu, 16 Jul 2020 08:24:13 -0700 Subject: [PATCH] Add support for the 'dw' directive --- TODO | 2 ++ src/assembler.js | 14 ++++++++++++++ test/test.js | 16 ++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/TODO b/TODO index db28f61..248c87b 100644 --- a/TODO +++ b/TODO @@ -8,3 +8,5 @@ Links: * Online assembler with "live" assmelby: https://svofski.github.io/pretty-8080-assembler/ * Online assembler: https://www.asm80.com/onepage/asm8080.html +* Intel 8080-8085 assembly manual: + https://www.tramm.li/i8080/Intel%208080-8085%20Assembly%20Language%20Programming%201977%20Intel.pdf diff --git a/src/assembler.js b/src/assembler.js index f2a9daf..cfb7bf7 100644 --- a/src/assembler.js +++ b/src/assembler.js @@ -28,6 +28,9 @@ class Assembler { this.tracing = false; } + // Assembles the given source lines. Returns [memory, labelToAddr]. + // memory is the assembled memory array. labelToAddr is a Map object mapping + // labels to addresses in memory. assemble(sourceLines) { this._assembleInstructions(sourceLines); this._applyFixups(); @@ -189,6 +192,17 @@ class Assembler { // Pseudo-instruction that simply assigns its immediate args to memory. return sl.args.map((arg) => {return this._argImm(sl, arg);}); } + case 'dw': { + // Pseudo-instruction that treats immediate args as 2-byte words, and + // assigns them to memory in little-endian. + let enc = []; + for (let arg of sl.args) { + let argEnc = this._argImm(sl, arg); + enc.push(argEnc & 0xFF); + enc.push((argEnc >> 8) & 0xFF); + } + return enc; + } case 'dcr': { this._expectArgsCount(sl, 1); let r = this._argR(sl, sl.args[0]); diff --git a/test/test.js b/test/test.js index ec08d89..c9f7525 100644 --- a/test/test.js +++ b/test/test.js @@ -229,6 +229,22 @@ describe('sim', () => { assert.equal(state.a, 33); }); + it('array-dw', () => { + let [state, mem, labelToAddr] = runProg(` + hlt + + myArray: + dw 2030h, 5060h + `); + + assert.ok(state.halted); + let arrAddr = labelToAddr.get('myArray'); + assert.equal(mem[arrAddr], 0x30); + assert.equal(mem[arrAddr+1], 0x20); + assert.equal(mem[arrAddr+2], 0x60); + assert.equal(mem[arrAddr+3], 0x50); + }); + it('mult', () => { let [state, mem] = runProg(` mvi b, 44