"use strict"; // TODO: not quite done function assembleACME(code) { load("acme"); // stderr var re_err2 = /(Error|Warning) - File (.+?), line (\d+) ([^:]+) (.*)/; var errors = []; var errline = 0; function match_fn(s) { var matches = re_err2.exec(s); if (matches) { errors.push({ line:1, // TODO: parseInt(matches[3]), msg:matches[0] // TODO: matches[5] }); } } var Module = ACME({ noInitialRun:true, print:match_fn, printErr:match_fn }); var FS = Module['FS']; FS.writeFile("main.a", code); // TODO: --msvc Module.callMain(["-o", "a.out", "-r", "a.rpt", "-l", "a.sym", "--setpc", "24576", "main.a"]); if (errors.length) { return {errors:errors}; } var aout = FS.readFile("a.out"); var alst = FS.readFile("a.rpt", {'encoding':'utf8'}); var asym = FS.readFile("a.sym", {'encoding':'utf8'}); var listing = parseDASMListing(alst, {}); // TODO return { output:aout, lines:listing.lines, errors:listing.errors, intermediate:{listing:alst, symbols:asym}, }; } function assembleZ80ASM(step) { load("z80asm"); var Module = z80asm({ noInitialRun:true, //logReadFiles:true, print:print_fn, printErr:function() {}, TOTAL_MEMORY:256*1024*1024, }); var FS = Module['FS']; //setupFS(FS); // changes for dialect populateFiles(step, FS, { mainFilePath:"main.asm", transform:function(code) { code = code.replace(".optsdcc -mz80",""); code = code.replace(/^(\w+)\s*=/gim,"DEFC $1 ="); code = code.replace(/\tXREF /gi,"\tEXTERN "); code = code.replace(/\tXDEF /gi,"\tPUBLIC "); return code; } }); try { execMain(step, Module, ["-b", "-s", "-l", "-m", "-g", "--origin=" + origin.toString(16), step.path]); try { var aerr = FS.readFile(step.prefix+".err", {'encoding':'utf8'}); // TODO if (aerr.length) { return {errors:extractErrors(/.+? line (\d+): (.+)/, aerr.split("\n"))}; } // Warning at file 'test.asm' line 9: 'XREF' is deprecated, use 'EXTERN' instead } catch (e) { } /* 77 0000 ;test.c:5: return 0; 78 0000 21 00 00 ld hl,$0000 */ var alst = FS.readFile(step.prefix+".lst", {'encoding':'utf8'}); // TODO /* _main = 0000, G: test l_main00101 = 0003, L: test */ var amap = FS.readFile(step.prefix+".map", {'encoding':'utf8'}); // TODO var aout = FS.readFile(step.prefix+".bin", {'encoding':'binary'}); var asmlines = parseListing(alst, /^(\d+)\s+([0-9A-F]+)\s+([0-9A-F][0-9A-F ]*[0-9A-F])\s+/i, 1, 2, 3); var srclines = parseListing(alst, /^(\d+)\s+([0-9A-F]+)\s+;[(]null[)]:(\d+)/i, 3, 2, 1); // TODO; multiple listing files return { output:aout, errors:[], lines:asmlines, srclines:srclines, intermediate:{listing:alst, mapfile:amap}, }; } catch (e) { throw (e); } } function compileCASPR(code, platform, options) { loadNative("caspr"); var errors = []; var match_fn = makeErrorMatcher(errors, /(ERROR|FATAL) - (.+)/, 2, 2); var caspr_mod = caspr({ wasmBinary:wasmBlob['caspr'], noInitialRun:true, print:print_fn, printErr:match_fn, }); var FS = caspr_mod['FS']; FS.writeFile("main.asm", code); var arch = code.match(/^[.]arch\s+(\w+)/m); var deps = [{prefix:'verilog',filename:arch[1]+'.cfg'}]; // TODO: parse file for ".arch femto8" writeDependencies(deps, FS, errors); starttime(); caspr_mod.callMain(["main.asm"]); endtime("compile"); var miffile = FS.readFile("main.mif", {encoding:'utf8'}); // TODO return { errors:errors, output:parseMIF(miffile), intermediate:{listing:miffile}, lines:[]}; } function parseMIF(s) { var lines = s.split('\n'); var words = []; for (var i=0; i