8bitworkshop/gen/chunk-RXF2JDJ3.js.map

8 lines
72 KiB
Plaintext

{
"version": 3,
"sources": ["../src/common/util.ts", "../src/common/vlist.ts", "../src/common/emu.ts"],
"sourcesContent": ["\nexport function lpad(s:string, n:number):string {\n s += ''; // convert to string\n while (s.length<n) s=\" \"+s;\n return s;\n}\n\nexport function rpad(s:string, n:number):string {\n s += ''; // convert to string\n while (s.length<n) s+=\" \";\n return s;\n}\n\nexport function byte2signed(b:number):number {\n b &= 0xff;\n return (b < 0x80) ? b : -(256-b);\n}\n\nexport function getFilenameForPath(s:string):string {\n var toks = s.split('/');\n return toks[toks.length-1];\n}\n\nexport function getFolderForPath(s:string):string {\n return s.substring(0, s.lastIndexOf('/'));\n}\n\nexport function getFilenamePrefix(s:string):string {\n var pos = s.lastIndexOf('.');\n return (pos > 0) ? s.substr(0, pos) : s;\n}\n\nexport function hex(v:number, nd?:number) {\n if (!nd) nd = 2;\n if (nd == 8) {\n return hex((v>>16)&0xffff,4) + hex(v&0xffff,4);\n } else {\n return toradix(v,nd,16);\n }\n}\n\nexport function tobin(v:number, nd?:number) {\n if (!nd) nd = 8;\n return toradix(v,nd,2);\n}\n\nexport function toradix(v:number, nd:number, radix:number) {\n try {\n var s = v.toString(radix).toUpperCase();\n while (s.length < nd)\n s = \"0\" + s;\n return s;\n } catch (e) {\n return v+\"\";\n }\n}\n\nexport function arrayCompare(a:ArrayLike<any>, b:ArrayLike<any>):boolean {\n if (a == null && b == null) return true;\n if (a == null) return false;\n if (b == null) return false;\n if (a.length != b.length) return false;\n for (var i=0; i<a.length; i++)\n if (a[i] != b[i])\n return false;\n return true;\n}\n\nexport function invertMap(m:{}):{} {\n var r = {};\n if (m) {\n for (var k in m) r[m[k]] = k;\n }\n return r;\n}\n\nexport function highlightDifferences(s1:string, s2:string):string {\n var split1 = s1.split(/(\\S+\\s+)/).filter(function(n) {return n});\n var split2 = s2.split(/(\\S+\\s+)/).filter(function(n) {return n});\n var i = 0;\n var j = 0;\n var result = \"\";\n while (i < split1.length && j < split2.length) {\n var w1 = split1[i];\n var w2 = split2[j];\n if (w2 && w2.indexOf(\"\\n\") >= 0) {\n while (i < s1.length && split1[i].indexOf(\"\\n\") < 0)\n i++;\n }\n if (w1 != w2) {\n w2 = '<span class=\"hilite\">' + w2 + '</span>';\n }\n result += w2;\n i++;\n j++;\n }\n while (j < split2.length) {\n result += split2[j++];\n }\n return result;\n}\n\nexport function lzgmini() {\n\n // Constants\n var LZG_HEADER_SIZE = 16;\n var LZG_METHOD_COPY = 0;\n var LZG_METHOD_LZG1 = 1;\n\n // LUT for decoding the copy length parameter\n var LZG_LENGTH_DECODE_LUT = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,\n 20,21,22,23,24,25,26,27,28,29,35,48,72,128];\n\n // Decoded data (produced by the decode() method)\n var outdata = null;\n\n // Calculate the checksum\n var calcChecksum = function(data) {\n var a = 1;\n var b = 0;\n var i = LZG_HEADER_SIZE;\n while (i < data.length)\n {\n a = (a + (data[i] & 0xff)) & 0xffff;\n b = (b + a) & 0xffff;\n i++;\n }\n return (b << 16) | a;\n }\n\n // Decode LZG coded data. The function returns the size of the decoded data.\n // Use any of the get* methods to retrieve the decoded data.\n this.decode = function(data:number[]):number[] {\n // Start by clearing the decompressed array in this object\n outdata = null;\n\n // Check magic ID\n if ((data.length < LZG_HEADER_SIZE) || (data[0] != 76) ||\n (data[1] != 90) || (data[2] != 71))\n {\n return null;\n }\n \n // what's the length?\n var uncomplen = data[6] | (data[5]<<8) | (data[4]<<16) | (data[3]<<24);\n\n // Calculate & check the checksum\n var checksum = ((data[11] & 0xff) << 24) |\n ((data[12] & 0xff) << 16) |\n ((data[13] & 0xff) << 8) |\n (data[14] & 0xff);\n if (calcChecksum(data) != checksum)\n {\n return null;\n }\n\n var dst = new Array();\n // Check which method to use\n var method = data[15] & 0xff;\n if (method == LZG_METHOD_LZG1)\n {\n // Get marker symbols\n var m1 = data[16] & 0xff;\n var m2 = data[17] & 0xff;\n var m3 = data[18] & 0xff;\n var m4 = data[19] & 0xff;\n\n // Main decompression loop\n var symbol, b, b2, b3, len, offset;\n var dstlen = 0;\n var k = LZG_HEADER_SIZE + 4;\n var datalen = data.length;\n while (k <= datalen)\n {\n symbol = data[k++] & 0xff;\n if ((symbol != m1) && (symbol != m2) && (symbol != m3) && (symbol != m4))\n {\n // Literal copy\n dst[dstlen++] = symbol;\n }\n else\n {\n b = data[k++] & 0xff;\n if (b != 0)\n {\n // Decode offset / length parameters\n if (symbol == m1)\n {\n // marker1 - \"Distant copy\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n b2 = data[k++] & 0xff;\n b3 = data[k++] & 0xff;\n offset = (((b & 0xe0) << 11) | (b2 << 8) | b3) + 2056;\n }\n else if (symbol == m2)\n {\n // marker2 - \"Medium copy\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n b2 = data[k++] & 0xff;\n offset = (((b & 0xe0) << 3) | b2) + 8;\n }\n else if (symbol == m3)\n {\n // marker3 - \"Short copy\"\n len = (b >> 6) + 3;\n offset = (b & 63) + 8;\n }\n else\n {\n // marker4 - \"Near copy (incl. RLE)\"\n len = LZG_LENGTH_DECODE_LUT[b & 0x1f];\n offset = (b >> 5) + 1;\n }\n\n // Copy the corresponding data from the history window\n for (i = 0; i < len; i++)\n {\n dst[dstlen] = dst[dstlen-offset];\n dstlen++;\n }\n }\n else\n {\n // Literal copy (single occurance of a marker symbol)\n dst[dstlen++] = symbol;\n }\n }\n }\n\n }\n else if (method == LZG_METHOD_COPY)\n {\n // Plain copy\n var dstlen = 0;\n var datalen = data.length;\n for (var i = LZG_HEADER_SIZE; i < datalen; i++)\n {\n dst[dstlen++] = data[i] & 0xff;\n }\n }\n else\n {\n // Unknown method\n return null;\n }\n // Store the decompressed data in the lzgmini object for later retrieval\n if (dst.length < uncomplen) return null; // data too short\n outdata = dst.slice(0, uncomplen);\n return outdata;\n }\n\n // Get the decoded byte array\n this.getByteArray = function():number[]\n {\n return outdata;\n }\n\n // Get the decoded string from a Latin 1 (or ASCII) encoded array\n this.getStringLatin1 = function():string {\n return byteArrayToString(outdata);\n }\n\n // Get the decoded string from an UTF-8 encoded array\n this.getStringUTF8 = function():string {\n return byteArrayToUTF8(outdata);\n }\n}\n\nexport function stringToByteArray(s:string) : Uint8Array {\n var a = new Uint8Array(s.length);\n for (var i=0; i<s.length; i++)\n a[i] = s.charCodeAt(i);\n return a;\n}\n\nexport function byteArrayToString(data : number[] | Uint8Array) : string {\n var str = \"\";\n if (data != null) {\n var charLUT = new Array();\n for (var i = 0; i < 256; ++i)\n charLUT[i] = String.fromCharCode(i);\n var len = data.length;\n for (var i = 0; i < len; i++)\n str += charLUT[data[i]];\n }\n return str;\n}\n\nexport function byteArrayToUTF8(data : number[] | Uint8Array) : string {\n var str = \"\";\n var charLUT = new Array();\n for (var i = 0; i < 128; ++i)\n charLUT[i] = String.fromCharCode(i);\n var c;\n var len = data.length;\n for (var i = 0; i < len;) {\n c = data[i++];\n if (c < 128) {\n str += charLUT[c];\n } else {\n if ((c >= 192) && (c < 224)) {\n c = ((c & 31) << 6) | (data[i++] & 63);\n } else {\n c = ((c & 15) << 12) | ((data[i] & 63) << 6) | (data[i+1] & 63);\n i += 2;\n if (c == 0xfeff) continue; // ignore BOM\n }\n str += String.fromCharCode(c);\n }\n }\n return str;\n}\n\nexport function removeBOM(s:string) {\n if (s.charCodeAt(0) === 0xFEFF) {\n s = s.substr(1);\n }\n return s;\n}\n\nexport function isProbablyBinary(path:string, data?:number[] | Uint8Array) : boolean {\n var score = 0;\n // check extensions\n if (path) {\n path = path.toUpperCase();\n const BINEXTS = ['.CHR','.BIN','.DAT','.PAL','.NAM','.RLE','.LZ4','.NSF'];\n for (var ext of BINEXTS) {\n if (path.endsWith(ext)) score++;\n }\n }\n // decode as UTF-8\n for (var i = 0; i < (data?data.length:0);) {\n let c = data[i++];\n if ((c & 0x80) == 0) {\n // more likely binary if we see a NUL or obscure control character\n if (c < 9 || (c >= 14 && c < 26) || c == 0x7f) {\n score++;\n break;\n }\n } else {\n // look for invalid unicode sequences\n var nextra = 0;\n if ((c & 0xe0) == 0xc0) nextra = 1;\n else if ((c & 0xf0) == 0xe0) nextra = 2;\n else if ((c & 0xf8) == 0xf0) nextra = 3;\n else if (c < 0xa0) score++;\n else if (c == 0xff) score++;\n while (nextra--) {\n if (i >= data.length || (data[i++] & 0xc0) != 0x80) {\n score++;\n break;\n }\n }\n }\n }\n return score > 0;\n}\n\n// need to load liblzg.js first\nexport function compressLZG(em_module, inBuffer:number[], levelArg?:boolean) : Uint8Array {\n var level = levelArg || 9;\n var inLen = inBuffer.length;\n var inPtr = em_module._malloc(inLen + 1);\n for (var i = 0; i < inLen; i++) {\n em_module.setValue(inPtr + i, inBuffer[i], 'i8');\n }\n var maxEncSize = em_module._LZG_MaxEncodedSize(inLen);\n var outPtr = em_module._malloc(maxEncSize + 1);\n var compLen = em_module.ccall('compress_lzg', 'number', ['number', 'number', 'number', 'number', 'number'], [level, inPtr, inLen, maxEncSize, outPtr]);\n em_module._free(inPtr);\n var outBuffer = new Uint8Array(compLen);\n for (var i = 0; i < compLen; i++) {\n outBuffer[i] = em_module.getValue(outPtr + i, 'i8');\n }\n em_module._free(outPtr);\n return outBuffer;\n}\n\n// only does primitives, 1D arrays and no recursion\nexport function safe_extend(deep, dest, src) {\n // TODO: deep ignored\n for (var key in src) {\n var val = src[key];\n var type = typeof(val);\n if (val === null || type == 'undefined') {\n dest[key] = val;\n } else if (type == 'function') {\n // ignore function\n } else if (type == 'object') {\n if (val['slice']) { // array?\n dest[key] = val.slice();\n } else {\n // ignore object\n }\n } else {\n dest[key] = val;\n }\n }\n return dest;\n}\n\nexport function printFlags(val:number, names:string[], r2l:boolean) {\n var s = '';\n for (var i=0; i<names.length; i++) {\n if (names[i]) {\n var bit = 1 << (r2l ? (names.length-1-i) : i);\n if (i > 0) s += \" \";\n s += (val & bit) ? names[i] : \"-\";\n }\n }\n return s;\n}\n\nexport function rgb2bgr(x) {\n return ((x&0xff)<<16) | ((x>>16)&0xff) | (x&0x00ff00);\n}\n\nexport function RGBA(r:number,g:number,b:number) {\n return (r&0xff) | ((g&0xff)<<8) | ((b&0xff)<<16) | 0xff000000;\n}\n\nexport function clamp(minv:number, maxv:number, v:number) {\n return (v < minv) ? minv : (v > maxv) ? maxv : v;\n}\n\nexport function safeident(s : string) : string {\n // if starts with non-alpha character, prefix with '_'\n if (s.length == 0) return '';\n if (!s.match(/^[a-zA-Z_]/)) s = '_' + s;\n return s.replace(/\\W+/g, \"_\");\n}\n\nexport function rle_unpack(src : Uint8Array) : Uint8Array {\n var i = 0;\n var tag = src[i++];\n var dest = [];\n var data = tag;\n while (i < src.length) {\n var ch = src[i++];\n if (ch == tag) {\n var count = src[i++];\n for (var j=0; j<count; j++)\n dest.push(data);\n if (count == 0)\n break;\n } else {\n data = ch;\n dest.push(data);\n }\n }\n return new Uint8Array(dest);\n}\n\n// firefox doesn't do GET with binary files\n// TODO: replace with fetch()?\nexport function getWithBinary(url:string, success:(text:string|Uint8Array)=>void, datatype:'text'|'arraybuffer') {\n var oReq = new XMLHttpRequest();\n oReq.open(\"GET\", url, true);\n oReq.responseType = datatype;\n oReq.onload = function (oEvent) {\n if (oReq.status == 200) {\n var data = oReq.response;\n if (data instanceof ArrayBuffer) {\n data = new Uint8Array(data);\n }\n success(data);\n } else if (oReq.status == 404) {\n success(null);\n } else {\n throw Error(\"Error \" + oReq.status + \" loading \" + url);\n }\n }\n oReq.onerror = function (oEvent) {\n success(null);\n }\n oReq.ontimeout = function (oEvent) {\n throw Error(\"Timeout loading \" + url);\n }\n oReq.send(null);\n}\n\n// get platform ID without . emulator\nexport function getBasePlatform(platform : string) : string {\n return platform.split('.')[0];\n}\n\n// get platform ID without - specialization\nfunction getRootPlatform(platform : string) : string {\n return platform.split('-')[0];\n}\n\n// get platform ID without emulator or specialization\nexport function getRootBasePlatform(platform : string) : string {\n return getRootPlatform(getBasePlatform(platform));\n}\n\nexport function isArray(obj: any) : obj is ArrayLike<any> {\n return obj != null && (Array.isArray(obj) || isTypedArray(obj));\n}\n\nexport function isTypedArray(obj: any) : obj is ArrayLike<number> {\n return obj != null && obj['BYTES_PER_ELEMENT'];\n}\n\nexport function convertDataToUint8Array(data: string|Uint8Array) : Uint8Array {\n return (typeof data === 'string') ? stringToByteArray(data) : data;\n}\n\nexport function convertDataToString(data: string|Uint8Array) : string {\n return (data instanceof Uint8Array) ? byteArrayToUTF8(data) : data;\n}\n\nexport function byteToASCII(b: number) : string {\n if (b < 32)\n return String.fromCharCode(b + 0x2400);\n else\n return String.fromCharCode(b);\n}\n\nexport function loadScript(scriptfn:string) : Promise<Event> {\n return new Promise( (resolve, reject) => {\n var script = document.createElement('script');\n script.onload = resolve;\n script.onerror = reject;\n script.src = scriptfn;\n document.getElementsByTagName('head')[0].appendChild(script);\n });\n}\n\nexport function decodeQueryString(qs : string) : {} {\n if (qs.startsWith('?')) qs = qs.substr(1);\n var a = qs.split('&');\n if (!a || a.length == 0)\n return {};\n var b = {};\n for (var i = 0; i < a.length; ++i) {\n var p = a[i].split('=', 2);\n if (p.length == 1)\n b[p[0]] = \"\";\n else\n b[p[0]] = decodeURIComponent(p[1].replace(/\\+/g, \" \"));\n }\n return b;\n}\n\nexport function parseBool(s : string) : boolean {\n if (!s) return false;\n if (s == 'false' || s == '0') return false;\n if (s == 'true' || s == '1') return true;\n return s ? true : false;\n}\n\n///\n\nexport class XMLParseError extends Error {\n}\n\nexport interface XMLNode {\n type: string;\n text: string | null;\n children: XMLNode[];\n attrs: { [id: string]: string };\n obj: any;\n}\n\nexport type XMLVisitFunction = (node: XMLNode) => any;\n\nfunction escapeXML(s: string): string {\n if (s.indexOf('&') >= 0) {\n return s.replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&amp;/g, '&');\n } else {\n return s;\n }\n}\n\nexport function parseXMLPoorly(s: string, openfn?: XMLVisitFunction, closefn?: XMLVisitFunction): XMLNode {\n const tag_re = /[<]([/]?)([?a-z_-]+)([^>]*)[>]+|(\\s*[^<]+)/gi;\n const attr_re = /\\s*(\\w+)=\"(.*?)\"\\s*/gi;\n var fm: RegExpMatchArray;\n var stack: XMLNode[] = [];\n var top: XMLNode;\n\n function closetop() {\n top = stack.pop();\n if (top == null || top.type != ident) throw new XMLParseError(\"mismatch close tag: \" + ident);\n if (closefn) {\n top.obj = closefn(top);\n }\n if (stack.length == 0) throw new XMLParseError(\"close tag without open: \" + ident);\n stack[stack.length - 1].children.push(top);\n }\n function parseattrs(as: string): { [id: string]: string } {\n var am;\n var attrs = {};\n if (as != null) {\n while (am = attr_re.exec(as)) {\n attrs[am[1]] = escapeXML(am[2]);\n }\n }\n return attrs;\n }\n while (fm = tag_re.exec(s)) {\n var [_m0, close, ident, attrs, content] = fm;\n //console.log(stack.length, close, ident, attrs, content);\n if (close) {\n closetop();\n } else if (ident) {\n var node = { type: ident, text: null, children: [], attrs: parseattrs(attrs), obj: null };\n stack.push(node);\n if (attrs) {\n parseattrs(attrs);\n }\n if (openfn) {\n node.obj = openfn(node);\n }\n if (attrs && attrs.endsWith('/')) closetop();\n } else if (content != null) {\n if (stack.length == 0) throw new XMLParseError(\"content without element\");\n var txt = escapeXML(content as string).trim();\n if (txt.length) stack[stack.length - 1].text = txt;\n }\n }\n if (stack.length != 1) throw new XMLParseError(\"tag not closed\");\n if (stack[0].type != '?xml') throw new XMLParseError(\"?xml needs to be first element\");\n return top;\n}\n\nexport function escapeHTML(s: string): string {\n return s.replace(/[&]/g, '&amp;').replace(/[<]/g, '&lt;').replace(/[>]/g, '&gt;');\n}\n\n// lame factorization for displaying bitmaps\n// returns a > b such that a * b == x (or higher), a >= mina, b >= minb\nexport function findIntegerFactors(x: number, mina: number, minb: number, aspect: number) : {a: number, b: number} {\n let a = x;\n let b = 1;\n if (minb > 1 && minb < a) {\n a = Math.ceil(x / minb);\n b = minb;\n }\n while (a > b) {\n let a2 = a;\n let b2 = b;\n if ((a & 1) == 0) {\n b2 = b * 2;\n a2 = a / 2;\n }\n if ((a % 3) == 0) {\n b2 = b * 3;\n a2 = a / 3;\n }\n if ((a % 5) == 0) {\n b2 = b * 5;\n a2 = a / 5;\n }\n if (a2 < mina) break;\n if (a2 < b2 * aspect) break;\n a = a2;\n b = b2;\n }\n return {a, b};\n}\n\nexport class FileDataCache {\n maxSize : number = 8000000;\n size : number;\n cache : Map<string, string|Uint8Array>;\n constructor() {\n this.reset();\n }\n get(key : string) : string|Uint8Array {\n return this.cache.get(key);\n }\n put(key : string, value : string|Uint8Array) {\n this.cache.set(key, value);\n this.size += value.length;\n if (this.size > this.maxSize) {\n console.log('cache reset', this);\n this.reset();\n }\n }\n reset() {\n this.cache = new Map();\n this.size = 0;\n }\n}\n\nexport function coerceToArray<T>(arrobj: any) : T[] {\n if (Array.isArray(arrobj)) return arrobj;\n else if (arrobj != null && typeof arrobj[Symbol.iterator] === 'function') return Array.from(arrobj);\n else if (typeof arrobj === 'object') return Array.from(Object.values(arrobj))\n else throw new Error(`Expected array or object, got \"${arrobj}\"`);\n}\n\nexport function replaceAll(s:string, search:string, replace:string) : string {\n if (s == '') return '';\n if (search == '') return s;\n return s.split(search).join(replace);\n}\n\nexport function getCookie(name: string) : string {\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(';');\n for(var i=0;i < ca.length;i++) {\n var c = ca[i];\n while (c.charAt(0)==' ') c = c.substring(1,c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);\n }\n return null;\n}\n\n", "/**\n * The MIT License (MIT)\n *\n * Copyright (C) 2013 Sergi Mansilla\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Creates a virtually-rendered scrollable list.\n * @param {object} config\n * @constructor\n */\nexport function VirtualList(config) {\n var width = (config && config.w + 'px') || '100%';\n var height = (config && config.h + 'px') || '100%';\n var itemHeight = this.itemHeight = config.itemHeight;\n\n this.items = config.items;\n this.generatorFn = config.generatorFn;\n this.totalRows = config.totalRows || (config.items && config.items.length);\n\n var scroller = VirtualList.createScroller(itemHeight * this.totalRows);\n this.container = VirtualList.createContainer(width, height);\n this.container.appendChild(scroller);\n\n var screenItemsLen = Math.ceil(config.h / itemHeight);\n // Cache 4 times the number of items that fit in the container viewport\n this.cachedItemsLen = screenItemsLen * 3;\n this._renderChunk(this.container, 0);\n\n var self = this;\n var lastRepaintY;\n var maxBuffer = screenItemsLen * itemHeight;\n var lastScrolled = 0;\n\n // As soon as scrolling has stopped, this interval asynchronouslyremoves all\n // the nodes that are not used anymore\n this.rmNodeInterval = setInterval(function() {\n if (Date.now() - lastScrolled > 100) {\n var badNodes = document.querySelectorAll('[data-rm=\"1\"]');\n for (var i = 0, l = badNodes.length; i < l; i++) {\n try {\n self.container.removeChild(badNodes[i]);\n } catch (e) {\n //\n }\n }\n }\n }, 300);\n\n function onScroll(e) {\n var scrollTop = e.target.scrollTop; // Triggers reflow\n if (!lastRepaintY || Math.abs(scrollTop - lastRepaintY) > maxBuffer) {\n var first = Math.floor(scrollTop / itemHeight) - screenItemsLen;\n self._renderChunk(self.container, first < 0 ? 0 : first);\n lastRepaintY = scrollTop;\n }\n\n lastScrolled = Date.now();\n e.preventDefault && e.preventDefault();\n }\n\n this.container.addEventListener('scroll', onScroll);\n}\n\nVirtualList.prototype.createRow = function(i) {\n var item;\n if (this.generatorFn)\n item = this.generatorFn(i);\n else if (this.items) {\n if (typeof this.items[i] === 'string') {\n var itemText = document.createTextNode(this.items[i]);\n item = document.createElement('div');\n item.style.height = this.itemHeight + 'px';\n item.appendChild(itemText);\n } else {\n item = this.items[i];\n }\n }\n\n item.classList.add('vrow');\n item.setAttribute('data-index', ''+i);\n item.style.position = 'absolute';\n item.style.top = (i * this.itemHeight) + 'px';\n return item;\n};\n\n/**\n * Renders a particular, consecutive chunk of the total rows in the list. To\n * keep acceleration while scrolling, we mark the nodes that are candidate for\n * deletion instead of deleting them right away, which would suddenly stop the\n * acceleration. We delete them once scrolling has finished.\n *\n * @param {Node} node Parent node where we want to append the children chunk.\n * @param {Number} from Starting position, i.e. first children index.\n * @return {void}\n */\nVirtualList.prototype._renderChunk = function(node, from) {\n var finalItem = from + this.cachedItemsLen;\n if (finalItem > this.totalRows)\n finalItem = this.totalRows;\n\n // Append all the new rows in a document fragment that we will later append to\n // the parent node\n var fragment = document.createDocumentFragment();\n for (var i = from; i < finalItem; i++) {\n fragment.appendChild(this.createRow(i));\n }\n\n // Hide and mark obsolete nodes for deletion.\n for (var j = 1, l = node.childNodes.length; j < l; j++) {\n node.childNodes[j].style.display = 'none';\n node.childNodes[j].setAttribute('data-rm', '1');\n }\n node.appendChild(fragment);\n};\n\nVirtualList.createContainer = function(w, h) {\n var c = document.createElement('div');\n c.classList.add('vlist');\n c.style.width = w;\n c.style.height = h;\n c.style.overflow = 'auto';\n c.style.position = 'relative';\n c.style.padding = '0';\n c.style.border = '1px solid black';\n return c;\n};\n\nVirtualList.createScroller = function(h) {\n var scroller = document.createElement('div');\n scroller.style.opacity = '0';\n scroller.style.position = 'absolute';\n scroller.style.top = '0';\n scroller.style.left = '0';\n scroller.style.width = '1px';\n scroller.style.height = h + 'px';\n return scroller;\n};\n\nVirtualList.prototype.scrollToItem = function(index) {\n this.container.scrollTop = this.itemHeight * index;\n};\n\n", "\nimport { hex, clamp, lpad, RGBA } from \"./util\";\nimport { SourceLocation } from \"./workertypes\";\nimport { VirtualList } from \"./vlist\"\n\n// Emulator classes\n\nexport var PLATFORMS = {};\n\nvar _random_state = 1;\n\nexport function noise() {\n\tlet x = _random_state;\n\tx ^= x << 13;\n\tx ^= x >> 17;\n\tx ^= x << 5;\n\treturn (_random_state = x) & 0xff;\n}\n\nexport function getNoiseSeed() {\n return _random_state;\n}\n\nexport function setNoiseSeed(x : number) {\n _random_state = x;\n}\n\ntype KeyboardCallback = (which:number, charCode:number, flags:KeyFlags) => void;\n\nexport function __createCanvas(doc:HTMLDocument, mainElement:HTMLElement, width:number, height:number) : HTMLCanvasElement {\n var canvas = doc.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n canvas.classList.add(\"emuvideo\");\n canvas.tabIndex = -1; // Make it focusable\n mainElement.appendChild(canvas);\n return canvas;\n}\n\nexport enum KeyFlags {\n KeyDown = 1,\n Shift = 2,\n Ctrl = 4,\n Alt = 8,\n Meta = 16,\n KeyUp = 64,\n KeyPress = 128,\n}\n\n// TODO: don't use which/keyCode anymore?\n// TODO: let keycode = e.key ? e.key.charCodeAt(0) : e.keyCode;\n// TODO: let charCode = e.key ? e.key.charCodeAt(0) : e.charCode;\nexport function _setKeyboardEvents(canvas:HTMLElement, callback:KeyboardCallback) {\n canvas.onkeydown = (e) => {\n let flags = _metakeyflags(e);\n callback(e.which, e.keyCode, KeyFlags.KeyDown|flags);\n if (!flags) e.preventDefault(); // eat all keys that don't have a modifier\n };\n canvas.onkeyup = (e) => {\n callback(e.which, e.keyCode, KeyFlags.KeyUp|_metakeyflags(e));\n };\n};\n\ntype VideoCanvasOptions = {rotate?:number, overscan?:boolean, aspect?:number};\n\nexport class RasterVideo {\n\n mainElement : HTMLElement;\n width : number;\n height : number;\n options : VideoCanvasOptions;\n\n constructor(mainElement:HTMLElement, width:number, height:number, options?:VideoCanvasOptions) {\n this.mainElement = mainElement;\n this.width = width;\n this.height = height;\n this.options = options;\n }\n \n canvas : HTMLCanvasElement;\n ctx : CanvasRenderingContext2D;\n imageData : ImageData;\n datau32 : Uint32Array;\n vcanvas : JQuery;\n \n paddle_x = 255;\n paddle_y = 255;\n \n setRotate(rotate:number) {\n var canvas = this.canvas;\n if (rotate) {\n // TODO: aspect ratio?\n canvas.style.transform = \"rotate(\"+rotate+\"deg)\";\n if (canvas.width < canvas.height)\n canvas.style.paddingLeft = canvas.style.paddingRight = \"10%\";\n } else {\n canvas.style.transform = null;\n canvas.style.paddingLeft = canvas.style.paddingRight = null;\n }\n }\n\n create(doc?: HTMLDocument) {\n var canvas;\n this.canvas = canvas = __createCanvas(doc || document, this.mainElement, this.width, this.height);\n this.vcanvas = $(canvas);\n if (this.options && this.options.rotate) {\n this.setRotate(this.options.rotate);\n }\n if (this.options && this.options.overscan) {\n this.vcanvas.css('padding','0px');\n }\n if (this.options && this.options.aspect) {\n console.log(this.options);\n this.vcanvas.css('aspect-ratio', this.options.aspect+\"\");\n }\n this.ctx = canvas.getContext('2d');\n this.imageData = this.ctx.createImageData(this.width, this.height);\n this.datau32 = new Uint32Array(this.imageData.data.buffer);\n }\n\n setKeyboardEvents(callback) {\n _setKeyboardEvents(this.canvas, callback);\n }\n\n getFrameData() { return this.datau32; }\n\n getContext() { return this.ctx; }\n\n updateFrame(sx?:number, sy?:number, dx?:number, dy?:number, w?:number, h?:number) {\n if (w && h)\n this.ctx.putImageData(this.imageData, sx, sy, dx, dy, w, h);\n else\n this.ctx.putImageData(this.imageData, 0, 0);\n }\n\n clearRect(dx:number, dy:number, w:number, h:number) {\n var ctx = this.ctx;\n ctx.fillStyle = '#000000';\n ctx.fillRect(dx, dy, w, h);\n }\n\n setupMouseEvents(el? : HTMLCanvasElement) {\n if (!el) el = this.canvas;\n $(el).mousemove( (e) => {\n var pos = getMousePos(el, e);\n var new_x = Math.floor(pos.x * 255 / this.canvas.width);\n var new_y = Math.floor(pos.y * 255 / this.canvas.height);\n this.paddle_x = clamp(0, 255, new_x);\n this.paddle_y = clamp(0, 255, new_y);\n });\n };\n}\n\nexport class VectorVideo extends RasterVideo {\n\n persistenceAlpha = 0.5;\n jitter = 1.0;\n gamma = 0.8;\n sx : number;\n sy : number;\n \n create() {\n super.create();\n this.sx = this.width/1024.0;\n this.sy = this.height/1024.0;\n }\n\n clear() {\n var ctx = this.ctx;\n ctx.globalCompositeOperation = 'source-over';\n ctx.globalAlpha = this.persistenceAlpha;\n ctx.fillStyle = '#000000';\n ctx.fillRect(0, 0, this.width, this.height);\n ctx.globalAlpha = 1.0;\n ctx.globalCompositeOperation = 'lighter';\n }\n\n COLORS = [\n '#111111',\n '#1111ff',\n '#11ff11',\n '#11ffff',\n '#ff1111',\n '#ff11ff',\n '#ffff11',\n '#ffffff'\n ];\n\n drawLine(x1:number, y1:number, x2:number, y2:number, intensity:number, color:number) {\n var ctx = this.ctx;\n var sx = this.sx;\n var sy = this.sy;\n //console.log(x1,y1,x2,y2,intensity,color);\n if (intensity > 0) {\n // TODO: landscape vs portrait\n var alpha = Math.pow(intensity / 255.0, this.gamma);\n ctx.globalAlpha = alpha;\n ctx.lineWidth = 3;\n ctx.beginPath();\n // TODO: bright dots\n var jx = this.jitter * (Math.random() - 0.5);\n var jy = this.jitter * (Math.random() - 0.5);\n x1 += jx;\n x2 += jx;\n y1 += jy;\n y2 += jy;\n ctx.moveTo(x1*sx, this.height-y1*sy);\n if (x1 == x2 && y1 == y2)\n ctx.lineTo(x2*sx+1, this.height-y2*sy);\n else\n ctx.lineTo(x2*sx, this.height-y2*sy);\n ctx.strokeStyle = this.COLORS[color & 7];\n ctx.stroke();\n }\n }\n}\n\nexport function drawCrosshair(ctx:CanvasRenderingContext2D, x:number, y:number, width:number) {\n if (!ctx?.setLineDash) return; // for unit testing\n ctx.fillStyle = 'rgba(0,0,0,0.25)';\n ctx.fillRect(x-2, 0, 5, 32767);\n ctx.fillRect(0, y-2, 32767, 5);\n ctx.lineWidth = width;\n ctx.strokeStyle = 'rgba(255,255,255,0.75)';\n ctx.setLineDash([width*2,width*2]);\n ctx.beginPath();\n ctx.moveTo(x, 0);\n ctx.lineTo(x, 32767);\n ctx.moveTo(0, y);\n ctx.lineTo(32767, y);\n ctx.stroke();\n}\n\nexport class RAM {\n mem : Uint8Array;\n constructor(size:number) {\n this.mem = new Uint8Array(new ArrayBuffer(size));\n }\n}\n\nexport class EmuHalt extends Error {\n $loc : SourceLocation;\n squelchError = true;\n constructor(msg: string, loc?: SourceLocation) {\n super(msg);\n this.$loc = loc;\n Object.setPrototypeOf(this, EmuHalt.prototype);\n }\n}\n\nexport var useRequestAnimationFrame : boolean = false;\n\nexport class AnimationTimer {\n\n callback; \n running : boolean = false;\n pulsing : boolean = false;\n nextts = 0;\n nframes;\n startts; // for FPS calc\n frameRate;\n intervalMsec;\n useReqAnimFrame = useRequestAnimationFrame && typeof window.requestAnimationFrame === 'function'; // need for unit test\n \n constructor(frequencyHz:number, callback:() => void) {\n this.frameRate = frequencyHz;\n this.intervalMsec = 1000.0 / frequencyHz;\n this.callback = callback;\n }\n\n scheduleFrame(msec:number) {\n var fn = (timestamp) => {\n try {\n this.nextFrame(this.useReqAnimFrame ? timestamp : Date.now());\n } catch (e) {\n this.running = false;\n this.pulsing = false;\n throw e;\n }\n }\n if (this.useReqAnimFrame)\n window.requestAnimationFrame(fn);\n else\n setTimeout(fn, msec);\n }\n \n nextFrame(ts:number) {\n if (ts > this.nextts) {\n if (this.running) {\n this.callback();\n }\n if (this.nframes == 0)\n this.startts = ts;\n if (this.nframes++ == 300) {\n console.log(\"Avg framerate: \" + this.nframes*1000/(ts-this.startts) + \" fps\");\n }\n }\n this.nextts += this.intervalMsec;\n // frames skipped? catch up\n if ((ts - this.nextts) > 1000) {\n //console.log(ts - this.nextts, 'msec skipped');\n this.nextts = ts;\n }\n if (this.running) {\n this.scheduleFrame(this.nextts - ts);\n } else {\n this.pulsing = false;\n }\n }\n isRunning() {\n return this.running;\n }\n start() {\n if (!this.running) {\n this.running = true;\n this.nextts = 0;\n this.nframes = 0;\n if (!this.pulsing) {\n this.scheduleFrame(0);\n this.pulsing = true;\n }\n }\n }\n stop() {\n this.running = false;\n }\n}\n\n// TODO: move to util?\n\nexport function dumpRAM(ram:ArrayLike<number>, ramofs:number, ramlen:number) : string {\n var s = \"\";\n var bpel = ram['BYTES_PER_ELEMENT'] || 1;\n var perline = Math.ceil(16 / bpel);\n var isFloat = ram instanceof Float32Array || ram instanceof Float64Array;\n // TODO: show scrollable RAM for other platforms\n for (var ofs=0; ofs<ramlen; ofs+=perline) {\n s += '$' + hex(ofs+ramofs) + ':';\n for (var i=0; i<perline; i++) {\n if (ofs+i < ram.length) {\n if (i == perline/2) s += \" \";\n if (isFloat) s += \" \" + ram[ofs+i].toPrecision(bpel*2);\n else s += \" \" + hex(ram[ofs+i], bpel*2);\n }\n }\n s += \"\\n\";\n }\n return s;\n}\n\nexport interface KeyDef {\n c:number,\t// key code\n n:string,\t// name\n // for gamepad\n plyr?:number,\n xaxis?:number,\n yaxis?:number,\n button?:number\n };\n\nexport interface KeyMapEntry {\n index:number;\n mask:number;\n def:KeyDef;\n}\n\ntype KeyCodeMap = Map<number,KeyMapEntry>;\n\nexport const Keys = {\n ANYKEY: {c: 0, n: \"?\"},\n // https://w3c.github.io/gamepad/#remapping\n // gamepad and keyboard (player 0)\n UP: {c: 38, n: \"Up\", plyr:0, button:12, yaxis:-1},\n DOWN: {c: 40, n: \"Down\", plyr:0, button:13, yaxis:1},\n LEFT: {c: 37, n: \"Left\", plyr:0, button:14, xaxis:-1},\n RIGHT: {c: 39, n: \"Right\", plyr:0, button:15, xaxis:1},\n A: {c: 32, n: \"Space\", plyr:0, button:0},\n B: {c: 16, n: \"Shift\", plyr:0, button:1},\n GP_A: {c: 88, n: \"X\", plyr:0, button:0},\n GP_B: {c: 90, n: \"Z\", plyr:0, button:1},\n GP_C: {c: 86, n: \"V\", plyr:0, button:2},\n GP_D: {c: 67, n: \"C\", plyr:0, button:3},\n SELECT: {c: 220, n: \"\\\\\", plyr:0, button:8},\n START: {c: 13, n: \"Enter\", plyr:0, button:9},\n OPTION: {c: 8, n: \"Bcksp\", plyr:0, button:10},\n // gamepad and keyboard (player 1)\n P2_UP: {c: 87, n: \"W\", plyr:1, button:12, yaxis:-1},\n P2_DOWN: {c: 83, n: \"S\", plyr:1, button:13, yaxis:1},\n P2_LEFT: {c: 65, n: \"A\", plyr:1, button:14, xaxis:-1},\n P2_RIGHT: {c: 68, n: \"D\", plyr:1, button:15, xaxis:1},\n P2_A: {c: 84, n: \"T\", plyr:1, button:0},\n P2_B: {c: 82, n: \"R\", plyr:1, button:1},\n P2_GP_A: {c: 69, n: \"E\", plyr:1, button:0},\n P2_GP_B: {c: 82, n: \"R\", plyr:1, button:1},\n P2_GP_C: {c: 84, n: \"T\", plyr:1, button:2},\n P2_GP_D: {c: 89, n: \"Y\", plyr:1, button:3},\n P2_SELECT: {c: 70, n: \"F\", plyr:1, button:8},\n P2_START: {c: 71, n: \"G\", plyr:1, button:9},\n // keyboard only\n VK_ESCAPE: {c: 27, n: \"Esc\"},\n VK_F1: {c: 112, n: \"F1\"},\n VK_F2: {c: 113, n: \"F2\"},\n VK_F3: {c: 114, n: \"F3\"},\n VK_F4: {c: 115, n: \"F4\"},\n VK_F5: {c: 116, n: \"F5\"},\n VK_F6: {c: 117, n: \"F6\"},\n VK_F7: {c: 118, n: \"F7\"},\n VK_F8: {c: 119, n: \"F8\"},\n VK_F9: {c: 120, n: \"F9\"},\n VK_F10: {c: 121, n: \"F10\"},\n VK_F11: {c: 122, n: \"F11\"},\n VK_F12: {c: 123, n: \"F12\"},\n VK_SCROLL_LOCK: {c: 145, n: \"ScrLck\"},\n VK_PAUSE: {c: 19, n: \"Pause\"},\n VK_QUOTE: {c: 222, n: \"'\"},\n VK_1: {c: 49, n: \"1\"},\n VK_2: {c: 50, n: \"2\"},\n VK_3: {c: 51, n: \"3\"},\n VK_4: {c: 52, n: \"4\"},\n VK_5: {c: 53, n: \"5\"},\n VK_6: {c: 54, n: \"6\"},\n VK_7: {c: 55, n: \"7\"},\n VK_8: {c: 56, n: \"8\"},\n VK_9: {c: 57, n: \"9\"},\n VK_0: {c: 48, n: \"0\"},\n VK_MINUS: {c: 189, n: \"-\"},\n VK_MINUS2: {c: 173, n: \"-\"},\n VK_EQUALS: {c: 187, n: \"=\"},\n VK_EQUALS2: {c: 61, n: \"=\"},\n VK_BACK_SPACE: {c: 8, n: \"Bkspc\"},\n VK_TAB: {c: 9, n: \"Tab\"},\n VK_Q: {c: 81, n: \"Q\"},\n VK_W: {c: 87, n: \"W\"},\n VK_E: {c: 69, n: \"E\"},\n VK_R: {c: 82, n: \"R\"},\n VK_T: {c: 84, n: \"T\"},\n VK_Y: {c: 89, n: \"Y\"},\n VK_U: {c: 85, n: \"U\"},\n VK_I: {c: 73, n: \"I\"},\n VK_O: {c: 79, n: \"O\"},\n VK_P: {c: 80, n: \"P\"},\n VK_ACUTE: {c: 219, n: \"\u00B4\"},\n VK_OPEN_BRACKET: {c: 219, n: \"[\"},\n VK_CLOSE_BRACKET: {c: 221, n: \"]\"},\n VK_CAPS_LOCK: {c: 20, n: \"CpsLck\"},\n VK_A: {c: 65, n: \"A\"},\n VK_S: {c: 83, n: \"S\"},\n VK_D: {c: 68, n: \"D\"},\n VK_F: {c: 70, n: \"F\"},\n VK_G: {c: 71, n: \"G\"},\n VK_H: {c: 72, n: \"H\"},\n VK_J: {c: 74, n: \"J\"},\n VK_K: {c: 75, n: \"K\"},\n VK_L: {c: 76, n: \"L\"},\n VK_CEDILLA: {c: 186, n: \"\u00C7\"},\n VK_TILDE: {c: 222, n: \"~\"},\n VK_ENTER: {c: 13, n: \"Enter\"},\n VK_SHIFT: {c: 16, n: \"Shift\"},\n VK_BACK_SLASH: {c: 220, n: \"\\\\\"},\n VK_Z: {c: 90, n: \"Z\"},\n VK_X: {c: 88, n: \"X\"},\n VK_C: {c: 67, n: \"C\"},\n VK_V: {c: 86, n: \"V\"},\n VK_B: {c: 66, n: \"B\"},\n VK_N: {c: 78, n: \"N\"},\n VK_M: {c: 77, n: \"M\"},\n VK_COMMA: {c: 188, n: \"] =\"},\n VK_PERIOD: {c: 190, n: \".\"},\n VK_SEMICOLON: {c: 59, n: \";\"},\n VK_SLASH: {c: 191, n: \"/\"},\n VK_CONTROL: {c: 17, n: \"Ctrl\"},\n VK_ALT: {c: 18, n: \"Alt\"},\n VK_COMMAND: {c: 224, n: \"Cmd\"},\n VK_SPACE: {c: 32, n: \"Space\"},\n VK_INSERT: {c: 45, n: \"Ins\"},\n VK_DELETE: {c: 46, n: \"Del\"},\n VK_HOME: {c: 36, n: \"Home\"},\n VK_END: {c: 35, n: \"End\"},\n VK_PAGE_UP: {c: 33, n: \"PgUp\"},\n VK_PAGE_DOWN: {c: 34, n: \"PgDown\"},\n VK_UP: {c: 38, n: \"Up\"},\n VK_DOWN: {c: 40, n: \"Down\"},\n VK_LEFT: {c: 37, n: \"Left\"},\n VK_RIGHT: {c: 39, n: \"Right\"},\n VK_NUM_LOCK: {c: 144, n: \"Num\"},\n VK_DIVIDE: {c: 111, n: \"Num /\"},\n VK_MULTIPLY: {c: 106, n: \"Num *\"},\n VK_SUBTRACT: {c: 109, n: \"Num -\"},\n VK_ADD: {c: 107, n: \"Num +\"},\n VK_DECIMAL: {c: 194, n: \"Num .\"},\n VK_NUMPAD0: {c: 96, n: \"Num 0\"},\n VK_NUMPAD1: {c: 97, n: \"Num 1\"},\n VK_NUMPAD2: {c: 98, n: \"Num 2\"},\n VK_NUMPAD3: {c: 99, n: \"Num 3\"},\n VK_NUMPAD4: {c: 100, n: \"Num 4\"},\n VK_NUMPAD5: {c: 101, n: \"Num 5\"},\n VK_NUMPAD6: {c: 102, n: \"Num 6\"},\n VK_NUMPAD7: {c: 103, n: \"Num 7\"},\n VK_NUMPAD8: {c: 104, n: \"Num 8\"},\n VK_NUMPAD9: {c: 105, n: \"Num 9\"},\n VK_NUMPAD_CENTER: {c: 12, n: \"Num Cntr\"}\n};\n\nfunction _metakeyflags(e) {\n return (e.shiftKey?KeyFlags.Shift:0) |\n (e.ctrlKey?KeyFlags.Ctrl:0) | \n (e.altKey?KeyFlags.Alt:0) | \n (e.metaKey?KeyFlags.Meta:0);\n}\n\ntype KeyMapFunction = (o:KeyMapEntry, key:number, code:number, flags:number) => void;\n\nexport function newKeyboardHandler(switches:number[]|Uint8Array, map:KeyCodeMap, func?:KeyMapFunction, alwaysfunc?:boolean) {\n return (key:number,code:number,flags:number) => {\n if (!map) {\n func(null, key, code, flags);\n return;\n }\n var o : KeyMapEntry = map[key];\n if (!o) o = map[0];\n if (func && (o || alwaysfunc)) {\n func(o, key, code, flags);\n }\n if (o) {\n //console.log(key,code,flags,o);\n var mask = o.mask;\n if (mask < 0) { // negative mask == active low\n mask = -mask;\n if (flags & (KeyFlags.KeyDown | KeyFlags.KeyUp))\n flags ^= KeyFlags.KeyDown | KeyFlags.KeyUp;\n }\n if (flags & KeyFlags.KeyDown) {\n switches[o.index] |= mask;\n } else if (flags & KeyFlags.KeyUp) {\n switches[o.index] &= ~mask;\n }\n }\n };\n}\n\nexport function setKeyboardFromMap(video:RasterVideo, switches:number[]|Uint8Array, map:KeyCodeMap, func?:KeyMapFunction, alwaysfunc?:boolean) {\n var handler = newKeyboardHandler(switches, map, func, alwaysfunc);\n video.setKeyboardEvents(handler);\n return new ControllerPoller(handler);\n}\n\nexport function makeKeycodeMap(table : [KeyDef,number,number][]) : KeyCodeMap {\n var map = new Map<number,KeyMapEntry>();\n for (var i=0; i<table.length; i++) {\n var entry = table[i];\n var val : KeyMapEntry = {index:entry[1], mask:entry[2], def:entry[0]};\n map[entry[0].c] = val;\n }\n return map;\n}\n\nconst DEFAULT_CONTROLLER_KEYS : KeyDef[] = [\n Keys.UP, Keys.DOWN, Keys.LEFT, Keys.RIGHT, Keys.A, Keys.B, Keys.SELECT, Keys.START,\n Keys.P2_UP, Keys.P2_DOWN, Keys.P2_LEFT, Keys.P2_RIGHT, Keys.P2_A, Keys.P2_B, Keys.P2_SELECT, Keys.P2_START,\n];\n\nexport class ControllerPoller {\n active = false;\n handler;\n state : Int32Array[];\n lastState : Int32Array[];\n AXIS0 = 24; // first joystick axis index\n constructor(handler:(key,code,flags) => void) {\n this.handler = handler;\n window.addEventListener(\"gamepadconnected\", (event) => {\n console.log(\"Gamepad connected:\", event);\n this.reset();\n });\n window.addEventListener(\"gamepaddisconnected\", (event) => {\n console.log(\"Gamepad disconnected:\", event);\n this.reset();\n });\n }\n reset() {\n this.active = typeof navigator.getGamepads === 'function';\n if (this.active) {\n let numGamepads = navigator.getGamepads().length;\n this.state = new Array(numGamepads);\n this.lastState = new Array(numGamepads);\n for (var i=0; i<numGamepads; i++) {\n this.state[i] = new Int32Array(64);\n this.lastState[i] = new Int32Array(64);\n }\n console.log(this);\n }\n }\n poll() {\n if (!this.active) return;\n var gamepads = navigator.getGamepads();\n for (var gpi=0; gpi<gamepads.length; gpi++) {\n let state = this.state[gpi];\n let lastState = this.lastState[gpi];\n var gp = gamepads[gpi];\n if (gp) {\n for (var i=0; i<gp.axes.length; i++) {\n var k = i + this.AXIS0;\n state[k] = Math.round(gp.axes[i]);\n if (state[k] != lastState[k]) {\n this.handleStateChange(gpi,k);\n }\n }\n for (var i=0; i<gp.buttons.length; i++) {\n state[i] = gp.buttons[i].pressed ? 1 : 0;\n if (state[i] != lastState[i]) {\n this.handleStateChange(gpi,i);\n }\n }\n lastState.set(state);\n }\n }\n }\n handleStateChange(gpi:number, k:number) {\n var axis = k - this.AXIS0;\n // TODO: this is slow\n for (var def of DEFAULT_CONTROLLER_KEYS) {\n // is this a gamepad entry? same player #?\n if (def && def.plyr == gpi) {\n var code = def.c;\n var state = this.state[gpi][k];\n var lastState = this.lastState[gpi][k];\n // check for button/axis match\n if (k == def.button || (axis == 0 && def.xaxis == state) || (axis == 1 && def.yaxis == state)) {\n //console.log(\"Gamepad\", gpi, code, state);\n if (state != 0) {\n this.handler(code, 0, KeyFlags.KeyDown);\n } else {\n this.handler(code, 0, KeyFlags.KeyUp);\n }\n break;\n }\n // joystick released?\n else if (state == 0 && (axis == 0 && def.xaxis == lastState) || (axis == 1 && def.yaxis == lastState)) {\n this.handler(code, 0, KeyFlags.KeyUp);\n break;\n }\n }\n }\n }\n}\n\n\nexport function padBytes(data:Uint8Array|number[], len:number, padstart?:boolean) : Uint8Array {\n if (data.length > len) {\n throw Error(\"Data too long, \" + data.length + \" > \" + len);\n }\n var r = new RAM(len);\n if (padstart)\n r.mem.set(data, len-data.length);\n else\n r.mem.set(data);\n return r.mem;\n}\n\ntype AddressReadWriteFn = ((a:number) => number) | ((a:number,v:number) => void);\ntype AddressDecoderEntry = [number, number, number, AddressReadWriteFn];\ntype AddressDecoderOptions = {gmask?:number, defaultval?:number};\n\n// TODO: better performance, check values\nexport function AddressDecoder(table : AddressDecoderEntry[], options?:AddressDecoderOptions) {\n var self = this;\n function makeFunction() {\n var s = \"\";\n if (options && options.gmask) {\n s += \"a&=\" + options.gmask + \";\";\n }\n for (var i=0; i<table.length; i++) {\n var entry = table[i];\n var start = entry[0]|0;\n var end = entry[1]|0;\n var mask = entry[2]|0;\n var func = entry[3];\n self['__fn'+i] = func;\n s += \"if (a>=\" + start + \" && a<=\"+end + \"){\";\n if (mask) s += \"a&=\"+mask+\";\";\n s += \"return this.__fn\"+i+\"(a,v)&0xff;}\\n\";\n }\n s += \"return \"+(options?.defaultval|0)+\";\";\n return new Function('a', 'v', s);\n }\n return makeFunction().bind(self);\n}\n\nexport function newAddressDecoder(table : AddressDecoderEntry[], options?:AddressDecoderOptions) : (a:number,v?:number) => number {\n return new (AddressDecoder as any)(table, options);\n}\n\n\n// https://stackoverflow.com/questions/17130395/real-mouse-position-in-canvas\nexport function getMousePos(canvas : HTMLCanvasElement, evt) : {x:number,y:number} {\n var rect = canvas.getBoundingClientRect(), // abs. size of element\n scaleX = canvas.width / rect.width, // relationship bitmap vs. element for X\n scaleY = canvas.height / rect.height; // relationship bitmap vs. element for Y\n\n return {\n x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after they have\n y: (evt.clientY - rect.top) * scaleY // been adjusted to be relative to element\n }\n}\n\n///\n\n// TODO: https://stackoverflow.com/questions/10463518/converting-em-to-px-in-javascript-and-getting-default-font-size\nexport function getVisibleEditorLineHeight() : number{\n return $(\"#booksMenuButton\").first().height();\n}\n\nexport interface VirtualTextLine {\n text : string;\n clas? : string;\n}\n\nexport class VirtualTextScroller {\n memorylist;\n maindiv : HTMLElement;\n getLineAt : (row:number) => VirtualTextLine;\n\n constructor(parent : HTMLElement) {\n var div = document.createElement('div');\n div.setAttribute(\"class\", \"memdump\");\n parent.appendChild(div);\n this.maindiv = div;\n }\n \n create(workspace : HTMLElement, maxRowCount : number, fn : (row:number) => VirtualTextLine) {\n this.getLineAt = fn;\n this.memorylist = new VirtualList({\n w: $(workspace).width(),\n h: $(workspace).height(),\n itemHeight: getVisibleEditorLineHeight(),\n totalRows: maxRowCount, // TODO?\n generatorFn: (row : number) => {\n var line = fn(row);\n var linediv = document.createElement(\"div\");\n linediv.appendChild(document.createTextNode(line.text));\n if (line.clas != null) linediv.className = line.clas;\n return linediv;\n }\n });\n $(this.maindiv).append(this.memorylist.container);\n }\n\n // TODO: refactor with elsewhere\n refresh() {\n if (this.memorylist) {\n $(this.maindiv).find('[data-index]').each( (i,e) => {\n var div = e;\n var row = parseInt(div.getAttribute('data-index'));\n var oldtext = div.innerText;\n var line = this.getLineAt(row);\n var newtext = line.text;\n if (oldtext != newtext) {\n div.innerText = newtext;\n if (line.clas != null && !div.classList.contains(line.clas)) {\n var oldclasses = Array.from(div.classList);\n oldclasses.forEach((c) => div.classList.remove(c));\n div.classList.add('vrow');\n div.classList.add(line.clas);\n }\n }\n });\n }\n }\n}\n\n// https://forums.atariage.com/topic/107853-need-the-256-colors/page/2/\nexport function gtia_ntsc_to_rgb(val: number) {\n const gamma = 0.9;\n const bright = 1.1;\n const color = 60;\n let cr = (val >> 4) & 15;\n let lm = val & 15;\n let crlv = cr ? color : 0;\n if (cr) lm += 1;\n let phase = ((cr - 1) * 25 - 25) * (2 * Math.PI / 360);\n let y = 256 * bright * Math.pow(lm / 16, gamma);\n let i = crlv * Math.cos(phase);\n let q = crlv * Math.sin(phase);\n var r = y + 0.956 * i + 0.621 * q;\n var g = y - 0.272 * i - 0.647 * q;\n var b = y - 1.107 * i + 1.704 * q;\n return RGBA(clamp(0,255,r), clamp(0,255,g), clamp(0,255,b));\n}\n"],
"mappings": "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",
"names": []
}