From 8b2b512b28778feabd048a9d828e2117e41e4cbe Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Thu, 15 Aug 2019 21:25:08 -0400 Subject: [PATCH] nes: added nesasm3 --- .gitignore | 1 + doc/notes.txt | 1 + presets/nes/skeleton.ca65 | 99 +++++++++++++++++++++++++++++++++++ presets/nes/skeleton.nesasm | 63 ++++++++++++++++++++++ src/platform/nes.ts | 4 +- src/ui.ts | 1 + src/worker/wasm/nesasm.js | 21 ++++++++ src/worker/wasm/nesasm.wasm | Bin 0 -> 109191 bytes src/worker/workermain.ts | 101 +++++++++++++++++++++++++++++++++++- 9 files changed, 288 insertions(+), 3 deletions(-) create mode 100644 presets/nes/skeleton.ca65 create mode 100644 presets/nes/skeleton.nesasm create mode 100644 src/worker/wasm/nesasm.js create mode 100644 src/worker/wasm/nesasm.wasm diff --git a/.gitignore b/.gitignore index 41850320..12d7c394 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ local release gen test/output +.DS_Store diff --git a/doc/notes.txt b/doc/notes.txt index 4ae1329b..06f006a4 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -128,6 +128,7 @@ TODO: - show cur/tmp vram addresses - NES crt should mark raster pos when debugging - OAMDMA in profiler? (haltCycles) + - ca65 skeleton - JSNES - doesn't support hiding >8 sprites - doesn't do sprite zero test right diff --git a/presets/nes/skeleton.ca65 b/presets/nes/skeleton.ca65 new file mode 100644 index 00000000..0b542cc3 --- /dev/null +++ b/presets/nes/skeleton.ca65 @@ -0,0 +1,99 @@ + +;#define LIBARGS , + +; +; iNES header +; + +.segment "HEADER" + +INES_MAPPER = 0 ; 0 = NROM +INES_MIRROR = 1 ; 0 = horizontal mirroring, 1 = vertical mirroring +INES_SRAM = 0 ; 1 = battery backed SRAM at $6000-7FFF + +.byte 'N', 'E', 'S', $1A ; ID +.byte $02 ; 16k PRG chunk count +.byte $01 ; 8k CHR chunk count +.byte INES_MIRROR | (INES_SRAM << 1) | ((INES_MAPPER & $f) << 4) +.byte (INES_MAPPER & %11110000) +.byte $0, $0, $0, $0, $0, $0, $0, $0 ; padding + +;;;;; START OF CODE + +.segment "CODE" +Start: + sei ; mask interrupts + lda #0 + sta $2000 ; disable NMI + sta $2001 ; disable rendering + sta $4015 ; disable APU sound + sta $4010 ; disable DMC IRQ + lda #$40 + sta $4017 ; disable APU IRQ + cld ; disable decimal mode + ldx #$FF + txs ; initialize stack + ; wait for first vblank + bit $2002 + : + bit $2002 + bpl :- + ; clear all RAM to 0 + lda #0 + ldx #0 + : + sta $0000, X + sta $0100, X + sta $0200, X + sta $0300, X + sta $0400, X + sta $0500, X + sta $0600, X + sta $0700, X + inx + bne :- + ; place all sprites offscreen at Y=255 + lda #255 + ldx #0 + : + sta $200, X + inx + inx + inx + inx + bne :- + ; wait for second vblank + : + bit $2002 + bpl :- + ; NES is initialized, ready to begin! + ; enable the NMI for graphical updates, and jump to our main program + lda #%10001000 + sta $2000 +Endless: + jmp Endless ; endless loop + +;;;;; INTERRUPT HANDLERS + +NMIHandler: + rti + +;;;;; CPU VECTORS + +.segment "VECTORS" + +.word NMIHandler +.word Start +.word NMIHandler + +; +; CHR ROM +; +.segment "CHARS" +.incbin "jroatch.chr" + +; +; .etc +; +.segment "STARTUP" +.segment "SAMPLES" diff --git a/presets/nes/skeleton.nesasm b/presets/nes/skeleton.nesasm new file mode 100644 index 00000000..1275ed55 --- /dev/null +++ b/presets/nes/skeleton.nesasm @@ -0,0 +1,63 @@ + + .inesprg 1 ; 1x 16KB PRG code + .ineschr 1 ; 1x 8KB CHR data + .inesmap 0 ; mapper 0 = NROM, no bank swapping + .inesmir 1 ; background mirroring + +;;;;;;;;;;;;;;; + + .bank 0 + .org $C000 +RESET: + SEI ; disable IRQs + CLD ; disable decimal mode + LDX #$40 + STX $4017 ; disable APU frame IRQ + LDX #$FF + TXS ; Set up stack + INX ; now X = 0 + STX $2000 ; disable NMI + STX $2001 ; disable rendering + STX $4010 ; disable DMC IRQs + +vblankwait1: ; First wait for vblank to make sure PPU is ready + BIT $2002 + BPL vblankwait1 + +clrmem: + LDA #$00 + STA $0000, x + STA $0100, x + STA $0400, x + STA $0500, x + STA $0600, x + STA $0700, x + LDA #$FE + STA $0300, x + INX + BNE clrmem + +vblankwait2: ; Second wait for vblank, PPU is ready after this + BIT $2002 + BPL vblankwait2 + +Foreverloop: + JMP Foreverloop ;jump back to Forever, infinite loop + +IRQ: +NMI: + RTI + +;;;;;;;;;;;;;; + + .bank 1 + .org $FFFA + .dw NMI + .dw RESET + .dw IRQ + +;;;;;;;;;;;;;; + + .bank 2 + .org $0000 + .incbin "jroatch.chr" ;include CHR ROM diff --git a/src/platform/nes.ts b/src/platform/nes.ts index b0516872..4d27d4a1 100644 --- a/src/platform/nes.ts +++ b/src/platform/nes.ts @@ -385,8 +385,8 @@ class JSNESPlatform extends Base6502Platform implements Platform { } getToolForFilename = (fn:string) : string => { //if (fn.endsWith(".asm")) return "ca65"; // .asm uses ca65 - //else - return getToolForFilename_6502(fn); + if (fn.endsWith(".nesasm")) return "nesasm"; + else return getToolForFilename_6502(fn); } } diff --git a/src/ui.ts b/src/ui.ts index a6262d96..ef55fb85 100644 --- a/src/ui.ts +++ b/src/ui.ts @@ -64,6 +64,7 @@ var TOOL_TO_SOURCE_STYLE = { 'acme': '6502', 'cc65': 'text/x-csrc', 'ca65': '6502', + 'nesasm': '6502', 'z80asm': 'z80', 'sdasz80': 'z80', 'sdcc': 'text/x-csrc', diff --git a/src/worker/wasm/nesasm.js b/src/worker/wasm/nesasm.js new file mode 100644 index 00000000..f996968d --- /dev/null +++ b/src/worker/wasm/nesasm.js @@ -0,0 +1,21 @@ + +var nesasm = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + return ( +function(nesasm) { + nesasm = nesasm || {}; + +var Module=typeof nesasm!=="undefined"?nesasm:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=function(status,toThrow){throw toThrow};Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_HAS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_HAS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_NODE=ENVIRONMENT_HAS_NODE&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;read_=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);Module["quit"]=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=function(status){quit(status)}}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;if(end>_emscripten_get_heap_size()){abort()}HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":function(x,y){return x%y},"debugger":function(){debugger}};var jsCallStartIndex=1;var functionPointers=new Array(0);function convertJsFunctionToWasm(func,sig){var typeSection=[1,0,1,96];var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={"i":127,"j":126,"f":125,"d":124};typeSection.push(sigParam.length);for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i=endIdx))++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,outU8Array,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;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var WASM_PAGE_SIZE=65536;var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STACK_BASE=2192560,DYNAMIC_BASE=7435440,DYNAMICTOP_PTR=2192528;var TOTAL_STACK=5242880;var INITIAL_TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(INITIAL_TOTAL_MEMORY>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;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();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}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 addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var wasmBinaryFile="nesasm.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(env){var info={"env":env,"global":{"NaN":NaN,Infinity:Infinity},"global.Math":Math,"asm2wasm":asm2wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){return WebAssembly.instantiateStreaming(response,info).then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}Module["asm"]=function(global,env,providedBuffer){env["memory"]=wasmMemory;env["table"]=wasmTable=new WebAssembly.Table({"initial":90,"maximum":90,"element":"anyfunc"});env["__memory_base"]=1024;env["__table_base"]=0;var exports=createWasm(env);return exports};var tempDouble;var tempI64;__ATINIT__.push({func:function(){___emscripten_environ_constructor()}});var tempDoublePtr=2192544;var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["LANG"]=(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}function ___lock(){}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(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:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(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:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}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.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(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;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)}},flush: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)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};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(1)}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}return node},getFileDataAsRegularArray:function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length=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+lengthe2.timestamp){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=function(e){done(this.error);e.preventDefault()};transaction.oncomplete=function(e){if(!errored){callback(null)}};create.sort().forEach(function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};var NODEFS={isWindows:false,staticInit:function(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"]}},bufferFrom:function(arrayBuffer){return Buffer.alloc?Buffer.from(arrayBuffer):new Buffer(arrayBuffer)},mount:function(mount){assert(ENVIRONMENT_HAS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode:function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(22)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode:function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}return stat.mode},realPath:function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)},flagsForNode:function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(22)}},node_ops:{getattr:function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr:function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},lookup:function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod:function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}return node},rename:function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},unlink:function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},rmdir:function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},readdir:function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},symlink:function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},readlink:function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}}},stream_ops:{open:function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},close:function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(-e.errno)}},read:function(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(-e.errno)}},write:function(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(-e.errno)}},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(-e.errno)}}}if(position<0){throw new FS.ErrnoError(22)}return position}}};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(5)},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(22)}return position}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)},lookupPath:function(path,opts){path=PATH_FS.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(40)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(40)}}}}return{path:current_path,node:current}},getPath:function(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:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(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:function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,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:function(parent,name,mode,rdev){if(!FS.FSNode){FS.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};FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.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)}}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 13}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 13}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 13}return 0},mayLookup:function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return 13;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 17}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return 20}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 16}}else{if(FS.isDir(node.mode)){return 21}}return 0},mayOpen:function(node,flags){if(!node){return 2}if(FS.isLink(node.mode)){return 40}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 21}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=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(24)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};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}}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(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:function(){throw new FS.ErrnoError(29)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(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:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("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(err){FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(16)}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(16)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(20)}}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:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(22)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(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(22)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(1)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.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=function(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);if(typeof Uint8Array!="undefined")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||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(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;console.log("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(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}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>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>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;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-22}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-22;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-22}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-13}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:0,get:function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(){var ret=UTF8ToString(SYSCALLS.get());return ret},getStreamFromFD:function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(9);return stream},get64:function(){var low=SYSCALLS.get(),high=SYSCALLS.get();return low},getZero:function(){SYSCALLS.get()}};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-75}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[result>>2]=tempI64[0],HEAP32[result+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-22}var newStream;newStream=FS.open(stream.path,stream.flags,0,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 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-22;case 9:___setErrNo(22);return-1;default:{return-22}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21509:case 21505:{if(!stream.tty)return-25;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-25;return 0}case 21519:{if(!stream.tty)return-25;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-25;return-22}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-25;return 0}case 21524:{if(!stream.tty)return-25;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___unlock(){}function _emscripten_get_heap_size(){return HEAP8.length}function _exit(status){exit(status)}function _getenv(name){if(name===0)return 0;name=UTF8ToString(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){abortOnCannotGrowMemory(requestedSize)}function _system(command){___setErrNo(11);return-1}FS.staticInit();Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;if(ENVIRONMENT_HAS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}var ASSERTIONS=false;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 asmGlobalArg={};var asmLibraryArg={"abort":abort,"setTempRet0":setTempRet0,"getTempRet0":getTempRet0,"___buildEnvironment":___buildEnvironment,"___lock":___lock,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall145":___syscall145,"___syscall146":___syscall146,"___syscall221":___syscall221,"___syscall5":___syscall5,"___syscall54":___syscall54,"___syscall6":___syscall6,"___unlock":___unlock,"_emscripten_get_heap_size":_emscripten_get_heap_size,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_resize_heap":_emscripten_resize_heap,"_exit":_exit,"_getenv":_getenv,"_system":_system,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"tempDoublePtr":tempDoublePtr,"DYNAMICTOP_PTR":DYNAMICTOP_PTR};var asm=Module["asm"](asmGlobalArg,asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return Module["asm"]["___errno_location"].apply(null,arguments)};var __get_environ=Module["__get_environ"]=function(){return Module["asm"]["__get_environ"].apply(null,arguments)};var _free=Module["_free"]=function(){return Module["asm"]["_free"].apply(null,arguments)};var _main=Module["_main"]=function(){return Module["asm"]["_main"].apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return Module["asm"]["_malloc"].apply(null,arguments)};var _memcpy=Module["_memcpy"]=function(){return Module["asm"]["_memcpy"].apply(null,arguments)};var _memset=Module["_memset"]=function(){return Module["asm"]["_memset"].apply(null,arguments)};var _sbrk=Module["_sbrk"]=function(){return Module["asm"]["_sbrk"].apply(null,arguments)};var establishStackSpace=Module["establishStackSpace"]=function(){return Module["asm"]["establishStackSpace"].apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return Module["asm"]["stackAlloc"].apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return Module["asm"]["stackRestore"].apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return Module["asm"]["stackSave"].apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return Module["asm"]["dynCall_iidiiii"].apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return Module["asm"]["dynCall_jiji"].apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)};Module["asm"]=asm;Module["getMemory"]=getMemory;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS"]=FS;Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;Module["then"]=function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=function(){if(old)old();func(Module)}}return Module};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=function callMain(args){args=args||[];var argc=args.length+1;var argv=stackAlloc((argc+1)*4);HEAP32[argv>>2]=allocateUTF8OnStack(Module["thisProgram"]);for(var i=1;i>2)+i]=allocateUTF8OnStack(args[i-1])}HEAP32[(argv>>2)+argc]=0;try{var ret=Module["_main"](argc,argv);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}err("exception thrown: "+toLog);Module["quit"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;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}Module["noExitRuntime"]=true;run(); + + + return nesasm +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = nesasm; + else if (typeof define === 'function' && define['amd']) + define([], function() { return nesasm; }); + else if (typeof exports === 'object') + exports["nesasm"] = nesasm; + \ No newline at end of file diff --git a/src/worker/wasm/nesasm.wasm b/src/worker/wasm/nesasm.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d996db41c3ea22a6d0ed5180871d5d41221f8860 GIT binary patch literal 109191 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 literal 0 HcmV?d00001 diff --git a/src/worker/workermain.ts b/src/worker/workermain.ts index 1c263248..214680ab 100644 --- a/src/worker/workermain.ts +++ b/src/worker/workermain.ts @@ -1995,12 +1995,110 @@ function assembleXASM6809(step:BuildStep) { }; } +// http://www.nespowerpak.com/nesasm/ +function assembleNESASM(step:BuildStep) { + loadNative("nesasm"); + var re_filename = /[#](\d+)\s+(\S+)/; + var re_insn = /\s+(\d+)\s+([0-9A-F]+):([0-9A-F]+)/; + var re_error = /\s+(.+)/; + var errors = []; + var state = 0; + var lineno = 0; + var filename; + function match_fn(s) { + var m; + switch (state) { + case 0: + m = re_filename.exec(s); + if (m) { + filename = m[2]; + } + m = re_insn.exec(s); + if (m) { + lineno = parseInt(m[1]); + state = 1; + } + break; + case 1: + m = re_error.exec(s); + if (m) { + errors.push({line:lineno, msg:m[1]}); + state = 0; + } + break; + } + } + var Module = emglobal.nesasm({ + instantiateWasm: moduleInstFn('nesasm'), + noInitialRun:true, + print:match_fn + }); + var FS = Module['FS']; + populateFiles(step, FS, { + mainFilePath:'main.a' + }); + var binpath = step.prefix+'.nes'; + var lstpath = step.prefix+'.lst'; + var sympath = step.prefix+'.fns'; + execMain(step, Module, [step.path, '-s', "-l", "2" ]); + // parse main listing, get errors and listings for each file + var listings = {}; + try { + var alst = FS.readFile(lstpath, {'encoding':'utf8'}); + // 16 00:C004 8E 17 40 STX $4017 ; disable APU frame IRQ + var asmlines = parseListing(alst, /^\s*(\d+)\s+([0-9A-F]+):([0-9A-F]+)\s+([0-9A-F ]+?) (.*)/i, 1, 3, 4); + putWorkFile(lstpath, alst); + listings[lstpath] = { + lines:asmlines, + text:alst + }; + } catch (e) { + // + } + if (errors.length) { + return {errors:errors}; + } + // read binary rom output and symbols + var aout, asym; + aout = FS.readFile(binpath); + try { + asym = FS.readFile(sympath, {'encoding':'utf8'}); + } catch (e) { + console.log(e); + errors.push({line:0,msg:"No symbol table generated, maybe segment overflow?"}); + return {errors:errors} + } + putWorkFile(binpath, aout); + putWorkFile(sympath, asym); + if (alst) putWorkFile(lstpath, alst); // listing optional (use LIST) + // return unchanged if no files changed + if (!anyTargetChanged(step, [binpath, sympath])) + return; + // parse symbols + var symbolmap = {}; + for (var s of asym.split("\n")) { + if (!s.startsWith(';')) { + var m = /(\w+)\s+=\s+[$]([0-9A-F]+)/.exec(s); + if (m) { + symbolmap[m[1]] = parseInt(m[2], 16); + } + } + } + var segments = step.params.extra_segments; + return { + output:aout, + listings:listings, + errors:errors, + symbolmap:symbolmap, + segments:segments + }; +} + //////////////////////////// var TOOLS = { 'dasm': assembleDASM, - //'acme': assembleACME, //'plasm': compilePLASMA, 'cc65': compileCC65, @@ -2018,6 +2116,7 @@ var TOOLS = { //'caspr': compileCASPR, 'jsasm': compileJSASMStep, 'zmac': assembleZMAC, + 'nesasm': assembleNESASM, 'bataribasic': compileBatariBasic, 'markdown': translateShowdown, }