From c99597ee28679db40104e39fdd6bb371fd2da347 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Tue, 8 Jun 2021 12:49:37 -0500 Subject: [PATCH] arm32: new vasm, new editor mode --- index.html | 1 + src/codemirror/vasm.js | 98 +++++++++++++++++++++++++ src/common/cpu/ARM.ts | 113 +++++++++++++++++++---------- src/ide/ui.ts | 2 +- src/ide/views.ts | 1 + src/machine/arm32.ts | 17 +++-- src/platform/arm32.ts | 10 ++- src/worker/wasm/vasmarm_std.js | 28 ++++---- src/worker/wasm/vasmarm_std.wasm | Bin 189860 -> 191549 bytes src/worker/workermain.ts | 119 ++++++++++++++++++++----------- 10 files changed, 282 insertions(+), 107 deletions(-) create mode 100644 src/codemirror/vasm.js diff --git a/index.html b/index.html index 4a5faf6f..5a1eb910 100644 --- a/index.html +++ b/index.html @@ -540,6 +540,7 @@ if (window.location.host.endsWith('8bitworkshop.com')) { + diff --git a/src/codemirror/vasm.js b/src/codemirror/vasm.js new file mode 100644 index 00000000..af9ad68c --- /dev/null +++ b/src/codemirror/vasm.js @@ -0,0 +1,98 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +// vasm DASM syntax + +CodeMirror.defineMode('vasm', function(_config, parserConfig) { + var keywords1, keywords2; + + var directives_list = [ + ]; + var directives = new Map(); + directives_list.forEach(function(s) { directives.set(s, 'keyword'); }); + + var opcodes = /^[a-z]+\b/; + var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i; + + return { + startState: function() { + return { + context: 0 + }; + }, + token: function(stream, state) { + if (!stream.column()) { + state.context = 0; + } + if (stream.eatSpace()) { + if (!state.context) state.context = 1; + return null; + } + + var w; + if (stream.eatWhile(/\w/)) { + w = stream.current(); + var cur = w.toLowerCase(); + var style = directives.get(cur); + if (style) + return style; + if (stream.eat(':')) { + state.context = 1; + return 'tag'; + } + if (state.context == 1 && opcodes.test(w)) { + state.context = 4; + return 'keyword'; + } else if (state.context == 4 && numbers.test(w)) { + return 'number'; + } else if (stream.match(numbers)) { + return 'number'; + } else { + return null; + } + } else if (stream.eat('.')) { + if (stream.eatWhile(/[\w]/)) { + return 'meta'; + } + } else if (stream.eat(';')) { + stream.skipToEnd(); + return 'comment'; + } else if (stream.eat('"')) { + while (w = stream.next()) { + if (w == '"') + break; + + if (w == '\\') + stream.next(); + } + return 'string'; + } else if (stream.eat('\'')) { + if (stream.match(/\\?.'/)) + return 'number'; + } else if (stream.eat('$') || stream.eat('#')) { + if (stream.eatWhile(/[^;]/i)) + return 'number'; + } else if (stream.eat('%')) { + if (stream.eatWhile(/[01]/)) + return 'number'; + } else { + stream.next(); + } + return null; + } + }; +}); + +CodeMirror.defineMIME("text/x-vasm", "vasm"); + +}); diff --git a/src/common/cpu/ARM.ts b/src/common/cpu/ARM.ts index 9221793b..2a42a615 100644 --- a/src/common/cpu/ARM.ts +++ b/src/common/cpu/ARM.ts @@ -101,7 +101,8 @@ export interface ARMCoreState { bankedRegisters: number[][], spsr: number, bankedSPSRs: number[], - cycles: number + cycles: number, + instructionWidth: 2 | 4 } interface ARMCoreType { @@ -122,6 +123,7 @@ interface ARMCoreType { spsr: number; mmu: ARMMMUInterface; irq : ARMIRQInterface; + instructionWidth: 2 | 4; hasSPSR() : boolean; unpackCPSR(v : number) : void; @@ -148,6 +150,33 @@ export enum ARMMode { MODE_SYSTEM = 0x1F } +export enum ARMRegs { + SP = 13, + LR = 14, + PC = 15, +} + +export enum ARMConstants { + + BANK_NONE = 0, + BANK_FIQ = 1, + BANK_IRQ = 2, + BANK_SUPERVISOR = 3, + BANK_ABORT = 4, + BANK_UNDEFINED = 5, + + WORD_SIZE_ARM = 4, + WORD_SIZE_THUMB = 2, + + BASE_RESET = 0x00000000, + BASE_UNDEF = 0x00000004, + BASE_SWI = 0x00000008, + BASE_PABT = 0x0000000C, + BASE_DABT = 0x00000010, + BASE_IRQ = 0x00000018, + BASE_FIQ = 0x0000001C, +} + const UNALLOC_MASK = 0x0FFFFF00; const USER_MASK = 0xF0000000; const PRIV_MASK = 0x000000CF; // This is out of spec, but it seems to be what's done in other implementations @@ -2627,14 +2656,14 @@ function ARMCore() { }; ARMCore.prototype.resetCPU = function(startOffset) { - for (var i = 0; i < this.PC; ++i) { + for (var i = 0; i < ARMRegs.PC; ++i) { this.gprs[i] = 0; } - this.gprs[this.PC] = startOffset + this.WORD_SIZE_ARM; + this.gprs[ARMRegs.PC] = startOffset + ARMConstants.WORD_SIZE_ARM; this.loadInstruction = this.loadInstructionArm; this.execMode = ARMMode.MODE_ARM; - this.instructionWidth = this.WORD_SIZE_ARM; + this.instructionWidth = ARMConstants.WORD_SIZE_ARM; this.mode = ARMMode.MODE_SYSTEM; @@ -2674,21 +2703,21 @@ ARMCore.prototype.resetCPU = function(startOffset) { var mmu = this.mmu as ARMMMUInterface; this.step = function() { - var instruction = this.instruction || (this.instruction = this.loadInstruction(gprs[this.PC] - this.instructionWidth)); - gprs[this.PC] += this.instructionWidth; + var instruction = this.instruction || (this.instruction = this.loadInstruction(gprs[ARMRegs.PC] - this.instructionWidth)); + gprs[ARMRegs.PC] += this.instructionWidth; this.conditionPassed = true; instruction(); if (!instruction.writesPC) { if (this.instruction != null) { // We might have gotten an interrupt from the instruction if (instruction.next == null || instruction.next.page.invalid) { - instruction.next = this.loadInstruction(gprs[this.PC] - this.instructionWidth); + instruction.next = this.loadInstruction(gprs[ARMRegs.PC] - this.instructionWidth); } this.instruction = instruction.next; } } else { if (this.conditionPassed) { - var pc = gprs[this.PC] &= 0xFFFFFFFE; + var pc = gprs[ARMRegs.PC] &= 0xFFFFFFFE; if (this.execMode == ARMMode.MODE_ARM) { mmu.wait32(pc); mmu.waitPrefetch32(pc); @@ -2696,12 +2725,12 @@ ARMCore.prototype.resetCPU = function(startOffset) { mmu.wait(pc); mmu.waitPrefetch(pc); } - gprs[this.PC] += this.instructionWidth; + gprs[ARMRegs.PC] += this.instructionWidth; if (!instruction.fixedJump) { this.instruction = null; } else if (this.instruction != null) { if (instruction.next == null || instruction.next.page.invalid) { - instruction.next = this.loadInstruction(gprs[this.PC] - this.instructionWidth); + instruction.next = this.loadInstruction(gprs[ARMRegs.PC] - this.instructionWidth); } this.instruction = instruction.next; } @@ -2787,7 +2816,8 @@ ARMCore.prototype.freeze = function() : ARMCoreState { this.bankedSPSRs[4], this.bankedSPSRs[5] ], - 'cycles': this.cycles + 'cycles': this.cycles, + 'instructionWidth': this.instructionWidth, }; }; @@ -2860,6 +2890,10 @@ ARMCore.prototype.defrost = function(frost: ARMCoreState) { this.bankedSPSRs[5] = frost.bankedSPSRs[5]; this.cycles = frost.cycles; + + this.instructionWidth = frost.instructionWidth; + this.loadInstruction = frost.instructionWidth == 2 ? this.loadInstructionThumb : this.loadInstructionArm; + this.execMode = frost.instructionWidth == 2 ? ARMMode.MODE_THUMB : ARMMode.MODE_ARM; }; ARMCore.prototype.fetchPage = function(address : number) { @@ -2921,17 +2955,17 @@ ARMCore.prototype.selectBank = function(mode : ARMMode) { case ARMMode.MODE_USER: case ARMMode.MODE_SYSTEM: // No banked registers - return this.BANK_NONE; + return ARMConstants.BANK_NONE; case ARMMode.MODE_FIQ: - return this.BANK_FIQ; + return ARMConstants.BANK_FIQ; case ARMMode.MODE_IRQ: - return this.BANK_IRQ; + return ARMConstants.BANK_IRQ; case ARMMode.MODE_SUPERVISOR: - return this.BANK_SUPERVISOR; + return ARMConstants.BANK_SUPERVISOR; case ARMMode.MODE_ABORT: - return this.BANK_ABORT; + return ARMConstants.BANK_ABORT; case ARMMode.MODE_UNDEFINED: - return this.BANK_UNDEFINED; + return ARMConstants.BANK_UNDEFINED; default: throw new EmuHalt("Invalid user mode passed to selectBank"); } @@ -2941,10 +2975,10 @@ ARMCore.prototype.switchExecMode = function(newMode) { if (this.execMode != newMode) { this.execMode = newMode; if (newMode == ARMMode.MODE_ARM) { - this.instructionWidth = this.WORD_SIZE_ARM; + this.instructionWidth = ARMConstants.WORD_SIZE_ARM; this.loadInstruction = this.loadInstructionArm; } else { - this.instructionWidth = this.WORD_SIZE_THUMB; + this.instructionWidth = ARMConstants.WORD_SIZE_THUMB; this.loadInstruction = this.loadInstructionThumb; } } @@ -2963,8 +2997,8 @@ ARMCore.prototype.switchMode = function(newMode) { if (newBank != oldBank) { // TODO: support FIQ if (newMode == ARMMode.MODE_FIQ || this.mode == ARMMode.MODE_FIQ) { - var oldFiqBank = (oldBank == this.BANK_FIQ) ? 1 : 0; - var newFiqBank = (newBank == this.BANK_FIQ) ? 1 : 0; + var oldFiqBank = (oldBank == ARMConstants.BANK_FIQ) ? 1 : 0; + var newFiqBank = (newBank == ARMConstants.BANK_FIQ) ? 1 : 0; this.bankedRegisters[oldFiqBank][2] = this.gprs[8]; this.bankedRegisters[oldFiqBank][3] = this.gprs[9]; this.bankedRegisters[oldFiqBank][4] = this.gprs[10]; @@ -2976,10 +3010,10 @@ ARMCore.prototype.switchMode = function(newMode) { this.gprs[11] = this.bankedRegisters[newFiqBank][5]; this.gprs[12] = this.bankedRegisters[newFiqBank][6]; } - this.bankedRegisters[oldBank][0] = this.gprs[this.SP]; - this.bankedRegisters[oldBank][1] = this.gprs[this.LR]; - this.gprs[this.SP] = this.bankedRegisters[newBank][0]; - this.gprs[this.LR] = this.bankedRegisters[newBank][1]; + this.bankedRegisters[oldBank][0] = this.gprs[ARMRegs.SP]; + this.bankedRegisters[oldBank][1] = this.gprs[ARMRegs.LR]; + this.gprs[ARMRegs.SP] = this.bankedRegisters[newBank][0]; + this.gprs[ARMRegs.LR] = this.bankedRegisters[newBank][1]; this.bankedSPSRs[oldBank] = this.spsr; this.spsr = this.bankedSPSRs[newBank]; @@ -3018,8 +3052,8 @@ ARMCore.prototype.raiseIRQ = function() { var instructionWidth = this.instructionWidth; this.switchMode(ARMMode.MODE_IRQ); this.spsr = cpsr; - this.gprs[this.LR] = this.gprs[this.PC] - instructionWidth + 4; - this.gprs[this.PC] = this.BASE_IRQ + this.WORD_SIZE_ARM; + this.gprs[ARMRegs.LR] = this.gprs[ARMRegs.PC] - instructionWidth + 4; + this.gprs[ARMRegs.PC] = this.BASE_IRQ + ARMConstants.WORD_SIZE_ARM; this.instruction = null; this.switchExecMode(ARMMode.MODE_ARM); this.cpsrI = true; @@ -3030,8 +3064,8 @@ ARMCore.prototype.raiseTrap = function() { var instructionWidth = this.instructionWidth; this.switchMode(ARMMode.MODE_SUPERVISOR); this.spsr = cpsr; - this.gprs[this.LR] = this.gprs[this.PC] - instructionWidth; - this.gprs[this.PC] = this.BASE_SWI + this.WORD_SIZE_ARM; + this.gprs[ARMRegs.LR] = this.gprs[ARMRegs.PC] - instructionWidth; + this.gprs[ARMRegs.PC] = this.BASE_SWI + ARMConstants.WORD_SIZE_ARM; this.instruction = null; this.switchExecMode(ARMMode.MODE_ARM); this.cpsrI = true; @@ -3213,7 +3247,7 @@ ARMCore.prototype.compileArm = function(instruction) { // MRS var rd = (instruction & 0x0000F000) >> 12; op = this.armCompiler.constructMRS(rd, r, condOp); - op.writesPC = rd == this.PC; + op.writesPC = rd == ARMRegs.PC; } } else { // Data processing/FSR transfer @@ -3374,7 +3408,7 @@ ARMCore.prototype.compileArm = function(instruction) { } break; } - op.writesPC = rd == this.PC; + op.writesPC = rd == ARMRegs.PC; } } else if ((instruction & 0x0FB00FF0) == 0x01000090) { // Single data swap @@ -3386,7 +3420,7 @@ ARMCore.prototype.compileArm = function(instruction) { } else { op = this.armCompiler.constructSWP(rd, rn, rm, condOp); } - op.writesPC = rd == this.PC; + op.writesPC = rd == ARMRegs.PC; } else { switch (i) { case 0x00000000: @@ -3446,7 +3480,7 @@ ARMCore.prototype.compileArm = function(instruction) { op = this.armCompiler.constructSMLALS(rd, rn, rs, rm, condOp); break; } - op.writesPC = rd == this.PC; + op.writesPC = rd == ARMRegs.PC; } else { // Halfword and signed byte data transfer var load = instruction & 0x00100000; @@ -3465,7 +3499,7 @@ ARMCore.prototype.compileArm = function(instruction) { } else { address = this.armCompiler.constructAddressingMode23Register(instruction, rm, condOp); } - address.writesPC = !!w && rn == this.PC; + address.writesPC = !!w && rn == ARMRegs.PC; if ((instruction & 0x00000090) == 0x00000090) { if (load) { @@ -3489,7 +3523,7 @@ ARMCore.prototype.compileArm = function(instruction) { op = this.armCompiler.constructSTRH(rd, address, condOp); } } - op.writesPC = rd == this.PC || address.writesPC; + op.writesPC = rd == ARMRegs.PC || address.writesPC; } break; case 0x04000000: @@ -3541,7 +3575,7 @@ ARMCore.prototype.compileArm = function(instruction) { op = this.armCompiler.constructSTR(rd, address, condOp); } } - op.writesPC = rd == this.PC || address.writesPC; + op.writesPC = rd == ARMRegs.PC || address.writesPC; break; case 0x08000000: // Block data transfer @@ -3733,7 +3767,7 @@ ARMCore.prototype.compileThumb = function(instruction) { case 0x0000: // ADD(4) op = this.thumbCompiler.constructADD4(rd, rm) - op.writesPC = rd == this.PC; + op.writesPC = rd == ARMRegs.PC; break; case 0x0100: // CMP(3) @@ -3743,7 +3777,7 @@ ARMCore.prototype.compileThumb = function(instruction) { case 0x0200: // MOV(3) op = this.thumbCompiler.constructMOV3(rd, rm); - op.writesPC = rd == this.PC; + op.writesPC = rd == ARMRegs.PC; break; case 0x0300: // BX @@ -4198,4 +4232,7 @@ export class ARM32CPU implements CPU, InstructionBased, ARMMMUInterface, ARMIRQI } updateTimers() : void { } + isThumb() : boolean { + return this.core.instructionWidth == 2; + } } diff --git a/src/ide/ui.ts b/src/ide/ui.ts index bb88bd3d..8e0bb0db 100644 --- a/src/ide/ui.ts +++ b/src/ide/ui.ts @@ -84,7 +84,7 @@ var TOOL_TO_SOURCE_STYLE = { 'basic': 'basic', 'silice': 'verilog', 'wiz': 'text/x-wiz', - 'vasmarm': '6502' + 'vasmarm': 'vasm' } function gaEvent(category:string, action:string, label?:string, value?:string) { diff --git a/src/ide/views.ts b/src/ide/views.ts index d172a817..04737284 100644 --- a/src/ide/views.ts +++ b/src/ide/views.ts @@ -71,6 +71,7 @@ const MODEDEFS = { z80: { isAsm: true }, jsasm: { isAsm: true }, gas: { isAsm: true }, + vasm: { isAsm: true }, inform6: { theme: 'cobalt' }, markdown: { lineWrap: true }, fastbasic: { noGutters: true }, diff --git a/src/machine/arm32.ts b/src/machine/arm32.ts index 648b9f45..d415d539 100644 --- a/src/machine/arm32.ts +++ b/src/machine/arm32.ts @@ -89,12 +89,12 @@ export class ARM32Machine extends BasicScanlineMachine implements Debuggable { getDebugInfo?(category: string, state: EmuState) : string { var s = ''; var c = state.c as ARMCoreState; - for (var i=0; i<13; i++) { - s += lpad('r'+i, 3) + ' ' + hex(c.gprs[i],8) + '\n'; + const EXEC_MODE = {2:'Thumb',4:'ARM'}; + const REGNAMES = {15:'PC',14:'LR',13:'SP',12:'IP',11:'FP',9:'SB'}; + for (var i=0; i<16; i++) { + s += lpad(REGNAMES[i]||'',3) + lpad('r'+i, 5) + ' ' + hex(c.gprs[i],8) + '\n'; } - s += ' SP ' + hex(c.SP,8) + '\n'; - s += ' LR ' + hex(c.gprs[14],8) + '\n'; - s += ' PC ' + hex(c.PC,8) + '\n'; + s += 'Flags '; s += c.cpsrN ? " N" : " -"; s += c.cpsrV ? " V" : " -"; s += c.cpsrF ? " F" : " -"; @@ -102,10 +102,9 @@ export class ARM32Machine extends BasicScanlineMachine implements Debuggable { s += c.cpsrC ? " C" : " -"; s += c.cpsrI ? " I" : " -"; s += '\n'; - s += 'MODE ' + MODE_NAMES[c.mode]; - s += '\n'; - s += 'cycl ' + c.cycles; - s += '\n'; + s += 'MODE ' + EXEC_MODE[c.instructionWidth] + ' ' + MODE_NAMES[c.mode] + '\n'; + s += 'SPSR ' + hex(c.spsr,8) + '\n'; + s += 'cycl ' + c.cycles + '\n'; return s; } } diff --git a/src/platform/arm32.ts b/src/platform/arm32.ts index 351c0b17..68557e19 100644 --- a/src/platform/arm32.ts +++ b/src/platform/arm32.ts @@ -231,13 +231,15 @@ export abstract class BaseARMMachinePlatform extends BaseMach class ARM32Platform extends BaseARMMachinePlatform implements Platform { - capstone : any; + capstone_arm : any; + capstone_thumb : any; async start() { super.start(); console.log("Loading Capstone"); await loadScript('./lib/capstone-arm.min.js'); - this.capstone = new cs.Capstone(cs.ARCH_ARM, cs.MODE_ARM); + this.capstone_arm = new cs.Capstone(cs.ARCH_ARM, cs.MODE_ARM); + this.capstone_thumb = new cs.Capstone(cs.ARCH_ARM, cs.MODE_THUMB); } newMachine() { return new ARM32Machine(); } @@ -250,11 +252,13 @@ class ARM32Platform extends BaseARMMachinePlatform implements Plat {name:'Video RAM',start:0x40000000,size:0x20000,type:'ram'}, ] } }; disassemble(pc:number, read:(addr:number)=>number) : DisasmLine { + var is_thumb = this.machine.cpu.isThumb(); + var capstone = is_thumb ? this.capstone_thumb : this.capstone_arm; var buf = []; for (var i=0; i<4; i++) { buf[i] = read(pc+i); } - var insns = this.capstone.disasm(buf, pc, 4); + var insns = capstone.disasm(buf, pc, 4); var i0 = insns && insns[0]; if (i0) { return { diff --git a/src/worker/wasm/vasmarm_std.js b/src/worker/wasm/vasmarm_std.js index 8fa72141..3a77d013 100644 --- a/src/worker/wasm/vasmarm_std.js +++ b/src/worker/wasm/vasmarm_std.js @@ -750,8 +750,8 @@ var wasmMemory; // so this creates a (non-native-wasm) table for us. var wasmTable = new WebAssembly.Table({ - 'initial': 109, - 'maximum': 109, + 'initial': 111, + 'maximum': 111, 'element': 'anyfunc' }); @@ -1372,11 +1372,11 @@ function updateGlobalBufferAndViews(buf) { } var STATIC_BASE = 1024, - STACK_BASE = 5270320, + STACK_BASE = 5270912, STACKTOP = STACK_BASE, - STACK_MAX = 27440, - DYNAMIC_BASE = 5270320, - DYNAMICTOP_PTR = 27280; + STACK_MAX = 28032, + DYNAMIC_BASE = 5270912, + DYNAMICTOP_PTR = 27872; assert(STACK_BASE % 16 === 0, 'stack must start aligned'); assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned'); @@ -1940,7 +1940,7 @@ var ASM_CONSTS = { -// STATICTOP = STATIC_BASE + 26416; +// STATICTOP = STATIC_BASE + 27008; /* global initializers */ __ATINIT__.push({ func: function() { ___wasm_call_ctors() } }); @@ -4678,7 +4678,7 @@ var ASM_CONSTS = { } function _emscripten_get_sbrk_ptr() { - return 27280; + return 27872; } function _emscripten_memcpy_big(dest, src, num) { @@ -4871,6 +4871,12 @@ var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); /** @type {function(...*):?} */ var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); +/** @type {function(...*):?} */ +var dynCall_iii = Module["dynCall_iii"] = createExportWrapper("dynCall_iii"); + +/** @type {function(...*):?} */ +var dynCall_vii = Module["dynCall_vii"] = createExportWrapper("dynCall_vii"); + /** @type {function(...*):?} */ var dynCall_vi = Module["dynCall_vi"] = createExportWrapper("dynCall_vi"); @@ -4889,18 +4895,12 @@ var dynCall_vijjiii = Module["dynCall_vijjiii"] = createExportWrapper("dynCall_v /** @type {function(...*):?} */ var dynCall_vjjjj = Module["dynCall_vjjjj"] = createExportWrapper("dynCall_vjjjj"); -/** @type {function(...*):?} */ -var dynCall_iii = Module["dynCall_iii"] = createExportWrapper("dynCall_iii"); - /** @type {function(...*):?} */ var dynCall_iiii = Module["dynCall_iiii"] = createExportWrapper("dynCall_iiii"); /** @type {function(...*):?} */ var dynCall_iidiiii = Module["dynCall_iidiiii"] = createExportWrapper("dynCall_iidiiii"); -/** @type {function(...*):?} */ -var dynCall_vii = Module["dynCall_vii"] = createExportWrapper("dynCall_vii"); - /** @type {function(...*):?} */ var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji"); diff --git a/src/worker/wasm/vasmarm_std.wasm b/src/worker/wasm/vasmarm_std.wasm index ae4771a2738ef8a2cb3eaca00152a2fb3b0a2f0e..ac010d6f2ffde7e5c5b2c9335722959a93dcfdd8 100644 GIT binary patch delta 69424 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 z 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 M{Q)PDm+0#M8}6(p8~^|S delta 67722 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/; var errors : WorkerError[] = []; + var undefsyms = []; + function findUndefinedSymbols(line:string) { + // find undefined symbols in line + undefsyms.forEach((sym) => { + if (line.indexOf(sym) >= 0) { + console.log(sym,line); + errors.push({ + path:curpath, + line:curline, + msg:"Undefined symbol: " + sym, + }) + } + }); + } function match_fn(s) { - var matches = re_err1.exec(s); + let matches = re_err1.exec(s); if (matches) { errors.push({ line:parseInt(matches[3]), - path:matches[2], + path:matches[4], msg:matches[5], }); + console.log(matches); } else { matches = re_err2.exec(s); if (matches) { - errors.push({ - line:0, - msg:s, - }); + let m = re_undefsym.exec(matches[3]); + if (m) { + undefsyms.push(m[1]); + } else { + errors.push({ + line:0, + msg:s, + }); + } } else { console.log(s); } @@ -2937,7 +2958,7 @@ function assembleVASMARM(step:BuildStep) { var lstpath = step.prefix+".lst"; if (staleFiles(step, [objpath])) { - var args = [ '-Fbin', '-x', '-wfail', step.path, '-o', objpath, '-L', lstpath ]; + var args = [ '-Fbin', '-m7tdmi', '-x', '-wfail', step.path, '-o', objpath, '-L', lstpath ]; var vasm = emglobal.vasm({ instantiateWasm: moduleInstFn('vasmarm_std'), noInitialRun:true, @@ -2952,60 +2973,74 @@ function assembleVASMARM(step:BuildStep) { return {errors:errors}; } - var objout = FS.readFile(objpath, {encoding:'binary'}); - putWorkFile(objpath, objout); - if (!anyTargetChanged(step, [objpath])) - return; + if (undefsyms.length == 0) { + var objout = FS.readFile(objpath, {encoding:'binary'}); + putWorkFile(objpath, objout); + if (!anyTargetChanged(step, [objpath])) + return; + } var lstout = FS.readFile(lstpath, {encoding:'utf8'}); - //console.log(lstout); - // F00:0001 mov r0, #0x884400 ; RGB value - // S01:00000000: 11 0B A0 E3 22 07 80 E3 - // S01 .text - // F00 vidfill.vasm - // LOOP LAB (0x10) sec=.text + // 00:00000018 023020E0 14: eor r3, r0, r2 + // Source: "vidfill.vasm" + // 00: ".text" (0-40) + // LOOP 00:00000018 + // STACK S:20010000 var symbolmap = {}; - var segments = []; + var segments = []; // TODO var listings : CodeListingMap = {}; // TODO: parse listings - var re_lstline = /^F(\d+):(\d+)\s+(.+)/; - var re_secline = /^\s+S(\d+):([0-9A-F]+):\s*([0-9A-F ]+)/; - var re_nameline = /^([SF])(\d+)\s+(.+)/; - var files = {}; + var re_asmline = /^(\d+):([0-9A-F]+)\s+([0-9A-F ]+)\s+(\d+)([:M])/; + var re_secline = /^(\d+):\s+"(.+)"/; + var re_nameline = /^Source:\s+"(.+)"/; + var re_symline = /^(\w+)\s+(\d+):([0-9A-F]+)/; + var re_emptyline = /^\s+(\d+)([:M])/; + var curpath = step.path; + var curline = 0; var sections = {}; // map file and section indices -> names - var lines = lstout.split(re_crlf); - for (var line of lines) { - var m; - if (m = re_nameline.exec(line)) { - if (m[1] == 'F') { - files[m[2]] = m[3]; - } else { - sections[m[2]] = m[3]; - } - } - } - //console.log(files, sections); + var lines : string[] = lstout.split(re_crlf); // parse lines var lstlines : SourceLine[] = []; - var linenum = 0; for (var line of lines) { var m; - if (m = re_lstline.exec(line)) { - linenum = parseInt(m[2]); - } else if (m = re_secline.exec(line)) { + if (m = re_secline.exec(line)) { + sections[m[1]] = m[2]; + } else if (m = re_nameline.exec(line)) { + curpath = m[1]; + } else if (m = re_symline.exec(line)) { + symbolmap[m[1]] = parseInt(m[3], 16); + } else if (m = re_asmline.exec(line)) { + if (m[5] == ':') { + curline = parseInt(m[4]); + } else { + // TODO: macro line + } lstlines.push({ - line: linenum, + path: curpath, + line: curline, offset: parseInt(m[2], 16), - path: step.path, insns: m[3].replaceAll(' ','') }); + findUndefinedSymbols(line); + } else if (m = re_emptyline.exec(line)) { + curline = parseInt(m[1]); + findUndefinedSymbols(line); + } else { + //console.log(line); } } - listings[lstpath] = {lines:lstlines}; + listings[lstpath] = {lines:lstlines, text:lstout}; + // catch-all if no error generated + if (undefsyms.length && errors.length == 0) { + errors.push({ + line: 0, + msg: 'Undefined symbols: ' + undefsyms.join(', ') + }) + } return { - output:objout, //.slice(0), + output:objout, //.slice(0x34), listings:listings, errors:errors, symbolmap:symbolmap,