From 44271fe9b87ce54aaad4543eb2fe3c6cacd2e6c5 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Mon, 13 Nov 2023 12:17:54 -0600 Subject: [PATCH] added acme assembler vcslib: increased # of lines in kernel --- presets/c64/basicheader.acme | 7 +++ presets/c64/skeleton.acme | 18 +++++++ presets/vcs/vcslib/vcslib.h | 4 +- src/common/baseplatform.ts | 4 +- src/ide/project.ts | 5 ++ src/ide/ui.ts | 4 ++ src/platform/vcs.ts | 1 + src/worker/tools/acme.ts | 96 +++++++++++++++++++++++++++++++++++ src/worker/wasm/acme.js | 21 ++++++++ src/worker/wasm/acme.wasm | Bin 0 -> 100249 bytes src/worker/workermain.ts | 7 ++- test/cli/testworker.js | 3 ++ 12 files changed, 166 insertions(+), 4 deletions(-) create mode 100644 presets/c64/basicheader.acme create mode 100644 presets/c64/skeleton.acme create mode 100644 src/worker/tools/acme.ts create mode 100644 src/worker/wasm/acme.js create mode 100755 src/worker/wasm/acme.wasm diff --git a/presets/c64/basicheader.acme b/presets/c64/basicheader.acme new file mode 100644 index 00000000..fe98792f --- /dev/null +++ b/presets/c64/basicheader.acme @@ -0,0 +1,7 @@ + +* = $0801 +!word Start +!byte $00,$00,$9e +!text "2066" +!byte $00,$00,$00 +* = $0812 diff --git a/presets/c64/skeleton.acme b/presets/c64/skeleton.acme new file mode 100644 index 00000000..b9878ebe --- /dev/null +++ b/presets/c64/skeleton.acme @@ -0,0 +1,18 @@ + +!src "basicheader.acme" + +Start: + jsr $e544 ; clear screen + ldy #0 +Loop: + lda Message,y ; load message byte + beq EOM ; 0 = end of string + sta $400+41,y ; store to screen + iny + bne Loop ; next character +EOM: + jmp EOM ; infinite loop + +Message: +!scr "hello world!", 0 + diff --git a/presets/vcs/vcslib/vcslib.h b/presets/vcs/vcslib/vcslib.h index 297f06fe..8eda2b31 100644 --- a/presets/vcs/vcslib/vcslib.h +++ b/presets/vcs/vcslib/vcslib.h @@ -161,8 +161,8 @@ extern void tinyfont48_build(byte* dest, const char str[12]); #define OVERSCAN_TIM64 _TIM64(_CYCLES(36)) #else #define VBLANK_TIM64 _TIM64(_CYCLES(37)) -#define KERNAL_TIM64 _TIM64(_CYCLES(194)) -#define OVERSCAN_TIM64 _TIM64(_CYCLES(32)) +#define KERNAL_TIM64 _TIM64(_CYCLES(198)) +#define OVERSCAN_TIM64 _TIM64(_CYCLES(28)) #endif #define JOY_UP(plyr) (!(RIOT.swcha & ((plyr) ? 0x1 : ~MOVE_UP))) diff --git a/src/common/baseplatform.ts b/src/common/baseplatform.ts index af8e232d..3c26174e 100644 --- a/src/common/baseplatform.ts +++ b/src/common/baseplatform.ts @@ -888,7 +888,9 @@ export abstract class BaseMachinePlatform extends BaseDebugPl const {x,y} = this.machine.getRasterCanvasPosition(); if (x >= 0 || y >= 0) { const ctx = this.video.getContext(); - drawCrosshair(ctx, x, y, 1); + if (ctx) { + drawCrosshair(ctx, x, y, 1); + } } } } diff --git a/src/ide/project.ts b/src/ide/project.ts index c79b5c45..ccb6587e 100644 --- a/src/ide/project.ts +++ b/src/ide/project.ts @@ -217,6 +217,11 @@ export class CodeProject { while (m = re6.exec(text)) { this.pushAllFiles(files, m[2]); } + // for acme + let re7 = /^[!]src\s+"(.+?)"/gmi; + while (m = re7.exec(text)) { + this.pushAllFiles(files, m[1]); + } } return files; } diff --git a/src/ide/ui.ts b/src/ide/ui.ts index e0b65275..6711cedd 100644 --- a/src/ide/ui.ts +++ b/src/ide/ui.ts @@ -129,6 +129,7 @@ const TOOL_TO_SOURCE_STYLE = { 'remote:llvm-mos': 'text/x-csrc', } +// TODO: move into tool class const TOOL_TO_HELPURL = { 'dasm': 'https://raw.githubusercontent.com/sehugg/dasm/master/doc/dasm.txt', 'cc65': 'https://cc65.github.io/doc/cc65.html', @@ -142,6 +143,7 @@ const TOOL_TO_HELPURL = { 'zmac': "https://raw.githubusercontent.com/sehugg/zmac/master/doc.txt", 'cmoc': "http://perso.b2b2c.ca/~sarrazip/dev/cmoc.html", 'remote:llvm-mos': 'https://llvm-mos.org/wiki/Welcome', + 'acme': 'https://raw.githubusercontent.com/sehugg/acme/main/docs/QuickRef.txt', } function gaEvent(category:string, action:string, label?:string, value?:string) { @@ -1895,6 +1897,8 @@ function _addIncludeFile() { addFileToProject("Include", ".wiz", (s) => { return 'import "'+s+'";' }); else if (tool == 'ecs') addFileToProject("Include", ".ecs", (s) => { return 'import "'+s+'"' }); + else if (tool == 'acme') + addFileToProject("Include", ".acme", (s) => { return '!src "'+s+'"' }); else alertError("Can't add include file to this project type (" + tool + ")"); } diff --git a/src/platform/vcs.ts b/src/platform/vcs.ts index e0851faa..bbe2c7af 100644 --- a/src/platform/vcs.ts +++ b/src/platform/vcs.ts @@ -62,6 +62,7 @@ function getToolForFilename_vcs(fn: string) { if (fn.endsWith(".wiz")) return "wiz"; if (fn.endsWith(".bb") || fn.endsWith(".bas")) return "bataribasic"; if (fn.endsWith(".ca65")) return "ca65"; + if (fn.endsWith(".acme")) return "acme"; //if (fn.endsWith(".inc")) return "ca65"; if (fn.endsWith(".c")) return "cc65"; //if (fn.endsWith(".h")) return "cc65"; diff --git a/src/worker/tools/acme.ts b/src/worker/tools/acme.ts new file mode 100644 index 00000000..65197301 --- /dev/null +++ b/src/worker/tools/acme.ts @@ -0,0 +1,96 @@ +import { CodeListing, CodeListingMap } from "../../common/workertypes"; +import { BuildStep, BuildStepResult, emglobal, execMain, fixParamsWithDefines, gatherFiles, loadNative, makeErrorMatcher, moduleInstFn, msvcErrorMatcher, populateFiles, print_fn, putWorkFile, setupFS, staleFiles } from "../workermain"; +import { EmscriptenModule } from "../workermain" + +function parseACMESymbolTable(text: string) { + var symbolmap = {}; + var lines = text.split("\n"); + for (var i = 0; i < lines.length; ++i) { + var line = lines[i].trim(); + // init_text = $81b ; ? + var m = line.match(/(\w+)\s*=\s*[$]([0-9a-f]+)/i); + if (m) { + symbolmap[m[1]] = parseInt(m[2], 16); + } + } + return symbolmap; +} + +function parseACMEReportFile(text: string) { + var listings : CodeListingMap = {}; + var listing : CodeListing; + var lines = text.split("\n"); + for (var i = 0; i < lines.length; ++i) { + var line = lines[i].trim(); + // ; ******** Source: hello.acme + var m1 = line.match(/^;\s*[*]+\s*Source: (.+)$/); + if (m1) { + var file = m1[1]; + listings[file] = listing = { + lines: [], + }; + continue; + } + // 15 0815 201b08 jsr init_text ; write line of text + var m2 = line.match(/^(\d+)\s+([0-9a-f]+)\s+([0-9a-f]+)/i); + if (m2) { + if (listing) { + listing.lines.push({ + line: parseInt(m2[1]), + offset: parseInt(m2[2], 16), + insns: m2[3], + }); + } + } + } + return listings; +} + +export function assembleACME(step: BuildStep): BuildStepResult { + loadNative("acme"); + var errors = []; + gatherFiles(step, { mainFilePath: "main.acme" }); + var binpath = step.prefix + ".bin"; + var lstpath = step.prefix + ".lst"; + var sympath = step.prefix + ".sym"; + if (staleFiles(step, [binpath, lstpath])) { + var binout, lstout, symout; + var ACME: EmscriptenModule = emglobal.acme({ + instantiateWasm: moduleInstFn('acme'), + noInitialRun: true, + print: print_fn, + printErr: msvcErrorMatcher(errors), + //printErr: makeErrorMatcher(errors, /(Error|Warning) - File (.+?), line (\d+)[^:]+: (.+)/, 3, 4, step.path, 2), + }); + var FS = ACME.FS; + populateFiles(step, FS); + fixParamsWithDefines(step.path, step.params); + var args = ['--msvc', '--initmem', '0', '-o', binpath, '-r', lstpath, '-l', sympath, step.path]; + if (step.params?.acmeargs) { + args.unshift.apply(args, step.params.acmeargs); + } else { + args.unshift.apply(args, ['-f', 'plain']); + } + args.unshift.apply(args, ["-D__8BITWORKSHOP__=1"]); + if (step.mainfile) { + args.unshift.apply(args, ["-D__MAIN__=1"]); + } + execMain(step, ACME, args); + if (errors.length) { + let listings: CodeListingMap = {}; + return { errors, listings }; + } + binout = FS.readFile(binpath, { encoding: 'binary' }); + lstout = FS.readFile(lstpath, { encoding: 'utf8' }); + symout = FS.readFile(sympath, { encoding: 'utf8' }); + putWorkFile(binpath, binout); + putWorkFile(lstpath, lstout); + putWorkFile(sympath, symout); + return { + output: binout, + listings: parseACMEReportFile(lstout), + errors: errors, + symbolmap: parseACMESymbolTable(symout), + }; + } +} diff --git a/src/worker/wasm/acme.js b/src/worker/wasm/acme.js new file mode 100644 index 00000000..5b1d463c --- /dev/null +++ b/src/worker/wasm/acme.js @@ -0,0 +1,21 @@ + +var acme = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(acme = {}) { + +var Module=typeof acme!="undefined"?acme:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[Emscripten Module object]"}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="acme.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinary(binaryFile))}else{if(readAsync){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),reject)})}}}return Promise.resolve().then(()=>getBinary(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>{return WebAssembly.instantiate(binary,imports)}).then(instance=>{return instance}).then(receiver,reason=>{err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}else{return instantiateArrayBuffer(binaryFile,imports,callback)}}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["m"];updateMemoryViews();wasmTable=Module["asm"]["p"];addOnInit(Module["asm"]["n"]);removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function initRandomFill(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")}function randomFill(view){return(randomFill=initRandomFill())(view)}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)}var preloadPlugins=Module["preloadPlugins"]||[];function FS_handledByPreloadPlugin(byteArray,fullname,finish,onerror){if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled}function FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}}function FS_modeStringToFlags(str){var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}function FS_getMode(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size},write:function(stream,buffer,offset,length,position){throw new FS.ErrnoError(29)},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(28)}return position}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"WORKERFS":WORKERFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function stringToAscii(str,buffer){for(var i=0;i>0]=str.charCodeAt(i)}HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _proc_exit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;_proc_exit(status)}var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function stringToUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;var wasmImports={"d":___syscall_fcntl64,"h":___syscall_ioctl,"i":___syscall_openat,"l":_emscripten_memcpy_big,"k":_emscripten_resize_heap,"e":_environ_get,"f":_environ_sizes_get,"a":_exit,"b":_fd_close,"g":_fd_read,"j":_fd_seek,"c":_fd_write};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module["asm"]["n"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["o"]).apply(null,arguments)};var _malloc=function(){return(_malloc=Module["asm"]["malloc"]).apply(null,arguments)};var _free=function(){return(_free=Module["asm"]["free"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module["asm"]["q"]).apply(null,arguments)};var stackAlloc=function(){return(stackAlloc=Module["asm"]["r"]).apply(null,arguments)};Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;Module["callMain"]=callMain;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS"]=FS;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach(arg=>{HEAP32[argv_ptr++]=stringToUTF8OnStack(arg)});HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); + + + return acme;//.ready +} + +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = acme; +else if (typeof define === 'function' && define['amd']) + define([], function() { return acme; }); +else if (typeof exports === 'object') + exports["acme"] = acme; diff --git a/src/worker/wasm/acme.wasm b/src/worker/wasm/acme.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b4c6bbffc5ab46422e5343d6a3d985b762bc2952 GIT binary patch literal 100249 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 foXK=RpyYHEL;xdYOn)&f4yV_!M)|v3e&a&% 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 MN60s}nL9%M1-{ICNB{r; literal 0 HcmV?d00001 diff --git a/src/worker/workermain.ts b/src/worker/workermain.ts index 60c0b6b2..54835fe1 100644 --- a/src/worker/workermain.ts +++ b/src/worker/workermain.ts @@ -252,12 +252,14 @@ var PLATFORM_PARAMS = { libargs: [ '--lib-path', '/share/target/apple2/drv', '-D', '__EXEHDR__=0', 'apple2.lib'], __CODE_RUN__: 16384, code_start: 0x803, + acmeargs: ['-f', 'apple'], }, 'apple2-e': { arch: '6502', define: ['__APPLE2__'], cfgfile: 'apple2.cfg', libargs: ['apple2.lib'], + acmeargs: ['-f', 'apple'], }, 'atari8-800xl.disk': { arch: '6502', @@ -327,6 +329,7 @@ var PLATFORM_PARAMS = { define: ['__CBM__', '__C64__'], cfgfile: 'c64.cfg', // SYS 2061 libargs: ['c64.lib'], + acmeargs: ['-f', 'cbm'], //extra_link_files: ['c64-cart.cfg'], }, 'vic20': { @@ -334,6 +337,7 @@ var PLATFORM_PARAMS = { define: ['__CBM__', '__VIC20__'], cfgfile: 'vic20.cfg', libargs: ['vic20.lib'], + acmeargs: ['-f', 'cbm'], //extra_link_files: ['c64-cart.cfg'], }, 'kim1': { @@ -1135,10 +1139,11 @@ import * as x86 from './tools/x86' import * as arm from './tools/arm' import * as ecs from './tools/ecs' import * as remote from './tools/remote' +import * as acme from './tools/acme' var TOOLS = { 'dasm': dasm.assembleDASM, - //'acme': assembleACME, + 'acme': acme.assembleACME, 'cc65': cc65.compileCC65, 'ca65': cc65.assembleCA65, 'ld65': cc65.linkLD65, diff --git a/test/cli/testworker.js b/test/cli/testworker.js index a558a134..cb7500f5 100644 --- a/test/cli/testworker.js +++ b/test/cli/testworker.js @@ -265,6 +265,9 @@ describe('Worker', function() { compile('cc65', '#define CC65_FLAGS -Or,-g,-j\nint main() {\nint x=1;\nreturn x+2;\n}', 'apple2', done, 416, 3); }); /* + it('should compile ACME', function(done) { + compile('acme', 'nop', 'c64', done, 416, 3); + }); it('should compile CMOC', function(done) { compile('cmoc', 'int foo=0; // comment\n#if defined(__8BITWORKSHOP__) && defined(__MAIN__)\nint main(int argc) {\nint x=1;\nint y=2+argc;\nreturn x+y+argc;\n}\n#endif\n', 'williams', done, 8192, 3, 0, {filename:'test.c'}); });