mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2025-01-11 08:30:02 +00:00
dasm: started testing wasi
dasm:
This commit is contained in:
parent
2e0382b0a6
commit
bd63ef1268
@ -485,7 +485,8 @@ export class WASIRunner {
|
|||||||
}
|
}
|
||||||
fd_seek(fd: number, offset: number, whence: number, newoffset_ptr: number) {
|
fd_seek(fd: number, offset: number, whence: number, newoffset_ptr: number) {
|
||||||
const file = this.fds[fd];
|
const file = this.fds[fd];
|
||||||
debug("fd_seek", fd, offset, whence, file);
|
if (typeof offset == 'bigint') offset = Number(offset);
|
||||||
|
debug("fd_seek", fd, offset, whence, file+"");
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
file.llseek(offset, whence);
|
file.llseek(offset, whence);
|
||||||
this.poke64(newoffset_ptr, file.offset);
|
this.poke64(newoffset_ptr, file.offset);
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
|
import { WASIRunner } from "../../common/wasi/wasishim";
|
||||||
import { CodeListingMap, WorkerError } from "../../common/workertypes";
|
import { CodeListingMap, WorkerError } from "../../common/workertypes";
|
||||||
import { BuildStep, BuildStepResult, populateFiles, putWorkFile, anyTargetChanged } from "../builder";
|
import { BuildStep, BuildStepResult, populateFiles, putWorkFile, anyTargetChanged, store } from "../builder";
|
||||||
import { msvcErrorMatcher, re_crlf, re_msvc } from "../listingutils";
|
import { msvcErrorMatcher, re_crlf, re_msvc } from "../listingutils";
|
||||||
import { execMain, emglobal, EmscriptenModule, load } from "../wasmutils";
|
import { execMain, emglobal, EmscriptenModule, load, loadWASMBinary } from "../wasmutils";
|
||||||
|
|
||||||
function parseDASMListing(lstpath: string, lsttext: string, listings: CodeListingMap, errors: WorkerError[], unresolved: {}) {
|
function parseDASMListing(lstpath: string, lsttext: string, listings: CodeListingMap, errors: WorkerError[], unresolved: {}) {
|
||||||
// TODO: this gets very slow
|
// TODO: this gets very slow
|
||||||
@ -119,9 +120,21 @@ function parseDASMListing(lstpath: string, lsttext: string, listings: CodeListin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var re_usl = /(\w+)\s+0000\s+[?][?][?][?]/;
|
||||||
|
|
||||||
|
function parseSymbolMap(asym: string) {
|
||||||
|
var symbolmap = {};
|
||||||
|
for (var s of asym.split("\n")) {
|
||||||
|
var toks = s.split(/\s+/);
|
||||||
|
if (toks && toks.length >= 2 && !toks[0].startsWith('-')) {
|
||||||
|
symbolmap[toks[0]] = parseInt(toks[1], 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return symbolmap;
|
||||||
|
}
|
||||||
|
|
||||||
export function assembleDASM(step: BuildStep): BuildStepResult {
|
export function assembleDASM(step: BuildStep): BuildStepResult {
|
||||||
load("dasm");
|
load("dasm");
|
||||||
var re_usl = /(\w+)\s+0000\s+[?][?][?][?]/;
|
|
||||||
var unresolved = {};
|
var unresolved = {};
|
||||||
var errors = [];
|
var errors = [];
|
||||||
var errorMatcher = msvcErrorMatcher(errors);
|
var errorMatcher = msvcErrorMatcher(errors);
|
||||||
@ -188,13 +201,7 @@ export function assembleDASM(step: BuildStep): BuildStepResult {
|
|||||||
// TODO: what if listing or symbols change?
|
// TODO: what if listing or symbols change?
|
||||||
if (!anyTargetChanged(step, [binpath/*, lstpath, sympath*/]))
|
if (!anyTargetChanged(step, [binpath/*, lstpath, sympath*/]))
|
||||||
return;
|
return;
|
||||||
var symbolmap = {};
|
const symbolmap = parseSymbolMap(asym);
|
||||||
for (var s of asym.split("\n")) {
|
|
||||||
var toks = s.split(/\s+/);
|
|
||||||
if (toks && toks.length >= 2 && !toks[0].startsWith('-')) {
|
|
||||||
symbolmap[toks[0]] = parseInt(toks[1], 16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for bataribasic (TODO)
|
// for bataribasic (TODO)
|
||||||
if (step['bblines']) {
|
if (step['bblines']) {
|
||||||
let lst = listings[step.path];
|
let lst = listings[step.path];
|
||||||
@ -212,4 +219,55 @@ export function assembleDASM(step: BuildStep): BuildStepResult {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let wasiModule: WebAssembly.Module | null = null;
|
||||||
|
|
||||||
|
export function assembleDASM2(step: BuildStep): BuildStepResult {
|
||||||
|
const errors = [];
|
||||||
|
if (!wasiModule) {
|
||||||
|
wasiModule = new WebAssembly.Module(loadWASMBinary("dasm-wasisdk"));
|
||||||
|
}
|
||||||
|
const binpath = 'a.out';
|
||||||
|
const lstpath = step.prefix + '.lst';
|
||||||
|
const sympath = step.prefix + '.sym';
|
||||||
|
const wasi = new WASIRunner();
|
||||||
|
wasi.initSync(wasiModule);
|
||||||
|
for (let file of step.files) {
|
||||||
|
wasi.fs.putFile("./" + file, store.getFileData(file));
|
||||||
|
}
|
||||||
|
wasi.addPreopenDirectory(".");
|
||||||
|
wasi.setArgs(['dasm', step.path, '-f3', "-l" + lstpath, "-s" + sympath]);
|
||||||
|
try {
|
||||||
|
wasi.run();
|
||||||
|
} catch (e) {
|
||||||
|
errors.push(e);
|
||||||
|
}
|
||||||
|
const stdout = wasi.fds[1].getBytesAsString();
|
||||||
|
//const stderr = wasi.fds[2].getBytesAsString();
|
||||||
|
const matcher = msvcErrorMatcher(errors);
|
||||||
|
const unresolved = {};
|
||||||
|
for (let line of stdout.split("\n")) {
|
||||||
|
matcher(line);
|
||||||
|
let m = re_usl.exec(line);
|
||||||
|
if (m) {
|
||||||
|
unresolved[m[1]] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const alst = wasi.fs.getFile("./" + lstpath).getBytesAsString();
|
||||||
|
const listings: CodeListingMap = {};
|
||||||
|
for (let path of step.files) {
|
||||||
|
listings[path] = { lines: [] };
|
||||||
|
}
|
||||||
|
parseDASMListing(lstpath, alst, listings, errors, unresolved);
|
||||||
|
if (errors.length) {
|
||||||
|
return { errors: errors };
|
||||||
|
}
|
||||||
|
const asym = wasi.fs.getFile("./" + sympath).getBytesAsString();
|
||||||
|
const symbolmap = parseSymbolMap(asym);
|
||||||
|
const output = wasi.fs.getFile("./" + binpath).getBytes();
|
||||||
|
return {
|
||||||
|
output,
|
||||||
|
errors,
|
||||||
|
listings,
|
||||||
|
symbolmap
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user