mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-09-06 23:54:30 +00:00
220 lines
9.1 KiB
JavaScript
220 lines
9.1 KiB
JavaScript
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.compileWiz = exports.compileBASIC = exports.compileInform6 = exports.translateShowdown = void 0;
|
|
const workermain_1 = require("../workermain");
|
|
const basic_compiler = __importStar(require("../../common/basic/compiler"));
|
|
const util_1 = require("../../common/util");
|
|
function translateShowdown(step) {
|
|
(0, workermain_1.setupRequireFunction)();
|
|
(0, workermain_1.load)("showdown.min");
|
|
var showdown = workermain_1.emglobal['showdown'];
|
|
var converter = new showdown.Converter({
|
|
tables: 'true',
|
|
smoothLivePreview: 'true',
|
|
requireSpaceBeforeHeadingText: 'true',
|
|
emoji: 'true',
|
|
});
|
|
var code = (0, workermain_1.getWorkFileAsString)(step.path);
|
|
var html = converter.makeHtml(code);
|
|
delete workermain_1.emglobal['require'];
|
|
return {
|
|
output: html
|
|
};
|
|
}
|
|
exports.translateShowdown = translateShowdown;
|
|
function compileInform6(step) {
|
|
(0, workermain_1.loadNative)("inform");
|
|
var errors = [];
|
|
(0, workermain_1.gatherFiles)(step, { mainFilePath: "main.inf" });
|
|
var objpath = step.prefix + ".z5";
|
|
if ((0, workermain_1.staleFiles)(step, [objpath])) {
|
|
var errorMatcher = (0, workermain_1.msvcErrorMatcher)(errors);
|
|
var lstout = "";
|
|
var match_fn = (s) => {
|
|
if (s.indexOf("Error:") >= 0) {
|
|
errorMatcher(s);
|
|
}
|
|
else {
|
|
lstout += s;
|
|
lstout += "\n";
|
|
}
|
|
};
|
|
// TODO: step.path must end in '.inf' or error
|
|
var args = ['-afjnops', '-v5', '-Cu', '-E1', '-k', '+/share/lib', step.path];
|
|
var inform = workermain_1.emglobal.inform({
|
|
instantiateWasm: (0, workermain_1.moduleInstFn)('inform'),
|
|
noInitialRun: true,
|
|
//logReadFiles:true,
|
|
print: match_fn,
|
|
printErr: match_fn,
|
|
});
|
|
var FS = inform.FS;
|
|
(0, workermain_1.setupFS)(FS, 'inform');
|
|
(0, workermain_1.populateFiles)(step, FS);
|
|
//fixParamsWithDefines(step.path, step.params);
|
|
(0, workermain_1.execMain)(step, inform, args);
|
|
if (errors.length)
|
|
return { errors: errors };
|
|
var objout = FS.readFile(objpath, { encoding: 'binary' });
|
|
(0, workermain_1.putWorkFile)(objpath, objout);
|
|
if (!(0, workermain_1.anyTargetChanged)(step, [objpath]))
|
|
return;
|
|
// parse debug XML
|
|
var symbolmap = {};
|
|
var segments = [];
|
|
var entitymap = {
|
|
// number -> string
|
|
'object': {}, 'property': {}, 'attribute': {}, 'constant': {}, 'global-variable': {}, 'routine': {},
|
|
};
|
|
var dbgout = FS.readFile("gameinfo.dbg", { encoding: 'utf8' });
|
|
var xmlroot = (0, util_1.parseXMLPoorly)(dbgout);
|
|
//console.log(xmlroot);
|
|
var segtype = "ram";
|
|
xmlroot.children.forEach((node) => {
|
|
switch (node.type) {
|
|
case 'global-variable':
|
|
case 'routine':
|
|
var ident = node.children.find((c, v) => c.type == 'identifier').text;
|
|
var address = parseInt(node.children.find((c, v) => c.type == 'address').text);
|
|
symbolmap[ident] = address;
|
|
entitymap[node.type][address] = ident;
|
|
break;
|
|
case 'object':
|
|
case 'property':
|
|
case 'attribute':
|
|
var ident = node.children.find((c, v) => c.type == 'identifier').text;
|
|
var value = parseInt(node.children.find((c, v) => c.type == 'value').text);
|
|
//entitymap[node.type][ident] = value;
|
|
entitymap[node.type][value] = ident;
|
|
//symbolmap[ident] = address | 0x1000000;
|
|
break;
|
|
case 'story-file-section':
|
|
var name = node.children.find((c, v) => c.type == 'type').text;
|
|
var address = parseInt(node.children.find((c, v) => c.type == 'address').text);
|
|
var endAddress = parseInt(node.children.find((c, v) => c.type == 'end-address').text);
|
|
if (name == "grammar table")
|
|
segtype = "rom";
|
|
segments.push({ name: name, start: address, size: endAddress - address, type: segtype });
|
|
}
|
|
});
|
|
// parse listing
|
|
var listings = {};
|
|
// 35 +00015 <*> call_vs long_19 location long_424 -> sp
|
|
var lines = (0, workermain_1.parseListing)(lstout, /\s*(\d+)\s+[+]([0-9a-f]+)\s+([<*>]*)\s*(\w+)\s+(.+)/i, -1, 2, 4);
|
|
var lstpath = step.prefix + '.lst';
|
|
listings[lstpath] = { lines: [], asmlines: lines, text: lstout };
|
|
return {
|
|
output: objout,
|
|
listings: listings,
|
|
errors: errors,
|
|
symbolmap: symbolmap,
|
|
segments: segments,
|
|
debuginfo: entitymap,
|
|
};
|
|
}
|
|
}
|
|
exports.compileInform6 = compileInform6;
|
|
function compileBASIC(step) {
|
|
var jsonpath = step.path + ".json";
|
|
(0, workermain_1.gatherFiles)(step);
|
|
if ((0, workermain_1.staleFiles)(step, [jsonpath])) {
|
|
var parser = new basic_compiler.BASICParser();
|
|
var code = (0, workermain_1.getWorkFileAsString)(step.path);
|
|
try {
|
|
var ast = parser.parseFile(code, step.path);
|
|
}
|
|
catch (e) {
|
|
console.log(e);
|
|
if (parser.errors.length == 0)
|
|
throw e;
|
|
}
|
|
if (parser.errors.length) {
|
|
return { errors: parser.errors };
|
|
}
|
|
// put AST into JSON (sans source locations) to see if it has changed
|
|
var json = JSON.stringify(ast, (key, value) => { return (key == '$loc' ? undefined : value); });
|
|
(0, workermain_1.putWorkFile)(jsonpath, json);
|
|
if ((0, workermain_1.anyTargetChanged)(step, [jsonpath]))
|
|
return {
|
|
output: ast,
|
|
listings: parser.getListings(),
|
|
};
|
|
}
|
|
}
|
|
exports.compileBASIC = compileBASIC;
|
|
function compileWiz(step) {
|
|
(0, workermain_1.loadNative)("wiz");
|
|
var params = step.params;
|
|
(0, workermain_1.gatherFiles)(step, { mainFilePath: "main.wiz" });
|
|
var destpath = step.prefix + (params.wiz_rom_ext || ".bin");
|
|
var errors = [];
|
|
if ((0, workermain_1.staleFiles)(step, [destpath])) {
|
|
var wiz = workermain_1.emglobal.wiz({
|
|
instantiateWasm: (0, workermain_1.moduleInstFn)('wiz'),
|
|
noInitialRun: true,
|
|
print: workermain_1.print_fn,
|
|
//test.wiz:2: error: expected statement, but got identifier `test`
|
|
printErr: (0, workermain_1.makeErrorMatcher)(errors, /(.+?):(\d+):\s*(.+)/, 2, 3, step.path, 1),
|
|
});
|
|
var FS = wiz.FS;
|
|
(0, workermain_1.setupFS)(FS, 'wiz');
|
|
(0, workermain_1.populateFiles)(step, FS);
|
|
(0, workermain_1.populateExtraFiles)(step, FS, params.extra_compile_files);
|
|
const FWDIR = '/share/common';
|
|
var args = [
|
|
'-o', destpath,
|
|
'-I', FWDIR + '/' + (params.wiz_inc_dir || (0, util_1.getRootBasePlatform)(step.platform)),
|
|
'-s', 'wla',
|
|
'--color=none',
|
|
step.path
|
|
];
|
|
args.push('--system', params.wiz_sys_type || params.arch);
|
|
(0, workermain_1.execMain)(step, wiz, args);
|
|
if (errors.length)
|
|
return { errors: errors };
|
|
var binout = FS.readFile(destpath, { encoding: 'binary' });
|
|
(0, workermain_1.putWorkFile)(destpath, binout);
|
|
var dbgout = FS.readFile(step.prefix + '.sym', { encoding: 'utf8' });
|
|
var symbolmap = {};
|
|
for (var s of dbgout.split("\n")) {
|
|
var toks = s.split(/ /);
|
|
// 00:4008 header.basic_start
|
|
if (toks && toks.length >= 2) {
|
|
var tokrange = toks[0].split(':');
|
|
var start = parseInt(tokrange[1], 16);
|
|
var sym = toks[1];
|
|
symbolmap[sym] = start;
|
|
}
|
|
}
|
|
return {
|
|
output: binout,
|
|
errors: errors,
|
|
symbolmap: symbolmap,
|
|
};
|
|
}
|
|
}
|
|
exports.compileWiz = compileWiz;
|
|
//# sourceMappingURL=misc.js.map
|